目录
- 预备知识 -> 操作系统
- 操作系统的定义
- 操作系统的定位
- 进程
- 进程的概念
- 进程调度的过程
- 进程的管理
- 描述
- 组织
- PCB描述进程的特征
- 进程调度的相关属性
- 进程的状态
- 优先级
- 上下文
- 记账信息
预备知识 -> 操作系统
操作系统的定义
操作系统是一个搞管理的软件
- 对上,要对硬件设备管理
- 对下,要给软件提供稳定的运行环境
- 操作系统是软件 硬件 用户之间交互的媒介
常见的操作系统:Windows linux mac Android(本质上也是linux) IOS(和mac同宗同源)
操作系统的定位
一个应用程序想要操作一下硬件设备。就需要先通过系统调用,把操作系统命令告诉给系统内核,内核调用驱动程序,进一步的操作操作系统
进程包含线程
一个进程包含一个及以上的线程
进程是资源分配的基本单位
线程是系统调度的基本单位
进程
进程的概念
概念:一个跑起来的程序就是一个”进程“
电脑上有一个.exe 可执行程序。但是没有去运行它,没有运行的就不是进程(没有运行起来的叫做程序)
进程(process)也叫做任务(task)
Ctrl + Alt + delete => 打开任务管理器
上面每一个运行中的程序就是进程
每个进程都对应一些资源进程是操作系统资源分配的基本单位
进程调度的过程
进程调度是指操作系统按某种策略或规则选择进程占用CPU资源进行运行的过程。
硬件资源,内存,硬盘,网卡都好分。但是cup资源不好分!!
进程有上百个之多,但是cpu市面上流行的电脑都是多核cpu,多核大都是8核或者16核。
上图就是一个八核电脑。八核cup和几百个进程明显不够分,狼多肉少。
这些进程,是希望能够同时运行
但是计算机并不能同时运行,计算机真正做到的是分时复用
分时复用分为并行和并发
并行:微观上同一时刻,两个核心上的进程,就是同时进行的
并发:微观上,同一时刻,一个核心中只能运行一个进程,但是它能够对进程快速的进行切换。
比如在cpu核心上,先运行一下qq,再运行一下微信,再运行一下idea…只要切换的速度足够快(我的电脑3.2GHz,每秒运行32亿条指令),宏观上人感知不到,人们看起来感觉好像几个程序在同时运行。就好比电脑屏幕刷新的频率大都是60Hz,屏幕并不是连续的,但是刷新频率大于眼睛的反应,人看电脑屏幕就好像是连续的
并行和并发是由操作系统内核处理的,应用程序(程序员)感知不到,因此我们也把并行和并发统称为并发
除非有显式声明,否则谈到并发,并发 = 并行 + 并发
操作系统里有一个重要的模块调度器,就来负责让有限的CPU来调度执行这么多的进程
进程的管理
进程是一个重要的软件资源,是由操作系统内核负责管理的
管理:组织 + 描述
描述
描述:用结构体(C语言的结构体)来描述进程的属性。
因为操作系统基本上都是C/C++来写的,所以用C语言结构体来描述。
PCB:用来描述进程的这个结构体叫做进程控制块也叫做PCB,这是一个结构体,注意不要和硬件中的PCB板弄混
组织
通过双向链表,把多个PCB串联在一起。(并不是一个单纯的双向链表)
- 创建一个进程,本质上就是创建一个PCB这样的结构体对象,把它插入到链表中。
- 销毁一个进程,本质上就是把链表上的PCB结点删掉
- 任务管理器查看进程列表,本质上就是遍历整个PCB链表
PCB描述进程的特征
pcb中包含的属性非常非常多,下面只介绍最核心的属性
- pid 进程身份标识符(唯一的数字)
- 内存指针 指向了说内存是那些
- 文件描述符表 硬盘上的文件等其他资源 (2和3描述了进程有哪些硬件资源)
- 进程调度相关属性:
- 进程的状态
- 优先级
- 上下文
- 记账信息
进程调度的相关属性
进程通过调度器对其以并行+并发的形式进行调度。但是它也需要PCB对他提供帮助。PCB就记录进程调度的相关属性。
一个很有名的日本游戏叫做约会大作战,里面的男主角五河士道通过与女生约会来拯救世界。假设现在有ABC三个女生,让男主角和他们约会,还不能让他们相互知到对方的存在就需要合理的安排,但是每个妹子的状态不同,有的妹子周二需要上课,有的妹子正在准备和你约会,有的妹子正在和你约会,每个妹子的状态不同所以得记录妹子们的状态,每个妹子不能平均分配时间有的是新攻略的需要多花时间培养感情,有的已经交往了很久有了深厚的感情,就可以先往后放放。每个妹子的约会是有优先级的。和很多女生约会得记录他们的交往的进度和信息,假如A女生说她想去海边旅游了,让你给他准备准备。B女生说亲戚结婚了想让你给她挑一件礼服。但是你没有记录上下文,
A女生问:你准备好了嘛?
主角回答:给你准备了件礼服
B女生问:你准备好了嘛?
主角回答:给你准备了件泳衣
这样就露馅了,所以必须得记录上下文来避免出现错误而导致功亏一篑
主角和ABC交往了一段时间,要每隔一段时间来做个总结,统计一下在每个人身上花费的精力,以此为标准保持好尺度,不能太近也不能太远。
以这个小故事用来理解进程的相关属性
进程的状态
进程的状态主要有下面三种
- 就绪状态: 随叫随到,进程随时准备好了去CPU上执行
- 运行状态:正在CPU上执行
- 阻塞状态:短时间内无法到CPU上执行,比如 进程 正在进行密集的IO操作,读写数据
优先级
先给谁排,后给谁排,给谁排的多一点,给谁排的少点。
进程也是有优先级的,操作系统的调度并不是一碗水端平的
上下文
操作系统在进行进程切换的时候,就需要把执行的中间状态记录下来,保存好。下次这个进程再上CPU上运行时,就可以恢复上次的状态好继续执行下去。
读档,存档
上下文的本质上就是你存档的内容。
进程的上下文,就是cpu各个寄存器1的值。
记账信息
操作系统,统计每个进程在cpu上的时间和指令数目,根据这个来决定下一阶段如何调度。
各个寄存器 :CPU内置的存储数据的模块,保存的就是程序运行过程中的中间结果
保存上下文:就是把这些CPU寄存器的值,记录到内存(PCB)中。
回复上下文:就是把内存中的这些寄存器中的值恢复回去 ↩︎