操作系统进程通信

进程通信方式:

1.管道

  所谓管道,就是一个进程向一个存储空间的一端写入信息,另一个进程从存储空间的另一端读取信息。管道所占的空间既可以是内存,也可以是磁盘。。要创建一个管道,一个进程只需调用管道创建的系统调用即可。该系统调用所做的事情就是在某种存储介质上划出一片空间,赋给其中一个进程写的权利,另一个进程读的权利即可。从根本上说,管道是一个线性字节数组,类似文件,可以使用文件读写的方式进行访问。但却不是文件,因为通过文件系统看不见管道的存在。管道可以设在内存里,而文件很少设在内存里。

2.记名管道

  如果要在两个不相关的进程之间进行管道通信,则需要使用记名管道。记名管道与文件系统共用一个命名空间,也就是说,记名管道的名字不能与文件系统里的任何文件名重名。对于同一主机来讲,允许有多个同一命名管道的实例并且可以由不同的进程打开,但是不同的管道都有属于自己的管道缓冲区而且有自己的通信环境,互不影响。命名管道可以支持多个客户端连接一个服务器端。命名管道客户端不但可以与本机上的服务器通信也可以同其他主机上的服务器通信。

3.套接字

  套接字(socket)是另外一种可以用于进程间通信的机制。套接字首先在BSD操作系统中出现,随后几乎渗透到所有的主流操作系统中。套接字的功能非常强大,可以支持不同层面、不同应用、跨网络的通信。使用套接字进行通信需要双方均创建一个套接字,其中一方作为服务器方,另外一方作为客户方。服务器方必须先创建一个服务区套接字,然后在该套接字上进行监听,等待远方的连接请求。欲与服务器通信的客户则创建一个客户套接字,然后向服务区套接字发送连接请求。服务器套接字在收到连接请求后,将在服务器方机器上建立客户方套接字,与远方的客户机上的客户套接字进行点对点的通信。

4.信号(进程电报)

  如果使用管道和套接字进行通信,必须事先在通信的进程之间建立连接,这需要消耗系统资源。如果通信的信息量微小,那么使用管道与套接字就有点“杀鸡用牛刀”的味道。另外,使用管道与套接字不能迫使一方对我们的通信立即做出回应。应付上述问题,我们使用信号进行通信。那么信号是什么呢?在计算机里,信号就是野怪内核对象,也就是一个内核数据结构。发送方将该数据结构的内容填好,并指明该信号的目标进程后,发出特定的软件中断。操作系统接收到特定的中断请求后,知道是有进程要发送信号,于是到特定的内核数据结构里查找信号接收方 ,并进行通知。接到通知的进程则对信号进行相应处理,如果对方选择不对信号做出响应,则将被操作系统终止运行。

5.信号量(进程旗语)

  在计算机里,信号量实际上就是一个简单整数。一个进程在信号变为0或者1的情况下推进,并且将信号变为1或者0来防止别的进程推进。当进程完成任务后,则将信号再改变为0或者1,从而允许其他进程执行。需要注意的是,信号量不只是一种通信机制,更是一种同步机制。

6.共享内存

  共享内存就是两个进程共同拥有同一片内存。对于这一片内存中的所有内容,二者均可以访问。要使用共享内存进行通信,一个进程首先要创建一个内存空间作为通信时使用,而其他进程则将该片内存映射到自己的(虚拟)地址空间。这样,读写自己的地址空间中对应共享内存的区域时,就是在和其他进程进行通信。

7.消息队列

  消息队列是一列具有头和尾的消息排列。它看上去像管道,但不是管道。首先,它无需固定的读写进程,任何进程都可以读写。其次,它可以同时支持多个进程,多个进程可以读写消息队列。另外,消息队列只在内存中实现。

8.其他通信机制

原文地址:https://www.cnblogs.com/chen-bw/p/8259327.html