所有types的进程间/线程间通信都需要系统调用吗?

在Linux中,

  1. 做所有types的进程间通信是否需要系统调用

    进程间通信types如

    Pipes Signals Message Queues Semaphores Shared Memory Sockets 
  2. 所有types的线程间通信都需要系统调用吗?

我想知道所有进程间通信和线程间通信是否涉及从用户模式切换到内核模式,以便内核运行来执行通信? 由于系统调用都涉及这样的切换,所以我询问通信是否需要系统调用。

例如,“共享内存”可以用于进程间和线程间通信,但是我不确定是否需要系统调用或操作系统内核的参与来接pipeCPU来执行某些操作。

谢谢。

对于进程间通信,我确信你不能避免系统调用。

对于线上阅读沟通,我不能给你一个明确的答案,但我的教育猜测是“是 – 否”。 你看,你可以使用线程安全的队列在线程之间进行通信,线程安全的队列唯一需要的就是锁。 如果一个线程想要获得锁的时候锁是不可用的,那么为了使线程处于等待模式,当然必须包含系统。 但是,如果可以获得锁,则线程应该能够继续进行,而不需要任何系统调用。

这就是我所猜测的,我会很失望地发现,事情并不是真的这样工作,因为那意味着我到现在为止已经考虑的代码实际上已经有了额外的额外隐藏的开销。

是的,每个IPC都由一些系统调用(2)来设置 。

有可能是由于前面的程序(例如execve之前的程序在同一进程中)设置了一些IPC,例如运行ls | ./yourprog ls | ./yourprog它是叫做pipe(2)的shell ,不是yourprog

由于线程在同一进程中(根据定义)共享一个公共地址空间,因此它们可以使用某些共享数据进行通信。 但是,他们通常需要一些系统调用来同步 (例如使用互斥锁),请参阅futex(7) – 因为您希望避免自旋锁 (即浪费CPU电力等待)。 但在实践中,你应该使用pthreads(7)

在实践中,你不能使用共享内存(如shm_overview(7) )而没有同步(例如使用信号量,参见sem_overview(7) )。 请注意, 缓存一致性是非常棘手的,并使内存模型有时不直观(和处理器特定)。

至少,每个读/写共享内存都不需要系统调用。 设置共享内存将是肯定的,同步线程/进程通常涉及系统调用。 您可以在共享内存中使用标志进行同步,但请注意,读取和写入标志可能不是原子操作。

(例如,如果您将共享内存中的某个位置设置为0,然后检查它是否为非零,而另一个进程在准备好某些内容时将其设置为非零)