【问题标题】:How do programs communicate with each other?程序如何相互通信?
【发布时间】:2012-03-22 09:25:26
【问题描述】:

进程之间如何通信?使用到目前为止我在编程中学到的所有知识,我无法解释套接字、文件系统和其他与在程序之间发送消息有关的事情是如何工作的。

顺便说一句,如果您要添加任何特定于操作系统的东西,我会使用基于 Linux 的操作系统。提前致谢。这个问题困扰我很久了。我也猜测内核与它有关。

【问题讨论】:

  • 那么当您请求打开文件时,例如使用操作系统 api,有一个共享内存空间被写入操作系统接收信息并提供文件?我是对的还是我完全错了?再次感谢。
  • 当你打开一个文件时,操作系统提供了读写该文件的能力(以及一些其他的东西,比如寻找和截断)。两个进程打开同一个文件究竟意味着什么,以及它是如何工作的,取决于内核的实现细节,不会暴露给用户进程。

标签: linux ipc


【解决方案1】:

在大多数 IPC(进程间通信)机制的情况下,您的问题的一般答案是这样的:进程 A 调用内核,传递一个指向缓冲区的指针,其中包含要传输到进程 B 的数据,进程 B 调用内核(或已在调用内核时被阻塞)传递一个指向缓冲区的指针以填充来自进程 A 的数据。

此一般描述适用于socketspipesSystem V message queues、普通文件等。如您所见,通信成本很高,因为它涉及至少一个上下文切换。

Signals 构成一种异步 IPC 机制,其中一个进程可以向另一个进程发送一个简单的通知,触发由第二个进程注册的处理程序(或者,如果没有注册处理程序,则什么也不做,停止或终止该进程,具体取决于信号)。

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

这就是为什么当进程需要经常通信时,最好让它们在单个进程中成为线程。

【讨论】:

  • 谢谢。这很有意义。我想我忽略了一些事情。非常详细和清晰。再次感谢。
  • 我不确定线程​​是否总是会降低上下文切换的数量(如果您的内核比线程少得多,它们当然不会)。线程像 Linux 上的进程一样被调度(内核调度器正在调度任务,可以是多线程进程的线程,也可以是单线程进程)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多