进程系列
什么是进程?OS中为什么要引入进程?
- 进程是对正在运行的程序过程的抽象,是一种数据结构,目的在于清晰地刻画动态系统的内在规律,有效管理和调度进入计算机系统主存储器运行的程序。
- 进程是程序的一次执行。
- 进程是一个程序及其数据结构在处理机上顺序执行时所发生的活动。
- 进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。
- 程序是指令运行的集合体,CPU是按照指令顺序不断的运行。CPU的运行是高效的,而程序进行IO是低效的,这就会导致程序在进行IO的时候出现CPU空闲在等程序的情况,降低了实际效率。这时候不如让这个程序挂起,切换到下一个需要CPU执行的程序。为了方便对程序切换的管理,引入了进程的概念,一个进程对应了一个运行的程序,它能申请到资源并且独立的给程序提供资源,提高了系统资源利用率和系统的处理能力。
进程的组成
为了使参与并发执行的每个程序(含数据)都能独立的运行,在操作系统中必须为之配置一个专门的数据结构,称为进程控制块(PCB)。系统利用PCB来描述进程的基本情况和活动过程,进而控制和管理进程。这样,**由程序段、相关数据段和PCB三部分就构成了进程实体。**创建进程实质上就是创建进程实体中的PCB,撤销进程实质上就是撤销进程中的PCB。
进程控制块PCB
PCB:为了便于系统的描述和管理进程的运行。PCB作为进程实体的一部分,记录了操作系统所需的,用于描述进程的当前情况以及管理进程运行的全部信息,是操作系统中最重要的记录型数据结构。
PCB的作用是使一个在多道程序环境下不能独立运行的程序(含数据)成为一个能独立运行的基本单位,一个能与其他进程并发执行的过程。
- 作为独立运行基本单位的标志;
- 能实现间断性运行方式;
- 提供进程管理、调度所需要的信息;
- 实现与其他进程的同步与通信
PCB的组成:
- 进程标识符:外部标识符(方便用户对进程的访问);内部标识符(方便系统对进程的调用)
- 处理机状态:通用寄存器、指令计数器、程序状态字PSW、用户栈指针
- 进程调度信息:进程状态、进程优先级、进程调度所需的其他信息、事件
- 进程控制信息:程序和数据的地址、进程同步和通信机制、资源清单
PCB的组织方式:
- 线性方式:所有的PCB都组织在一张线性表中,将该表的首地址存放在内存的一个专用区域中。该方式实现简单、开销小,但每次查找都需要扫描整张表,适合进程数目不多的场景。
- 链接方式:把具有相同状态进程的PCB分别通过PCB中的链接字链接成一个队列。这样可以形成就绪队列、若干个阻塞队列和空白队列等。
- 就绪队列:按照进程的优先级将PCB从高到低进行排列。
- 阻塞队列:根据其阻塞原因进行排列。
- 索引方式:系统根据所有进程状态的不用,建立几张索引表,例如就绪索引表、阻塞索引表等,并把各索引表在内存的首地址记录在内存的一些专用单元中。在每个索引表的表目中,记录具有相应状态的某个PCB在PCB表中的位置。
进程的基本特征
- 基本特征:并发性和动态性
- 并发性:并发性是进程的一个重要特征,同时也是OS的重要特征。引入进程的目的正是为了使其程序能和其它建立了进程的程序并发执行,而程序本身是不能并发执行的。
- 动态性:表现为由创建而产生,由调度而执行,因得不到资源而暂停执行,以及由撤销而消亡,因而进程有一定的生命期;而程序只是一组有序指令的集合,是静态实体。
- 其他特征:独立性、异步性、结构性
- 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的基本单位。
- 异步性:由于进程间的相互制约,使进程具有执行的间断性。即进程按各自独立的、不可预知的速度向前推进。
- 结构性:进程是由程序、数据和进程控制块三部分组成。
进程与程序之间的区别与联系?
- 进程可以看做是程序的一部分。一个程序可以对应多个进程,但一个进程只能对应一个程序。类似与演出和剧本,一个剧本可以由不同的演员去演出,但是这些演员都是照着这个剧本去演的。
- 进程具有一定的生命周期,是动态的;而程序则是指令的集合,是静态的。
- 进程具有并发性,而程序没有;进程是竞争计算机资源的基本单位,而程序不是。
进程的状态及转换
进程状态的出现,使得OS对于进程的管理更加便捷。状态之间的不断转换说明了进程是动态的。
- 就绪:指进程已经处于准备好运行的状态,即已经分配到所需要的系统资源,只要获得CPU时间片就可以运行。如果系统中有许多处于就绪状态的进程,通常将他们按照一定的策略(如优先级策略)排成一个队列,称该队列为就绪队列。
- 运行:指进程获取了CPU时间片正在执行,在单处理机系统中,最多只有一个进程处于该状态。
- 阻塞:指正在执行的进程,在执行过程中发生了某事件(IO请求,申请缓存失败,等待接收数据等)而导致暂时无法执行。此时需要把该进程的处理机释放掉,并选取其他就绪的进程执行。处于阻塞状态的进程都在阻塞队列中。
- 创建:
- 由进程去申请一个空白的进程控制块,并向PCB中填写用于控制和管理进程的信息。
- 为该进程分配运行时必要的资源
- 把该进程转为就绪状态并插入到就绪队列中
- 终止:当一个进程到达了自然结束点,或者是出现了无法克服的错误,或者被操作系统终结,就进入了终止状态。首先等待OS进行善后处理(停止执行,终止子进程、归还资源等),然后将其PCB清零并将该空间归还给系统。
进程的挂起与激活
**当挂起操作作用于某个进程时,意味着此时该进程处于停止状态。如果进程正在执行,它将暂停执行;若原本处于就绪状态,则该进程暂时不接受调度。**与挂机操作对应的就是激活操作。
为什么要挂起?
- **终端用户的需要:**当终端用户在自己的程序运行期间发现有问题,希望暂停自己的程序的运行,让其停下来,以便用户研究其执行的情况或者对程序进行修改。
- **父进程的请求:**有时父进程希望挂起自己的某个子进程,以便考察和修改子进程,或者协调各个子进程之间的活动。
- **负荷调节的需要:**当实时系统中的工作负荷较重,已经可能影响到对实时任务的控制时,可由系统把一些不重要的进程挂起,以保证系统能正常运行。
- **操作系统的需要:**操作系统有时希望挂起来某些进程,以便检查运行中的资源使用情况或者进行记账。
引入挂起和激活操作后,可能会出现以下状态转换:
- 活动就绪-》静止就绪:当进程处于未被挂起的就绪状态时,称此为活动就绪状态,此时进程可以接受调度。当挂起该进程时,该进程处于静止就绪状态,不再接受调度。
- 活动阻塞-》静止阻塞:当进程处于未被挂起的阻塞状态时,称此为活动阻塞状态。当挂起该进程时该进程处于静止阻塞状态。处于该状态的进程在出现其所期待的事件后,从静止阻塞变为静止就绪。
- 静止就绪-》活动就绪:给某个静止就绪的进程激活操作。
- 静止阻塞-》活动阻塞:给某个静止阻塞的进程激活操作。
进程的创建与终止过程
在系统中每当出现了创建新进程的请求后,OS便调用进程创建原语Create按照下述步骤创建一个新进程:
- 申请空白PCB:为新进程申请获得唯一的数字标识符,并从PCB集合中索取一个空白PCB;
- 为新进程分配其运行所需的资源,包括各种物理和逻辑资源,如内存、文件、IO设备和CPU时间等;
- 初始化进程控制块PCB;
- 如果进程就绪队列能够接纳新进程,则将新进程插入就绪队列。
如果系统中发生了要求终止进程的某事件,OS便调用进程终止原语,按照下述过程去终止指定进程:
- 读取PCB状态:根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从中读出该进程的状态;
- 终止执行:若被终止进程正在处于执行状态,应该立刻终止该进程的执行,并设置调度标志为true,用于指示该进程终止后应该重新调度;
- 终止子孙进程:若该进程还有子孙进程,还应该将其子孙进程都终止,防止其子孙进程成为孤儿进程;
- 归还资源:将被终止进程所拥有的全部资源归还给父进程或者系统,防止其子孙进程称为僵尸进程;
- 移除PCB:将被终止进程PCB所在的队列中移除,等待其他程序来收集信息。
进程的切换
进程的切换主要分为两种,主动放弃处理器和被动放弃处理器。并且进程的切换一定发生在中断、异常或者系统调用处理过程中。
- 主动:
- 线程正常结束,主动放弃。
- 线程在执行时发生了异常。
- 被动:
- 进程在执行时有个更紧急的任务(IO操作)。
- 遇到有更高优先级的进程。
- 进程还没结束但时间片用完。
进程切换的步骤:
- 保存处理机上下文,包括程序计数器和其他寄存器。
- 更新PCB信息并把进程的PCB移入相应的队列,如就绪、阻塞等队列。
- 选择另一个进程执行,并更新其PCB。
- 更新内存管理的数据结构。
- 恢复处理机上下文。
并不是所有的中断/异常都会引起进程的切换。有一些中断/异常不会引起进程状态的切换,只是在处理完成后把控制权交给被中断的进程
- (中断/异常等触