美文网首页
第二章 经典同步问题(4)

第二章 经典同步问题(4)

作者: w王好人w | 来源:发表于2018-09-27 22:09 被阅读0次

    生产者-消费者的问题

    有多个生产者和消费者对n个缓冲区的使用。

    生产者

    produce an item in nexp; 

    wait(empty);

    wait(mutex);

    buffer(in):=nexp; 

    in:=(in+1) mod n;

    signal(mutex);

    signal(full);

    消费者

    wait(full);

    wait(mutex);

    nextc:=buffer(out); 

    out:=(out+1) mod n;

    signal(mutex);

    signal(empty);

    full是满信号量 empty是空信号量 这个比较好理解 放入的时候就wait(empty)看看是否有空来放入 放完后signal(full)满信号量加1 表示放入了一个 取的时候就先wait(full)看看缓冲区内是否有东西 取完后signal(empty)空信号量加1 表示空的区域又多了一个

    mutex是缓冲区互斥的信号量 保证不能同时对一个缓冲区同时放入和取出。也不能同时多个消费者对同一个缓冲区同时取出。

    mutex要记住是缓冲区互斥的!!!

    哲学家进餐问题:

    五个哲学家共用一张圆桌, 分别坐在周围的五张椅子上,在 桌子上有五只碗和五只筷子,他 们的生活方式是交替地进行思考 和进餐。平时,一个哲学家进行 思考,饥饿时便试图取用其左右 最靠近他的筷子,只有在他拿到 两只筷子时才能进餐。进餐毕, 放下筷子继续思考。

    可见:相邻两位不能同时进餐; 最多只能有两人同时进餐。

    记录型信号量解决哲学家进餐问题:筷子是临界资源,在一段时间内只允许 一个哲学家使用。为实现对筷子的互斥使用, 用一个信号量表示一只筷子,五个信号量构 成信号量数组。 

    Var chopstick: array [0, …, 4] of semaphore; 所有信号量均被初始化为1。

    第i位哲学家的活动描述为:

    repeat

    wait(chopstick[ i ]);

    wait(chopstick[ ( i +1) mod 5];

    eat; 

    signal(chopstick[ i ]); 

    signal(chopstick[ ( i +1) mod 5] );

    think; 

    until false;

    就餐死锁问题

    假如五位哲学家同时饥饿而各自拿起左 边的筷子时,就会使五个信号量chopstick 均为0,当他们再试图去拿右边的筷子时,都 将因无筷子可拿而无限等待。

    解决方法: 数量控制: 至多只允许有四位哲学家同时去拿左 边的筷子,最终能保证至少有一位哲学家 能够进餐,并在用毕后释放出他用过的两 只筷子,从而使更多的哲学家能够进餐。--限制并发执行的进程数 一刀切: 仅当哲学家的左右两只筷子均 可用时,才允许他拿起筷子进餐。 ---采用AND信号量。

    在哲学家进餐问题中,要求每个哲学家先获得两个临界 资源(筷子)后方能进餐。

    Var chopstick: array [0, …, 4] of semaphore:=(1, 1, 1, 1, 1); Process i repeat think; Swait(chopstick[ ( i +1) mod 5] , chopstick[ i ] ); eat; Ssignal(chopstick[ ( i +1) mod 5] , chopstick[ i ] ); until false;

    规定奇数号哲学家先拿他左边的 筷子,然后再去拿右边的筷子;偶数 号哲学家则相反。保证总会有一个哲 学家能同时获得两只筷子而进餐 

    读者写者问题:

    一个数据文件被多个进程共享。Reader进程 只要求读文件,Writer进程要求写入内容。 

    同步关系是:

    多个读进程可同时读,Writer进程与任何其他进程(包括 Reader进程或其他Writer进程)不允许 同时访问文件。

    readcount 表示正在读的进程数目,防止多个读者对readcount操作出问题 加互斥信号量 初值1

    semaphore rmutex=1,wmute=1;

    int readcount=0;

    void reader()

    {

    do{

    wait(rmutex);

    if(readcount==0)

    wait(wmutex);

    readcount++;

    signal(rmutex);

    .....

    wait(rmutex);

    readcount--;

    if(readcount==0)

    signal(wmutex);

    signal(rmutex);

    }while(1)

    }

    void writer()

    {do{

    wait(wmutex);

    write

    signal(wmuex);

    }while(1)

    相关文章

      网友评论

          本文标题:第二章 经典同步问题(4)

          本文链接:https://www.haomeiwen.com/subject/cmzjoftx.html