-
TCP/IP 소켓 프로그래밍 - 11장 : 프로세스간 통신네트워크 2024. 6. 21. 23:44
11장
11-1 프로세스간 통신의 기본 개념
두 프로세스가 데이터를 주고 받기 위해서는 동시에 접근 가능한 메모리 공간이 있어야 한다.
fork 함수 호출을 통해 생성된 자식 프로세스는 부모 프로세스와 메모리 공간을 공유하지 않는다.
프로세스 간 통신을 하기 위해서는 파이프 기법이 필요하다.
파이프는 프로세스가 아닌, 운영체제에 속하는 자원이다.
운영체제가 마련해주는 메모리 공간을 통해 두 프로세스는 통신을 하게 되는 것이다.

pipe 생성에 사용되는 함수는 아래와 같다.
#include <unistd.h> int pipe(int filedes[2]); //성공 시 0, 실패 시 -1 반환 //filedes[0] : 데이터를 수신하는데 사용된 파일 디스크립터 저장. (출구) //filedes[1] : 데이터를 송신하는데 사용된 파일 디스크립터 저장. (입구)부모 프로세스가 pipe 함수를 호출하면 파이프가 생성되고,
파이프의 입구/출구에 해당하는 파일 디스크립터를 동시에 얻게 된다.
부모 프로세스는 fork 함수를 이용해 자식 프로세스에게
입구 또는 출구에 대응되는 파일 디스크립터 중 하나를 넘겨준다.
양방향 통신을 할 때는 굉장히 주의해야 한다.
아래는 책의 예제를 통해 양방향 통신에서 주의해야 할 부분에 대한 코드 실행 결과다.
(특정 코드를 주석 처리하면, 무한 대기하는 결과가 나온다.)

양방향 통신에서 주의할 점은,
파이프에 데이터가 전달되면 먼저 온 프로세스가 그 데이터를 읽어가는 것이다.
read 함수호출을 통해 먼저 읽는 프로세스에게 데이터가 전달된다.
심지어는 같은 프로세스가 쓰고 읽어가는 경우가 발생할 수도 있다.

한 파이프로 양방향으로 데이터를 송수신할 때의 모델 하나의 파이프만을 가지고 양방향 데이터를 송수신한다는 것은
프로그램의 실행흐름을 예측하고 컨트롤해야 하는 일이며,
이는 시스템에 따라 달라질 수 있기 때문에 불가능하다고 여겨진다.
해결 방법은 파이프를 두 개 생성하면 된다.!

두개의 파이프로 양방향으로 데이터를 송수신 할때의 모델 파이프를 두 개 사용하면,
프로그램의 흐름을 예측하거나 컨트롤할 필요가 없다!
11-2 프로세스 간 통신의 적용
프로세스 간 통신을 이용하면,
서버는 클라이언트가 전송하는 문자열을 별도의 프로세스를 이용해 파일에 저장할 수 있다.
서버의 한 프로세스는 클라이언트에게 서비스를 제공하고,
또 다른 프로세스는 문자열 정보를 수신한다.
두 프로세스는 파이프 기법을 통해 데이터를 송수신한다.
아래는 멀티프로세스 기반 서버에서 위 예제를 돌린 결과 사진이다.

'네트워크' 카테고리의 다른 글
TCP/IP 소켓 프로그래밍 - 13장 : 다양한 입출력 함수들 (0) 2024.06.24 TCP/IP 소켓 프로그래밍 - 12장 : IO 멀티플렉싱 ( Multiplexing ) (0) 2024.06.23 TCP/IP 소켓 프로그래밍 - 10장 : 멀티프로세스 기반의 서버 구현 (0) 2024.06.20 TCP/IP 소켓 프로그래밍 - 9장 : 소켓의 다양한 옵션 (0) 2024.06.19 TCP/IP 소켓 프로그래밍 - 8장 : 도메인 이름과 인터넷 주소 (0) 2024.06.18