跳到主要内容

进程间的通信方式

共享存储

保证操作互斥(消息队列的读取和写入的过程,都会有发生用户态与内核态之间的消息拷贝过程。那共享内存的方式,就很好的解决了这一问题。)共享某些数据结构或共享存储区,进程之间能通过这些空间进行通信

  1. 基于数据结构的共享(低级通信方式):共享空间的数据形式被os限制,如只能放一长度为10的数组。速度慢、限制多。信号量通信。操作系统仅提供共享存储器,由程序员负责对公用数据结构的设置及对进程间同步的处理。各进程公用该数据结构,以实现进程间的信息交换,仅适用于传递相对少量的数据,通信效率低下限制多。
    1. 有界缓冲区
    2. semaphore通信
  2. 基于存储区的共享(高级通信方式):数据的形式、存放位置都由进程控制。速度快。高级通信共享内存通信:内存划出了一块共享存储区域,数据的形式和位置甚至访问控制都是由进程负责,而不是OS。进程在通信前,先向系统申请获得共享存储区中的一个分区,并将其附加到自己的地址空间中,便可以对其中的数据进行正常读写,读写完成或不再需要时,将其归还给共享存储区。

共享内存(现代操作系统,对于内存管理,采用的是虚拟内存技术,也就是每个进程都有自己独立的虚拟内存空间,不同进程的虚拟内存映射到不同的物理内存中。所以,即使进程 A 和 进程 B 的虚拟地址是一样的,其实访问的是不同的物理内存地址,对于数据的增删查改互不影响。 共享内存的机制,就是拿出一块虚拟地址空间来,映射到相同的物理内存中。这样这个进程写入的东西,另外一个进程马上就能看到了,都不需要拷贝来拷贝去,传来传去,大大提高了进程间通信的速度):本质上是同一块物理内存通过页表分别映射到不同进程的虚拟地址空间中,从而导致第一个进程修改变量,物理内存发生变化,第二个进程再去读取,就能感知到变量的改变。使得多个进程可以可以直接读写同一块内存空间,是最快的可用 IPC 形式。是针对其他通信机制运行效率较低而设计的;双向通信(既能读,又能写);没有同步互斥机制,因此需要依靠某种同步机制(如信号量)来达到进程间的同步及互斥;不存在面向字节流和面向数据报的概念,只是一块内存,可以随意的读写数据,随机访问;生命周期随内核(没有手动销毁,一直存在到系统重启)。

消息传递

格式化消息(消息头,消息体)主要利用的数据结构是消息缓冲区不适合大数据传输

  1. 直接通信方式,消息会直接挂到接收进程的消息缓冲队列上。消息队列是保存在内核中的消息链表,在发送数据时,会分成一个一个独立的数据单元,也就是消息体(数据块),消息体是用户自定义的数据类型,消息的发送方和接收方要约定好消息体的数据类型,所以每个消息体都是固定大小的存储块,不像管道是无格式的字节流数据。如果进程从消息队列中读取了消息体,内核就会把这个消息体删除。
  2. 间接通信方式 信箱p.send(mailboxA,msg)

管道通信

互斥同步半双工单向管pipe文件,OS在内存区开辟一个大小固定的内存缓冲区

  • 一条管道只能实现半双工通信,半双工通信即某一时间段内只能实现单向的数据传输。
  • 如果没写满,就不允许读;如果没读空,就不允许写。
  • 管道机制必须提供三方面的协调能力:互斥、同步、确定对方的存在
  • 管道不适合进程间频繁地交换数据。
Loading Comments...