详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

这篇具有很好参考价值的文章主要介绍了详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. 利用信号量实现进程的同步和互斥

利用信号量实现进程互斥

利用信号量实现进程同步

2. 生产者消费者问题

3. 哲学家就餐问题

4. 读者写者问题

读者优先

写者优先

读者写者问题的变形

使用信号量解决读者写者问题

5. 经典同步问题例题

6. 管程机制

使用管程解决生产者消费者问题

管程与进程的区别

7. 进程通信

共享存储器

 消息传递系统

 管道通信

易错知识点




1. 利用信号量实现进程的同步和互斥

利用信号量实现进程互斥

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

  为使多个进程能互斥地访问某临界资源,只须为该资 源设置一个互斥信号量 mutex,并设其初始值为 1,然后将各进程访问该资源的临界区 CS 置于 wait(mutex) 和 signal(mutex) 操作之间即可。 在进程互斥中使用 P、V 操作,须在同一程序段成对出 现同一信号量的 P、V 操作,否则会造成系统瘫痪。

注意:

  实现互斥的信号量的PV操作必须在同一程序当中成对的出现

利用信号量实现进程同步

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

   与此同时,可以利用信号量来描述前趋图

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

 详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

wait和signal操作必须成对出现

同步的wait操作在互斥的wait操作前

2. 生产者消费者问题

  生产者—消费者”问题 (producer/consumer problem) 是最著名的进程同步问题。 它描述了一组生产者向一组消费者提供产品,它们共享 一个有界缓冲池,生产者向其中投放产品,消费者从中 取得产品。 它是许多相互合作进程的抽象,如输入进程与计算进 程;计算进程与打印进程等。

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

  设置两个资源信号量和一个互斥信号量

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

 注意:

empty是空缓冲区的数目,其初值是有界缓冲池的大小n

full满缓冲区的数目,其初值是1

互斥信号量的初值是1

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

注意:

  两个P操作的顺序不当会导致死锁的出现

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

3. 哲学家就餐问题

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

此算法可以保证不会有相邻的两位哲学家同时进餐。 若五位哲学家同时饥饿而各自拿起了左边的筷子,这使 五个信号量 chopstick 均为 0,当他们试图去拿起右边 的筷子时,都将因无筷子而无限期地等待下去,即可能 会引起死锁。

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

4. 读者写者问题

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

读者优先

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

  需要设置一个共享变量,两个互斥信号量

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

  需要注意的是,对于共享变量Readcount的访问也是互斥的。

  第一位读者阻止写者

  最后一位读者允许写者

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

写者优先

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

注意:

写者优先增加了一个读写互斥信号量S

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

读者写者问题的变形

 详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

 详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

使用信号量解决读者写者问题

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

5. 经典同步问题例题

 例题1:

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

例题2:

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

例题3:

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

例题4:

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

注意本题当中对S的PV操作,应该放在不同程序段,因为笼子里一次只可以放一个,必须消费者V操作以后,生产者才可以继续放。

 例题5:

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

 详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

例题6:

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

6. 管程机制

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

  基本思想: 把访问某种临界资源的所有进程的同步操作 都集中起来,构成一个所谓的“秘书”进程(管程), 凡是访问临界资源的进程,都需要报告“秘书”,由秘 书来实现诸进程的同步。

  管程的定义: 一个数据结构和在该数据结构上能被并发进程所执行的一组操作,这组操作能使进程同步和改变 管程中的数据。

  管程的组成:①管程的名称;②局部于管程内部的共享 数据结构说明;③ 对该数据结构进行操作的一组过程; ④ 对局部于管程内部的共享数据设置初始值的语句。

  管程中的共享变量在管程外部是不可见的,不能被任何 外部过程访问。管程相当于围墙,把共享变量和对它进 行操作的若干过程围了起来。 外部只能通过调用管程中所说明的外部过程(函数)来 间接地访问管程中的共享变量。 一个进程通过调用管程内的一个过程而进入管程。 管程通常是用来管理资源的,因而在管程中设有进程等 待队列以及相应的等待及唤醒操作。 管程每次只允许一个进程执行,从而实现了进程的互斥

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

使用管程解决生产者消费者问题

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

注意:此处的full 和 empty均为条件变量

 详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

 详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

管程与进程的区别

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

注意

管程定义是公共数据结构

7. 进程通信

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

共享存储器

 详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

 消息传递系统

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

 管道通信

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

易错知识点

1. 临界区是指进程当中用于访问临界资源的那段代码

2.  信号量机制是一种有效实现进程同步和互斥的机制;进程的并发执行不需要信号量。

3. 进程进入临界区必须满足互斥条件,进程进入临界区但没有离开就进入阻塞是可以的;

例如:

一个正在访问临界资源的的进程由于申请等待I/O操作而中断,它允许其他进程抢占处理器,但是它不允许其他进程进入它的临界区。

