操作系统笔记(五)信号量,经典的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,一经查实,立即删除!

相关文章

[UVM] objection笔记

1.raise_objection&drop_objection 成对出现 2.在进入到某一phase时,UVM会收集此phase提出的所有objection,并且实时监测所有objection是否已经被撤销了,当发现所有都已经撤销后,那么就会关闭此phase,开始进入下一…

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

近日,紫光股份旗下新华三集团在北京隆重举办了主题为“乘势 进化 臻于智境”的新华三智算新品发布会。作为新华三集团的长期战略合作伙伴,亚信安全受邀参会,亚信安全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,仿照这些协议,定义的数据格式。如果用这些协…

【数据结构 | C语言】单身狗进化

这一天晚上,弯通又做梦了,并且梦到了一个帅气的男孩纸!这个男孩给了弯通一个数字 n。男孩离开前告诉弯通,n!(n 的阶乘)的位数就是距离弯通脱单的天数。矜持的弯通想知道自己还有多久能脱单,快写个程序帮助他! 输入格式:输入第一行为一个正整数 n(1<=n<=25000)…

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

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

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

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

Oracle 大表添加索引的最佳方式

背景&#xff1a; 业务系统中现在经常存在上亿数据的大表&#xff0c;在这样的大表上新建索引&#xff0c;是一个较为耗时的操作&#xff0c;特别是在生产环境的系统中&#xff0c;添加不当&#xff0c;有可能造成业务表锁表&#xff0c;业务表长时间的停服势必会影响正常业务…

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

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

golang有序map

最近使用go开发排行榜的需求, 有些情况会用到有序map, 但是go竟然没有有序map的实现 本着自己动手丰衣足食的原则, 就自己实现了一个 原理 原理比较简单, 主要结合了container/list双向链表和map 使用双向链表存储key和value, 保证顺序, 使用map存储key和节点信息, 保证查找…

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

Elasticsearch版本&#xff1a;7.17.25 Kibana版本&#xff1a;7.17.25 0、进入首页 1、点击空间名“默”&#xff08;我的默认空间名就是“默认”&#xff09;&#xff1b; 2、点击气泡弹窗的“管理空间”进入管理页面&#xff1b; 3、点击“索引模式”&#xff0c;进入索引模…

Elasticsearch Date类型,时间存储相关说明

本文介绍了在SpringBoot中处理Elasticsearch中日期时间格式的问题。当时间输出为UTC格式并存在时区差异时&#xff0c;可通过设置字段格式如yyyy-MM-dd HH:mm:ss并指定时区为GMT8来解决。存储Date类型数据时&#xff0c;可以使用JSON库如json-lib, fastjson, Jackson或gson进行…

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&…

事件的传递

如果一个事件在 Qt 中未被处理&#xff0c;事件将按照以下机制进行传递和释放&#xff1a; 事件的传递&#xff1a;逐级向上传递 在 Qt 中&#xff0c;如果事件未在某个对象上被处理&#xff08;即 event() 或具体的事件处理函数没有调用 accept() 接受事件&#xff09;&#…

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;那么最后返回的是不是原链表的头…