程序之间如何进行通信?

12

进程之间如何通信?根据我目前所学的编程知识,我无法解释套接字、文件系统以及其他程序间发送消息相关的内容。

顺便提一下,如果您要添加操作系统特定的内容,请注意我使用的是基于Linux的操作系统。 提前感谢您的帮助。这个问题困扰了我很久。 我猜内核可能与此有关。


1
你要找的是“IPC”:https://zh.wikipedia.org/wiki/%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1。 - Greg Hewgill
当您请求打开文件时,例如使用操作系统API时,会写入共享内存空间,操作系统接收信息并提供文件服务?我是对的还是完全错误的?再次感谢。 - user1031446
当您打开一个文件时,操作系统提供了读写该文件的能力(以及一些其他功能,如查找和截断)。当两个进程打开同一个文件时,它们之间的具体工作方式取决于内核的实现细节,并且不会暴露给用户进程。 - Greg Hewgill
1个回答

18
在大多数IPC(进程间通信)机制中,对于你的问题,一般的答案是这样的:进程A调用内核,并传递一个指向缓冲区的指针,其中包含要传输到进程B的数据,进程B调用内核(或已经被阻塞在对内核的调用上),并传递一个指向缓冲区的指针,以便从进程A中填充数据。
这个通用描述对于socketspipesSystem V message queues、普通文件等都是正确的。正如你所看到的,通信的成本很高,因为它至少涉及一个上下文切换。 Signals构成了一种异步IPC机制,其中一个进程可以向另一个进程发送简单的通知,触发第二个进程注册的处理程序(或者根据信号的不同什么也不做、停止或杀死该进程,具体取决于信号)。

如果需要传输大量数据,则可以使用System V共享内存,在这种情况下,两个进程可以访问同一部分主内存。请注意,即使在这种情况下,也需要使用同步机制,例如System V信号量,这会导致上下文切换。

因此,当进程需要频繁通信时,最好将它们作为单个进程中的线程。


谢谢。这让我很有感触。我想我一直在忽略一些东西。非常详细和清晰。再次感谢。 - user1031446
1
我不确定线程总是会降低上下文切换的次数(如果您的核心数量远少于线程数量,则肯定不会)。在Linux上,线程像进程一样被调度(内核调度程序正在调度任务,无论是多线程进程的线程还是单线程进程)。 - Basile Starynkevitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接