进程通信:进程通信是指进程之间的信息交换;
进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立;
为了保证安全,一个进程不能直接访问另一个进程的地址空间;
但是进程之间的信息交互又是必须实现的,为了保证进程间的安全通信,操作系统提供了一些方法;比如说手机自带的图片浏览软件,我们想把某些图片分享给微信朋友,可以直接用分享功能将其分享到微信中,从图片软件进程到微信这两个进程之间肯定是有信息交换的,因此这种信息交换是必须要实现的;
为了保证信息交换的安全性,操作系统会提供一些方法供各个进程使用;操作系统提供的进程通信包括共享存储、消息传递、管道通信;
两个进程不能直接访问对方的地址空间,操作系统会对两个进程分配一个共享空间,两个进程之间的通信可以通过共现空间来完成;
需要注意的是,两个进程对共享空间的访问必须是互斥的(互斥访问通过操作系统提供的工具实现);
操作系统只负责提供共享空间和同步互斥工具(如P、V操作);
共享存储分为两种,第一种是基于数据结构的共享,第二种是基于存储区的共享;
基于数据结构的共享:比如共享空间里只能放一个长度为10的数组。这种共享方式速度慢、限制多,是一种低级的通信方式;
基于存储区的共享:在内存中画出一块共享存储区,数据的形式、存放位置都由进程控制,而不是操作系统。相比之下,这种共享方式更快,是一种高级通信方式;
进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换;
一个消息由消息头和消息体组成,消息头包括:发送进程ID、接收进程IO、消息类型、消息长度等格式化的消息(计算机网络中发送的“报文”其实就是一种格式化的消息);
消息传递分为直接通信方式和间接通信方式;
直接通信方式就是把消息直接挂到接收进程的消息缓冲队列上;
每一个进程有一个消息缓冲队列,当A进程想给B进程发送消息时,A进程首先会创建一个格式化的消息,这个消息会通过发送原语发送给目标进程B,这个消息就会挂到目标进程B的消息缓冲队列上。
进程B会通过接收原语依次把消息缓冲队列中的消息取走,这就是直接通信方式;
间接通信方式中,消息要先发送到中间实体(信箱)中,因此也称作“信箱通信方式”。
系统会为各个通信的进程管理一个信箱,这个信箱中会有各种各样的消息,并且这些消息可能是不同进程之间通信的一些消息。具体由哪个进程发送,哪个进程接收是由消息头包含的消息决定;
如果进程A想要给进程B发送消息,进程A会用发送原语将信息发送到中间信箱,进程B会使用接收原语从信箱中取走属于自己的消息;
“管道”是指用于连接读写进程的一个共享文件,又名pipe文件。其实就是在内存中开辟一个大小固定的缓冲区;