操作系统笔记(五)信号量,经典的IPC问题(读写者问题...)

信号量 

一个信号量是一个包含两部分内容的数据结构:    

(a) 一个整数计数器, COUNT    

(b) 一个记录阻塞进程ID的队列, Q

信号量有两个原子操作:  

UP(V操作) 和 DOWN (P操作)

DOWN(S):     

if (S.count > 0)         

  S.count = S.count - 1;   

 else       

  block(P);

即,                      

 (a) 将 P进程的pid 插入 S.Q                        

(b) 阻塞进程 P                    

 (c) 将控制权交给调度进程

UP(S):             

if (S.Q is nonempty)             

wakeup(P) 唤醒 S.Q中的某个P; 即:                        

(a) 将进程P的pid从队列S.Q中移除                      

  (b) 将进程P的pid插入就绪队列                      

  (c) 将控制权交给调度进程             

else             

S.count = S.count + 1;

利用信号量实现互斥

semaphore mutex = 1;  

// set mutex.count = 1    

DOWN(mutex);     

- critical section -    

UP(mutex);

信号量通过引入阻塞避免了忙等待。

习题:

设两个进程共用一个临界资源的互斥信号量mutex,当mutex=1时表示()

A 一个进程进入了临界区,另一个进程在等待;

B没有一个进程进入临界区;

C 两个进程都进入临界区;

D 两个进程都在等待;

经典的IPC问题

  1. 读者写者问题
  2. 哲学家就餐问题
  3. 睡眠理发师问题

1. 读者写者问题

             

Reader:

Down(mutex)

Read data

Up(mutex)

Writer:

Down(mutex)

Write data

Up(mutex)

问题:每次只允许一个读者读数据。

Initial: reader = 0; wmutex = 1;

Reader:

reader ++;

If(reader == 1)

Down(wmutex);

Read data

reader--;

If(reader == 0)

Up(wmutex);

Writer :

Down(wmutex)

Write data

Up(wmutex)

问题: 导致竞争条件。

方案1

Reader:

Down(mutex);

reader ++;

If(reader == 1)

Down(wmutex);

Up(mutex);

Read data

Down(mutex);

reader--;

If(reader == 0)

Up(wmutex);

Up(mutex);

Writer:

Down(wmutex)

Write data

Up(wmutex)

2. 哲学家就餐问题

五个哲学家坐在餐桌边,每两位哲学家之间有一个叉子。每个哲学家需要拿到两把叉子才能吃到面条。哲学家吃一会儿面就放下叉子思考人生,思考一会又打算吃点面条,如此循环。如何确保所有哲学家都能高效地吃面条和思考人生?

方案1

过程take-fork 将等待直到获得相应的叉子。

问题:如果五个哲学家同时感到饿了,他们将同时拿起他们左边的叉子,这将导致大家都在等待右边的叉子,谁都吃不了面条。

方案2

问题: 如果一个哲学家正在吃面条,而他旁边的哲学家请求使用叉子,那么所有其他的哲学家都必须等待直到这个请求满足。

方案3

Void philosopher(int i) {    

     While (True) do {

            Thinking;

            take_forks(i);

            Eating;

            put_forks(i);

      }

}

           

目的: 用于检查是否 (i) 可以开始吃了. 如果 (i) 可以开始吃,那么更新 (i)的状态并允许 (i) 开始吃面条。否则,当执行下一个 down 操作时(i) 将被阻塞。

3. 睡眠理发师问题

有一个理发师,一张理发的椅子和n张顾客等待时坐的椅子。如果没有顾客,则理发师将睡觉;若第一个顾客进来了,他将叫醒理发师给自己理发;若顾客进来发现没有空的椅子,他将离开理发店。

解决方案

利用信号量实现同步/异步

  

同步与互斥的关系

  1. 同步:多个相互合作的进程,在一些关键节点上可能需要互相等待或互相交换信息,这种相互制约关系称为同步。
  2. 互斥:当一个进程进入临界区使用临界资源时,另一个进程必须等待;当占用临界资源的进程退出临界区后,另一进程才允许访问此临界资源,进程之间的这种相互制约关系称为互斥。
  3. 关系:互斥是同步的一种特殊情况。

