본문 바로가기

공부 기록/OS

[OS/공룡책] Chapter 3. 프로세스 - IPC 시스템의 사례

IPC 시스템의 사례

POSIX 공유 메모리

- POSIX 공유 메모리는 메모리-사상 파일을 사용하여 구현된다.

- 먼저 아래와 같이 shm_open() 시스템 콜을 사용하여 공유 메모리 객체를 생성해야 한다.

fd = shm_open(name, O_CREATE | O_RDWR, 0666);

- 객체가 설정되면 ftruncate() 함수를 사용하여 객체의 크기를 바이트 단위로 설정한다.

ftruncate(fd, 4096);

- 마지막으로 mmap() 함수가 공유 메모리 객체를 포함하는 메모리-사상 파일을 구축한다.

- 생산자-소비자 모델을 사용하는 공유 메모리 구현에서 생산자는 공유 메모리 객체를 구축하고 공유 메모리에 데이터를 쓰고, 소비자는 공유 메모리에서 데이터를 읽는다.


Mach 메시지 전달

- Mach 커널은 프로세스와 유사하지만 제어 스레드가 많고 관련 자원이 적은 다중 태스크의 생성 및 제거를 지원한다. 모든 태스크 간 통신을 포함하여 Mach에서 대부분의 통신은 메시지로 수행된다. Mach에서 포트(port)라고 하는 메일박스로 메시지를 주고 받는다.

- 각 포트에는 그 포트와 상호 작용하는 데 필요한 자격을 식별하는 포트 권한 집합이 연관된다.

- 태스크가 생성되면 Task Self 포트와 Notify 포트라는 두 개의 특별한 포트도 생성된다. 커널은 Task Self 포트에 대한 수신 권한을 가지고 있어 태스크가 커널에 메시지를 보낼 수 있다. 커널은 이벤트 발생 알림을 작업의 Notify 포트로 보낼 수 있다.

- 각 태스크는 부트스트랩 포트에 액세스할 수 있어서 태스크가 생성한 포트를 시스템 전체의 부트스트랩 서버에 등록할 수 있다.

- Mach 메시지에는 다음 두 필드를 포함한다. => 고정 크기의 메시지 헤더, 데이터를 포함하는 가변 크기 본체

- mach_msg() 함수는 메시지를 보내고 받는 표준 API이다. mach_msg() 함수 호출은 메시지 전달을 수행하기 위해 사용자 프로그램에 의해 호출된다.

- 메시지 시스템의 주요 문제점은 일반적으로 송신자의 포트에서 수신자의 포트로 메시지를 복사해야 하므로 발생하는 성능 저하이다. 기본적으로 Mach는 송신자의 메시지가 포함된 주소 공간을 수신자의 주소 공간에 매핑한다. 따라서 송신자와 수신자 모두 동일한 메모리에 액세스하므로 메시지 자체는 실제로 복사되지 않는다.


Windows

- Windows 운영체제는 모듈화를 이용하여 기능을 향상시키고 새로운 기능을 구현하는 시간을 감소시킨 최신 설계의 예이다.

- Windows의 메시지 전달 설비는 고급 로컬 프로시저 호출 설비(ALPC)라 불린다.

Windows의 고급 로컬 프로시저 호출

- Mach와 유사하게, Windows는 두 프로세스 간에 연결을 구축하고 유지하기 위해 포트 객체를 사용한다. Windows는 연결 포트와 통신 포트의 두 가지 유형의 포트를 사용한다.

- 대용량 메시지는 반드시 섹션 객체를 통하여 전달되어야 한다. 섹션 객체란 채널과 연관된 공유 메모리의 영역을 말한다.


파이프

- 파이프는 두 프로세스가 통신할 수 있게 하는 전달자로서 동작한다.

- 일반 파이프는 생산자-소비자 형태로 두 프로세스 간의 통신을 허용한다. 생산자는 파이프의 한 종단(쓰기 종단)에 쓰고, 소비자는 다른 종단(읽기 종단)에서 읽는다. 결과적으로 일반 파이프는 한쪽으로만 데이터를 전송할 수 있으며 오직 단방향 통신만을 가능하게 한다.

- 일반 파이프는 파이프를 생성한 프로세스 이외에는 접근할 수 없다. 따라서 통상 부모 프로세스가 파이프를 생성하고 fork()로 생성한 자식 프로세스와 통신하기 위해 사용한다.

- Windows 시스템의 일반 파이프는 익명 파이프라고 불리며 UNIX의 대응되는 파이프와 유사하게 동작한다.

 

- 지명 파이프는 좀 더 강력한 통신 도구를 제공한다. 통신은 양방향으로 가능하며 부모-자식 관계도 필요로 하지 않는다.

- 지명 파이프를 UNIX에서는 FIFO라고 부른다. FIFO가 양방향 통신을 허용하기는 하지만 반이중 전송만이 가능하다. 데이터가 양방향으로 전송될 피룡가 있다면, 보통 2개의 FIFO가 사용된다.

- Windows 시스템의 지명 파이프는 UNIX의 상응 파이프보다 훨씬 풍부한 통신 기법을 제공한다. => 전이중 통신을 허용하며, 통신하는 두 프로세스는 같은 기계 또는 다른 기계상에 존재할 수 있다. 추가로 바이트-단위 또는 메시지-단위 데이터의 전송을 허용한다.