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

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

作者: Mr_Nuo | 来源:发表于2018-09-30 11:12 被阅读0次

1.生产者-消费者问题

有多个生产者和消费者对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),还原空。

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

2.哲学家进餐问题

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

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

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;

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

3.读者写者问题

一个数据文件被多个进程共享。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)

相关文章

  • 第二章 (四)经典同步问题

    1.生产者-消费者问题 有多个生产者和消费者对n个缓冲区的使用。 生产者 produce an item in n...

  • 第二章 经典同步问题

    生产者消费者问题:分析进程的交叉执行过程,体会信号量原语的控制作用到底表现在哪里。 写者-读者问题: 解决思路:设...

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

    生产者-消费者的问题 有多个生产者和消费者对n个缓冲区的使用。 生产者 produce an item in ne...

  • 冷月手撕408之操作系统(10)-经典同步互斥问题

    操作系统的经典同步互斥问题主要是介绍了 几个经典的同步互斥问题,其中搞懂生产者消费者问题、读者写者问题;其他的问题...

  • 经典同步互斥问题

    生产者消费者问题 生产者消费者应当是最最基本的同步互斥问题了。生产者生产了之后消费者才消费,消费者消费之后,通知生...

  • 同步和互斥

    同步和P-V操作 同步和互斥的概念 P-V操作的概念 P-V操作解决互斥问题 P-V操作解决同步问题 经典同步问题...

  • 经典进程的同步问题

    本文摘自汤小丹主编《计算机操作系统》(第三版)2.4 经典进程的同步问 在多道程序环境下,进程同步问题十分重要,也...

  • 操作系统:信号量与管程

    第10章:信号量与管程 信号量信号量使用互斥访问条件同步管程经典同步问题哲学家就餐问题读者-写者问题 10.1 信...

  • 二.进程(4)经典同步问题

    1.生产者—消费者问题 互斥、同步 2.哲学家就餐问题 互斥 3.读者——写者问题 有条件的互斥 1. 生产者—消...

  • 经典多线程同步问题详解

    前言 多线程同步问题是操作系统课程重点内容,是所有程序员解决并发问题无法绕开的一个领域,当然PHP、NodeJS例...

网友评论

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

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