一. 简单介绍
进程间通信是指两个进程之间产生数据交互
但是进程是资源分配和调度的单位,因此各进程拥有的内存地址空间相互独立,为了保证安全,一个进程是不能直接访问另外一个进程的地址空间的。
但是进程间的信息交换又是必须的。为了实现进程间通信,操作系统提供了一些方法(共享存储,消息传递,管道通信)。
二. 共享存储
-
基于存储区的共享
在内存中划出一块共享存储区,数据的形式、存放的位置都是由进程控制而不是操作系统。相比之下,这种共享方式速度更快,是一种高级通信方式。 -
基于数据结构的共享
比如共享空间里面只能放一个长度为10 的数组。这种共享方式速度慢、显示多、是一种低级通信方式。
三. 消息传递
- 简单介绍
进程间数据交换是以格式化的消息为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。
消息主要由消息头和消息体组成;消息头包括:发送进程ID、接收进程ID,消息长度等格式化信息(类似于计算机网络中发送的“报文”);消息体就是主要发送的内容。
消息传递分为直接通信方式和间接通信方式; - 直接通信方式
消息直接挂到接收进程的消息缓冲队列中 - 间接通信方式
消息要发送到中间实体中,因此也称为“信箱通信方式”
进程1向进程2发送消息,使用间接通信的方式就是,进程1先发送原语,将消息发送到信箱1中,然后进程2会通过接受原语取走信箱1的消息。
四. 管道通信
-
简介:
管道是指用于连接读写进程的一个共享文件,又名pipe文件。其实就是在内存中开辟一个大小固定的缓冲区。与共享存储的区别是没有共享存储灵活, 消息队列先进先出。 -
特点:
- 管道只能采用半双工通信,某一时间段内只能实现单向的传输(一个进程从管道中写数据,另个进程从里面读数据)。如果要实现双向同 时通信,则需要设置两个管道。
- 各个进程要互斥地访问管道。
- 数据以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞;当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞。
- 一旦数据被读出,就在管道中被抛弃,再也找不回来了