【问题标题】:Do all types of interprocess/interthread communication need system calls?所有类型的进程间/线程间通信都需要系统调用吗?
【发布时间】:2015-04-07 17:11:44
【问题描述】:

在 Linux 中,

  1. 所有类型的进程间通信都需要系统调用吗?

    进程间通信的类型如

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

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

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

谢谢。

【问题讨论】:

    标签: linux multithreading system-calls inter-process-communicat


    【解决方案1】:

    对于进程间通信,我很确定您无法避免系统调用。

    对于线程间通信,我不能给你一个明确的答案,但我有根据的猜测是“是与否”。您会看到,您可以使用线程安全队列在线程之间进行通信,而线程安全队列唯一需要的就是锁。如果一个锁在线程想要获得它的那一刻不可用,那么当然必须涉及系统才能使线程处于等待模式。但是如果可以获取锁,那么线程应该能够继续进行而不需要任何系统调用。

    这就是我的猜测,我会很失望地发现事情实际上并没有以这种方式工作,因为这意味着我迄今为止一直认为非常无辜的代码实际上有一个巨大的额外隐藏开销。

    【讨论】:

      【解决方案2】:

      是的,每个IPC 都是由一些syscalls(2) 设置的。

      可能会发生某些 IPC 是由以前的程序设置的(​​例如,execve 之前的同一进程中的程序),例如在运行像 ls | ./yourprog 这样的管道时,它是 shell它调用了pipe(2),而不是yourprog

      由于线程——在同一个进程中——(根据定义)共享一个公共地址空间,它们可以使用一些共享数据进行通信。但是,他们通常需要一些系统调用 synchronization(例如使用互斥锁),参见例如futex(7) - 因为您想避免 spinlocks(即浪费 CPU 功率等待)。但实际上你应该使用pthreads(7)

      实际上,您不能在没有同步的情况下使用共享内存(如shm_overview(7))(例如,使用信号量,请参阅sem_overview(7))。请注意,cache coherence 很棘手,并且使memory model 有时不直观(并且特定于处理器)。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2011-02-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-31
          • 1970-01-01
          相关资源
          最近更新 更多