4、进程同步:进程同步的概念和同步原则,临界资源和临界区的概念,信号量及其应用,经典进程同步问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/canyanruxue/article/details/78440015

进程同步的概念

临界资源:许多硬件资源如打印机、磁带机等,都属于临界资源(CriticalResouce)
临界区:人们把在每个进程中访问临界资源的那段代码称为临界区(critical section)
repeat
    entry section
    critical section;
    exit section 
    remainder section;
until false;

while(TRUE){
    进入区
    临界区
    退出区
    剩余区
}

同步机制应遵循的规则(同步原则)

    空闲让进:当无进程处于临界区时,表明临界资源处于空闲状态,应允许一个请求进入临界区的进程立即进入自己的临界区,以有效地利用临界资源;
    忙则等待:当已有进程进入临界区时,表明临界资源正在被访问,因而其它试图进入临界区的进程必须等待,以保证对临界资源的互斥访问。
    有限等待:对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区,以免陷入“死等”状态。
    让权等待:当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”状态。

硬件同步机制

1、关中断:进程在临界区执行期间,计算机系统不响应中断,从而不会引发调度。
2、Test-and-Set:原子操作(原语)
3、Swap
上述硬件指令能有效实现进程互斥,但当临界资源忙碌时,其他进程处于忙等状态,不符合“让权等待”

信号量机制

整型信号量 、记录型信号量、信号量集

整型信号量

  把整型信号量定义为一个用于表示资源数目的整型量S
  除初始化外,仅能通过两个标准的*原子操作*(Atomic Operation) wait(S)和 signal(S) 来访问
  在整型信号量机制中的wait 操作,只要是信号量 S≤0,就会不断地测试。因此,该机 制并未遵循“让权等待”的准则------》记录型信号量

记录型信号量

采用了记录型的数据结构
增加一个进程链表指针 L,用于链接上述的所有等待进程。
type semaphore =
                    record 
                        value: integer;
                        L: list of process;
                    end
    procedure wait(S) 
                var Ssemaphorebegin 
                    S.value:=S.value-1if S.value<0 then block(S.L);
                end
    procedure signal(S) 
                var S: semaphore; 
                begin 
                    S.value:=S.value+1if S.value<=0 then wakeup(S.L);
                end
wait中“if S.value<0”表示资源不足 ,则进程进行变成阻塞状态,放弃处理机,并插入到信号量链表S.L中。
signal中“if S.value<=0” 表示依然有因为没有得到资源而阻塞的进程,故“wakeup(S.L)”唤醒进程。

AND型信号量

(一个进程需要先获得两个或更多的共享资源后方能执行其任务)
 Swait(Simultaneous wait)

这里写图片描述
这里写图片描述

信号量集

原因:1、出现需要N 个某类临界资源的情况
     2、在有些情况下,为了确保系统的安全,当资源数量低于某一下限值时,便不予以分配。
方法:对AND信号量机制加以扩充,形成一般化的“信号量集” 机制。

这里写图片描述

信号量的应用

1.利用信号量实现进程互斥
semaphore mutex = 1;
    Pa(){
        while{
            wait(mutex);
            critical section
            signal(mutex);
            remainder seetion
        }
    }
    Pb(){
        while{
            wait(mutex);
            critical section
            signal(mutex);
            remainder seetion
        }
    }
2.利用信号量实现前趋关系
cobegin 和 coend 与 parbegin 和parend 一样 都是并发进程,并行开始、并行结束的意思。

这里写图片描述

P1(){S1;sign(a);sign(b)}
P2(){wait(a);S2;sign(c);sign(d);}
P3(){wait(b);S3;sign(e);}
P4(){wait(c);S4;sign(f);}
P5(){wait(d);S5;sign(g);}
P6(){wait(e);wait(f);wait(g);S6}
main(){
    semaphore a,b,c,d,e,f,g;
    a = b = c = d = e = f = g = 0;
    cobegain
        P1();P2();P3();P4();P5();P6();
    coend
}

管程机制(Monitors)

展开阅读全文

没有更多推荐了,返回首页