习题:

这节跟上一个笔记的内容联系较大,可以移步上一个笔记看看哦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/58820.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

臻于智境 安全护航 亚信安全受邀出席新华三智算新品发布会

近日,紫光股份旗下新华三集团在北京隆重举办了主题为“乘势 进化 臻于智境”的新华三智算新品发布会。作为新华三集团的长期战略合作伙伴,亚信安全受邀参会,亚信安全CEO马红军出席发布仪式,并与来自各界的业界伙伴共同探讨智能化…

【解决】Ubuntu18.04 卸载python之后桌面异常且终端无法打开,重启后进入tty1,没有图形化界面

我因为python版本太过于混乱 (都是为了学习os) ,3.6—3.9版本我都安装了,指向关系也很混乱,本着“重装是最不会乱”的原则,我把全部版本都卸载了。然后装了3.9 发现终端打不开了,火狐浏览器的图…

2-140 基于Solidworks和Matlab Simulink Simscape仿真的机器人手臂仿真

基于Solidworks和Matlab Simulink Simscape仿真的机器人手臂仿真,使用Simulink-Simscape Multibody模块,完成SW-Simscape-Multibody-Link-Plugin手臂仿真,通过调节关节实现手臂动作,并显示三坐标位置。程序已调通,可直…

流媒体协议.之(RTP,RTCP,RTSP,RTMP,HTTP)(一)

闲着没事做,记录一下开发项目用过的协议,项目中,大多是是实时显示播放的,通过私有协议,传输到上位机,实时播放,延时小于200ms,仿照这些协议,定义的数据格式。如果用这些协…

通过思维导图【脑图】梳理Java 开发技术栈

通过思维导图【脑图】梳理Java 开发技术栈 前言一、思维导图概述二、Java 开发技术栈1.整体脑图结构2.基础知识3.核心语法4.高级特性5.常用框架6.数据库7.算法8.设计模式9.最佳实践10.资源推荐 附思维导图原件总结我是将军我一直都在,。! 前言 将军深刻…

Mac “屏幕保护程序启动或显示器关闭后需要密码“无效

屏幕保护程序启动或显示器关闭后需要密码只能选择“立即”的解决方法: 在 iPhone mirror中设置,每次询问权限。 参考:https://support.apple.com/en-us/120421

基于matlab的凸包(Convex Hull)算法理解与测试

基于matlab的凸包Convex Hull算法理解与测试 0 引言1 Graham扫描算法原理2 Graham扫描算法实现3 Graham扫描算法关键函数4 结语 0 引言 💻💻AI一下💻💻 凸包算法是计算给定点集的最小凸包的一种算法。凸包是包含给定点集中所有点…

Conmi的正确答案——在Kibana中搜索Elasticsearch的索引

Elasticsearch版本:7.17.25 Kibana版本:7.17.25 0、进入首页 1、点击空间名“默”(我的默认空间名就是“默认”); 2、点击气泡弹窗的“管理空间”进入管理页面; 3、点击“索引模式”,进入索引模…

QT访问数据库:应用提示Driver not loaded

在QT中运行完全正确错误截图 解决办法1 我用的是MySQL。我把libmysql.dll复制到应用程序的目录下&#xff0c;即可正常访问数据库。 解决办法2 bool open_work_db() {QString info "support drivers:";for (int i0; i<QSqlDatabase::drivers().size(); i){inf…

用图说明 CPU、MCU、MPU、SoC 的区别

CPU CPU 负责执行构成计算机程序的指令&#xff0c;执行这些指令所指定的算术、逻辑、控制和输入/输出&#xff08;I/O&#xff09;操作。 MCU (microcontroller unit) 不同的 MCU 架构如下&#xff0c;注意这里的 MPU 表示 memory protection unit MPU (microprocessor un…

