Skip to content

2.23 进程间通信

Giovanna

About 484 wordsAbout 2 min

2024-08-31

  • P、V操作可否用于进程通信?

    • PV操作用于进程的同步与互斥,是低级进程通信
  • P、V操作对于哪些进程通信不适用?

    • 网络进程通信
    • 数据交换量较大的单机进程通信
  • 如何解决?

    • 共享寄存器
    • 消息传递
    • 管道

一、共享寄存器

共享存储器系统

  • 基于共享数据结构的通信方式

    • 公用某一个数据结构实现信息交换

      • 缺点?(难,低效,数据量较少)
    • 基于共享存储区的通信方式(邮箱)

      • 划分一块存储空间作为公用

二、消息传递

直接消息传递

  • 两个或多个进程利用系统调用相互发送消息

  • Send(Destination, &message)

  • Receive(Source, &message)

    • 安全问题
      • 消息丢失、对象假冒、消息篡改……
  • 各有什么优缺点

    • 阻塞Send,阻塞Receiver
    • 无阻塞Send,阻塞Receiver
    • 无阻塞Send,无阻塞Receiver

间接消息传递

  • 不直接发给消息的接收者,而是发到某个共享空间。

  • 消息的接收者和发送者之间的关系是不定的

    • 一对一
    • 多对多
    • 一对多
    • 多对一
  • 共享空间的所有权问题

三、管道

  • 管道通信

    • 连接两个进程:读进程,写进程
    • 写进程以字符流形式输入管道
    • 读进程以字符流形式接收输入
  • 注意事项

    • 互斥
    • 同步
    • 互相确定对方存在则开始通信

Unix中的管道

Unix系统中管道的限制

  • 以半双工方式工作

  • 使用管道的进程具有共同的祖先

由Pipe函数创建管道

#include <unistd.h>

int pipe(int fd[2])
  • fd[2]为两个文件描述符,0为读,1是写,fd[1]的输出是fd[0]的输入

  • 如果成功返回0,否则返回-1

image.png