对多个相关进程再执行次序上进行协调,使并发执行的诸程序之间能按照一定的规则共享系统资源,并能很好的相互合作,从而使程序的执行具有可在现性。
同步机制应遵循的规则
- 空闲让进:临界资源处于空闲状态,应允许进程进入,以有效地利用临界资源。
- 忙则等待:临界资源正在被访问,则进程必须等待空闲时进入。
- 有限等待:应保证各进程再有限的事件内能够进入临界区。
- 让权等待:当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入"忙等"状态。
硬件同步机制
- 虽然可以用软件方法解决诸进程互斥进入临界区的问题,但是有一定的难度,并且局限性很大,因此很少采用。
关中断
- 关中断是实现互斥的最简单的方法之一。
- 在进入锁测试之间关闭中断,直到完成锁测试并关上锁之后才能打开中断。
- 这样,在执行期间,计算机系统不响应中断,从而不会发生调度,就不会发生进程或线程的切换。
关中断的缺点
- 滥用关中断全力可能导致严重后果
- 关中断时间过长,会影响系统效率,限制了处理机交叉执行程序的能力。
- 关中断方法不适用于多CPU系统,因为在一个处理机上关中断并不能防止进程在其他处理机上执行相同的临界段代码。
Test-and-Set指令实现互斥
do{
...
while(TS(&lock));//直到lock=true
critical section;//进入临界区
lock = false;//释放lock
remainder section;
}while(true)
boolean TS(boolean *lock){
//*lock = true表示该资源正在被使用
//*lock = false表示该资源空闲
boolean old;
old = *lock;
*lock = TRUE;
return old;
}
Swap指令实现进程互斥
do{
key = true;
do{
swap(&lock,&key);
}while(key != false);//lock = false则循环结束
临界区操作
lock = false;
...
}while(true)
void swap(boolean *a,boolean *b){
boolean temp;
temp = *a;
*a = *b;
*b = temp;
}
信号量机制
整型信号量
通过两个原子操作wait(S) 和 signal(S)来访问
wait(S){
while(S<=0);//s < 0 则一直等待
s--;
}
signal(S){
S++;
}
- 由于s<=0就会不断测试,不符合让权等待准则
记录型信号量
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);
}
AND型信号量
- 基本思想:将进程在整个运行过程中需要的所有资源,一次性全部分配给进程,待进程使用完后再一起释放。只要尚有一个资源未能分配给进程,其他所有可能为之分配的资源也不分配给它。
Swait(S1,S2,...,Sn){
while(true){
if(Si >= 1 && ... && Sn >= 1){
for( i = 1 ; i <= n ; i++ ) Si--;
break;
}
else{
place the process in the waiting queue associated with the first Si found with
Si < 1 , and set the program count of this process to the beginning of Swait
operation
//如果信号量不够,则将进程放入就绪队列
}
}
}
Ssignal(S1,S2,...,Sn){
while(true){
for(i = 1;i <= n ;i++){
Si++;
Remove all the process waiting in the queue associated with Si into
the ready queue
}
}
}
信号量集
- Swait(S,d,d),此时在信号集中只有一个信号量S,但允许它每次申请 d 个资源,当现有资源少于d时,不予分配。
- Swait(S,1,1),此时为记录型信号量或互斥型信号量。
- Swait(S,1,0),这是一种很特殊且很有用的信号量操作,当S>= 1时,允许多个进程进入某特定区;当S变为0后,将阻止任何进程进入特定区。
本文详细探讨了进程间同步的规则,如空闲让进、忙则等待等,以及硬件同步方法如关中断和Test-and-Set、Swap指令的应用。重点讲解了信号量机制(整型、记录型、AND型和信号量集),展示如何解决并发控制问题。
632

被折叠的 条评论
为什么被折叠?



