news 2026/4/12 10:49:18

操作系统--进程同步问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
操作系统--进程同步问题

目录

1.生产者消费者问题

​2.读者写者问题

3.哲学家进餐问题

1.生产者消费者问题

一组生产者进程和一组消费者进程共享一个初始为空,大小为n的缓冲区

只有缓冲区没满时,生产者才能把消息放入缓冲区,否则必须等待;只有缓冲区不空时,消费者才能从中取出消息,否则必须等待。(两对同步关系)

缓冲区是一个临界资源,它只允许一个生产者放入消息,或者一个消费者从中取出消息。(互斥关系)

2.读者写者问题

有读者和写者两组并发进程,共享一个文件,当两个或以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程或写进程)同时访问共享数据时则可能导致数据不一致的错误。

因此,需要满足:

1.允许多个读者可以同时对文件进行读操作

2.只允许一个写者往文件中写信息

3.任一写者在完成写操作之前不允许其他读者或写者工作

4.写者执行写操作前,应让已有的读者和写者全部退出

(1)关系分析:写者和读者互斥,写者和写者互斥,读者和读者不存在互斥关系。

(2)整理思路:写者和任一进程都是互斥的,读者和读者同步,和写者互斥,因此需要设置计数器,用它来判断当前是否有读者读文件,当有读者读文件时,写者无法写文件,读者一直占用文件,当没有读者时,写者才可以写文件。同时,读者对计数器的访问也应该是互斥的。
(3)信号量的设置:首先设置信号量count为计数器,用来记录当前读者的数量,初值为0,设置mutex 为互斥信号量,用来保护更新count变量的互斥,设置互斥信号量rw,用来保证读者和写者的互斥访问

上述算法,读进程是优先的,即当存在读进程时,写操作将被延迟,且只要有一个读进程活跃,随后而来的读进程都将被允许访问,这样可能会导致写进程长时间等待,且存在写进程“饿死”的情况。

3.哲学家进餐问题

一张圆桌边上坐着5名哲学家,每两名哲学家之间的桌子上摆一根筷子,两根筷子中间是一碗米饭,哲学家进行思考和进餐,在思考时,并不影响他人,只有当饥饿时,才会试图拿起左右两根筷子,若筷子已在他人手上,则需要等待,饥饿的哲学家只能同时拿到两根筷子才能进餐,进餐完毕,放下筷子继续思考。

(1)关系分析:5名哲学家与左右邻居对其中间筷子的访问是互斥关系。
(2)整理思路:本题有5个进程,如何让一名哲学家拿到左右两根筷子而不造成死锁或饥饿现象。即同时拿起两根筷子,或对每名哲学家制定拿筷子的规则。
(3)信号量的设置:定义互斥信号量数组:chopstick[5]={1,1,1,1,1},用于对5个筷子的互斥访问,哲学家按序号0~4,哲学家i左边筷子的编号为i,哲学家右边筷子的编号为(i+1)%5。

该算法存在以下问题,当5名哲学家都想要进餐并且分别拿起左边筷子时,筷子都被拿光,等到他们再想去拿右边筷子时,就全被阻塞,因此出现了死锁。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!