5 进程同步
5.1 进程同步的基本概念
5.1.1 并发性
进程的并发性是操作系统的基本特征,并发可以改善操作系统资源的利用率,提高系统的吞吐量。所谓并发性,是指一组进程执行在时间点上相互交替,在时间段上互相重叠。
5.1.2 与时间相关的错误
在多进程并发的情况下,进程共享某些变量或硬件资源,由于进程的执行具有不确定性,如果不对进程的执行加以制约,其执行结果往往是错误的。
从以上的分析可以看出,相同的程序由于指令的交错执行,最终的结果也不尽相同。这就要求使用进程同步及互斥机制,实现对共享资源的互斥访问,保证程序执行的正确性。
5.1.3 进程的同步与互斥
1. 进程的同步
进程同步,是指当进程运行到某一点时,若其他进程已完成了某种操作,使进程满足了继续运行的条件,进程才能够继续运行,否则必须停下来等待。通常将进程等待的那一点称为“同步点”,而将等待运行的条件称为“同步条件”。
相互协作的进程间经常存在数据或变量等共享资源,进程受到特定条件的限制,各进程需要严格按照固定的顺序执行,否则将导致程序的执行错误。
2. 进程的互斥
对系统中的某些进程来说,为保证程序的正确执行,必须相互协调共享资源的使用顺序。通常共享资源可分为互斥共享资源和可同时访问共享资源两类。互斥共享资源是指在某段时间内,只能有一个进程对该资源进行访问,其他进程若想访问该资源则必须停下来等待,直到该共享资源被前一个进程释放。可同时访问共享资源是指在某段时间内,可以有多进程同时对该资源进行访问,因而也不会存在进程互斥的问题。
5.1.4 临界资源和临界区
1. 临界资源
将只允许一个进程访问的共享资源称为临界资源,许多物理设备都属于你临界资源,如打印机、绘图仪等。另外,有很多变量,数据能由若干进程共享,这些共享变量及数据也属于临界资源。
2. 临界区
将程序中对临界资源访问的代码部分称为临界区。
临界区访问准则:
1)空闲让进:没有进程在临界区时,想进入临界区的进程可进入
2)忙则等待:任何时候,处于临界区内的进程不可多于一个,当已有进程在临界区时,其他欲进入的进程必须等待
3)有限等待:进入临界区的进程要在有限时间内完成并退出临界区,不能让其他进程无限等待
4)让权等待:如果进程不能进入自己的临界区,则应停止运行,让出处理器,避免进程出现“忙等”现象
5.2 互斥实现方法
5.2.1 硬件方法
1. 禁止中断
由于处理器只能在发生中断引起进程切换,因此关闭中断就能保证当前运行的进程将临界区代码执行完,从而保证了对临界区资源的互斥访问。
这种方法的优点是简单、方便,缺点是不适用于多处理器;不适用于用户程序;如果对临界区的访问时间较长,关中断的时间就会较长,从而限制了处理器并发能力。
2. TS(Test-and-Set)指令
S指令的功能是检查指定标志后把该标志置位,可以将TS指令看作一个不可中断的函数,该函数以一个测试标志为参数。当测试标志位时函数返回0,表示资源被占用,否则函数返回1,表示资源可被占用,同时将测试标志位置位。可描述为如下形式:
TS(key){
if(key==1){
return 0;
}else{
key=1;
return 1;
}
}
可使用如下TS指令实现临界区互斥:
while(!TS(key)); //测试标志位并置位,加锁
临界区;
key=0; //清标志位,解锁
进程在执行时首先检查标志位是否被置位,若未被置位则进入临界区,否则将循环进行测试。在进程访问完临界资源后,会将标志位清除,以保证其他进程可以进入临界区。
3. Swap指令
Swap对换指令的功能是交换两个字节的内容,该指令可用函数描述为如下形式。
Swap(a,b){
temp=a;
a=b;
b=a;
}
可使用如下Swap指令实现临界区互斥:
x=1;
while(x!=0) swap(&key,&x); //加锁
临界区;
key=0;
标志位key的初值被置为0,表示临界资源未被使用。进程在进入临界区时将使用Swap指令将key与x的值互换,若x值变为0,则表示临界资源可被占用,进程可进入临界区,否则将循环进行测试。在进程访问完临界资源后,通过将key置为0来释放其所占用的资源。
使用硬件方法管理临界区优点:
1)适用范围广。
2)方法简单。
3)支持多个临界区