操作系统原理一:进程管理 (4)

互斥关系:A,B共享一个缓冲区,互斥

PA(){ while(1){ wait(s); // 临界区 signal(s); // 剩余区 } } PB(){ while(1){ wait(s); // 临界区 signal(s); // 剩余区 } } main(){ s=1; //init // begin PA(); PB(); // end }

前驱关系:P1,P2同步,P2→P1

PA(){ P(s); a1; } PB(){ a2; V(s); }

总结:

互斥的模式:PV总是成对出现在同一进程中;

同步的模式:PV总是成对出现在不同进程中;

前驱关系:有多少前驱关系设置多少个信号量,初值为0;有多少前驱做多少P操作,有多少后继结点做多少V操作,无前驱不做P操作。

信号量表示的是临界资源数
初值为2,表示初始时有2个可用的资源,若现在为-1,说明这两个可用资源已经被占用了,而且有一个进程在等待资源
初值为3,表示初始时有3个可用的资源,若现在为1,表示有两个资源被进程访问了,可用资源变为1,没有进程会等待

为了使两个进程同步运行,至少2个信号量

例题

1.桌上有一空盘,允许存放一只水果,爸爸可向盘内放苹果或桔子,儿子专等吃桔子,女儿专等吃苹果

semaphore s,so,sa=1,0,0; father(){ while(1) { wait(s); // 将水果放入盘中; if(放入的是桔子) then signal(so); else signal(sa); } } son(){ while(1){ wait(so); // 从盘中取出桔子 signal(s); // 吃桔子 } } daughter() { while(1){ wait(sa); // 从盘中取出苹果 signal(s); // 吃苹果 } } main() { // cobegin father(); son(); daughter(); // coend }

2.某寺庙,有小、老和尚若干,由小和尚提水入缸供老和尚饮用,水缸可容10桶水,水取自同一个井中,水井窄,每次只能容一个桶取水,水桶总数3个,每次入缸取水桶仅为1桶,且不可同时进行,试给出有关取水,入水的算法

mutexj = 1; mutexg = 1; empty = 10; full = 0; count = 3; old(){ while(1) { wait(full); //缸中有无水 wait(count); //有无桶 wait(mutexg); //取水前 Fetch from gang; signal(mutexg); signal(count); signal(empty); //通知小 } } little(){ while(1) { wait(empty); //缸中有无空 wait(count); //有无桶 wait(mutexj); //取水前 Fetch from well; signal(mutexj); wait(mutexg); //倒水前 pour; signal(mutexg); signal(count); signal(full); //通知老 } } 记录型信号量

整形信号量中S<=0就会不断地测试,未遵循让权等待,而是处于忙等

解决方案:建立一个进程链表list,连结所有等待该类资源的进程

typedef struct{ int value; struct process_control_block *list }semaphore; wait(semaphore *S){ S->value--; if(S->value < 0) block(S->list); } signal(semaphore *S){ S->value--; if(S->value <= 0) wakeup(S->list); }

S->value>0时,表示系统中可用资源的数目

当S->value<0时,S->value的绝对值表示阻塞进程的数目

如果S->value的初值为1,表示只允许一个进程访问临界资源,此时的信号量转化为互斥信号量

AND信号量

要么全分配,要么一个也不分配

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zypfsj.html