操作系统 进程篇之进程间通信

前言

本文在操作系统的角度梳理操作系统进程间通信方式。

进程通信

image.png

进程通信是指进程之间的信息交换。
进程是操作系统分配资源的单位,每个进程拥有自己独立的内存地址空间;但是为了保证操作系统安全,一个进程是不能直接访问另一个进程的地址空间的,所以操作系统提供了一些方法来让进程间进行信息交换,即进程间通信。

操作系统提供的方式为:共享存储、管道通信和消息传递。

共享存储

image.png

操作系统为两个进程分配一个共享空间,这两个进程通过操作该共享空间来进行通信。

  • 必须是互斥的
    两个进程对共享空间的访问必须是互斥的,还是通过操作系统提供的工具实现互斥,如P、V操作

  • 共享存储分为两种,基于数据结构的共享和基于存储区的共享

    • 基于数据结构的共享
      即共享空间里只能存放一种固定的数据结构,这种共享方式速度慢,限制多,是一种低级通信方式。
    • 基于存储区的共享
      在内存中划出一块共享存储区,数据的形式、存放位置都由进程控制;这种共享方式速度更快,是一种高级通信方式。

管道通信

image.png

管道是指用于连接读写进程的一个共享文件,又叫pipe文件。其实就是在内存中开辟一个大小固定的缓冲区。
该缓冲区大小一般和一个内存页大小一致,在linux系统中就是4kb。

  • 管道通信只能采用半双工的通信
    如果想要实现双向同时通信,则需要设置两个管道。

    扫描二维码关注公众号,回复: 12200305 查看本文章
  • 各进程要互斥的访问管道

  • 数据以字符流的形式写入管道:如果没写满,则就不允许读;如果没读空,就不允许写
    当管道写满时,写进程的write()系统调用将会被阻塞,等待读进程将数据取走;
    当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将会被阻塞;

  • 数据一旦被读出,就从管道中被抛弃
    这就意味着读进程最多只能有一个,否则可能会有读错数据的情况。

消息传递

image.png

消息传递是指进程间的数据交换是以格式化的消息为单位,通过操作系统提供的发送消息/接收消息两个原语进行数据交换的方式。

  • 格式化的消息
    一般由消息头和消息体组成;
    消息头包括:发送进程ID、接收进程ID、消息类型、消息长度等格式化的消息。
    image.png

消息传递分为两种:直接通信方式和间接通信方式

  • 直接通信方式
    进程1通过发送原语将格式化的消息发送给目标进程2,该消息直接挂到接收进程的消息缓冲队列队尾上,进程2通过接收原语依次读取缓冲队列中的值。
    image.png

  • 间接通信方式
    是指消息先发送到中间实体(信箱)中,因此也成为信箱通信方式。
    系统会为各个通信的进程管理一个信箱,该信箱中有各种各种的不同进程间正在通信的消息,因为消息头中包含了各个进程的信箱,所以不用担心会被取错。
    进程1通过发送原语将消息发送到信箱中,进程2 通过接收原语读取该消息。
    image.png

猜你喜欢

转载自blog.csdn.net/u014099894/article/details/112760039