Network - IPC
IPC (Inter Process Communication)
- 프로세스간 데이터통신
- 종류
- 시그널(Signal)
- Pipe
- Message Queue
- Shared Memory
- Mailbox
시그널
- 일단 PCB(Process Control Block ; 리눅스에서 task_struct 같은~ )에 시그널 개수만큼 미리 확보된 시그널 벡터가 있습니다.
-
시그널 개수만큼 확보되어있기 때문에, 평소에는 0으로 clear되어 있다가 해당 시그널이 발생하면 그 bit만 1로 set 해주면 되는것 이지요.
-
즉, 3번 시그널이 전달되면 3번 시그널벡터가 1로 set되는 것입니다.
-
시그널이 발생하면, 프로세스는 기존의 수행 흐름에서 벗어나, 해당 시그널 핸들러를 수행합니다.
-
시그널 핸들러는 커널이 지정해놓을 수도 있고(예를들어 프로세스 종료, 시그널 무시, 프로세스 중지, 실행 재개 등등) 사용자가 특정 기능을 수행하는 코드도 등록해 놓을 수 있습니다.
- 시그널 핸들러는 시그널 공간 할당 후에 함수포인터를 만들어서 시그널을 처리할 함수의 주소를 가리키도록 해놓는 방식으로 구현하게 됩니다.
Pipe
-
파이프는 프로세스 사이에 형식없는(unstructured) 데이터의 교환을 가능케 합니다. 파이프를 통해 전달되는 데이터는 단순한 바이트 스트림 형태로 전달됩니다.
- 프로세스1 => 파이프 => 프로세스2
-
리눅스에서 쉘명령어중에
|
-
파이프 안의 데이터는 바이트스트림(형식 없는 데이터)로 취급되기 때문에, 여러 메세지 객체가 쓰여졌을 때, 메세지의 경계를 분간할 수 없습니다.
-
또한 파이프는 FIFO(First In First Out)방식으로 데이터를 처리하므로, 메세지가 파이프에 들어온 순서대로 처리됩니다.
- 파이프는 고정된 크기(용량)을 갖습니다.
Message Queue
-
메세지큐는 파이프와 유사하게 프로세스들 간의 데이터통신(메세지 통신)을 위한 IPC입니다.
-
하지만, 메세지는 structured data이기 떄문에, 경계가 구분 가능합니다. 그러므로 하나의 메세지큐 안에 여러개의 메세지를 버퍼링 할 수 있습니다!
-
또한 FIFO, LIFO(Last In First Out) 을 모두 지원하며, 고정된 크기를 갖습니다.
-
메세지큐 구조
- 송신큐 => 메세지큐 => 수신큐
Shared Memory
-
공유 메모리는 두 개 이상으 프로세스가 특정한 메모리 영역을 공유하는 것을 말합니다. 이 공유메모리 영역에 대한 쓰기와 읽기 작업을 통해 데이터통신이 가능한 것입니다.
-
이 공유메모리를 사용할 때 가장 중요한것은 Race Condition이 일어나지 않도록 동기화 매커니즘을 적절히 사용하는 것입니다.
-
예전에 말했던 쓰레드개념도 이와 비슷하지요. 지역 변수는 각각 가지지만, 전역 변수는 여러 쓰레드(태스크)가 공유할 수 있기때문에 공유 메모리를 사용하는 것입니다.
Mailbox
- 메일박스는 두 프로세스간 데이터가 이동할 때 중간에 메일박스를 거쳐서 이동하는 방법
- 프로세스A가 메일박스로 데이터를 송신하면 메일박스는 프로세스 B에게 데이터가 왔다는 것을 알려준다. 이후 프로세스 B가 받을 준비가되면 메일박스에서 프로세스B로 송신한다. 이때 실제 데이터가 이동하는 것이 아닌 데이터의 주소를 이동시켜서 오버헤드를 감소시킨다.
- 또한 메일박스는 브로드캐스팅이 가능하며 여러프로세스간 통신이 가능하다
- 실제 구현을 위한 함수는
- send(목적지, &mailbox)
- recieve(송신지, &mailbox)
- open(&mailbox)
- close(&mailbox)
- 메일박스는 단방향 통신이므로 일반적으로는 두개의 채널(메일박스 두개 생성)로 양방향을 구현
Socket 통신
-
소켓이란 두 프로그램이 서로 데이터를 주고 받을 수 양쪽(두 프로그램 모두)에 생성되는 통신 단자이다.
-
소켓 통신이란 서버와 클라이언트 양방향 연결이 이루어지는 통신으로, 클라이언트도 서버로 요청을 보낼 수 있고 서버도 클라이언트로 요청을 보낼 수 있는 통신으로 다음과 같은 특성을 가진다.
- Communication consists between a pair of sockets
- Identified by IP address and port
- Client-server communication
- Server waits for clients request by listening to a specific port
- Client send a request to the server
- Server accepts the connection request from the client socket