整体框架
1、什么是进程通信?
顾名思义,进程通信就是指进程之间的信息交换。
进程是分配系统资源的单位(包括内存地址空间),
- 因此 各进程 \color{red}各进程 各进程拥有的 内存地址空间相互独立 \color{red}内存地址空间相互独立 内存地址空间相互独立。
为了保证安全, 一个进程不能直接访问另一个进程的地址空间 \color{red}一个进程不能直接访问另一个进程的地址空间 一个进程不能直接访问另一个进程的地址空间
但是进程之间的信息交换又是必须实现的。
为了保证进程间的安全通信,操作系统提供了一些方法。
2、共享存储
两个进程对共享空间的访问必须是互斥的(互斥访问通过操作系统提供的工具实现)。
操作系统只负责提供共享空间和同步互斥工具(如 P、V 操作)
基于数据结构 \color{red}基于数据结构 基于数据结构的共享:
-
比如共享空间里只能放一个长度为 10 的数组。
-
这种共享方式速度慢、限制多,
-
是一种 低级通信 \color{red}低级通信 低级通信方式
基于存储区 \color{red}基于存储区 基于存储区的共享:
-
在内存中画出一块共享存储区,数据的形式、存放位置都由进程控制,而不是操作系统。
-
相比之下,这种共享方式速度更快,
-
是一种 高级通信 \color{red}高级通信 高级通信方式。
3、管道通信
“管道” 是指用于连接读写进程的一个共享文件,
- 又名
pipe
文件。 - 其实就是在内存中开辟一个大小固定的缓冲区
管道只能采用 半双工通信 \color{red}半双工通信 半双工通信,某一时间段内只能实现单向的传输。
- 如果要实现双向同时通信,则需要设置两个管道。
首先进程 1 1 1 会往管道中写数据, 当管道中的数据写满了之后进程 2 2 2 才可以开始往外读数据
只有这个数据全部被读出后,进程 1 1 1 才可以继续往里面写数据
数据以字符流的形式写入管道,当管道写满时,写进程的 write()
系统调用将被阻塞,等待读进程将数据取走。
当读进程将数据全部取走后**,管道变空**,此时读进程的 read()
系统调用将被阻塞。
如果 没写满 , 就不允许读 \color{red}没写满,就不允许读 没写满,就不允许读。
如果 没读空 , 就不允许写 \color{red}没读空,就不允许写 没读空,就不允许写。
数据一旦被读出,就从管道中被抛弃,
-
这就意味着 读进程最多只能有一个 \color{red}读进程最多只能有一个 读进程最多只能有一个,
否则可能会有读错数据的情况。
4、消息传递
进程间的数据交换以
格式化的消息
\color{red}格式化的消息
格式化的消息(Message
)为单位。
进程通过操作系统提供的 “发送消息/接收消息” 两个 原语 \color{red}原语 原语进行数据交换。
例如:TCP
报文段的首部就是消息头,数据载荷就是消息体
4.1、直接通信方式
消息直接挂到接收进程的消息缓存队列上
4.2、间接通信方式
消息要先发送到中间实体(信箱)中,因此也称 “信箱通信方式” 。
- Eg:计网中的电子邮件系统