进程通信
进程通信
概述
进程间通信(IPC)是指两个进程之间产生数据交互。
为什么进程需要操作系统支持
进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。
为了保证安全,一个进程不能直接访问另一个进程的地址空间。
共享存储
为了避免出错。各个进程对共享空间的访问应该是互斥的。各个进程可使用的操作系统内核提供的同步互斥工具。(如P,V操作)
共享存储分为基于数据结构的共享:
- 基于数据结构的共享:比如共享空间里只能放一个长度为10的数组。这种共享方式速度慢、限制多,是一种低级通信方式。
- 基于存储区的共享:操作系统在内存中划出一块共享存储区,数据的形式,存放的位置都由通信进程控制,而不是操作系统。这种共享方式的速度很快,是一种高级通信方式。
消息传递
进程间的数据交换以格式化的信息为单位。进程通过操作系统提供的发送消息/接收消息两个原语进行数据交换。
直接通信方式
进程P向进程Q直接发送消息:
- 进程P先将向进程Q发送的数据封装为一个
Message
- 进程P执行发送原语:
Send(Q, msg)
,向Q进程发送数据。 - 进程Q发送的消息被挂到进程Q的
PCB
的消息队列中。 - 进程Q执行接收原语:
Receive(P, &msg)
,将消息队列中的数据拿进来。
间接通信方式
进程P向进程Q间接发送消息:
- 进程P先将向进程Q发送的数据封装为一个
Message
- 进程P执行发送原语:
Send(A, msg)
,往邮箱A发送消息msg
- 进程Q执行接收原语:
Receive(A, &msg)
,从邮箱A接收信息。
可以多个进程往同一个信箱send
消息,也可以多个进程从同一个邮箱中receive
信息。
管道通信
- 管道只能采用半双工通信,某一段时间内只能实现单向传输。要向实现全双共通信,则需要设置两个管道。
- 各进程要互斥地访问管道(由操作系统实现)
- 写进程往管道写数据,即便管道没被写满,只要管道没空,读进程就可以往管道读数据。
- 读进程从管道读数据,即便管道没被读空,只要管道没满,写进程就可以往管道写数据。
- 管道中的数据一旦被读出,就彻底消失,因此当多个进程同时访问管道时,可能会发生错乱。对此,通常有两个解决方案:
- 一个管道允许多个写进程,一个读进程。
- 允许有多个写进程,多个读进程,但是系统会让各个进程轮流从管道中读取数据。(Linux方案)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 MyAKDreamのBlog!