操作系统(七)进程间通信

发布于 2020-04-18  242 次阅读


进程间通信/IPC/Inter-Process Communication

1.直接通信

1.进程必须正确命名对方

  • send(P, message) //进程ID
  • receive(Q, message) //进程ID

2.通信链路的属性

  • 自动建立链路
  • 一条链路恰好对应一对通信进程
  • 每对进程只有一个链接存在
  • 链接可以是单向的,也可以是双向的

2.间接通信

定向从消息队列接受消息

  • 每个消息队列都有一个唯一的ID
  • 只有它们共享了一个消息队列,进程才能通信

通信链路的属性

  • 只有进程共享同一个队列才能通信
  • 链接可以与多个进程相连
  • 每对进程可以共享多个通信链路
  • 连接可以是单向的,也可以是双向的

操作:

  • send(A, message) //发送消息到队列A
  • receive(A, message) //从队列A接收消息

消息传递可以是阻塞和非阻塞的(同步和异步)。队列的消息被发送到链路,可为一下三种方式之一:

  1. 0容量/0 message——发送方必须等待接收方
  2. 有限容量/n message——若队列满,发送方必须等待
  3. 无限容量/unlimited message——发送方无需等待

3.信号

软件中断通知事件处理

程序接受到信号后

  • catch:指定信号处理函数被调用
  • ignore:忽略,不处理
  • 缺省的处理:停止运行(自杀)

不足:不能传输要交换的任何数据

实现:修改应用程序的堆栈(栈,函数返回地址)


4.管道

内核中的buffer,字节流

  • 子进程从父进程继承文件描述符
  • 进程不知道从键盘、文件、程序读取 或 写入终端、文件、程序

例:%ls | more

shell:

  • 创建管道
  • ls 创建一个进程,设置 stdout 为管道写端
  • more 创造一个进程,设置 stdin 为管道读端

5.消息队列

可传数据结构,间接

  • Message:作为一个字节序列储存
  • Message Queue:消息数组
  • FIFO & FILO configuration

6.共享内存

直接通信

每个进程都有私有地址空间,每个空间内,都明确地设置了共享内存段

优点:快速、方便地共享数据

缺点:必须同步数据访问