버티의 블로그
[운영체제 #03] Interprocess Communication 본문
Multiprocess Architecture
Google Chrome의 Multiprocess에는 세 가지 종류의 프로세스가 존재한다.
- Browser 프로세스 : 유저 인터페이스, 디스크, 네트워크 I/O만 전담하는 프로세스이다.
- Renderer 프로세스 : 열려진 웹 사이트마다 존재하는 프로세스로 Browser가 받아온 HTML, JS의 처리를 담당한다.
- Plug-in 프로세스 : 특정 종류의 플러그인 실행을 전담하는 프로세스이다.
프로세스는 기본적으로 서로 무관한 상태이다. 즉 서로 영향을 주거나 받지 않고, 심지어 부모-자식 관계의 프로세스도 서로 영향을 줄 수가 없다. 그러나 위의 Multiprocess 내 프로세스들처럼 서로 영향을 주고 받는 특수한 프로세스가 존재하는데, 이들을 Cooperating 프로세스라고 한다.
또한 Cooperating 프로세스들은 OS내의 IPC(Interprocess Communication)을 이용하여 데이터를 통신하고 동기화를 하는데, 이제 2가지의 IPC를 알아볼 것이다.
Shared Memory Concepts
첫번째는 Shared memory를 사용하는 IPC로, 커널 밖의 별도의 메모리 공간으로 데이터를 공유한다. 이는 대량의 데이터를 빠르게 전송할 때 유리한 방법이고, 생산자-소비자 유한버퍼 문제을 해결할 수 있다.
Producer가 데이터를 작성해서 버퍼에 넣고, consumer가 버퍼에서 데이터를 읽는 구조를 Producer-Consumer라고 하는데, 여기서 유한한 버퍼에 여러 producer과 consumer들을 어떻게 동기화할 것인가에 대한 문제를 생산자-소비자 유한버퍼 문제라 한다. 동기화가 제대로 이루어지지 않으면 consumer가 데이터가 필요할 때 버퍼가 empty일 수도 있고, proucer가 데이터를 넣어야 하는데 버퍼가 full일 수 있기 때문이다.
- 우선 Producer는 버퍼가 가득 찬 상태 ((in + 1) % buffer_size == out)인지를 확인하면서, full이 아니라면 next_produced를 버퍼에 하나씩 저장하고 in을 증가시킨다. 여기서 full조건이 empty조건과 같으면 혼동이 올 수 있으므로, 일부러 버퍼 사이즈의 -1만큼만 사용해서, 한자리가 남아있으면 버퍼가 가득 찬 상태로 간주한다.
- Consumer도 비슷하게 버퍼가 비어있는 상태 (in == out)인지 확인하면서, empty가 아니라면 버퍼에서 데이터를 하나씩 next_consumed에 읽어오면서 out을 증가시킨다.
아래 코드는 굉장이 비효율적인데, while문을 보면 버퍼가 full 혹은 empty면 무한으로 nothing이 돌아가며 해당 상태가 해제되기 전까지 대기하는 코드기 때문이다. 이것은 이전 단원에서 보았던 busy waiting 방식이다.
예시) POSIX Shared Memory : Unix 계열 OS에서 사용하는 Shared-Memory 시스템이다.
- shm_open : Shared memory segment가 존재하면 open하고 없으면 새로 생성한다.
- mmap : Shared memory segment를 Shared-memory에 매핑하여 포인터로 가리키게 한다.
- Proceduer은 write하고, consumer은 read한다.
- shm_unlink : Shared memory segment를 삭제한다.
Message Passing Concepts
두번째는 Message passing를 사용하는 IPC로, 커널의 메세지 큐로 데이터를 공유한다. 이는 적은 용량의 데이터를 전송할 때 유리한 방법이다. 프로세스 P와 Q가 통신을 한다면, 서로 통신 유형에 따른 link를 만들고 send/receive 메세지 큐를 사용한다.
Direct Communication : 누구한테 보내고 받는지 상대 프로세스를 정확히 지칭한다.
- send(P, message) : 프로세스 P에게 메세지를 송신
- receive(Q, message) : 프로세스 Q에서 메세지를 수신
Indirect Communication : 누구한테 보내고 받는지 지칭을 안한다. (ex. mailbox에 넣고 빼는 방식)
- send(A, message) : 메일박스 A에게 메세지를 송신
- receive(A, message) : 메일박스 A에서 메세지를 수신
또한 프로세스 통신 간의 동기화 여부에 따른 blocking 옵션도 존재한다.
Blocking (Synchronous)
- Blocking send : 수신자가 메세지를 받고 확인할때까지 송신자를 blocking
- Blocking receive : 송신자가 메세지를 보낼때까지 수신자를 blocking
- 송수신자가 모두 blocking이 되는 상황이 올 수도 있는데, 이를 랑데부라고 한다.
Non-blocking (Asynchronous)
- 이 케이스는 send, receive 모두 blocking을 하지 않고 자유롭다.
- 메일을 주고받는 시스템이 대표적인 예시이다.
'전공 공부 > 운영체제' 카테고리의 다른 글
[운영체제 #06] I/O Systems (0) | 2024.04.19 |
---|---|
[운영체제 #05] Computer System Operation (0) | 2024.04.18 |
[운영체제 #04] Threads (0) | 2024.04.16 |
[운영체제 #02] Processes (2) | 2024.04.04 |
[운영체제 #01] Operating System Structures (0) | 2024.04.02 |