你需要了解的Android repo工具

在 Android 开发中&#xff0c;repo 是 Google 用来管理多 Git 仓库的一种工具。Android 项目代码由多个 Git 仓库组成&#xff0c;repo 提供了一个高效的机制来批量管理这些仓库&#xff0c;尤其适用于大型项目和团队协作。 1. 什么是 Repo 工具&#xff1f; repo 是一个基于…

尚硅谷-react教程-求和案例-数据共享(下篇)-完成数据共享-笔记

#1024程序员节&#xff5c;征文# public/index.html <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>redux</title></head><body><div id"root"></div></body> </html&…

Linux环境下Mongodb部署

文章目录 一、系统环境二、MongoDb安装添加MongoDB官方库安装MongoDB配置MongoDB 三、MongoDB常见操作四、MongoDB用户管理创建用户修改密码删除用户 五、启用安全控制六、备份与还原1. 备份2. 恢复 七、外部工具连接MongoDB 一、系统环境 CentOS Stream 9 64bit 二、MongoD…

LeetCode总结-链表

一、遍历链表 1290.二进制链表转整数 2058.找出临界点之间的最小和最大距离 2181.合并零之间的节点 二、删除节点 问&#xff1a;为什么没有修改 dummy&#xff0c;但 dummy.next 却是新链表的头节点&#xff1f;如果删除了 head&#xff0c;那么最后返回的是不是原链表的头…

项目模块十二:TcpServer模块

一、模块设计思路 1、目的 对所有模块整合&#xff0c;实现一个服务器模块供外部快速搭建服务器。 2、管理 监听套接字 主 Reactor&#xff0c;创建 EventLoop _baseloop 对象&#xff0c;进行对监听套接字的管理 哈希表管理所有新连接的 Channel 创建线程池进行连接的事…

保险大模型革新:全面自动化倒计时

摘 要 大模型于保险业不仅是一个技术升级的过程&#xff0c;更是一种商业模式的变革 未来将会是一切都连接着AI的世界——科技杂志《连线》创始主编凯文凯利&#xff08;KevinKelly&#xff09;曾在《5000天后的世界》中预测。 ChatGPT催生大模型热潮已将近两年&#xff0c;…

Elasticsearch —— ES 环境搭建、概念、基本操作、文档操作、SpringBoot继承ES

文章中会用到的文件&#xff0c;如果官网下不了可以在这下 链接: https://pan.baidu.com/s/1SeRdqLo0E0CmaVJdoZs_nQ?pwdxr76 提取码: xr76 一、 ES 环境搭建 注&#xff1a;环境搭建过程中的命令窗口不能关闭&#xff0c;关闭了服务就会关闭&#xff08;除了修改设置后重启的…

Python编程中提升效率的8个实用代码

引言 Python 以其简洁易读著称&#xff0c;但有时候&#xff0c;一些巧妙的小技巧能让代码变得更加高效、优雅。本文将介绍八种提升 Python 编程效率的单行代码技巧&#xff0c;帮助你在日常开发中更加得心应手。下面&#xff0c;我们将从基础出发&#xff0c;逐步深入&#x…

Android 音量调节流程分析

音量调节流程分析 按下音量键 音量键被按下后&#xff0c;按键事件会一路派发给Acitivity&#xff0c;如果无人拦截并处理&#xff0c;承载当前Activity的显示PhoneWindow类的onKeyDown()以及onKeyUp()函数将会被处理&#xff0c;从而开始通过音量键调整音量的处理流程&#x…

【设计模式】《Java 设计模式魔法:解锁高效编程的秘密武器》

标题&#xff1a;《Java 设计模式奇幻之旅&#xff1a;解锁高效编程的魔法钥匙》 摘要&#xff1a; 本文将深入探讨 Java 中的十种设计模式&#xff0c;包括单例模式、工厂方法模式、抽象工厂模式…迭代器模式、组合模式、模板方法模式等。通过详细的解释、生动有趣的例子以及…