2.3 进程控制
进程控制是对系统中的全部进程实施有效的管理,包括进程创建、终止、进程阻塞和唤醒。
- 一、进程的创建
- 二、进程的终止
- 三、进程的阻塞与唤醒
- 四、进程的挂起与激活
一、进程的创建
创建原语是由若干条指令组成,能够完成一定功能的程序段
二、进程的终止
1、 引起进程终止的事件
正常结束
异常结束
越界错误、非法指令等
外界干预
操作员或操作系统干预
父进程请求
父进程终止
2、 进程的终止过程
三、进程的阻塞与唤醒
2、 进程阻塞过程(主动阻塞过程)
3、进程唤醒过程
四、进程的挂起与激活
2.4 进程同步
目的与要求
- 理解临界资源与临界区的概念
- 熟练掌握利用信号量机制解决进程同步问题
一、进程的同步基本概念
二、信号量机制
三、信号量的应用
进程同步的主要任务:
对多个相关进程在执行次序上进行协调,使并发执行的诸进程之间能够有效地共享资源和相互合作,从而使程序的执行具有可再现性。
一、进程同步的基本概念
1、进程间两种形式的制约关系
间接相互制约关系-------源于资源共享
直接相互制约关系-------源于进程合作
2、临界资源
-
临界资源:把一段时间内只允许一个进程访问的资源称为临界资源或独占资源
-
临界区:每个进程中访问临界资源的那段代码称为临界区
-
n是一个整型变量
-
item是一个商品
-
图中定义了一个数组buffer当做缓冲区,可以存储n个商品
-
in指针指向下一个可以放商品的位置
-
out指针指向下一个可以消费的商品的位置
-
缓冲池组织为循环缓冲,输入指针加1表示in:= (in+1)mod n,输出指针加1表示out:=(out+1)mod n,当(in+1)mod n = out时,表示缓冲池满,in = out 表示缓冲池空。
-
counter为计数变量,初始值为0,放入产品使其加1,取出产品使其减一。
nextp为临时变量
因为缓冲区是生产者和消费者所共享的,属于临界资源,所以要使用缓冲区要先申请,缓冲区有空间可以存储才可以使用,所以这里需要一个临时变量来存储刚刚生产出来的商品。
如果counter = n, 则证明缓冲区满了,此时生产出的商品无法存储进入缓冲区,所以执行do no-op
如果counter不是n,则缓冲区没满,此时把nextp中的商品存储进入缓冲区,再让指针in指向下一个存储空间,再令counter+1
关于消费者的程序:
当counter等于0时,则证明缓冲区里没有商品,则无法进行取出商品的操作。
当counter不等于0时,则证明缓冲区中有商品,则从对应存储位置将商品取出,存入临时变量nextc中,再令out指向下一个存储空间,令counter减一,然后消费者从nextc中将商品取出。
存在的问题
3、临界区
进入区就是申请临界资源,临界区就是访问临界资源,退出区就是释放临界资源。
4、同步机制应遵循的规则
空闲让进
忙则等待
有限等待
让权等待
二、信号量机制
1965年荷兰Dijkstra提出的信号量(Semaphores)是一种卓有成效的进程同步工具,在长期的应用中,得到了很大的发展,从整形信号量经过记录型信号量,进而发展为“信号量集”机制。
- 信号量就是OS提供的管理公有资源的有效手段
- 信号量代表可用资源实体的数量
1、整型信号量
wait(S)即P(S),也就是P操作,用来申请资源
signal(S)即V(S),也就是V操作,用来释放资源
整型信号量存在的问题
在整型信号量机制中的wait操作,只要是信号量S<=0,就会不断地测试。因此,该机制并未遵循“让权等待”的准则,而是使进程处于“忙等”的状态。记录型信号量机制则是一种不存在“忙等”现象的进程同步机制。
2、记录型信号量(重点!!!)
为了解决采取“让权等待”策略后出现多个进程等待访问同一临界资源的情况,在信号量机制中,除了需要一个用于代表资源数目的整型变量value外,还应增加一个进程链表指针list,用于链接上述的所有等待进程。记录型信号量是由于它采用了记录型的数据结构而得名。
- 对于wait操作,如果有可用资源,则S.value-1,如果没有可用资源,则进程主动阻塞,即block(S,L)
- 对于signal操作,如资源使用完,则进行资源释放,同时唤醒进程,即wakeup(S,L)
比如:两个进程A,B,打印机有1台
假设A先访问打印机,则:
- A进入到进入区执行P操作,S.value=1-1=0<0不成立,则有资源可以用,进程A不会被阻塞,即打印机可以给进程A用。
- 然后A进入到临界区去执行它的打印操作,在打印的过程中,如果进程B也想要使用打印机,可以吗?如果B想要用打印机,也要进入进入区进行申请,申请上就可以用,申请不上则进程B会自动阻塞起来。
- 那判断一下:此时因为A在用,所以S.value=S.value-1=0-1=-1<0成立,所以B就会因为申请不上打印机而被阻塞挂起到L上。
- 知道进程A用完了打印机,则A进入到退出区执行V操作,那么S.value=-1+1=0<=0成立,则就要唤醒B进程,把打印机给B用,B用完后,也要释放资源,执行V操作,那么S.value=0+1=1。
3、AND型信号量
前面所述的进程互斥问题针对的是多个并发进程仅共享一个临界资源的情况。在有些应用场合,是一个进程往往需要获得两个或者更多的共享资源后才能执行其任务。如下图:
相应地,在两个进程中都要包含两个对Dmutex和Emutex的操作,即
上图就是获得多个共享资源的情况下可能出现的问题!
AND同步机制的基本思想:将进程在整个运行过程中需要的所有资源,一次性全部分配给进程,待进程使用完后再一起释放。只要尚有一个资源未能分配给进程,其他所有可能为之分配的资源,也不分配给它。即对临界资源的分配采取原子操作,成为同时wait操作即Swait()。
4、信号量集
记录型信号量机制:
每次只能获得或释放一个单位的资源,低效
每次分配前必须测试资源数量,看其是否大于其下界值对AND信号量机制加以扩充
对AND信号量机制加以扩充
S为信号量;t为下限值;d为需求值
一般信号量集的几种特殊情况:
信号量的应用
- 利用信号量实现进程互斥(模式)
- 利用信号量实现前驱关系(模式)
- 利用记录型信号量实现同步(模式)
1、利用信号量实现进程互斥(模式)
为使多个进程互斥的访问某临界资源,需为该资源设置一互斥信号mutex,并设其初始值为1(N个相同的临界资源的话,就是N),然后将各进程访问资源的临界区CS置于wait(mutex)和signal(mutex)之间即可。
中间的两个process的程序段位于parbegin与parend之间,则说明这两个process是可以并发执行的。
wait(mutex)和signal(mutex)必须成对出现
2、利用信号量实现前驱关系(模式)
思路:
- 因为有7个箭头,所以有7个前趋关系,因此可以设置7个信号量,初值均为0
- 有几个直接后继,就写几个signal操作