第三章 进程互斥与同步

20
第第第 第第第第第第第 第第第 第第第第第第第

description

第三章 进程互斥与同步. 主要内容. 进程的同步和互斥机制的主要任务:控制并发执行的诸进程之间能有效地共享和相互协作,同时使并发执行的程序仍具有可再现性。 进程互斥 进程同步 利用信号量机制解决具体问题. 进程间的关系. 并发系统中诸进程由于资源共享、进程合作,而产生进程之间的相互制约;又因共享资源的方式不同,而导致 两种不同的制约关系 : 1 间接制约关系(进程互斥) 由于共享资源而引起的临界区内不允许并发进程交叉执行的现象。由共享公有资源而造成的对并发进程执行速度的间接制约 2 直接制约关系(进程同步) - PowerPoint PPT Presentation

Transcript of 第三章 进程互斥与同步

Page 1: 第三章 进程互斥与同步

第三章 进程互斥与同步第三章 进程互斥与同步

Page 2: 第三章 进程互斥与同步

主要内容

进程的同步和互斥机制的主要任务:控制并发执行的诸进程之间能有效地共享和相互协作,同时使并发执行的程序仍具有可再现性。

进程互斥 进程同步 利用信号量机制解决具体问题

Page 3: 第三章 进程互斥与同步

进程间的关系

并发系统中诸进程由于资源共享、进程合作,而产生进程之间的相互制约;又因共享资源的方式不同,而导致两种不同的制约关系:1 间接制约关系(进程互斥) 由于共享资源而引起的临界区内不允许并发进程

交叉执行的现象。由共享公有资源而造成的对并发进程执行速度的间接制约

2 直接制约关系(进程同步) 由于并发进程互相共享对方的私有资源所引起的

直接制约。

Page 4: 第三章 进程互斥与同步

临界资源

象打印机这类资源一次只允许一个进程使用的资源称为临界资源。属于临界资源有硬件打印机、磁带机等,软件有消息缓冲队列、变量、数组、缓冲区等。当然还有一类象磁盘等资源,它允许进程间共享,即可交替使用,所以它称为共享资源,而临界资源又称独享资源。

Page 5: 第三章 进程互斥与同步

举例 : 临界资源

P1: R1=count;R1=R1+1;count=R1;

P2: R2=count;R2=R2+1;count=R2;

进程 P1 和 P2 共享变量 count, R1 和 R2 是处理机中的寄存器

若执行顺序变为P1: R1=count;P2: R2=count;P1: R1=R1+1;

count=R1;P2: R2=R2+1;

count=R2;

Page 6: 第三章 进程互斥与同步

临界区 Critical sections

多个进程共享临界资源时必须互斥使用,例如A 和 B 两个进程都需要使用打印机,它们必须互斥使用。如果为了保证结果的正确性限制 A 、B 二进程推进序列,规定进程 A 执行好再执行进程 B ,这样的限制就显得过死,因为它已不能保证进程 A 、 B 能并发执行,所以必须把限制减少到最少,以尽可能支持并发执行。为此把各进程分解,把访问临界资源的那段代码(称为临界区)与其它段代码分割开来,只对各种进程进入自己的临界区加以限制,即各进程互斥地进入自己的临界区。

Page 7: 第三章 进程互斥与同步

举例 : 临界区

While ( 1 ) {

……

entry_section; // 申请进入critical_section; // 临界区exit_section; // 声明退出………

}

Page 8: 第三章 进程互斥与同步

进程同步机制

进程在并发执行时为了保证结果的可再现性,各进程执行序列必须加以限制以保证互斥地使用临界资源,相互合作完成任务。

多个相关进程在执行次序上的协调称为进程同步。用于保证多个进程在执行次序上的协调关系的相应机制称为进程同步机制。

准则– 空闲让进– 忙则等待– 阻塞等待– 有限等待

Page 9: 第三章 进程互斥与同步

一个由临界区和剩余区 1 和剩余区 2 程序段组成的进程采用进程同步机制后的描述如下:{ remainder section 1 ; 剩余区 1

进入区 ; critical section ; 临界区

退出区 ; remainder section 2 ; 剩余区 2

} 进程同步机制在临界区前加上进入区,它负责对欲访问

的临界资源状态进行检查,以决定是允许该进程进入临界区还是等待。同时在临界区后加上退出区,它负责释放临界资源以便其它等待该临界资源的进程使用。

实现进程互斥和同步的信号量机制有软件方法、硬件指令方法、信号量机制和管程等。

Page 10: 第三章 进程互斥与同步

互斥 - 软件的忙等待方法 -1算法 1int flag[2]={ 0, 0 }Cobegin

