第2章信号量概念和互斥

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(1)解 设信号量 MUTEX=1
wait (MUTEX) 过桥 signal (MUTEX)
mxh
(2)当独木桥上有行人时,同方向的行人可 以同时过桥,相反方向的人必须等待。
同向的第1人申请过桥权 wait(),后面过去,不用 申请 同方向过桥 分析: 1. 东西方向互斥的信 号量,MUTEX=1
mxh
Wait和signal原语的物理意义
• 每执行一次wait操作,意味着请求分配一个单位的资源 ,描述为s.value=s.value-1; 当s.value<0表示已无资源 ,请求该资源的进程将被阻塞。|s.value|表示等待该信 号量的等待进程数。
• 每执行一次signal操作,意味着释放一个单位的资源,描 述为s.value=s.value+1;若s.value<=0表示仍有被阻塞 进程。将被阻进程队列中的第一个进程唤醒插入就绪队 列中。
2.4.3 信号量机制
1. 整型信号量
最初由 Dijkstra把整型信号量定义为一个整型量,除初
始化外,仅能通过两个标准的原子操作(Atomic Operation)
wait(S) 和 signal(S) 来访问。这两个操作一直被分别称为 P 、 V操作。 wait和signal操作可描述为:
wait(S): {while (S≤0) ;
mxh
例如,系统中有 2、 台打印机,三个进程使用打印机。系统设置 用P V操作解决进程间互斥问题 一个资源信号量s,初值=2。 P1 P2
2) s- 1= 0 进入临界资源
P3
wait(s)
3)s-1=-1 P3阻塞
1) s- 1= 1 进入临界资源
wait(s)
wait(s)
signal(s)
wait(s) 临界区1
进程P(i)
wait(s) 临界区i

