ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2015.02.20 Inter Process Communication 프로세스간 통신
    Legacy/뇌자극 - WinSysProg 2015. 2. 19. 18:54
    728x90

    IPC(Inter-Process Communication) - 프로세스간 통신(IPC)

    프로세스 간에 서로 공유하는 메모리가 존재하면 프로세스간 통신은 아주 쉽지만, 그러한 영역이 없다면 보조 수단이 필요함. 실제로 프로세스들은 서로 '만나서' 데이터를 주고 받는 것이 불가능함.

    프로세스들이 서로 만날 수 없는 이유

    프로세스는 각자 자기에게 할당된 독립적인 메모리 공간을 가지게 된다. 이 때 프로세스들은 자신에게 할당된 메모리 공간 이외에는 접근이 불가능하다.

    왜 프로세스간에 만나지 못하게 디자인 했을까?

    레이스 컨디션과 같은 상황은 생각해 보면 쉬울 듯.


    Windows에서는 다양한 IPC 기법을 제공하고 있다.


    메일슬롯 방식의 IPC

    메일슬롯은 파이프와 더불어 대표적인 IPC 기법이다. 메일슬롯은 편지를 넣을 수 있는 가느다란 우체통의 입구를 의미한다. 우체통(Mail Box)가 아닌 Mail Slot이라는 점을 기억하자.

    (저자의 말에는 선형적인 메모리 구조의 특성을 반영하기 위한 것이라고 감히 짐작해 본다고 나와있음)

    "데이터를 주고 받기 위해서 프로세스가 우체통을 마련하는 것."

    데이터를 전송하고자 하는 프로세스를 Sender라고 하고 데이터를 수신하는 프로세스를 Receiver라고 하자. Receiver는 밖에다가 우체통을 하나 걸어둔다. 이를 가리켜 메일 슬롯이라고 한다. Sender는 Receiver의 주소를 통해서 Receiver의 메일슬롯을 향하여 데이터를 날린다.(마치 편지를 보내는 것처럼) 그러면 Receiver는 메일슬롯을 통해서 데이터를 얻게 된다.

    Receiver가 준비해야 할 것

    메일슬롯을 생성해야 한다. 메일슬롯을 생성하는 함수는 다음과 같다.

    HANDLE CreateMailslot (

    LPCTSTR lpName,

    DWORD nMaxMessageSize,

    DWORD lReadTimeout,

    LPSECURITY_ATTRIBUTES lpSecurityAttributes

    );

    lpName : 생성하는 메일슬롯의 이름을 결정하는데 사용됨. 주소를 지정하는 것이라고 생각하면 된다. 주소의 기본 형식은 다음과 같다.

    \\computername\mailslot\[path]name

    nMaxMessageSize : 메일슬로의 버퍼 크기를 지정하는데 사용된다. 만약 0으로 할 경우 시스템이 허용하는 최대 크기로 지정된다.

    lReadTimeout : 메일 슬롯을 통해 전송된 데이터를 읽기 위해서 파일 입출력 함수인 ReadFile함수가 사용된다. 만약 메일 슬롯으로부터 읽어 들일 데이터가 있다면, 이 데이터를 읽어 들이면서 ReadFile 함수를 빠져나오게 된다. 그러나 메일 슬롯이 비어 있다면 데이터가 채워질 때까지 ReadFile 함수는 반환하지 않고 블로킹(Blocking) 상태에 놓이게 된다. lReadTimeout은 최대 블로킹 시간을 밀리세컨드 단위로 지정하는 데 사용된다. 따라서 0을 인자로 전달하면 메일슬롯에 읽어 들일 데이터가 있든지, 없든지 간에 블로킹 상태 없이 빠져나와서 다음 단계를 실행하게 된다. 그리고 상수 MAILSLOT_WAIT_FOREVER를 인자로 전달할 경우 읽어 들일 데이터가 존재할 때까지 블로킹 상태에 놓인다.

    lpSecurityAttributes : 핸들을 상속하기 위한 용도로 사용됨.

    반환형으로는 커널 오브젝트의 핸들이 반환됨을 알 수 있다. 메일슬롯도 커널에 의해서 관리되는 리소스이기 때문에 커널 오브젝트가 생성되고, 이 커널 오브젝트의 핸들이 반환되는 것이다.


Designed by Tistory.