void P0(void){ while( 1 ) {

while ( flag[1] == 1) ;flag[0] = 1;……; //P0 的临界区代码flag[0] = 0;…….; // P0 的非临界区代码

}}void P1(void){ while( 1 ) {

while ( flag[0] == 1) ;flag[1] = 1;……; // P1 的临界区代码flag[1] = 0;…….; // P1 的非临界区代码

}}

Coend

Page 11: 第三章 进程互斥与同步

互斥 - 软件的忙等待方法 -2算法 2

int turn = 0;

Cobegin

void P0(void)

{ while( 1 ) {

while ( turn != 0 ) ;

……; //P0 的临界区代码turn = 1;

…….; // P0 的非临界区代码}

}

void P1(void)

{ while( 1 ) {

while ( turn != 1 ) ;

……; // P1 的临界区代码turn = 0;

…….; // P1 的非临界区代码}

}

Coend

1.P0 每小时进一次而 P1 每小时进入 1000次2. 若某进程发生意外永远不能运行… ..

Page 12: 第三章 进程互斥与同步

互斥 - 软件的忙等待方法 -3

Peterson 1981 为了防止二进程为进入临界区而无限期等待,

又设置变量 turn ,表示不允许进入临界区的编号,每个进程在先设置自己标志后再设置 turn标志,不允许另一个进程进入,这时再同时检测另一个进程状态标志和不允许进入标志,这样可以保证当二个进程同时要求进入临界区时,只允许一个进程进入临界区。

仅适用于两个进程互斥

Page 13: 第三章 进程互斥与同步

互斥 - 软件的忙等待方法 -3

算法 3Int flag[2] = { 0, 0 }Int turn = 0; Cobegin

void P0(void){ while( 1 ) {

flag [ 0 ] =1; //P0 申请进入临界区turn = 1;while( flag[1] == 1 && turn ==1) ; // 等待获准进入……; //P0 的临界区代码flag[ 0 ] =0; // 声明退出临界区…….; // P0 的非临界区代码

}}void P1(void){ while( 1 ) {

flag [ 1 ] =1; //P1 申请进入临界区turn = 0;while( flag[0] == 1 && turn ==0) ; // 等待获准进入……; //P0 的临界区代码flag[ 1 ] =0; // 声明退出临界区…….; // P1 的非临界区代码

}}

Coend

Page 14: 第三章 进程互斥与同步

互斥 - 硬件支持 1-禁止中断

提高临界区代码执行中断优先级– 这种方法在 UNIX 和 Windows NT 中都使用,它是

在单机系统中有效地实现互斥的一种方法。– 因为在传统操作系统中,打断进程对临界区代码的

执行只有中断请求、中断被接受后,系统有可能还调用其它进程进入临界区,并修改此全局数据库。所以用提高临界区中断优先级方法就可以屏蔽了其它中断,保证了临界段的执行不被打断,从而实现了互斥。

Page 15: 第三章 进程互斥与同步

禁止中断举例Void Pi(void){

while ( 1 ) {disable_interrupts;……; // 临界区代码enable_interrupts;……; // 非临界区代码

}}

在多处理机情况下,用提高临界段代码执行的中断优先级方法是无法保证互斥的,因为在一个处理机上提高中断优先级并不能阻止其它处理器上的中断,所以必须采用其它方法。

Page 16: 第三章 进程互斥与同步

互斥 - 硬件支持 2-特殊机器指令

1 Test-and-Set 处理机指令 对于同一主存块访问要求,即使两个处理机同时提

出,存储控制逻辑也只能让其中之一先访问,但在一个处理机的两个存储周期间却可以插入另一个处理机的存储周期。现在用一条指令来完成检测和修改两个功能,这样中断和插入另一处理机的存储周期均不可能,所以不会影响此公用变量数据的完整性。

Page 17: 第三章 进程互斥与同步

Test-and-Set 的语义

int Test_and_Set( int target )

{

int temp;

temp = target;

target = 1;

return temp;

}

Page 18: 第三章 进程互斥与同步

Test-and-Set 的应用//lock 为被测试变量 , 初值为 0, 互斥进程 Pi(i=1,2...n) 调

用 TSvoid Pi( void ){

while (1) {while( Test_and_Set( lock))

;.....; //Pi 临界区代码lock = 0; // 退出临界区.....; //Pi 非临界区代码

}}

Page 19: 第三章 进程互斥与同步

互斥 - 硬件支持 2-特殊机器指令

2 swap 处理机指令 ,语义如下 :void swap(int a, int b){

int temp;temp = a;a = b;b = temp;

}

Page 20: 第三章 进程互斥与同步

Swap 的应用//lock 为公用变量 , 初值为 0( 表临界资源空闲 )//keyi 为进程 Pi 的对应变量 , 初值为 0 表示不要求进入临界区void Pi( void ){

while (1) {keyi = 1;while( keyi != 0 )

swap( lock, keyi );.....; //Pi 临界区代码lock = 0; // 退出临界区.....; //Pi 非临界区代码

}}