与整形量不同,信号量的初值为非负整数,仅能通过两个标准的原子操作wait(s)和signal(s)来访问,也被称为P,V操作,信号量S的值仅有这两个操作来实现。存在忙等现象
wait(s){
while(s<=0);
s--;
}
signal(s)
{
s++;
}
增加了一个用于代表资源数目的整型变量value和一个进程链表指针list,用于表示连接上述的所有等待进程。
wait(*s){
s->value--;
if(s->value<0) block(s->list);
}
signal(*s){
s->value++;
if(s->value<=0) wakeup(s->list);
}
s->value的初值表示系统中某类资源的数目,也称为资源信号量
wait操作意味着进程请求一个单位的该类资源,使系统中可供分配的该类资源减一
s->value<0时,表示该类资源已经分配完毕,因此进程应调用block原语进行自我阻塞,放弃处理机,此时s->value的绝对值表示该信号量链表里所阻塞进程的数目。
signal操作表示执行进程释放一个单位资源,使系统中可供分配的该类资源增加一个
若加1后s->value<=0,表示在该信号量链表中仍有等待该资源的进程被阻塞
若s->value的初值为1,则表示系统内只允许一个进程访问临界资源,此时的信号量称为互斥信号量,用于进程互斥
若s->value > 1,则信号量S表示资源信号量
将进程在整个运行过程中所需要的所有资源,一次性全部分配给进程,将进程使用完在一起释放,要么把他所请求的资源全部分配,要么一个也不分配
为使多个进程能互斥地访问某临界资源,只需为该资源设置一互斥信号量mutex,设其初始值为1 ,然后将各进程访问该资源的临界区CS置于wait(mutex)和signal(mutex)操作之间即可。
每个欲访问该临界资源的进程在进入临界区之前,都要先对mutex执行wait操作,若该资源此刻未被访问,本次wait操作必然成功,进程便可进入自己的临界区,这时若再有其它进程也欲进入自己的临界区,由于对mutex执行wait操作定会失败,因而此时该进程阻塞,从而保证了该临界资源能被互斥地访问。当访问临界资源的进程退出临界区后,又应对mutex执行signal操作,以便释放该临界资源
当mutex=1时,表示两个进程皆未进入需要互斥的临界区
当mutex=0时,表示有一个进程进入临界区运行
当mutex=-1时,表示有一个进程正在临界区运行,另外一个进程因等待而阻塞在信号量队列中,需要被当前已在临界区运行的进程退出时唤醒
wait(mutex)与signal(mutex)必须成对存在
信号量实现多个进程的互斥:
P1中有语句S1; P2中有语句S2。我们希望在S1执行后再执行S2。为实现这种前趋关系,只需使进程P1和P2共享一个公用信号量S,并赋予其初值为0,将signal(S)操作放在语句S1后面,而在S2语 句前面插入wait(S)操作。
由于S被初始化为0,这样,若P,先执行必定阻塞,只有在进程Pq执行完Sq; signal(S); 操作后使S增为1时,P2进程方能成功执行语句S2。
P1() {S1;signal (a) ;signa1(b); signal(c);}
P2() {wait(a) ;S2; signal(d) ;}
P3() {wait(b) ;S3; signal(e); signal(f);}
P4() {wait(c) ;S4; signal(g) ;}
P5() {wait(d); wait(e) ;S5; signal(h) ;}
P6() {wait(f); wait(g) ;S6; signal(i)}
P7() {wait(h); wait(i) ;S7; signal(j) ;}
P8() {wait(j) ;S8;}
有A、B两进程,A进程从卡片机读信息写入缓冲区,B进程负责取出并加工缓冲区的信息:缓冲区只能存放一个消息。
设信号量S1:缓冲区中有否可供加工的信息,初始值为0;
信号量的使用:
必须一次且只能置一次初值
初值不能为负(与物理意义有关)
只能由P,V操作修改值
信号量的物理意义:
当s>0时,s表示可用资源的个数
当s=0时,s表示无资源,无等待的进程
当s<0时,|s |表示等待队列中进程个数。
互斥的信号量: PV操作在同一个进程中
同步的信号量: PV操作在不同的进程中
一个管程定义了一个数据结构和能为并发进程所执行(在该数据结构上)的一组操作,这组操作能同步进程和改变管程中的数据。
1)管程的组成部分
①管程的名称;
②局部于管程的共享数据结构说明;
③对该数据结构进行操作的一组过程;
④对局部于管程的共享数据设置初始值的语句。
在利用管程实 现进程同步时,必须设置同步工具,如两个同步操作原语wait和signal。当某进程通过管程请求获得临界资源而未能满足时,管程便调用wait原语使该进程等待,并将其排在等待队列上仅当另一进程访问完成并释放该资源之后,管程才又调用signal原语,唤醒等待队列中的队首进程。
管程中的signal必须在wait之后
如果有进程Q因x条件处于阻塞状态,当正在调用管程的进程P执行了x.signal操作后,进程Q被重新启动,管程中便存在两个同时处于活动状态的进程,如何确定哪个执行哪个等待,可采用下述两种方式之一进行处理:
①P等待,直至Q离开管程或等待另一条件。
②Q等待,直至P离开管程或等待另一条件。
规定管程中的过程所执行的signal操作是过程体的最后一个操作,于是,进程P执行signal操作后立即退出管程,因而,进程Q马上被恢复执行。
定义两个同步信号量:
empty表示缓冲区是否为空,初值为1。
full表示缓冲区中是否为满,初值为0。
单缓冲区的同步问题
➢P进程不能往“满”的缓冲区中放产品,设置信号量为empty
➢C进程不能从“空”的缓冲区中取产品,设置信号量full
单缓冲区的互斥问题
➢P、C进程不能同时使用缓冲区
empty:说明空缓冲单元的数目,其初值为有界缓冲区的大小n。——同步
full:说明满缓冲单元的数目(即产品数目),其初值为0。——同步
mutex :说明该有界缓冲区是临界资源,必须互斥使用,初始值为1——互斥
它是一个同步问题
(1)消费者想要取产品,有界缓冲区中至少有一个单元是满的。
(2) 生产者想要放产品,有界缓冲区中至少有一个是空的。
它是一互斥问题
有界缓冲区是临界资源,因此,各生产者进程和各消费者进程必须互斥执行。
put(x)过程。生产者利用该过程将自己生产的产品投放到缓冲池中,并用整型变量count来表示在缓冲池中已有的产品数目,当count≥N时表示缓冲池已满生产者须等待,执行cwait(x)。
get(x)过程。消费者利用该过程从缓冲池中取出一个产品,当count≤0时,表示缓冲池中已无可取用的产品,消费者应等待
对于条件变量notfull和notempty,分别有两个过程cwait和csignal对它们进行操作:
①cwait(condition)过程: 当管程被一个进程占用时,其他进程调用该过程时阻塞,并挂在条件condition的队列上。
②csignal(condition)过程:唤醒在cwait执行后阻塞在条件condition队列.上的进程,如果这样的进程不止一个,则选择其中一个实施唤醒操作;如果队列为空,则无操作而返回。
本题中,应设置三个信号量s,so,sa,信号量s表示盘子是否为室,其初值为1,信号量S0表示盘中是否有桔子,其初值为0,信号量sa表示盘中是否有苹果,其初值为0。
请用wait、signal操作来保证文件的正确打印。
本题中,应设置四个信号量empty1、empty2、full1、full2,信号量empty1和empty2分别表示缓冲区1及缓冲区2是否为空,其初值为1;信号量full1和full2分别表示缓冲区1和缓冲区2是否有记录可供处理,其初值为0。
该问题是描述有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐完毕,放下筷子继续思考。
经分析可知,放在桌子上的筷子是临界资源,在.一段时间内只允许一位哲学家使用。为了实现对筷子的互斥使用,可以用一个信号量表示一只筷子,由这五个信号量构成信号量数组。其描述如下:semaphore chopstick[5]={1,1,1,1,1};所有信号量均被初始化为1,第i位哲学家的活动
一个数据文件或记录可被多个进程共享,我们把只要求读该文件的进程称为“Reader进程”,其他进程则称为“Writer进程允许多个进程同时读一个共享对象,因为读操作不会使数据文件混乱。但不允许一个Writer进程和其他Reader进程或Writer进程同时访问共享对象。因为这种访问将会引起混乱。
所谓“读者一写者(Reader-Writer Problem)问题"是指保证一个Writer进程必须与其他进程互斥地访问共享对象的同步问题。
两组并发进程:读者和写者,共享一组数据区
要求:
■允许多个读者同时执行读操作
■不允许读者、写者同时操作
■不允许多个写者同时操作
为实现Reader与Writer进程间在读或写时的互斥而设置了一个互斥信号量Wmutex。
另外,再设置一个整型变量Readcount表示正在读的进程数目。由于只要有一个Reader进程在读,便不允许Writer进程去写。因此,仅当Readcount=0,表示尚无Reader进程在读时,Reader进程才需要执行Wait(Wmutex)操作。
若wait(Wmutex)操作成功,Reader进程便可去读,相应地,做Readcount+1操作。
同理,仅当Reader进程执行了Readcount减1操作后其值为0时,才须执行signal(Wmutex)操作,以便让Writer进程写操作。又因为Readcount是一个可被多个Reader进程访问的临界资源,
因此,也应该为它设置一个互斥信号量rmutex.
即一旦有写者到达,后续的读者必须等待,而无论是否有读者在读文件。设置一个互斥信号量mutex=1
定义信号量S1控制P1与P2之间的同步; S2控制P1与P3之间的同步,empty控制生产者与消费者之间的同步; mutex控制进程间互斥使用缓冲区。程序如下:
将顾客号码排成一个队列,顾客进入银行领取号码后,将号码由队尾插入;柜员空闲时,从队首取得顾客号码,并且为这个顾客服务,由于队列为若干进程共享,所以需要互斥.柜员空闲时,若有顾客,就叫下一个顾客为之服务.因此,需要设置一个信号量来记录等待服务的顾客数.
设置countSN和countNS表示由南往北、由北往南已在桥上行驶的汽车数目,初值为0
设置SN表示对countSN的互斥,初值为1
设置NS表示对countNS的互斥,初值为1
设置mutex表示对桥的互斥,初值为1
semaphore empty=30;
//表示缸中目前还能装多少桶水,初始时能装30桶水
semaphore full=0;
//表示缸中有多少桶水,初始时缸中没有水
semaphore buckets= 5;
//表示有多少只空桶可用,初始时有5只桶可用
semaphore mutex_ well=1;
//用于实现对井的互斥操作
semaphore mutex_ bigjar= 1;
//用于实现对缸的互斥操作
(1)为描述读者的动作,应设置几个进程?
(2)试用wait、 signal操作描述读者进程之间的同步关系。
读者的动作有两个,一是填表进入阅览室,这时要考虑阅览室里是否有座位;一是读者阅读完毕,离开阅览室,这时的操作要考虑阅览室里是否有读者。读者在阅览室读书时,由于没有引起资源的变动,不算动作变化。
算法的信号量有三个:
seats表示阅览室 是否有座位(初值为100,代表阅览室的空座位数) ;
readers表示阅览室里的读者数,初值为0;
用于互斥的mutex,初值为1。
用wait、signal操作管理这些并发进程时,应怎样定义信号量,写出信号量的初值以及信号量各种取值的含义。
信号量S,初始值为20。
意义: S>0:S的值表示可继续进入售 票厅的人数
S=0:表示售票厅中已有20名顾客(购票者)
S<0:|S|的值为等待进入售票厅的人数
mutex=1表示进程间的互斥,生产与消费不能同时的互斥
full表示缓冲区中的产品个数,初值为0
empty表示缓冲区空位置,初值为1000
s表示一个消费者进程从缓冲区连续取出10件产品后,其他消费者进程才可以取产品的互斥,初值为1
A、B两人操作过程:
Semaphore mutexA=1; //A信箱放信件与取信件的互斥
Semaphore mutexB=1;//B信箱放信件与取信件的互斥
Semaphore emptyA=M-x;//A信箱空位置的数量
Semaphore emptyB=N-y;//B信箱空位置的数量
Semaphore fullA=x;//A信箱邮件个数
Semaphore fullB=y;B信箱邮件个数