interprocess communication

운영체제 내에서 실행되는 병행 프로세스들은 independent거나 cooperating하다. 프로세스가 시스템에서 다른 프로세스들과 데이터를 공유하지 않는 프로세스는 independent 이다. 프로세스가 시스템에서 실행 중인 다른 프로세스들에 영향을 주거나 받는다면 이는 cooperating 프로세스다.

cooperating 프로세스들은 데이터를 교환할 수 있는, 즉 서로 데이터를 보내거나 받을 수 있는 Interprcoess communication, IPC 기법이 필요하다. 이때 IPC는 기본적으로 shared memory, message passing의 두 가지 모델을 가진다.

IPC in shared-memory systems

이때 공유 메모리에서 사용하는 버퍼에는 unbounded buffer, bounded buffer로 나뉘게 된다.

unbounded buffer는 말 그대로 버퍼에 제한이 없기에, 소비자는 기다리는 상황이 있을 수 있지만, 생산자는 계속해서 값을 넣을 수 있다.

bonunded buffer는 버퍼 크기에 제한을 둬서 생산자가 값을 쓰고 있다면 소비자는 이를 기다려야한다.

Pipes

Pipe는 두 프로세스가 통신할 수 있게 하는 UNIX 시스템에서 제공하는 IPC 기법의 하나였다.

책에서는 Ordinary pipes, Named pipe에 대해서 알아본다.

  • Ordinary pipes (on Windows systems are termed anonymous pipes): Ordinary pipe는 생산자-소비자 형태로 두 프로세스 간의 통신을 허용한다. 결과적으로 Ordinary pipe는 한쪽으로만 데이터를 전송할 수 있는 단방향 통신만이 가능하다. 만일 양방향 통신이 필요하다면 각각 다른 방향으로 데이터를 전송할 수 있개 2개의 pipe를 만들어야 한다.

    위 와 같이 선언하여 사용하며 UNIX에서는 pipe를 특수한 유형의 파일로 취급한다. 따라서 파이프는 일반적인 read(), write() system call을 사용하여 접근될 수 있다. Ordinary pipe는 pipe를 생성한 프로세서 이외에는 접근할 수 없다. 따라서 통상 부모 프로세서가 pipe를 생성하고 fork()로 생성한 자식 프로세스와 통신하기 위해 사용한다. 이때 자식은 부모의 파이프를 상속받는다.

    위의 그림처럼 부모에서 fd[1]에서 쓰고 자식이 fd[0]에서 받거나 그 반대로 동작하거나 하는 단방향 통신이 이루어진다.
    • 예시코드
    pipe에서 쓰는 쪽의 fd를 닫아주면 end-of-file (read() return 0)을 내보내기에, 쓰기가 끝났다면 fd를 닫아주는 작업을 중요하게 생각해야 한다.