进程间的相互作用

两种相互作用

同步

多个相关进程在执行次序上的协调。

制约关系:直接制约。

如图所示:一个进程在执行操作的时候,另一个进程必须等待,体现在次序上的等待和协调,并不争夺临界资源。

互斥

多个进程因为争夺临界资源相互排斥执行的过程称为进程的互斥

临界资源:也称为独占资源,是指在一段时间内只允许一个进程访问的资源。

制约关系:间接制约。

解决并发进程的问题

一.加锁法——自旋锁

思路:

  设置一个共享变量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

操作系统:进程间的相互作用(多线程基础)相关推荐

  1. 操作系统中的进程间相互作用

    在一个计算机系统中存在着多个进程,这些进程之间可能有逻辑上的关系,也可能没有逻辑上的关系.进程之间无论是否存在逻辑上的关系,由于它们都要共享或竞争一个计算机系统中的资源,所以不可避免地会互相发生作用. ...

  2. 第十章 进程间的通信 之 Java/Android多线程开发(二)

    文章目录 (一)Java 多线程开发 1.1)线程状态 1.2)线程控制方法 (1.2.1)Synchronized (1.2.2)Volatile (1.2.3)ReentrantLock 1.3) ...

  3. 《操作系统》实验报告——熟悉Linux基础命令及进程管理

    理论知识 Linux--进程管理 Linux--Linux C语言编程基础知识 手把手教你安装Linux虚拟机 一.实验目的 (1)加深对进程概念的理解,明确进程和程序的区别. (2)进一步认识并发执 ...

  4. 操作系统——进程管理(一文弄懂进程间的那些事)

    进程管理 进程 进程的概念 PCB 进程的组成 进程的特征 进程的状态与转换 进程的状态 进程间的转换 进程的组织方式 链接方式 索引方式 进程控制 怎么实现进程控制--原语 进程的创建 进程的终止 ...

  5. 【《现代操作系统 第4版》】4、进程间的通信之互斥

    买面包问题 假设有两个人A.B要采购面包,首先查看冰箱中是否有面包,如果没有则离开家去超市购买面包,买来后把面包放到冰箱. 假设A.B的日程如下图所示.显然这会导致面包超买,如何保证最多只有一个人去买 ...

  6. linux操作系统之信号量、互斥量在进程间的同步、文件锁

    (1)信号量:进化版的互斥量 多个线程间对某个对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能将整个数据对象锁住.这样虽然达到了多线程操作数据共享的目的,却导致线程并发性下降. 信号量:相对折 ...

  7. 2022-2-21 操作系统八股之七 —— 进程间的通信方式有哪些?

    进程 ( InterProcess Communication )间通信是指在不同进程间传播或者交换信息.进程间通信的方式有:管道(有名管道和匿名管道).消息队列.信号量.共享内存.Socket.St ...

  8. 操作系统:进程间通讯的七种方式

    一.常见的通信方式 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. 命名管道FIFO:有名管道也是半双工的通信方式 ...

  9. 【操作系统】进程间的通信——管道

    进程间的通信-管道 管道 进程间的通信(IPC-Inter-Process Communication)有多种方式,管道是其中最基本的方式. 管道是半双工的,即是单向的. 管道是FIFO(先进先出)的 ...

最新文章

  1. ubuntu apache2 的负载均衡和反向代理
  2. 【第一行代码笔记】(一)
  3. String.Format和StringBuilder的效率
  4. android ifw 启动广告,使用 IFW 完全控制 Android 应用行为 | 实用技巧
  5. 基础正则表达式介绍与练习
  6. 鸿蒙空间是什么星辰变,飞升之后做什么《星辰变》神魔妖界收伏奇珍异兽
  7. JAVA基础整理-6.Java数据类型
  8. linux zip命令收藏
  9. restframe_work1
  10. 刷屏!马化腾:腾讯只是一家普通公司,随时可以被替换
  11. 《从0到1:CTFer成长之路》书籍配套题目-[第二章 web进阶]死亡ping命令
  12. 鸿蒙熔炉是真实存在的吗,古董局中局父辛爵是真的吗 父辛爵真实存在国内仅有两件...
  13. jQuery过年烟火炫酷背景插件音效
  14. 中文分词后去除停用词
  15. HTML中加入背景音乐
  16. (EPROCESS/KPROCESS/ETHREAD/KTHREAD)进程与线程内核层中的结构
  17. 计算机输入法在桌面显示不出来的,电脑开机无法正常显示桌面只能看到输入法如何解决...
  18. c++日志工具之——log4cplus
  19. 【OFDM系列8】对知乎“正交频分复用(OFDM)原理灵魂9问”的理解与通俗易懂回答(慎入,含大量重要公式详细推导的万字长文)
  20. 视频号容易被限流的8个雷区,这些规则你一定要知道!

热门文章

  1. C# 根据年、月、周、星期获得日期等
  2. vs2008网站模式下不能设置rdlc的数据源
  3. 【深度好文】ICLR 2022 | cosFormer:重新思考注意力机制中的Softmax
  4. 内卷、996的背后,AI技术该如何服务企业“人、财、物”?
  5. 一种推理优化新思路,对特征图进行[随机采样-插值]
  6. 斯坦福用普通相机和激光笔实现“穿墙透视”,连你的证件都能看清
  7. 基于图像查询的视频检索,代码已开源!
  8. 收藏 | 李飞飞等发布200多页综述,阐述大模型机遇与风险
  9. 计算机视觉论文-2021-07-08
  10. 收藏 | 卷积神经网络中10大拍案叫绝的操作!