操作系统:进程间的相互作用(多线程基础)
进程间的相互作用
两种相互作用
同步
多个相关进程在执行次序上的协调。
制约关系:直接制约。
如图所示:一个进程在执行操作的时候,另一个进程必须等待,体现在次序上的等待和协调,并不争夺临界资源。
互斥
多个进程因为争夺临界资源二相互排斥执行的过程称为进程的互斥。
临界资源:也称为独占资源,是指在一段时间内只允许一个进程访问的资源。
制约关系:间接制约。
解决并发进程的问题
一.加锁法——自旋锁
思路:
设置一个共享变量W (锁) ,初值为0。当一个进程想进入其临界区(进程中涉及临界资源的程序段)时,它首
先测试这把锁:如果锁的值为0,则进程将其置为1并进入临界区。若锁已经为1,则进程等待直到其变成0。
实现:
加锁原语:LOCK(W) :L: if W=1 then goto L else W=1;
解锁原语:UNLOCK(W):W=0;
二.信号量和PV操作
信号量:
☻说明:
表示资源的实体——是一个与队列有关的整型变量。
说明:其值只能通过初始化操作和P、V操作来访问。
☻ 类型:
公用信号量:用于进程间的互斥,初始值通常为1.
私有信号量:用于进程间的同步,初始值通常为0或N .
☻P操作(Wait操作):
proberen——检查。意味着请求分配一个单位资源。
S=S-1if(S<0){//调用进程被阻塞,进入S的等待队列}
☻V操作(Signal操作):
荷兰语“verhogen”——“增量”之意,意味着释放/增加一个单位资源。
S=S+1; if(S<=0) {//从S的等待队列中唤醒一个进程使其进入就绪状态 }
☻使用PV实现互斥
☻使用PV实现进程同步
IPC经典问题
生产者消费者问题(有限缓存问题)
描述:生产者和消费者共享n个缓冲区,生产者生产产品放入缓冲区,消费者从缓冲区中取产品消费。请写出能够正确反映它们逻辑关系的代码
两个隐含条件:
1.消费者和生产者数量不固定。
2.消费者和生产者不能同时使用缓存区。
行为分析:
生产者:生产产品,放置产品(有空缓冲区)。
消费者:取出产品(有产品),消费产品。
行为关系:
生产者之间:互斥(放置产品)
消费者之间:互斥(取出产品)
生产者与消费者之间:互斥(放/取产品) 同步(放置——取出)
信号量设置:
semaphore mutex =1;//互斥
semaphore empty=n;//空闲数量
semaphore full=0;//产品数量
伪代码:
semaphore mutex=1 //互斥 semaphore empty=n //缓冲区空闲数 semaphore full=0 //产品数量 生产者: while(1) {product; //生产 p(empty);p(mutex);add to buffer;//放置产品 v(mutex);v(full) }消费者: while(1) {p(full);p(mutex);get from buffer;//取出产品 v(mutex);v(empty)conseume; //消耗 }
读者写者问题
描述:一个数据对象(文件、记录)可以为多个并发进程共享。其中有的进程只需要读其中的内容,我们称为“读者”;有的进程负责更新(读写)其中内容,我们称为“写者”。
规定:“读者”可以同时读取共享数据对象;“写者”不能和其它任何进程同时访问共享数据对象。
行为分析:
Ø读进程的行为:
- 系统中会有多个读进程同时访问共享数据。
- 我们可以将它们分为三类:第一个进入的读进程(占有资源),最后一个离开的读进程(释放资源)和其他读进程。
- 我们需要设置一个计数器readnum来记录读进程的数目。
Ø写进程的行为:排他性的使用资源。
Ø确定同步与互斥关系:
读者-读者:互斥访问readnum
读者-写者:互斥访问Data
写者-写者:互斥访问Data
Ø确定临界资源:
Data,readnum
信号量设置:
int readnum=0;
semaphore mutex=1;//公用信号量,用于readnum的互斥。
semaphore write=1;//公用信号量,用于Data访问的互斥。
伪代码:
int readnum=0; //计数,用于记录读者的数目 semaphore mutex=1; //公用信号量,用于readnum互斥 semaphore write=1; //公用信号量,用于Data访问的互斥, 读者: p(mutex) //对readnum互斥 readnum++; if(readnum==1)P(write) //申请使用data资源 V(mutext) //释放readnum reading;p(mutex) //对readnum互斥 readnum--; if(readnum==0)V(write) //释放data资源 V(mutext) //释放readnum 写者: //P(mutex) P(write) //write本身已经互斥 writing; v(wirte) //V(mutex)
理发师问题
描述:理发店有一位理发师和一把理发椅。如果没有顾客,则理发师在理发椅上睡觉;当有顾客到达时,如理发师在睡觉则唤醒他理发,如果理发师正忙着理发,则坐在椅上等待。 编写程序实现理发师和顾客行为的正确描述。
行为分析:
Ø理发师行为:睡觉、理发。没有顾客睡觉,有顾客理发。
Ø顾客行为:理发或等待。
Ø相互作用:
理发师与顾客之间:同步
顾客与顾客之间:无
信号量设置:
semaphore customers=0; //customers表示等候理发的顾客数量
semaphore barbers=0; //barbars表示等候顾客的理发师数量
伪代码:
semaphore customers=0; //customers表示等候理发的顾客数量 semaphore barbers=0; //barbars表示等候顾客的理发师数量 理发师代码: while(1) {p(customers) //检查是否有顾客v(barbers) //告诉顾客有发型师 Cut_hair();}顾客代码: V(customers) p(barbers); Get_hair();
这里主要体现了进程的同步。如有疑问,请看信号量介绍的同步实现。
增加条件:理发店有n把椅子,顾客到达时如果理发师空闲则理发,如果理发师忙,则看椅子上是否还有空位置,有空位置等待,没有空位置就离开。
伪代码:
semaphore customers=0; //customers表示等候理发的顾客数量 semaphore barbers=0; //barbars表示等候顾客的理发师数量 int waiting =0; //等待人数 semaphore mutex=1; //用于waiting的互斥 理发师进程: while(1) {p(customers) //检查是否有顾客 P(mutex);waiting=waiting-1;v(mutex);v(barbers) Cut_hair();}顾客进程: P(mutex) //占空椅子的操作是互斥的,即一个一个占 if(waiting<n) then //如果座位未满 {waiting=waiting+1;V(mutex);V(customers);P(barbers); //检测是否有理发师 Get_haircut(); } else {V(mutex); //表示座位已经满了 }
使用PV操作的注意事项
1.P、V操作(对同一信号量)总是成对出现的;互斥操作时他们处于同一进程中;同步操作时他们处于不同进程中。
2.信号量初始值的设置和P、V操作的位置及次序是关键,要十分小心的设置,一定要保持正确的逻辑关系和较高的执行效率。
转载于:https://www.cnblogs.com/MrSaver/p/6147437.html
操作系统:进程间的相互作用(多线程基础)相关推荐
- 操作系统中的进程间相互作用
在一个计算机系统中存在着多个进程,这些进程之间可能有逻辑上的关系,也可能没有逻辑上的关系.进程之间无论是否存在逻辑上的关系,由于它们都要共享或竞争一个计算机系统中的资源,所以不可避免地会互相发生作用. ...
- 第十章 进程间的通信 之 Java/Android多线程开发(二)
文章目录 (一)Java 多线程开发 1.1)线程状态 1.2)线程控制方法 (1.2.1)Synchronized (1.2.2)Volatile (1.2.3)ReentrantLock 1.3) ...
- 《操作系统》实验报告——熟悉Linux基础命令及进程管理
理论知识 Linux--进程管理 Linux--Linux C语言编程基础知识 手把手教你安装Linux虚拟机 一.实验目的 (1)加深对进程概念的理解,明确进程和程序的区别. (2)进一步认识并发执 ...
- 操作系统——进程管理(一文弄懂进程间的那些事)
进程管理 进程 进程的概念 PCB 进程的组成 进程的特征 进程的状态与转换 进程的状态 进程间的转换 进程的组织方式 链接方式 索引方式 进程控制 怎么实现进程控制--原语 进程的创建 进程的终止 ...
- 【《现代操作系统 第4版》】4、进程间的通信之互斥
买面包问题 假设有两个人A.B要采购面包,首先查看冰箱中是否有面包,如果没有则离开家去超市购买面包,买来后把面包放到冰箱. 假设A.B的日程如下图所示.显然这会导致面包超买,如何保证最多只有一个人去买 ...
- linux操作系统之信号量、互斥量在进程间的同步、文件锁
(1)信号量:进化版的互斥量 多个线程间对某个对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能将整个数据对象锁住.这样虽然达到了多线程操作数据共享的目的,却导致线程并发性下降. 信号量:相对折 ...
- 2022-2-21 操作系统八股之七 —— 进程间的通信方式有哪些?
进程 ( InterProcess Communication )间通信是指在不同进程间传播或者交换信息.进程间通信的方式有:管道(有名管道和匿名管道).消息队列.信号量.共享内存.Socket.St ...
- 操作系统:进程间通讯的七种方式
一.常见的通信方式 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. 命名管道FIFO:有名管道也是半双工的通信方式 ...
- 【操作系统】进程间的通信——管道
进程间的通信-管道 管道 进程间的通信(IPC-Inter-Process Communication)有多种方式,管道是其中最基本的方式. 管道是半双工的,即是单向的. 管道是FIFO(先进先出)的 ...
最新文章
- ubuntu apache2 的负载均衡和反向代理
- 【第一行代码笔记】(一)
- String.Format和StringBuilder的效率
- android ifw 启动广告,使用 IFW 完全控制 Android 应用行为 | 实用技巧
- 基础正则表达式介绍与练习
- 鸿蒙空间是什么星辰变,飞升之后做什么《星辰变》神魔妖界收伏奇珍异兽
- JAVA基础整理-6.Java数据类型
- linux zip命令收藏
- restframe_work1
- 刷屏!马化腾:腾讯只是一家普通公司,随时可以被替换
- 《从0到1:CTFer成长之路》书籍配套题目-[第二章 web进阶]死亡ping命令
- 鸿蒙熔炉是真实存在的吗,古董局中局父辛爵是真的吗 父辛爵真实存在国内仅有两件...
- jQuery过年烟火炫酷背景插件音效
- 中文分词后去除停用词
- HTML中加入背景音乐
- (EPROCESS/KPROCESS/ETHREAD/KTHREAD)进程与线程内核层中的结构
- 计算机输入法在桌面显示不出来的,电脑开机无法正常显示桌面只能看到输入法如何解决...
- c++日志工具之——log4cplus
- 【OFDM系列8】对知乎“正交频分复用(OFDM)原理灵魂9问”的理解与通俗易懂回答(慎入,含大量重要公式详细推导的万字长文)
- 视频号容易被限流的8个雷区,这些规则你一定要知道!
热门文章
- C# 根据年、月、周、星期获得日期等
- vs2008网站模式下不能设置rdlc的数据源
- 【深度好文】ICLR 2022 | cosFormer:重新思考注意力机制中的Softmax
- 内卷、996的背后,AI技术该如何服务企业“人、财、物”?
- 一种推理优化新思路,对特征图进行[随机采样-插值]
- 斯坦福用普通相机和激光笔实现“穿墙透视”,连你的证件都能看清
- 基于图像查询的视频检索,代码已开源!
- 收藏 | 李飞飞等发布200多页综述,阐述大模型机遇与风险
- 计算机视觉论文-2021-07-08
- 收藏 | 卷积神经网络中10大拍案叫绝的操作!