2
리눅스에서

,모든 유형의 프로세스 간/스레드 간 통신에는 시스템 호출이 필요합니까?

  1. 는 간 통신의 모든 유형이 시스템 호출을해야합니까? 간 통신의

    유형

    Pipes 
    Signals 
    Message Queues 
    Semaphores 
    Shared Memory 
    Sockets 
    
  2. 이 interthread 통신 필요한 시스템 호출의 모든 종류의 수행과 같은입니까?

모든 프로세스 간 통신 및 스레드 간 통신이 OS 커널이 통신을 수행하기 위해 실행되도록 사용자 모드에서 커널 모드로 전환해야하는지 알고 싶습니다. 시스템 호출은 모두 이러한 전환을 필요로하기 때문에 통신에 시스템 호출이 필요한지 물어 보았습니다.

예를 들어 "공유 메모리"는 프로세스 간 및 스레드 간 통신 모두에 사용할 수 있지만 시스템 호출이 필요하거나 뭔가 수행하기 위해 CPU를 인수하기 위해 OS 커널을 필요로하는지 확실하지 않습니다.

감사합니다.

답변

3

예, 모든 IPC은 일부 syscalls(2)으로 설정되었습니다.

일부 IPC는 이전 프로그램에서 설정 한 것을 발생할 수 (예를 들어 execve 이전과 동일한 프로세스에서 프로그램), 그것은 pipe(2)하지 yourprog라고했다 ls | ./yourprog 같은 파이프 라인을 실행하는 경우, 예를 들면이다.

동일한 프로세스 (정의에 따라)의 스레드는 공통된 주소 공간을 공유하므로 일부 공유 데이터를 사용하여 통신 할 수 있습니다. 그러나 종종 그들은 synchronization (예 : 뮤텍스와 함께)의 일부 시스템 콜을 필요로합니다. futex(7) - 당신이 spinlocks (즉, 대기중인 CPU 전력 낭비)을 피하기 원하기 때문입니다. 그러나 실제로 사용해야합니다. pthreads(7)

실제로 (예 : 과 같은) 공유 메모리는 동기화없이 사용할 수 없습니다 (예 : 세마포어로는 sem_overview(7) 참조). cache coherence은 까다 롭고 때로는 memory model이 비 직관적 (및 프로세서 관련)이됩니다.

3

프로세스 간 통신에서 나는 시스템 호출을 피할 수 없다고 확신합니다.

간통 한 의사 소통을 위해 나는 명확한 답을 줄 수는 없지만, 내 교훈받은 추측은 "예 & 아니오"가 될 것입니다. 스레드 안전 큐를 사용하여 스레드간에 통신 할 수 있으며 스레드 안전 큐가 작동하는 데 필요한 유일한 것은 잠금입니다. 스레드가 획득하려고하는 순간에 잠금을 사용할 수 없다면 시스템은 스레드를 대기 모드로두기 위해 반드시 참여해야합니다. 그러나 잠금을 얻을 수있는 경우 스레드는 시스템 호출이 필요없이 진행할 수 있어야합니다.

그건 내가 추측 할 수있는 것이고, 실제로 이런 식으로 작동하지 않는다는 것을 알게되면 실망 할 것입니다. 왜냐하면 지금까지 내가 가지고있는 코드가 지금까지 꽤 무고하다고 생각했기 때문에 엄청난 추가 숨겨진 오버 헤드.

1

적어도 공유 메모리에 대한 읽기/쓰기 각각에 대해 시스템 호출이 필요하지 않습니다. 공유 메모리를 설정하면 스레드/프로세스를 동기화 할 때 종종 시스템 호출이 관련됩니다. 동기화를 위해 공유 메모리에서 플래그를 사용할 수 있지만 플래그의 읽기 및 쓰기는 아토믹 액션이 아닐 수 있습니다.

(예를 들어 처음에 공유 메모리 위치를 0으로 설정 한 다음 0이 아닌지 확인하고 다른 프로세스가 무언가를 준비 할 때 0이 아닌 값으로 설정 한 경우)