第二章 进程管理
引入进程的原因 为了提高资源利用率必须让多个程序并发运行。 程序的并发运行出现了新的特征:间断性、 失去封闭性、 不可再现性。 为了让程序能正确并发运行,引入进程概念。 进程的定义 程序:指令的有序集合。 进程(process)是程序的一次执行。
进程的特征 (1)结构特征:程序+数据+PCB =进程 (2)动态性:①是程序的执行过程; ②有生命周期; (3)并发性:多个进程可并发执行; (4)独立性:是系统进行资源分配和调度的独立单位, 是能独立运行的基本单位; (5)异步性:进程以不可预知的速度向前推进。 速度不单取决于对应的程序,还受外界环境的影响。 最基本的特征:动态性、并发性
进程与程序的区别
(1)从定义上看,程序是一组指令的有序集合;进程是程序的 运行过程; (2)从结构上看,进程不仅包含程序段,还包含数据段和PCB; (3)进程是动态性,而程序是静态的; (4)进程可独立地、并发地执行,程序则不能独立、并发执行; 进程与程序的对应关系
在某个时刻一个进程对应于一个程序; 在整个生命周期中,进程可执行多个程序;( fork+exec ) 一个程序多次执行则将对应多个进程; 进程三种基本状态的转换
单CPU中N个进程的情况
具有挂起状态的进程状态转换
内核态与用户态
CPU的指令:特权指令,非特权指令
特权指令:关机指令、清主存、启动外设指令、设置系统时钟时间、关中断、修改存储器管理寄存器等 非特权指令:通用寄存器清0指令,访问内存指令,算术运算指令等
CPU的执行状态:
内核态(核心态、系统态、管态):(能访问所有的内存空间和I/O端口,能执行特权和非特权指令。)
用户态(目态)(系统调用):(只能访问分配给自己的内存空间,只能执行非特权指令。)
OS的内核运行于核心态,应用程序则运行于用户态。 (进程控制的大量原语)
进程的制约关系 直接制约:源于进程合作 间接制约:源于资源共享 同步 为了保证进程正确的并发执行,对多个相关进程在执行的次序上进行协调的过程。 临界资源 要求互斥共享的资源。 系统中一次仅允许一个进程使用的资源。 临界区 进程中访问临界资源的那部分程序段。 进程必须互斥地进入相关临界区 临界区与原语 进程必须互斥地进入相关临界区,但进程在临界区内执行时可以被中断; 原语则不能被中断。 同步机制(如信号量机制)应遵循的准则 空闲让进。 忙则等待。 有限等待。 让权等待。 用记录型信号量实现互斥时:
为每一类临界资源需定义一个信号量: ※信号量的初值: s.value的初值为对应临界资源的初始个数; s.L的初值为NULL。 ※信号量中的成员value>=0时,表示当前的空闲资源 数;value<0时,其绝对值表示因竞争该类资源而阻塞的进程个数; ※ wait( )相当于申请一个临界资源; ※ signal( )相当于释放一个临界资源。
如系统中某类临界资源,初始个数为3,则 对应信号量的初值为3; 当信号量值为-2时,表示已有5个进程申请过该资源,其中3个得到了,还有2个没得到资源被阻塞; 当n个进程申请该资源时,信号量的取值范围为:[3-n, 3]。 如某个资源最多同时允许2个进程同时使用,则其信号量的初值是2。
利用信号量实现同步 分别为每种同步关系(一个进程等另一个进程完成某个动作)设置一个同步信号量S,其初值为0; 在需要等其他进程的地方插入wait(s); 在完成其他进程所等的动作处插入signal(S)。
使用信号量解决进程同步问题的步骤
(1)确定进程: 包括进程的数量、进程的工作内容。 (2)确定进程之间的互斥、同步关系: 检查进程间要竞争哪些临界资源,以及有哪些工作必须在合作进程完成某个动作后才能进行,以此来确定进程间是互斥还是同步。 (3)确定信号量: 分别为每种临界资源定义一个信号量,初值为临界资源的初始个数;分别为每种同步关系定义一个信号量,初值为0。 每个信号量在使用以前都必须先定义并赋好初值。 (4)用类程序语言描述算法。 根据进程的工作内容写出进程对应的关键动作;然后: 在需要使用临界资源的程序段前通过加相应信号量的P操作来申请该资源,在使用完临界资源后加相应信号量的V操作来释放该资源。 在需要等合作进程完成某个动作才能执行的程序段之前加相应信号量的P操作;在完成被合作进程所等的动作之后加相应信号量的V操作。 注意:每个信号量的P、V操作通常是成对的。
管程 用来实现同步的一张机制; 管程比信号量容易保证正确性; 管程的组成: 管程名称 局部于管程内部的共享数据结构的说明; 对该数据结构进行操作的一组过程; 初始化共享数据结构的语句。
进程通信的三种类型: 共享存储器通信 消息通信 直接通信(如共享消息队列通信) 间接通信(如信箱通信) 管道通信 消息缓冲队列通信机制
线程的引入 将拥有资源的实体和执行的实体分开,使执行的实体具有较少的资源,从而减少并发执行的开销,从而提高系统的并发程度。 拥有资源的基本单位——进程; 执行的基本单位(即CPU调度和分派的单位)——线程。 线程是进程内一个相对独立的运行单位,一个进程可以有一个或多个线程(至少有一个),这些线程共享这个进程的代码、数据及大部分管理信息,但每个线程有自己的程序计数器、堆栈和线程控制块。 但对用户级线程而言,内核进行CPU调度仍然以进程(而不是用户级线程)为单位。