第2章 进程管理345.docx
《第2章 进程管理345.docx》由会员分享,可在线阅读,更多相关《第2章 进程管理345.docx(21页珍藏版)》请在冰豆网上搜索。
第2章进程管理345
第4次课教案
操作系统课程计本081-4班级年月日
章节名称
第2章进程管理
教学目的
与要求
掌握进程互斥的概念和实现方法。
教学内容
2.3进程互斥
重点
进程互斥
难点
进程互斥的实现
作业
教具与挂图
教学过程
(组织与方法)
讲解与举例
2.3进程互斥
在程序并发执行中所举的例子:
两个并发的循环程序共用一个公共变量N这个问题。
设程序A每执行一次都要做N=N+1操作,程序B每隔一定时间打印出N值,并将它重新置为“0”。
通过这个例子,可以知道由于每个进程都以各自独立的速度向前推进,导致出现了不同的执行结果,即显示出其不可再现性。
进程同步的主要任务:
是使并发执行的各进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。
下面通过分析与时间有关的错误,用进程同步的方法来解决问题。
一.与时间有关的错误
例如,某交通路口设置了一个自动计数系统,该系统由“观察者”进程和“报告者”进程组成。
其中观察者进程能识别卡车,并对通过的卡车计数,报告者进程定时将观察者的计数值打印输出,每次打印后把计数值清“0”。
两个进程的并发执行可完成对每小时中卡车流量的统计,两个进程的功能描述如下:
main()
{
intcount=0;/*用于计数*/
cobegin
ProcessObserver
{
while
(1)
{observealorry;
count=count+1;
}
}
ProcessReporter
{
while
(1)
{printf(“%d”,count);
count=0;
}
}
coend
}
在cobegin和coend之间的进程为可并发执行的进程。
观察者进程和报告者进程并发执行时可能有如下两种情况:
⒈报告者进程执行时无卡车通过。
⒉报告者进程执行时有卡车通过。
由于并发进程执行的随机性,其中一个进程对另一个进程的影响是不可预知的。
关键是它们都涉及到共享变量count,当在不同时刻交替地修改了count的值就会造成结果的不正确。
导致不正确的原因是与进程占用处理机的时间、执行的速度以及外界的影响有关。
这些因素都与时间有关,所以,把它称为“与时间有关的错误”。
二.进程的互斥
1.临界资源
允许若干进程均能访问和修改的存储单元称为公共变量。
并发进程对公共变量进行访问和修改时,必须作某种限制,否则就会产生与时间有关的错误。
例如:
在一个机票预定系统中,某一机座的定购情况由一个确定的内存单元的内容表示,假设把若干个订票处看成为若干个访问这一内存单元的进程。
如果一次有两个或n个进程同时存取该变量,那么就有可能使两家或几家订票处同时帮顾客订到相同的机座。
综上所述,对公共变量这样的临界资源的共享有这样的限制:
共享的各方不能同时读写同一数据区,只有当一方读写完成后,另一方才能读写。
到底哪一方先读写,要根据问题的性质和设计人员的意图而定。
2.临界区
在每个进程中,访问临界资源的那段程序能够从概念上分离出来,因而称为临界区或临界段。
它就是进程中对公共变量进行访问与修改的程序段,称为相对于该公共变量的临界区。
例如,前面提到的自动计数系统中,观察者进程的临界区是“count=count+1”,报告者进程的临界区是“printf(“%d”,count);count=0;”。
对若干进程共享某一变量的相关临界区的管理应满足如下三个要求:
每次最多有一个进程处于临界区。
任何一个进入临界区执行的进程必须在有限的时间内退出临界区。
当有若干进程欲进入它的临界区时,应在有限时间内使进程进入临界区。
注意:
临界区是对某一资源而言的,对于不同资源的临界区,它们之间是不相交的,不必互斥执行。
3.互斥的概念
在操作系统中,当一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用临界资源的进程退出临界区后,另一进程才被允许去访问此临界资源。
进程之间的这种相互制约关系被称为互斥。
4.上锁和解锁操作
在大多数同步机构中,必须用一个标志来代表某一资源的状态。
比如,标志为“0”表示未被使用,标志为“1”表示已被使用。
这一标志经常被称为锁或信号量。
对于每一共享数据块或设备都要有一个单位的锁位。
常用的锁位值为“0”表示资源可用,为“1”表示资源已被占用。
进程在使用某一共享资源之前必须完成下列操作:
如果原来的值为0,将锁位置1。
如果原来的值为1,则返回第一步再考察。
系统提供在一个锁位W上的两个原语操作:
上锁原语LOCK(W)和开锁原语UNLOCK(W),其功能可描述如下:
LOCK(W)
L:
ifW=1thenGOTOL
elseW=1;
UNLOCK(W)
W=0;
5.利用上锁和解锁操作实现进程互斥对两个进程关于临界资源的操作可描述为:
进程P1
…
LOCK(W);
CS1
UNLOCK(W);
…
进程P2
…
LOCK(W);
CS2
UNLOCK(W);
…
其中,CS1和CS2代表两个进程的所对应的临界区。
三.信号量和PV操作
1.信号量的概念
信号量是一个确切的二元组(S,Q),S是一个具有非负初值的整型变量,Q是一个初始状态为空的队列。
信号量的值只能通过P,V操作来改变,其可能的取值范围是负整数、零、正整数。
注:
一个信号量的建立必须经过说明,即应该准确说明S的意义和初值。
2.PV操作
信号量的数值仅能由P,V操作加以改变。
对信号量的P操作记为P(S),对信号量的V操作记为V(S),它们都是不可分割的原语操作。
P操作过程
S值减1。
若相减结果大于或等于0,则进程继续执行。
若相减结果小于0,该进程被阻塞,并将它插入到该信号量的等待队列中,然后转进程调度。
V操作过程
S值加1。
若相加结果大于0,进程继续执行。
若相加结果小于或等于0,则从该信号量的等待队列中移出一个进程,解除它的等待状态,然后返回本进程继续执行。
3.利用信号量实现进程互斥
例如,设两个并发进程A和B,具有相对于变量N的临界段CSA和CSB,用信号量实现它们的互斥情况可描述如下:
进程A
…
P(S);
CSA;
V(S);
…
进程B
…
P(S);
CSB;
V(S);
…
对于两个并发进程,互斥信号量的值仅取1、0、-1三个值。
若S=1,表示没有进程进入临界区;
若S=0,表示有一个进程进入临界区;
若S=-1,表示一个进程进入临界区,另一个进程等待进入。
思考题:
1.如果N个并发进程共用一个公共变量Q,用信号量和PV操作实现这N个进程的互斥,信号量的取值范围如何呢?
2.哲学家进餐问题
哲学家问题是描述有5个哲学家,它们的生活方式是交替地进行思考和进餐。
哲学家们共用一张圆桌,分别坐在周围的5张椅子上。
在圆桌上有5个碗和5支筷子,平时一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两支筷子时才能进餐。
进餐毕,放下筷子又继续思考。
请用信号量和PV操作说明这五位哲学家的同步过程。
3.读者-写者问题
在计算机系统中,有些文件是可以供若干进程共享的。
假定有某个共享文件F,系统允许进程对文件F读或者修改,但规定:
多个进程可以同时读文件F。
任一个进程在对文件F进行修改时不允许其它进程对文件进行读或者修改。
当有进程在读文件时不允许任何进程去修改文件。
在这个问题中,可以把想读文件的进程称为读者,把想修改文件的进程称为写者。
当有多个读者和写者都要对文件读或写时,按规定每次只允许一个进程执行写操作且有进程执行写时不允许进程去读文件。
显然,写者和写者之间要互斥,写者和读者之间也要互斥,但多个读者之间可同时读。
第5次课教案
操作系统课程计本081-4班级年月日
章节名称
第2章进程管理
教学目的
与要求
掌握进程同步的概念和实现方法。
教学内容
2.4进程同步
重点
进程同步
难点
进程同步的实现
作业
自编2.4、2.5、2.6
教具与挂图
教学过程
(组织与方法)
讲解与举例
2.4进程同步
一.同步的概念
所谓同步就是并发进程在一些关键点上可能要互相等待与互通消息,这种相互制约的等待与互通消息称为进程同步。
同步意味着两个或多个进程之间根据它们一致同意的协议进行相互作用。
要实现同步,一定存在着必须遵循的同步规则。
日常生活中的例子:
医生为某病员诊病,认为需要做某些化验,于是,就为病员开了化验单。
病员取样送到化验室,等待化验完毕交回化验结果,然后继续诊病。
医生为病员诊病是一个进程,化验室的化验工作又是另一个进程,它们是各自独立的活动单位,但它们共同完成医疗任务,所以需要交换信息。
在操作系统中进程同步的例子:
为了把原始的一批记录加工成当前需要的记录,创建两个进程A和B。
进程A启动输入设备不断地读记录,每读一个记录,存入缓冲区,进程B从缓冲区中取出记录进行加工。
如果对两个进程不进行制约的话就会造成如下错误。
⑴当进程A的执行速度超过进程B的执行速度时,可能进程A把一个记录存入缓冲区后,进程B还没有取走,进程A又把新读出的一个记录存入缓冲区,后一个记录就会把尚未取走的记录覆盖了,造成记录的丢失。
⑵当进程B的执行速度超过进程A的执行速度时,可能进程B从缓冲区取出一个记录并加工后,进程A仍没有把下一个新记录存入缓冲区,而进程B却又从缓冲区去取记录,造成重复地取出同一个记录加工。
用进程互斥的办法不能克服上述两种错误,引起错误的根本原因是它们的速度,可以采用互通消息的办法来控制它们的执行速度,使相互协作的进程正确工作。
两个进程应如下协作:
进程A把一个记录存入缓冲区后,应向进程B发送“缓冲区中有记录”的消息。
进程B从缓冲区中取出记录后,应向进程A发送“缓冲区中的记录已取走”的消息。
进程A只有在得到进程B发送来的“缓冲区中的记录已取走”的消息后,才能把下一个记录再存入缓冲区。
否则进程A等待,直到消息到达。
进程B只有在得到进程A发送来的“缓冲区中有记录”的消息后,才能从缓冲区中取出记录并加工。
否则进程B等待,直到消息到达。
二.利用信号量和PV操作实现进程同步
PV操作不仅是实现进程互斥的有效工具,而且还是实现同步的工具。
把一个信号量与一个消息联系起来,当信号量的值为“0”时,表示期望的消息尚未产生,当信号量的值为“非0”时,表示期望的消息已经存在。
⒈调用P操作判定消息是否到达
任何进程调用P操作可以判定自己所期望的消息是否到达。
若消息尚未产生,则S=0,调用P(S)后,在执行完P操作的第一步S=S-1后,S的值变成-1,使调用者成为等待信号量S的状态,即调用者要等待直到消息到达为止;若消息已经存在,则S>0,调用P(S)后,进程不会成为等待状态而可以继续执行,即进程测试到自己期望的消息已经存在。
⒉调用V操作发送消息
任何进程调用V操作可以向其它进程发送消息。
若调用V操作之前S=0,表示消息尚未产生且无等待消息的进程,调用V(S)后,在执行完V操作的第一步S=S+1后,使S的值>0,即意味着消息已经存在;若调用V操作之前S<0,表示消息未产生前已经有进程在等待消息,这时调用V操作后将释放一个等待消息的进程,即表示该进程等待的消息已经到达可以继续执行。
例如,某计算进程CP和打印进程PN共用一个单缓冲区,如图1所示。
其中,CP进程负责不断地计算数据并送入缓冲区T中,PN进程负责从缓冲区T中取出数据去打印。
图1计算进程和打印进程
设置两个信号量SA和SB。
信号量SA用来表示缓冲区有无空位置存放新的信息,其初值为“1”。
信号量SB用来表示缓冲区中是否有可供打印的计算结果,其初值为“0”。
上述两个进程之间的同步可描述如下:
main()
{
intSA=0;/*表示缓冲区是否为空*/
intSB=1;/*表示缓冲区是否有信息*/
cobegin
ProcessCP
{
while
(1)
{生产一个数据;
P(SA);
送入缓冲区;
V(SB);
}
}
ProcessPN
{
while
(1)
{P(SB);
从缓冲区中取出一个数据;
V(SA);
输出数据;
}
}
coend
}
三.生产者-消费者问题
通过一个有界缓冲区可以把一群生产者P1,P2,P3,…,Pm和一群消费者C1,C2,C3,…,Ck联系起来,如图2所示。
假定这些生产者和消费者是互相等效的。
只要缓冲区未满,生产者就可以把产品送入缓冲区,类似地,只要缓冲区未空,消费者便可以从缓冲区中取走物品并消耗它。
生产者和消费者的同步关系将禁止生产者向满的缓冲区输送产品,也禁止消费者从空的缓冲区中提取产品。
图2生产者-消费者问题
为了解决这一类生产者-消费者问题,应该设置两个同步信号量:
一个表示缓冲区是否为空,用empty表示,其初值为有界缓冲区的大小n,因为缓冲区中可以有n个单元存放产品,所以初值设为“n”。
另一个表示缓冲区是否有信息,用full表示,其初值为“0”,因为在最初时,缓冲区中无信息,所以初值设为0。
另外还需设置一个互斥信号量mutex,其初值为“1”。
生产者-消费者问题的同步描述如下:
main()
{
intempty=n;/*表示缓冲区中是否有无空位置*/
intfull=0;/*表示缓冲区中是否有信息*/
intmutex=1;/*互斥信号量*/
cobegin
Processproceduceri/*i=1,2,…,m*/
{
while(生产未完成)
{生产一个产品;
P(empty);
P(mutex);
送一个产品到有界缓冲区;
V(mutex);
V(full);
}
}
Processconsumerj/*j=1,2,…,k*/
{
while(还要继续消费)
{P(full);
P(mutex);
从有界缓冲区中取出产品;
V(mutex);
V(empty);
消费一个产品;
}
}
coend
}
第6次课教案
操作系统课程计本081-4班级年月日
章节名称
第2章进程管理(习题课)
教学目的
与要求
通过对一些习题的讲解和练习,掌握进程同步的概念和实现方法。
教学内容
进程同步习题
重点
进程同步的实现
难点
进程同步的实现
作业
教具与挂图
教学过程
(组织与方法)
讲解与举例
【例1】有三个进程PA、PB和PC合作解决文件打印问题,如图所示:
PA将文件记录从磁盘读入缓冲区1中,每执行一次读一个记录;PB将缓冲区1中的内容复制到缓冲区2中,每执行一次复制一个记录;PC将缓冲区2的内容打印出来,每执行一次打印一个记录。
这两个缓冲区都是单缓冲区,只能放一个记录。
请用PV操作来保证文件的正确打印。
图三个合作进程
main()
{
intempty1=1;/*表示缓冲区1是否为空*/
intempty2=1;/*表示缓冲区2是否为空*/
intfull1=0;/*表示缓冲区1是否有记录*/
intfull2=0;/*表示缓冲区2是否有记录*/
cobegin
ProcessPA
{
while
(1)
{从磁盘读一个记录;
P(empty1);
将记录存入缓冲区1;
V(full1);
}
}
ProcessPB
{
while
(1)
{P(full1);
P(empty2);
将缓冲区1中的记录复制到缓冲区2中;
V(empty1);
V(full2);
}
}
ProcessPC
{
while
(1)
{P(full2);
从缓冲区2中取出记录;
V(empty2);
}
}
coend
}
【例2】桌上有一个空盘子,允许存放一个水果。
爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。
请用PV操作实现爸爸、儿子和女儿三个并发进程的同步。
main()
{
intS=1;/*表示盘子是否为空*/
intSa=0;/*表示盘子中是否有苹果*/
intSo=0;/*表示盘子中是否有桔子*/
cobegin
Processfather
{
while
(1)
{
P(S);
将水果放入盘中;
if(放入的是苹果)V(Sa);
elseV(So);
}
}
Processson
{
while
(1)
{
P(So);
从盘中取出桔子;
V(S);
}
}
Processdaughter
{
while
(1)
{
P(Sa);
从盘中取出苹果;
V(S);
}
}
coend
}
【例3】设公共汽车上,司机和售票员的活动分别如下所示:
在汽车不断地到站、停车、行驶过程中,为保证乘客的安全,司机与售票员应密切配合协调工作。
请用PV操作来实现司机与售票员之间的同步。
司机的活动:
启动车辆;
正常行车;
到站停车;
售票员的活动:
关车门;
售票;
开车门;
main()
{
intS1=0;/*表示是否允许司机启动汽车*/
intS2=0;/*表示是否允许售票员开门*/
cobegin
Processdriver
{
while
(1)
{
P(S1);
启动车辆;
正常行车;
到站停车;
V(S2);
}
}
Processbusman
{
while
(1)
{
关车门;
V(S1);
售票;
P(S2);
开车门;
上下乘客;
}
}
coend
}
【例4】在计算机系统中,有些文件是可以供若干进程共享的。
假定有某个共享文件F,系统允许进程对文件F读或者修改,但规定:
多个进程可以同时读文件F。
任一个进程在对文件F进行修改时不允许其它进程对文件进行读或者修改。
当有进程在读文件时不允许任何进程去修改文件。
在这个问题中,可以把想读文件的进程称为读者,把想修改文件的进程称为写者。
当有多个读者和写者都要对文件读或写时,按规定每次只允许一个进程执行写操作且有进程执行写时不允许进程去读文件。
显然,写者和写者之间要互斥,写者和读者之间也要互斥,但多个读者之间可同时读。
main()
{
intrc=0;/*记录读者的个数*/
ints=1;/*互斥信号量,用于读者和写者之间的互斥*/
intsr=1;/*互斥信号量,用于对访问公共变量rc的互斥*/
cobegin
ProcessReaderi(i=1,2,…)
{
while
(1)
{P(sr);
if(rc==1)thenP(S);
rc=rc+1;
V(sr);
readfileF;
P(sr);
rc=rc-1;
if(rc==0)thenV(S);
V(sr);
}
}
ProcessWriterj(j=1,2,…)
{
while
(1)
{P(S);
writefileF;
V(S);
}
}
coend
}