操作系统—进程和通信012

一、进程间通信 IPC的解析

进程间通信的手段:信号、管道、消息队列、共享内存

1、通信模型

进程之间如何有效的数据交互。
1、进程间通信的概述:

  • 为什么进程间通信?
    1.进程间相互要保持独立,一个进程不能随便访问另外一个进程的地址空间(保护进程地址空间不能随便被其他进程访问,确保进程正确的运行。)
    2.而进程之间可能要协作在一起,完成一个大的任务。这时进程间需要一个沟通(数据传递),在保证进程的相互独立性的同时,还需要确保进程间有效的沟通。这就是进程间通信的原因。

2、IPC facility提供2个操作:
send(message) :消息大小固定或者不变
receive(mesage):发送和接受消息。
如果两个进程间发送消息,需要建立一个通信管道,有很多种情况,比如基于内存,硬件、资源等等。都可以建立通信管道。取决具体的实现

3、通信链路的实现:
1.物理(例如,共享内存,硬件总线)
2.逻辑(例如,逻辑属性)

2、直接及间接通信

1、间接通信和直接通信
左边间接通信:通信A和通信B,是通过间接性通信,A把消息发到内核中,由内核转发给B。类似于发邮件
右边直接通信:进程A和B,可以直接通信,避免了内核导一次。类似于打电话。
在这里插入图片描述
2、为了实现有效正确的通信,要知道送到哪里去。
直接通信:
正式发送和接受数据之前,需要一个通信链路的建立。可以是单向也可以是双向。一般来说两个进程,必然存在一条链路,是需要操作系统的支持。链路是打破了进程之间的隔离。所以需要操作系统。
在这里插入图片描述
间接通信:
需要把消息放到某个地方去,一般是操作系统定好的共享区域。接受方也是在该区域中接受数据,至于数据是从发送方哪里来的,接收方不用管,而接收方也不用管接收方哪里来。
而中间结点,一般是内核中的共享资源。
在这里插入图片描述
在这里插入图片描述

3、阻塞与非阻塞

阻塞是同步的:发送消息:如果没有发送完成,那么就要阻塞。只有发送完成后,才会正常返回去正常工作。
非阻塞是异步的:只要发送就好了,至于成功与否,不知道。那么send操作很快的返回。

在这里插入图片描述

4、通信链路缓冲

把消息进行缓存起来,是因为提高效率,避免发送方和接受方之间不匹配(可能发送的快,接受的慢)。那么缓存,就可以缓存一些临时不能处理的数据,从而提高效率。

  • 队列的消息被附加到链路;可以是一下3种方式之一:
  1. 0容量 (同步阻塞发送方式)
    发送方必须等待接收方,接收方接收到消息,接收方才可以返回。如果提前返回,则可能数据丢失。
  2. 有限容量 -n messages的有限长度。更多体现实际情况
    如果队列满,发送方必须等待。如果队列空,接收方必须等待。有一个缓冲区,空间有限,如果发送方没有填满缓冲区,可以持续在缓冲区放数据。一旦填满发送方必须要等待。同理,缓冲区是空的,那么接收方需要等待。
  3. 无限容量 -无限长度
    发送方不需要等待,如果缓冲区为空,那么接收方不得不等待。

二、信号

  1. 信号(Signal)
    软件中断通知事件处理
    1.直接退出运行。2.忽略。3.指定专门的信号参数,信号来了,函数调用,完成信号相应。
  2. 缺点:不能传输要交换的任何数据。信号是bit,表明信号。起到的是通知作用。
  3. 优点:效果很高,异步打断的机制。
  4. 第三点处理完函数之后怎么办?处理完后,会回到打断程序重新执行。
  5. 如何实现?
    操作系统提供那种手段,可以完成此功能?
    1.对单个程序做处理的话,首先程序开始的时候,先注册一个针对某一个信号的handles,作为系统调用发给操作系统。当产生某个进程信号时,操作系统会调用,信号处理函数来执行。
    2.一旦产生了信号,操作系统如何让正在运行的进程停下来,调到信号处理函数去执行呢?需要操作系统来完成的,将系统调用返回的用户空间的堆栈,进行修改(返回调用系统调用的语句,变成信号处理函数的入口)。同时再把信号处理函数的地址,作为后一条栈帧返回地址。修改应用程序的堆栈。
    在这里插入图片描述

三、管道

  • 管道是用来数据交换的。
  • 在早期年代,一个个小程序单独完成自己的小功能,那么将程序组合起来完成大功能,那么程序如何组合起来? 那么一个小程序的输出,重定向为另一个程序的输入。
  • ls | more 在windos 是 dir | more 分页显示数据
    命令做介绍:运行在shell命令行中,shell是一个进程,当进程收到了收到了ls | More字符串时,这是两个命令合在一起工作。将ls是输出者,输出到管道里面,类似于内核中的buffer,然后more在管道中接收。
    shell让操作系统的工作:shell要创建子进程,共享进程中的资源,其中的资源是文件。将ls的输出做了buffer,而more的输入做了buffer。
    进入了管道后,竖线的工作完成了,然后在ls 和More 去执行。
    在这里插入图片描述

四、消息队列

  • 管道是父进程帮子进程建好的通道,1.如果没有父子关系,那么管道就没办法工作了。2.管道数据是字节流,没有结构展示。
  • 在消息队列中,1.可以实现多个不想管的进程在消息队列中进程数据。2.是结构化的数据,没有字节流。3.同样的是有buffer慢或着空的限制,
    在这里插入图片描述

五、共享内存

  • 前两种是间接通信的方式,共享内存是直接通信的方式。两个进程有一个特殊的内存空间,是两个进程都可以访问到,一个进程往内存写, 另外一个进程可以马上看到 。 直接读写内存,就可以完成数据共享。 相对于前面几种方式,共享内存是最快最大的方式。

在这里插入图片描述
内存管理:可以将同一块内存映射到不同的进程的相同、不相同的地址空间去,通过序列访问不同进程虚地址时,其实是访问的同一块物理内存的地址空间。需要内存管理的充分支持,比如页表。

在这里插入图片描述

おすすめ

転載: blog.csdn.net/weixin_43989347/article/details/120317953