进程P(n)
wait(s) 临界区n
signal(s)
signal(s)
signal(s)
mxh
使用信号量解决第一个例子
进程PIN 进程POUT
wait(s) count→R1
wait(s)
count→R2
R2+2→R2
R1→count
其中:s.value=1,表示无进程进入临界区 s.value=0,表示已有一个进程进入临界区 s.value=-1,表示已有一个进程正在等待进入临界区 当用s来实现n个进程的互斥时,n>2, 互斥信号量s.value仅 能取 -(n-1) 到 1。
mxh
Wait和signal原语的物理意义
• 每执行一次wait操作,意味着请求分配一个单位的资源 ,描述为s.value=s.value-1; 当s.value<0表示已无资源 ,请求该资源的进程将被阻塞。|s.value|表示等待该信 号量的等待进程数。
signal(mutex)
6)Mutex+1=1
1)Mutex-1=0
wait(mutex)
wait(mutex)
signal(mutex)
signal(mutex)
4)Mutex+1=-1
5)Mutex+1=0
唤醒P3
临界区
唤醒P2
mxh
对于互斥
当仅有两个并发进程共享临界资源时,即n=2时,互斥信号 量s.value仅能取:-1 , 0 ,1三个值。
mxh
从东向西: wait(MD) IF (CD=0) {wait(MUTEX) } CD=CD+1 signal(MD) 过桥 wait(MD) CD=CD-1 IF (CD=0) {signal(MUTEX) } signal(MD)
mxh
从西向东: wait(MX) IF (CX=0) {wait(MUTEX) } CX=CX+1 signal(MX) 过桥 wait(MX) CX=CX-1 IF (CX=0) {signal(MUTEX) } signal(MX)
mxh
• signal(s) signal(semaphore *s) { s.value ++; 操作描述:
}
if (s.value<=0) wakeup(s.list);
signal原语的操作主要动作是: (1) s.value加1; (2) 若s.value加1后,结果大于零,进程继续执行; (3) 若s.value加1,结果小于或等于零,则从该信号的 等待队列中唤醒一等待进程,然后再返回原进程继 续执行或转进程调度。
临界区
R1+1→R1
R1→count
临界区
Signal(s)
Signal(s)
mxh
例如,系统中有一台打印机,三个进程使用打印机。系统设 用P、V操作解决进程间互斥问题 置一个互斥信号量mutex,初值=1。 P1 P2
2)Mutex-1=-1 P2阻塞
P3
3)Mutex-1=-2 P3阻塞
wait(mutex)
cobegin processin() ; processout() ; coend }
mxh
例2:独木桥
有一座东西方向的独木桥,用wait, signal操作实 现: (1)每次只允许一个人过桥; (2)当独木桥上有行人时,同方向的行人可以同 时过桥,相反方向的人必须等待。
mxh
(1)每次只允许一个人过桥;
前驱关系:S1→S2→S3,进程P1、P2、P3。
semaphore mutex1,mutex2; mutex1.value=mutex2.value=0;
P1 () { …. S1; signal(mutex1) ; …. } P2 () { …. wait(mutex1); S2; signal(mutex2); …. } P3() { …. wait(mutex2); S3; …. }
semaphore mutex1,mutex2; mutex1.value=mutex2.value=0;
P1 () { …. S1; signal(mutex1) ; signal(mutex2); …. }
mxh
P2 () { …. wait(mutex1); S2; …. }
P3() { …. wait(mutex2); S3; …. }
wait(semaphore *s) { s.value --; if (s.value<0) block(s.list); }
原语操作的主要动作是: (1) s.value减 1; (2) 若s.value减1后仍大于或等于零,则进程继续执行; (3) 若s.value减1后小于零,则该进程被阻塞后进入与 该信号相对应的队列中,然后转进程调度。
Wait(s) ;
R1:=count ; R1:=R1+1 ; count:=R1;
Wait(s) ;
R2:=count ; R2:=R2-1 ; count:=R2;
signal(s) ;
} main() { }
signal(s) ;
int count=n; semaphore s; s.value=1;
S--;}
signal(S): {while (S≤0) ;
S++;}
mxh
2.记录型信号量
• 记录型信号量结构:
typedef struct{
int value; } semaphore; &&信号量的值 struct PCB: list; &&在此信号量上的阻塞链表
mxh
• Wait(s)操作 描述:
mxh
• 互斥问题中
–对信号量mutex必须设置一次初值,初值必
须为1。
–wait、signal 原语操作应该分别紧靠临界区的头 部和尾部。 –wait、signal 原语操作必须成对出现,而且它们 同处于同一个进程中。
wait、signal原语不能次序错 误、重复或遗漏
mxh
• 进程互斥模型
–n个进程共享一个信号量mutex, 并初始化为1。 每个进程Pi的组织结构如下: while(1){ ……
mxh
互斥应用描述步骤如下
• 1. 定义互斥信号量 • 2. 进程过程描述 临界区前后用wait、signal • 3. 主程序描述 并发进程调用放在cobegin和coend之间
mxh
例1:游艺场例子
void processin() { int R1 ;
void processout() { int R2 ;
wait(mutex) 临界区(CS) signal(mutex) 剩余区 进程互斥 模型
}
mxh
用信号量实现进程互斥
利用信号量能方便地解决临界区问题。 设有n个进程,用数组P(i)表示,设与n个进程共享的临界 资源对应的互斥信号量为s。信号量初始化为1,表示初始状 态时共享资源是空闲的。只需把各个进程临界区的程序段置 于wait(s)和signal(s)之间即可实现n个进程的互斥。 进程P(1) …
2. 统计同方向的人数 的变量,CountD=0 3. 对计数变量的互斥 访问的信号量,MD=1
同向的最后1人释放过桥 权signal()
mxh
(2)当独木桥上有行人时,同方向的行人可 以同时过桥,相Байду номын сангаас方向的人必须等待。
同向的第1人申请过桥权 wait(MUTEX),后面过去 ,不用申请 wait(MD); IF (CD=0) {wait(MUTEX); } CD=CD+1; signal(MD); 同方向过桥 wait(MD); CD=CD-1; IF (CD=0) {signal(MUTEX); } signal(MD);
同方向过桥
同向的最后1人释放过桥 权signal(MUTEX)
mxh
(2)当独木桥上有行人时,同方向的行人可 以同时过桥,相反方向的人必须等待。
(2)解: 设信号量: MUTEX=1 (东西方互斥); MD=1 (东向西使用计数变量互斥) MX=1 (西向东使用计数变量互斥) 设整型变量: CD=0 (东向西的已上桥人数) CX=0 (西向东的已上桥人数)
P3() { …. wait(mutex1); wait(mutex2); S3; …. }
mxh
P1( ) { S1; signal(a); signal(b); } P2( ) { wait(a); S2; signal(c); signal(d); } P3( ) { wait(b); S3; signal(e); } P4( ) { wait(c); S4; signal(f); } P5( ) { wait(d); S5; signal(g); } P6( ) { wait(e); wait(f); wait(g); S6; } main( ) {
• 每执行一次signal操作,意味着释放一个单位的资源,描 述为s.value=s.value+1;若s.value<=0表示仍有被阻塞 进程。将被阻进程队列中的第一个进程唤醒插入就绪队 列中。
mxh
原语的物理意义
• S>0时,S表示可使用资源数,
• S=0时,表示已无资源可用,或表示不允许进程再进。 • S<0时,|s|表示等待使用资源的进程个数。
mxh
P1 () { …. S1; //语句S1 signal(S); …. }
P2 () { …. wait(S); S2; //语句2 …. }
前驱关系:S1→S2和S1→S3。有三个进程P1、 P2、P3,P1中有程序段S1,P2中有程序段S2,P3 中有程序段S3,在它们并发执行时,希望S1先执行 ,然后S2、S3才执行,S1→S2、S1→S3。 解决办法:设置两个信号量mutex1、mutex2, 分别用来标志前驱关系S1→S2、S1→S3。
6 )s +1 =2 释放资源
signal(s)
signal(s)
4 ) s +1 =0
5 )s +1 =1
释放资源
临界区
唤醒P3
mxh
2. 利用信号量实现前趋关系 P1 () { …. S1; //语句S1 …. }
P2 () { …. S2; //语句2 …. }
希望 S1 S2,只需使进程P1和P2共享一个公用信号量S=0, 将signal(S)放在语句S1后,将wait(S)放在语句S2前。
mxh
前驱关系:S1→S3和S2→S3,进程P1、P2、P3。
semaphore mutex1,mutex2; mutex1.value=mutex2.value=0;
P1 () { …. S1; signal(mutex1) ; …. }
P2 () { …. S2; signal(mutex2); …. }
信号量的类型
信号量分为:互斥信号量和资源信号量。 互斥信号量用于申请或归还资源的使用权,常初 始为1; 资源信号量用于申请或归还资源,可以常初始为 大于1的正整数,表示系统中某类资源的可用个 数。 Wait操作用于申请资源(或使用权),进程执行 wait原语时,可能会阻塞自己。 signal操作用于释放资源(或归还使用权),进 程执行signal原语时,会唤醒一个阻塞进程。
相关文档
最新文档