目录
零、学习路线
一、进程的状态
1.1 创建态、就绪态
进程的 创建态 是指进程在被创建时的一个初始状态。在这个状态下,进程已经被操作系统创建,但还没有完全准备好执行。进程从创建态转变为其他状态(如就绪态或运行态)之前,操作系统需要为其完成一些初始化工作。
进程创建态的过程
当一个进程被创建时,操作系统会经历几个关键步骤,通常包括以下内容:
分配进程控制块(PCB):
- 操作系统首先为新进程分配一个进程控制块(Process Control Block, PCB),其中包含进程的唯一标识符(PID)、初始状态信息、寄存器值、优先级、内存地址等。
- PCB 是操作系统用于跟踪和管理进程的核心数据结构。
分配资源:
- 操作系统为新进程分配其所需的资源,包括内存空间、堆栈空间、打开的文件描述符表等。
- 这些资源可能来自空闲资源池或通过其他机制分配。
加载程序:
- 操作系统将新进程的可执行代码和相关数据从硬盘加载到内存中。
- 加载程序的代码段(指令)和数据段(全局变量、静态变量等)是进程执行所必需的。
进程被创建的过程,如下图所示:
就绪态是进程生命周期中的一种重要状态,它表示进程已经具备了运行所需的所有条件,并且能够被CPU执行,但由于CPU当前正在执行其他任务,它暂时无法运行。因此,处于就绪态的进程等待操作系统的调度程序将其分配到CPU上。
1.2 运行态 (或执行态)
如果一个进程此时在CPU上运行,那么这个进程处于“运行态”。CPU会执行该进程对应的程序(执行指令序列)。
1.3 阻塞态
阻塞态(Blocked State),又称为等待态(Waiting State)或睡眠态(Sleeping State),是进程在运行过程中由于某些条件暂时无法继续执行时进入的状态。在阻塞态中,进程不能占用CPU,也不会被调度运行,它需要等待某个事件(如I/O操作完成、资源可用等)发生才能重新进入就绪态,并最终继续执行。
举例:
在进程运行的过程中,可能会请求等待某个事件的发生(如等待某种系统资源的分配,或者等待其他进程的响应)。
在这个事件发生之前,进程无法继续往下执行,此时操作系统会让这个进程下CPU,并让它进入“阻塞态”。
当CPU空闲时,又会选择另一个“就绪态”进程上CPU运行,除非等到该进程所请求等待的事情已发生,方可转为就绪态。
1.4 终止态
进程的终止也要通过两个步骤:首先,是等待操作系统进行善后处理,最后将其PCB清零,并将PCB空间返还系统。当一个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结,它将进入终止状态。进入终止态的进程以后不能再执行,但在操作系统中依然保留一个记录,其中保存状态码和一些计时统计数据,供其他进程收集。一旦其他进程完成了对其信息的提取之后,操作系统将删除该进程,即将其PCB清零,并将该空白PCB返还系统。
1.5 进程各状态之间的转换
1.5.1 三种基本状态的转换
进程在运行过程中会经常发生状态的转换。例如,处于就绪状态的进程,在调度程序为之分配了处理机之后便可执行,相应地,其状态就由就绪态转变为执行态或运行态;正在执行的进程(当前进程)如果因分配给它的时间片已完而被剥夺处理机暂停执行时,其状态便由执行转为就绪;如果因发生某事件,致使当前进程的执行受阻(例如进程访问某临界资源,而该资源正被其它进程访问时),使之无法继续执行,则该进程状态将由执行转变为阻塞。下图示出了进程的三种基本状态,以及各状态之间的转换关系。
1.5.2 五种状态的转换
一个进程在被运行之前需要被创建, 在被创建的过程当中,系统会完成创建进程的一系列工作(例如:新建PCB、分配系统资源、加载程序等)。
当一个进程被创建完成之后,他就拥有了可以上处理机(CPU)运行的条件,这个时候进程就进入了就绪态,也就是说,处于就绪态的进程,他其实只差处理机这种资源,其他所需要的资源该进程都已具备。
那如果处于就绪态的进程被操作系统调度,那这个进程就可以上处理机运行,当这个进程在处理机上运行时,就说这个进程处于运行态。也就是说,正在处理机上运行的进程既拥有该进程所需的其他资源,同时也拥有处理机这种资源。
而有的时候,正在运行的进程可能会请求等待某事件的发生,在这个事件发生之前,这个进程是没有办法继续执行的,所以在这种情况下,进程不应该一直占用着处理机资源,此时,该进程应该被剥夺处理机资源,同时,他还在等待其他某种资源,这个时候进程处于阻塞态。
那如果说,处于阻塞态的进程申请的资源被分配,或等待的事件发生,那这个进程就从阻塞态回到就绪态。当该进程回到就绪态后,那就说明该进程拥有了除了处理机之外所有它所需要的其他资源。
一个进程在处理机上正在运行,当时间片完或处理机被抢占,那么该进程就从运行态转到就绪态,等待处理机重新调度它。
五种状态转换关系图如下所示:
运行态--->阻塞态的转换其实是进程自身主动的一种选择。
阻塞态--->就绪态是不能进程自身控制的,是一种被动行为。比如说,一个进程他正在等待打印机这种资源,那么这个打印机资源什么时候分配给该进程,这并不是该进程能够说了算的。
1.5.3 总结
问题:那操作系统是怎么进入进程的这些状态的呢?
答案:进程PCB中,会有一个变量state来表示进程的当前状态。如:1表示创建态、2表示就绪态、3表示运行态.....。
为了对同一个状态下的各个进程进行统一的管理,操作系统会将各个进程的PCB组织起来。
那么操作系统是如何将各个进程的PCB组织起来呢?请看下面。
二、进程的组织
在一个系统中,通常可拥有数十个、数百个乃至数千个PCB。为了能对它们加以有效的管理,应该用适当的方式将这些PCB组织起来。目前常用的组织方式有以下三种。
2.1 线性方式
即将系统中所有的PCB都组织在一张线性表中,将该表的首址存放在内存的一个专用区域中。该方式实现简单、开销小,但每次查找时都需要扫描整张表,因此适合进程数目不多的系统。下图示出了线性表的PCB组织方式。
2.2 链接方式
即把具有相同状态进程的PCB分别通过PCB中的链接字链接成一个队列。这样,可以形成就绪队列、若干个阻塞队列和空白队列等。对就绪队列而言,往往按进程的优先级将PCB从高到低进行排列,将优先级高的进程PCB排在队列的前面。同样,也可把处于阻塞状态进程的PCB根据其阻塞原因的不同,排成多个阻塞队列,如等待I/O操作完成的队列和等待分配内存的队列等。下图示出了一种链接队列的组织方式。
2.3 索引方式
索引方式,即系统根据所有进程状态的不同,建立几张索引表,例如,就绪索引表、阻塞索引表等,并把各索引表在内存的首地址记录在内存的一些专用单元中。在每个索引表的表目中,记录具有相应状态的某个PCB在PCB表中的地址。下图示出了索引方式的PCB组织。