在Linux中,
-
所有类型的进程间通信都需要系统调用吗?
进程间通信的类型如
Pipes Signals Message Queues Semaphores Shared Memory Sockets
- 所有类型的线程间通信都需要系统调用吗
我想知道是否所有的进程间通信和线程间通信都涉及从用户模式切换到内核模式,以便运行操作系统内核来执行通信?由于系统调用都涉及这样的切换,我问通信是否需要系统调用。
例如,"共享内存"既可以用于进程间通信,也可以用于线程间通信,但我不确定它是否需要系统调用或操作系统内核的参与来接管cpu来执行某些操作。
谢谢。
对于进程间通信,我确信您无法避免系统调用。
对于线程间通信,我不能给你一个明确的答案,但我有根据的猜测是"是和否"。您可以使用线程安全队列在线程之间进行通信,而线程安全队列唯一需要的就是锁。如果一个锁在线程想要获得它的时刻不可用,那么系统当然必须参与进来,才能使线程处于等待模式。但是,如果可以获得锁,那么线程应该能够在不需要任何系统调用的情况下继续。
这就是我的猜测,如果我发现事情实际上并不是这样工作的,我会非常失望,因为这意味着我迄今为止一直认为非常无辜的代码实际上有巨大的额外隐藏开销。
是的,每个IPC都是由一些系统调用设置的(2)。
某些IPC可能是由以前的程序(例如execve
之前同一进程中的程序)设置的,例如,当运行类似ls | ./yourprog
的管道时,调用管道(2)而不是yourprog
的是shell。
由于同一进程中的线程(根据定义)共享一个公共地址空间,因此它们可以使用一些共享数据进行通信。然而,它们通常需要一些系统调用来进行同步(例如,使用互斥),请参见例如futex(7),因为您希望避免自旋锁(例如,浪费CPU功率等待)。但在实践中,您应该使用pthreads(7)
在实践中,如果没有同步(例如,使用信号量,请参阅sem_overview(7)),就无法使用共享内存(如shm_overview(7。请注意,缓存一致性很棘手,有时会使内存模型变得不直观(而且是特定于处理器的)。
至少,对共享内存的每次读/写都不需要系统调用。设置共享内存是肯定的,同步线程/进程通常涉及系统调用。您可以使用共享内存中的标志进行同步,但请注意,读取和写入标志可能不是原子操作。
(例如,如果您在共享内存中一开始就将一个位置设置为0,然后检查它是否为非零,而另一个进程在准备就绪时将其设置为非零)