【问题标题】:Do all types of interprocess/interthread communication need system calls?所有类型的进程间/线程间通信都需要系统调用吗?
【发布时间】:2015-04-07 17:11:44
【问题描述】:
在 Linux 中,
-
所有类型的进程间通信都需要系统调用吗?
进程间通信的类型如
Pipes
Signals
Message Queues
Semaphores
Shared Memory
Sockets
- 所有类型的线程间通信都需要系统调用吗?
我想知道是否所有进程间通信和线程间通信都涉及从用户模式切换到内核模式,以便操作系统内核运行来执行通信?由于系统调用都涉及到这种开关,所以我问了通信是否需要系统调用。
例如,“共享内存”可用于进程间和线程间通信,但我不确定它是否需要系统调用或操作系统内核的参与来接管 cpu 来执行某些操作。
谢谢。
【问题讨论】:
标签:
linux
multithreading
system-calls
inter-process-communicat
【解决方案1】:
对于进程间通信,我很确定您无法避免系统调用。
对于线程间通信,我不能给你一个明确的答案,但我有根据的猜测是“是与否”。您会看到,您可以使用线程安全队列在线程之间进行通信,而线程安全队列唯一需要的就是锁。如果一个锁在线程想要获得它的那一刻不可用,那么当然必须涉及系统才能使线程处于等待模式。但是如果可以获取锁,那么线程应该能够继续进行而不需要任何系统调用。
这就是我的猜测,我会很失望地发现事情实际上并没有以这种方式工作,因为这意味着我迄今为止一直认为非常无辜的代码实际上有一个巨大的额外隐藏开销。
【解决方案3】:
至少,您不需要为每次读取/写入共享内存进行系统调用。设置共享内存肯定会,同步线程/进程通常会涉及系统调用。
您可以使用共享内存中的标志进行同步,但请注意,标志的读取和写入可能不是原子操作。
(例如,如果您在开始时将共享内存中的位置设置为 0,然后检查它是否为非零,而其他进程在准备好某事时将其设置为非零)