4. PV操作是一种低级进程通信原语;PV操作由一种不可中断的过程组成

5. 原语是不可分割的指令序列

6. 管程外过程调用管程内数据结构的说明不是管程的组成部分

7. 管程当中的signa操作与信号量机制当中的V操作不同,信号量机制当中的V操作一定会改变信号量的值S=S+1,但是管程当中的signal是针对某个条件变量的,若不存在因为该条件而阻塞的进程,则 signal不会产生任何影响

8. 信箱通信是一种间接通信

9. 管程不仅可以实现进程间的互斥,还可以实现进程间的同步;管程是由编程语言支持的进程同步机制;在任何时候,只可以由一个进程在管程当中;管程当中定义的变量只可以被管程内的过程访问

10. 若X是管程当中的条件变量,则当进程执行x.wait()时所做的工作是阻塞该进程,并将其插入x的阻塞队列。

11. 信号量机制可以实现让权等待文章来源地址https://www.toymoban.com/news/detail-409404.html

到了这里,关于详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

领支付宝红包 赞助服务器费用

相关文章

  • 线程同步--生产者消费者模型

    条件变量是 线程间共享的全局变量 ,线程间可以通过条件变量进行同步控制 条件变量的使用必须依赖于互斥锁以确保线程安全,线程申请了互斥锁后,可以调用特定函数 进入条件变量等待队列(同时释放互斥锁) ,其他线程则可以通过条件变量在特定的条件下唤醒该线程( 唤醒后线

    2024年01月19日
    浏览(28)
  • 线程同步--生产者消费者模型--单例模式线程池

    条件变量是 线程间共享的全局变量 ,线程间可以通过条件变量进行同步控制 条件变量的使用必须依赖于互斥锁以确保线程安全,线程申请了互斥锁后,可以调用特定函数 进入条件变量等待队列(同时释放互斥锁) ,其他线程则可以通过条件变量在特定的条件下唤醒该线程( 唤醒后线

    2024年01月20日
    浏览(33)
  • 【linux】线程同步+基于BlockingQueue的生产者消费者模型

    喜欢的点赞,收藏,关注一下把! 在线程互斥写了一份抢票的代码,我们发现虽然加锁解决了抢到负数票的问题,但是一直都是一个线程在抢票,它错了吗,它没错但是不合理。那我们应该如何安全合理的抢票呢? 讲个小故事。 假设学校有一个VIP学霸自习室,这个自习室有

    2024年02月03日
    浏览(89)
  • 【Linux】线程同步 -- 条件变量 | 生产者消费者模型 | 自旋锁 |读写锁

    举一个例子: 学生去超市消费的时候,与厂家生产的时候,两者互不相冲突。 生产的过程与消费的过程 – 解耦 临时的保存产品的场所(超时) – 缓冲区 模型总结“321”原则: 3种关系:生产者和生产者(互斥),消费者和消费者(互斥),生产者和消费者(互斥[保证共享资

    2024年02月14日
    浏览(28)
  • 【Linux学习】多线程——同步 | 条件变量 | 基于阻塞队列的生产者消费者模型

    🐱作者:一只大喵咪1201 🐱专栏:《Linux学习》 🔥格言: 你只管努力,剩下的交给时间! 以生活中消费者生产者为例: 生活中,我们大部分人都扮演着消费者的角色,会经常在超市买东西,比如买方便面,而超市的方便面是由供应商生成的。所以我们就是消费者,供应商

    2024年02月05日
    浏览(37)
  • 生产者与消费者问题

            本篇文章我们使用C++探讨一下生产者与消费者问题.          我们学习了操作系统, 知道了进程和线程的概念, 但是如果不进行代码实战的话, 会很难理解它们. 特别是编程的初学者(比如我), 在了解了进程和线程后通常会感到疑惑: 多线程怎么用? 为啥我平时写代码

    2024年02月12日
    浏览(32)
  • java生产者与消费者问题

    等待唤醒机制可以解决经典的“生产者与消费者”的问题。生产者与消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个(多个) 共享固定大小缓冲区的线程 ——即所谓的“生产者

    2024年02月15日
    浏览(26)
  • 【Linux】cp问题,生产者消费者问题代码实现

    生产者消费者模式就是通过一个容器 来解决生产者和消费者的强耦合问题 。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞

    2024年02月04日
    浏览(24)
  • 【JUC基础】06. 生产者和消费者问题

    学习JUC,就不得不提生产者消费者。生产者消费者模型是一种经典的多线程模型,用于解决生产者和消费者之间的数据交换问题。在生产者消费者模型中,生产者生产数据放入共享的缓冲区中,消费者从缓冲区中取出数据进行消费。在这个过程中,生产者和消费者之间需要保

    2024年02月05日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包