1. 操作系统_进程管理
1. 进程管理
文章目录
1.1. 进程概念
- 进程是可并发执行的程序在某个数据集合上的一次计算活动,也是操作系统进行资源分配和保护的基本单位
- 进程是一个既能用来共享资源,又能描述程序并发执行过程的一个基本单位
- 操作系统为什么要引入进程概念?
- 刻画系统的动态性,发挥系统的并发性,提高资源利用率
- 它能解决系统的“共享性”,正确描述程序的执行状态
- "可再入"程序
1.2. 进程的状态与转换
1.2.1. 进程的三态模型
- 运行(running)态:进程占有处理器正在运行的状态
进程已获得CPU,其程序正在执行。在单处理机系统中,只有一个进程处于执行状态; 在多处理机系统中,则有多个进程处于执行状态。
- 就绪(ready)态:进程具备运行条件,等待系统分配处理器以便运行的状态。
当进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立即执行,进程这时的状态称为就绪状态。在一个系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列。
- 等待(wait)态: 又称阻塞态或睡眠态,指进程不具备运行条件,正在等待某个时间完成的状态。
也称为等待或睡眠状态,一个进程正在等待某一事件发生(例如请求I/O而等待I/O完成等)而暂时停止运行,这时即使把处理机分配给进程也无法运行,故称该进程处于阻塞状态。
-
进程状态间的转换:
- 运行态→等待态:等待使用资源;如等待外设传输;等待人工干预。
- 等待态→就绪态:资源得到满足;如外设传输结束;人工干预完成。
- 运行态→就绪态:运行时间片到;出现有更高优先权进程。
- 就绪态—→运行态:CPU 空闲时选择一个就绪进程
1.2.2. 进程的五态模型
- 五态模型在三态模型的基础上增加了新建态(new)和终止态(exit)
-
新建态:对应于进程被创建时的状态,尚未进入就绪队列
- 创建一个进程需要通过两个步骤
- 由进程申请一个空白的进程控制块(PCB),并向PCB中填写用于控制和管理进程的信息;然后为该进程分配运行时所必须的资源
- 设置该进程为就绪态,把该进程转入就绪状态并插入到就绪队列中
- 创建一个进程需要通过两个步骤
-
终止态:指进程完成任务到达正常结束点,或出现无法克服的错误而异常终止,或被操作系统及有终止权的进程所终止时所处的状态。
- 处于终止态的进程不再被调度执行,下一步将被系统撤销,最终从系统中消失,终止一个进程需要两个步骤:
-
先等待操作系统或相关的进程进行善后处理:
等待操作系统进行善后处理,最后将其PCB清零,并将PCB空间返还给系统。当一个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结,它将进入终止状态。进入终止态的进程以后不能在再执行,但是操作系统中任然保留了一个记录,其中保存状态码和一些计时统计数据,供其他进程进行收集 -
然后回收占用的资源并被系统删除:
一旦其他进程完成了对其信息的提取之后,操作系统将删除其进程,即将其PCB清零,并将该空白的PCB返回给系统
-
- 处于终止态的进程不再被调度执行,下一步将被系统撤销,最终从系统中消失,终止一个进程需要两个步骤:
-
进程状态间的转换:
- NULL→新建态:执行一个程序,创建一个子进程。
- 新建态→就绪态:当操作系统完成了进程创建的必要操作,并且当前系统的性能和虚拟内存的容量均允许。
- 运行态→终止态:当一个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结。
- 运行态→就绪态:运行时间片到;出现有更高优先权进程。
- 运行态→等待态:等待使用资源;如等待外设传输;等待人工干预。
- 就绪态→终止态:未在状态转换图中显示,但某些操作系统允许父进程终结子进程。
- 等待态→终止态:未在状态转换图中显示,但某些操作系统允许父进程终结子进程。
- 终止态→NULL:完成善后操作。
1.2.3. 进程的七态模型
-
三态模型和五态模型都是假设所有进程都在内存中的事实上有序不断的创建进程,当系统资源尤其是内存资源已经不能满足进程运行的要求时,必须把某些进程挂起(suspend),对换到磁盘对换区中,释放它占有的某些资源,暂时不参与低级调度。起到平滑系统操作负荷的目的。
-
引起进程挂起的原因:
- 终端用户的请求。当终端用户在自己的程序运行期间发现有可疑问题时,希望暂停使自己的程序静止下来。亦即,使正在执行的进程暂停执行;若此时用户进程正处于就绪状态而未执行,则该进程暂不接受调度,以便用户研究其执行情况或对程序进行修改。我们把这种静止状态成为“挂起状态”。
- 父进程的请求。有时父进程希望挂起自己的某个子进程,以便考察和修改子进程,或者协调各子进程间的活动。
- 负荷调节的需要。当实时系统中的工作负荷较重,已可能影响到对实时任务的控制时,可由系统把一些不重要的进程挂起,以保证系统能正常运行。
- 操作系统的需要。操作系统有时希望挂起某些进程,以便检查运行中的资源使用情况或进行记账。
- 对换的需要。为了缓和内存紧张的情况,将内存中处于阻塞状态的进程换至外存上。
-
七态模型在五态模型的基础上增加了挂起就绪态(ready suspend)和挂起等待态(blocked suspend)
- 挂起就绪态:进程具备运行条件,但目前在外存中,只有它被对换到内存才能被调度执行。
- 挂起等待态:表明进程正在等待某一个事件发生且在外存中。
-
进程状态间的转换:
- 等待态→挂起等待态:操作系统根据当前资源状况和性能要求,可以决定把等待态进程对换出去成为挂起等待态。
- 挂起等待态→挂起就绪态:引起进程等待的事件发生之后,相应的挂起等待态进程将转换为挂起就绪态
- 挂起就绪态→就绪态:当内存中没有就绪态进程,或者挂起就绪态进程具有比就绪态进程更高的优先级,系统将把挂起就绪态进程转换成就绪态。
- 就绪态→挂起就绪态:操作系统根据当前资源状况和性能要求,也可以决定把就绪态进程对换出去成为挂起就绪态。
- 挂起等待态→等待态:当一个进程等待一个事件时,原则上不需要把它调入内存。但是在下面一种情况下,这一状态变化是可能的。当一个进程退出后,主存已经有了一大块自由空间,而某个挂起等待态进程具有较高的优先级并且操作系统已经得知导致它阻塞的事件即将结束,此时便发生了这一状态变化。
- 运行态→挂起就绪态:当一个具有较高优先级的挂起等待态进程的等待事件结束后,它需要抢占 CPU,而此时主存空间不够,从而可能导致正在运行的进程转化为挂起就绪态。另外处于运行态的进程也可以自己挂起自己。
- 新建态→挂起就绪态:考虑到系统当前资源状况和性能要求,可以决定新建的进程将被对换出去成为挂起就绪态。
挂起进程等同于不在内存中的进程,因此挂起进程将不参与低级调度直到它们被调换进内存。
-
挂起进程具有如下特征:
- 该进程不能立即被执行
- 挂起进程可能会等待一个事件,但所等待的事件是独立于挂起条件的,事件结束并不能导致进程具备执行条件。 (等待事件结束后进程变为挂起就绪态)
- 进程进入挂起状态是由于操作系统、父进程或进程本身阻止它的运行。
- 结束进程挂起状态的命令只能通过操作系统或父进程发出。
1.3. 进程的描述与组成
1.3.1. 进程映像
是某一时刻进程的内容及其执行状态集合,是内存级的物理实体,又称为进程的内存映像,包括了:
进程控制块PCB(Process Control Block)
,进程程序块
,进程数据块
,进程核心栈
1.3.1.1. 进程控制块PCB(Process Control Block)
PCB是OS用于记录和刻画进程状态及环境信息的数据结构. 借助PCB,OS可以全面管理进程的物理实体,刻画进程的执行现状,控制进程的执行
-
标识信息(进程标识符):
用于存放唯一标识该进程的信息- 内部标识符:操作系统为每一个进程赋予的唯一数字标识符,系统使用
- 外部标识符:由创建者提供,通常有字母与数字组成,往往是由用户(进程)在访问该进程时使用。描述进程的家族关系,设置父进程标识及子进程标识,还可设置用户标识,以指示拥有该进程的用户。
-
现场信息(处理机状态):
用于存放该进程运行时的处理器现场信息- 用户可见寄存器内容:数据寄存器、地址寄存器
- 控制与状态寄存器内容:PC、IR、PSW
- 栈指针内容:核心栈与用户栈指针
-
控制信息(进程调度信息和进程控制信息):
用于存放与管理、调度进程相关的信息-
调度相关信息
:状态、等待事件/原因、优先级 -
进程组成信息
:代码/数据地址、外存映像地址 -
进程队列指引元
:进程队列指针、父子兄弟进程指针 -
进程通信相关信息
:消息队列、信号量、锁 -
进程处理器使用信息
:占用的处理器、时间片、处理器使用时间/已执行总时间、记账信息 -
进程特权信息
:如内存访问权限、处理器特权 -
进程资源清单信息
:如正占有的资源、已使用的资源
-
1.3.1.2. 进程程序块
- 进程执行的程序空间
1.3.1.3. 进程数据块
- 进程处理的数据空间,包括数据、处理函数的用户栈和可修改的程序
1.3.1.4. 进程核心栈
- 进程在内核模式下运行时使用的堆栈,中断或系统过程使用
1.3.2. 进程上下文
-
无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数,这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。进程上下文是为了描述进程调度而提出的一个抽象概念。
已执行的进程指令和数据在相关寄存器和堆栈中的内容称为上文
,正在执行的内容称为正文
,待执行的内容称为下文
。 -
除了进程映像,进程的执行还需要环境支持,包括CPU现场和Cache中的执行信息, OS中的进程物理实体(代码和数据等)和支持进程运行的环境合成进程上下文,用于刻画进程的执行情况,进程在当前上下文中运行,进程上下文包括:
-
用户级上下文:
用户程序块/用户数据区/用户堆栈/用户共享内存组成的用户空间信息 -
寄存器上下文:
即进程的现场信息,包括PSW/栈指针/通用寄存器。 -
系统级上下文:
由进程控制块(进程的状态)、内存管理信息(进程页表或段表)和系统核心栈(进程内核态运行时的工作区)等操作系统管理进程需要的信息
1.3.3. 进程队列
- 处于同一状态的所有PCB链接在一起的数据结构称为进程队列
- 同一状态进程的PCB既可按先来先到的原则排成队列;也可按优先数或其它原则排成队列
- 通用队列组织方式
线性方式
、链接方式
,索引方式
-
索引方式:
系统建立若干索引表,各索引表在内存中的起始地址放在内核专用指针单元。 -
链接方式:
队列中的进程可以通过PCB中的队列指引元采用单向链接或双向链接,系统为每个队列设置队列标志以标志和识别队列 -
进程实现的队列模型
1.3.4. 进程的控制与管理
-
进程创建
:进程列表加一项,申请PCB并初始化,分配唯一进程标识符,建立映像,分配资源,移入就绪队列 -
进程撤销
:从队列中移除,归还资源,撤销标识符,回收PCB,移除进程表项(先要撤销子进程) -
进程阻塞
:保存现场信息,修改PCB,移入等待队列,转向进程调度程序调度其他进程执行 -
进程唤醒
:等待队列中移出,修改PCB,移入就绪队列(该进程优先级高于运行进程,则重新设置调度标志) -
进程挂起
:修改状态并出入相关队列,收回内存等资源送至对换区 -
进程**
:分配内存,修改状态并出入相关队列
1.3.5. 进程切换与CPU模式切换
进程切换是让处于运行态的进程中断运行,让出处理器,这时要做一次进程上下文切换、即保存老进程状态而装入被保护了的新进程的状态,以便新进程运行
步骤
- 保存被中断进程的处理器现场信息
- 修改被中断进程的进程控制块的有关信息,如进程状态等
- 把被中断进程的进程控制块加入有关队列
- 选择下一个占有处理器运行的进程
- 修改被选中进程的进程控制块的有关信息
- 根据被选中进程设置操作系统用到的地址转换和存储保护信息
- 根据被选中进程恢复处理器现场
- 请求调度的事件发生后,就会运行低级调度程序,低级调度程序选中新的就绪进程后,就会进行上下文切换。实际上,由于种种原因,调度和切换并不一定能一气呵成。
- 通常的做法是,由内核置上请求调度标志,延迟到上述工作完成后再进行调度和进程上下文切换,
- Linux进程调度标志位need-resched,Windows延迟过程调用DPC/dispatch软件中断。
1.3.6. 处理器模式切换
- 当中断发生时,暂时中断正在执行的用户进程,把进程从用户状态切换到内核状态,去执行操作系统例行程序以获得服务,这就是一次模式切换,
- 内核在被中断了的进程的上下文中对这个中断事件作处理,即使该中断可能不是此进程引起的
步骤
- 保存被中断进程的处理器现场信息;
- 处理器从用户态切换到核心态,以便执行服务程序或中断处理程序;
- 如果处理中断,可根据规定的中断级设置中断屏蔽位;
- 根据系统调用号或中断号,从系统调用表或中断入口表找到服务程序或中断处理程序地址。