- [공룡책] 3장 - 프로세스2024년 10월 17일
- 31514
- 작성자
- 2024.10.17.:02
이 글은 공룡책 3장에 있는 프로세스 간의 통신에 대해 다룬다.
프로세스 간의 통신(IPC)에는 기본적으로 공유 메모리와 메시지 전달의 두 가지 모델이 있다.
공유 메모리
공유 메모리를 사용하여 통신하려는 프로세스들은 당연하게도 공유 메모리를 구축해야 한다.
하지만 운영체제는 하나의 프로세스가 다른 프로세스의 메모리에 접근하는 것을 금지하고 있기 때문에 두 프로세스는 제약 조건 제거에 동의하는 것을 필요로 한다.
대신 운영체제는 프로세스 간의 통신 과정에서 데이터의 형식과 위치는 프로세스가 결정하도록 한다.
약간.. 말 안듣는 자식한테 니 알아서 하라고 하는 느낌이다.따라서 두 프로세스는 동시에 동일한 위치에 쓰는 문제를 해결해야 한다.
이를 조금 더 자세히 살펴보기 위해서 생산자-소비자 문제를 예로 들어보자.
생산자 프로세스는 정보를 생산하고, 소비자 프로세스는 정보를 소비한다.
그리고 정보를 담은 공간인 버퍼가 필요하고, 이 버퍼는 메모리 영역에 존재하게 된다.
이 과정에서 소비자가 생산하지도 않은 정보를 소비하지 않게 하기 위해서 동기화가 되어 있어야 한다.
버퍼
<무한 버퍼>
무한 버퍼는 소비자가 새로운 정보를 기다릴 수 있지만, 생산자는 대기 없이 새로운 정보를 생산한다.
<유한 버퍼>
유한 버퍼는 소비자의 경우 버퍼가 비어있으면 대기하고, 생산자의 경우 버퍼가 가득 차있으면 대기한다.
하지만 공유 메모리를 사용하는 경우 경쟁 조건(Race Condition)이 발생할 수 있으니, Lock이나 Mutex 같은 메커니즘을 고려해야 한다.
메시지 전달
우선, 동일한 주소 공간을 공유하지 않아서 동기화 문제가 발생하지 않는 IPC 기법이다.
특히 네트워크로 연결된 분산 환경에서 유용하고, 최소 2개의 연산을 가지고 있다.
통신을 원하는 프로세스들은 서로를 가리킬 방법이 있어야 하는데, 이때 간접 통신 또는 직접 통신을 사용할 수 있다.
직접 통신
<대칭성 직접 통신>
통신을 원하는 각 프로세스는 수신자 또는 송신자의 이름을 명시해야 한다.
<비대칭성 직접 통신>
// Q가 수신자 Send(Q, message) Receive(id, message)
송신자만 수신자의 Identity를 알면 되고, 수신자의 Receive에서 송신자의 id가 자동으로 확인된다.
하지만 직접 통신은 프로세스의 이름이 변경되면 수정해야 할 부분이 많아지기 때문에 모듈성을 제한한다.
간접 통신
간접 통신에서 메시지들은 메일 박스 또는 포트로 송수신된다.
메일 박스는 고유 ID를 가지고 있고, 프로세스들이 메시지를 적재하고 제거하는 객체라고 생각하면 된다.
직접 통신과 다르게 같은 메일 박스를 기준으로 두 개 이상의 프로세스들과 연결될 수 있다.
여러 프로세스들이 메일 박스와 연결되면 다음과 의문점이 생긴다.
그럼 수신자가 둘 이상이면 어떡하지?
이런 경우 메일 박스가 누구의 소유냐에 따라 달라진다.
<하나의 프로세스가 메일 박스를 소유하는 경우>
신경 쓸 필요 없다.
그냥 소유자만 메일 박스에 존재하는 메시지를 가져가면 그만이다.
대신 송신자는 해당 프로세스가 종료되면 더는 메일 박스가 존재하지 않다는 것을 통보 받아야 한다.
<운영체제가 메일 박스를 소유하는 경우>
일단 운영체제는 프로세스에게 다음을 할 수 있도록 허용해야 한다.
- 새로운 메일 박스 생성
- 메일 박스로 메시지 송수신
- 메일 박스 삭제
처음에는 새로운 메일 박스를 생성하는 프로세스가 소유자가 된다.
그러나 소유권과 수신 특권은 적절한 시스템 콜을 통해 다른 프로세스로 전달될 수 있다.
예를 들면 fcntl(), sendmsg(), msgctl(), mq_open() 등이 있다.
따라서 이 경우에 수신자가 둘 이상이 될 수 있는데, 이때 어떤 수신자가 메시지를 받아야 할까?
이에 대한 정책은 운영체제나 시스템 설계에 따라 결정된다.
- 임의 선택 - 운영 체제가 수신자 중 임의의 하나를 선택
- 라운드 로빈 - 수신자들이 순차적으로 메시지를 수신
- 우선 순위 - 수신자에게 우선순위를 부여
- 최초 대기자 우선 - 먼저 메시지를 받을 준비가 된 수신자가 메시지를 가져감
- 브로드캐스트 - 송신자가 보낸 메시지가 모든 수신자에게 동시에 전달
- 로드 밸런싱 - 가장 적은 부하를 가지고 있는 수신자에게 전달
공통 부분
프로세스 간의 통신은 Send와 Receive에 대한 호출에 의해 발생한다.
각 프리미티브를 구현하기 위한 서로 다른 설계 옵션은 다음과 같다.
- 동기(blocking) - 어떤 액션을 취하면 끝날 때까지 기다린다.
- 비동기(non-blocking) - 어떤 액션을 취하고 바로 다음 액션을 수행한다.
그리고 통신이 직접적이든 간접적이든 교환되는 메시지는 임시 큐에 들어 있다.
- 무용량 큐(동기/blocking) - 큐의 크기가 0인 경우로, 메시지가 송신되면 바로 수신자에게 전달되어야 하는 방법이다.
- 유한 용량 큐(비동기/non-blocking) - 큐의 크기가 제한적인 경우로, 미리 정해진 수의 메시지만 저장할 수 있다.
- 큐에 여유 공간이 있다면 송신자가 메시지를 보내고, 없다면 대기한다.
- 수신자는 큐에 있는 메시지를 순차적으로 처리한다.
- 순차적으로 처리한다고 하지만 동시에 접근할 수도 있으므로 정책은 필요하다.
- 무한 용량 큐(비동기/non-blocking) - 큐의 크기에 제한이 없고 송수신자는 자유롭다.
공유 메모리와 메일 박스의 차이
공유 메모리 메일 박스 데이터 전달 방식 프로세스 간 직접 메모리 공간 공유 메시지 전달을 통해 데이터 교환 데이터 접근 속도 매우 빠름 비교적 느림 데이터 복사 여부 X O 동기화 문제 O △ 사용 예시 실시간 데이터 처리, 대용량 데이터 처리 등 네트워크 프로세스 통신, 분산 시스템 등 IPC 시스템의 사례
POSIX 공유 메모리
POSIX는 유닉스 기반 시스템에서 표준화된 인터페이스를 제공하는 규약이다.
POSIX 공유 메모리는 여러 프로세스가 하나의 메모리 공간을 공유하여 데이터를 교환할 수 있게 해주는 IPC 메커니즘이다.
매우 빠르고 큰 데이터를 효율적으로 전달할 수 있지만, 동기화 문제를 해결해야 한다.
Mach 메시지 전달
Mach는 마이크로커널 아키텍처 기반의 운영 체제에서 사용되는 IPC 메커니즘이다.
Mach에서 메시지 전달은 프로세스 간 통신의 기본 방식으로, 프로세스가 서로 메시지를 주고받는 형태로 통신합니다.
<작동 방식>
- 포트(port)라는 커널 객체를 통해 프로세스 간에 메시지를 전달한다. 각 포트는 고유한 식별자를 가지며, 포트는 프로세스가 소유할 수 있다.
- 프로세스는 특정 포트에 메시지를 보내거나 받을 수 있으며, 메시지는 비동기적으로 처리된다.
- 메시지는 데이터를 캡슐화한 객체로, 커널이 메시지 전달을 관리한다. 이를 통해 프로세스는 직접 메모리에 접근하지 않고도 서로 통신할 수 있다.
직접 메모리에 접근하지 않아서 보안성이 높고, 비동기로 처리되기 때문에 병렬성은 높지만, 성능은 공유 메모리보다 느리다.
파이프
파이프(Pipes)는 두 프로세스 간의데이터 통신을 위한 가장 기본적인 IPC 메커니즘이다.
일반적으로 한 프로세스가 파이프에 데이터를 쓰고(write), 다른 프로세스가 그 데이터를 읽는(read) 방식으로 동작합니다.
<Unnamed Pipes>
부모-자식 프로세스 간에 사용되는 기본적인 파이프입니다.
프로세스 간의 통신에 사용되며, 일방향으로 데이터가 흐릅니다.
하지만 네트워크 상의 통신에서는 사용할 수 없다.
<Named Pipes (FIFO)>
Named Pipes는 두 개의 독립된 프로세스 간에 사용할 수 있으며, 양방향 통신을 지원할 수 있습니다.
파이프는 간단하고 효율적이며 부모-자식 프로세스 간의 통신에 적합하다.
Windows IPC
Windows 운영 체제에서는 다양한 IPC 메커니즘을 제공한다.
- Named Pipes - 메시지 전달(간접 통신)
- Shared Memory - 공유 메모리
- Message Queues - 메시지 전달(메일 박스)
- Sockets
클라이언트 서버 환경에서 통신
소켓(저수준)
소켓은 IP 주소와 Port 번호로 이루어져 있으며, 프로세스가 네트워크 상에서 통신하기 위해 필요하다.
Port 번호는 SSH(22), FTP(21), HTTP(80)과 같이 1,024 미만의 번호는 well-known이라고 부른다.
종류는 TCP, UDP 등이 있다.
<통신 과정>
- 호스트 시스템 X에 존재하는 클라이언트 프로세스가 서버로 연결을 요청한다.
- 이때 X는 클라이언트 프로세스에게 Port 번호를 부여하는데, 1024보다 큰 임의의 정수가 부여된다.
- 서버는 요청이 들어온 Port로 연결한다.
따라서 소켓으로 연결이 성사되면 (X의 IP + Port 번호, 서버의 IP + Port 번호)가 유일해야 한다.
원격 프로시저 호출(RPCs)
네트워크 상의 다른 컴퓨터에서 원격 함수를 호출하는 고수준 통신 방식으로, 네트워크 투명성과 함수 호출 추상화를 제공한다.
클라우드 서비스, 분산 시스템 등에 사용된다.
다음글이전글이전 글이 없습니다.댓글