王道 —— 进程通信

1、知识总览

进程通信:进程通信是指进程之间的信息交换;

进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立;

为了保证安全,一个进程不能直接访问另一个进程的地址空间;

但是进程之间的信息交互又是必须实现的,为了保证进程间的安全通信,操作系统提供了一些方法;比如说手机自带的图片浏览软件,我们想把某些图片分享给微信朋友,可以直接用分享功能将其分享到微信中,从图片软件进程到微信这两个进程之间肯定是有信息交换的,因此这种信息交换是必须要实现的;

为了保证信息交换的安全性,操作系统会提供一些方法供各个进程使用;操作系统提供的进程通信包括共享存储、消息传递、管道通信

2、共享存储

两个进程不能直接访问对方的地址空间,操作系统会对两个进程分配一个共享空间,两个进程之间的通信可以通过共现空间来完成;

需要注意的是,两个进程对共享空间的访问必须是互斥的(互斥访问通过操作系统提供的工具实现);

操作系统只负责提供共享空间和同步互斥工具(如P、V操作);

共享存储分为两种,第一种是基于数据结构的共享,第二种是基于存储区的共享;

2.1 基于数据结构的共享

基于数据结构的共享:比如共享空间里只能放一个长度为10的数组。这种共享方式速度慢、限制多,是一种低级的通信方式;

2.2 基于存储区的共享

基于存储区的共享:在内存中画出一块共享存储区,数据的形式、存放位置都由进程控制,而不是操作系统。相比之下,这种共享方式更快,是一种高级通信方式;

扫描二维码关注公众号,回复: 13489448 查看本文章

3、消息传递

进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换;

一个消息由消息头和消息体组成,消息头包括:发送进程ID、接收进程IO、消息类型、消息长度等格式化的消息(计算机网络中发送的“报文”其实就是一种格式化的消息);

消息传递分为直接通信方式和间接通信方式;

3.1 直接通信方式

直接通信方式就是把消息直接挂到接收进程的消息缓冲队列上;

每一个进程有一个消息缓冲队列,当A进程想给B进程发送消息时,A进程首先会创建一个格式化的消息,这个消息会通过发送原语发送给目标进程B,这个消息就会挂到目标进程B的消息缓冲队列上。

进程B会通过接收原语依次把消息缓冲队列中的消息取走,这就是直接通信方式;

3.2 间接通信方式

间接通信方式中,消息要先发送到中间实体(信箱)中,因此也称作“信箱通信方式”。

系统会为各个通信的进程管理一个信箱,这个信箱中会有各种各样的消息,并且这些消息可能是不同进程之间通信的一些消息。具体由哪个进程发送,哪个进程接收是由消息头包含的消息决定;

如果进程A想要给进程B发送消息,进程A会用发送原语将信息发送到中间信箱,进程B会使用接收原语从信箱中取走属于自己的消息;

4、管道通信

“管道”是指用于连接读写进程的一个共享文件,又名pipe文件。其实就是在内存中开辟一个大小固定的缓冲区;

  • 管道只能实现半双工通信,某一时间段内只能实现单向的传递。如果要实现双向同时通信,则需要设置两个管道;
  • 各进程要互斥地访问管道;
  • 数据以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞;
  • 如果没写满,就不允许读;如果没读空,就不允许写;
  • 数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只有一个,否则可能会有读错数据的情况;

猜你喜欢

转载自blog.csdn.net/qq_37388085/article/details/108565239