ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 프로세스 간 통신의 적용

    프로세스 간 통신을 이용하면,

    서버는 클라이언트가 전송하는 문자열을 별도의 프로세스를 이용해 파일에 저장할 수 있다.

     

    서버의 한 프로세스는 클라이언트에게 서비스를 제공하고,

    또 다른 프로세스는 문자열 정보를 수신한다.

    두 프로세스는 파이프 기법을 통해 데이터를 송수신한다.

     

    아래는 멀티프로세스 기반 서버에서 위 예제를 돌린 결과 사진이다.



Designed by Tistory.