在Linux中,
我想知道是否所有进程间通信和线程间通信都涉及从用户模式切换到内核模式,以便操作系统内核运行来执行通信?由于系统调用都涉及这样的交换机,我问通信是否需要系统调用。
例如,“共享内存”既可用于进程间通信,也可用于线程间通信,但我不确定是否需要系统调用或操作系统内核参与才能接管cpu来执行某些操作。
谢谢。
发布于 2015-02-07 16:58:47
是的,每个IPC都是由一些系统(2)设置的。
可能会发生这样的情况:某些IPC是由以前的程序(例如,在execve
之前的相同进程中的程序)设置的,例如,当运行像ls | ./yourprog
这样的管道时,它是调用管道(2)的shell,而不是yourprog
。
由于线程使用相同的进程(根据定义)共享一个公共地址空间,所以它们可以使用一些共享数据进行通信。但是,它们通常需要一些用于同步的syscall (例如,使用互斥),请参见例如futex(7) --因为您希望避免自旋锁 (即浪费CPU资源用于等待)。但实际上您应该使用线程(7)
实际上,如果没有同步,就不能使用共享内存(如概览(7)) (例如,使用信号量,请参见概览(7))。请注意,缓存一致性很棘手,有时会使记忆模型变得不直观(和处理器特定)。
发布于 2015-02-07 17:01:09
对于进程间通信,我确信您无法避免系统调用。
对于线程间的交流,我不能给你一个明确的答案,但我有教养的猜测是“是--和-不是”。您知道,您可以使用线程安全队列在线程之间进行通信,而线程安全队列唯一需要的就是锁。如果在线程想要获得锁的时候锁是不可用的,那么当然必须涉及系统,以便将线程置于等待模式中。但是,如果可以获得锁,那么线程应该能够继续进行,而不需要任何系统调用。
这就是我所猜测的,我会非常失望地发现事情实际上并不是这样的,因为这意味着我到现在为止一直认为相当无辜的代码实际上还有一个巨大的隐藏开销。
发布于 2015-02-08 08:30:53
至少,您不需要对共享内存进行每次读/写的系统调用。当然,设置共享内存和同步线程/进程通常会涉及系统调用。您可以在共享内存中使用标志进行同步,但请注意,标记的读和写可能不是原子操作。
(例如,如果在开始时将共享内存中的位置设置为0,然后检查它是否为非零,而其他进程则在准备就绪时将其设置为非零)
https://stackoverflow.com/questions/28384764
复制相似问题