오다기리 박의 알고리즘 노트

7장. 프로세스간 통신(IPC) 1 본문

운영체제

7장. 프로세스간 통신(IPC) 1

오다기리 박 2018. 8. 8. 23:18

7장. 프로세스간 통신(IPC) 1

1. 프로세스간 통신(IPC)란?

IPC(Inter-Process Communication) : 둘 이상의 프로세스가 데이터를 주고 받는 행위


  • 프로세스 사이에서 통신이 이뤄지기 위한 조건

    • 서로 통신하고자 하는 프로세스가 서로 만날 수 있는 여건(공유하는 메모리 영역이 존재)이 허락되면 프로세스간 통신은 쉽다. -> 사실 불가

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

    • 프로세스들은 자신에게 할당된 메모리 공간 이외에는 접근불가

    • 데이터를 주고 받기 위해 메모리 공간을 마련해 놓고, 이곳을 이용해서 통신을 하면 간단하지만 불가능한 일이므로 다른 통신수단을 이용해야 한다.

  • 프로세스들이 서로 만나지 못하게 디자인한 이유

    • 프로그램 안전성을 높이기 위해


2. 메일슬롯 방식의 IPC

  • 메일슬롯(Mail Slot) 원리

    • 파이프와 더불어 대표적인 IPC 기법

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

  • 메일슬롯 구성을 위해 필요한 요소

    • Receiver는 우체통(메일슬롯)을 생성해야한다.
      HANDLE CreateMailslot(
      LPCTSTR lpName,
      DWORD nMaxMessageSize,
      DWORD lReadTimeout,
      LPSECURITY_ATTRIBUTES lpSecurityAttributes
      );
      함수 호출 실패시 반환값은 INVALID_HANDLE_VALUE

      • lpName : 생성하는 메일슬롯의 이름(주소).
        주소형식 : \\computername\mailsolt\[path]name

      • nMaxMessageSize : 메일슬롯의 버퍼 크기를 지정. 0전달시 시스템이 허용하는 최대 크기로 지정

      • lReadTimeout : 메일슬롯을 통해 전송된 데이터를 읽기위해 ReadFile함수가 사용된다. 만약 메일슬롯으로부터 읽어 들일 데이터가 있다면 이 데이터들을 읽어 들이면서 ReadFile 함수를 빠져 나오게 된다. 그러나 비어 있다면 데이터가 채워질 때까지 ReadFile함수는 반환하지 않고 블로킹상태에 놓인다.
        lReadTimeout로 최대 블로킹 시간을 ms단위로 지정한다. 0전달시 메일슬롯에 읽어들일 데이터가 있든 없든 블로킹 상태 없이 빠져 나와 다음 단계를 실행한다. MAILSLOT_WAIT_FOREVER를 전달시 ReadFile함수는 읽어 들일 데이터가 존재할 때까지 블로킹 상태에 놓인다.

      • lpSecurityAttributes : 핸들을 상속하기 위한 용도

      • 반환 타입 : 메일슬롯도 커널에 의해서 관리되는 리소스이기 때문에 커널 오브젝트가 더불어 생성되고 이 커널 오브젝트의 핸들이 반환된다.

    • Sender는 Receiver가 만들어 놓은 메일슬롯의 이름(주소)을 알아야 한다.

//1. 편지봉투, 혹은 편지봉투를 보내기 위한 통로를 마련
// 메일슬롯에 데이터를 보내기 위해 주소 정보를 담고 있는 리소스 생성
HANDLE hMailSlot;
hMailSlot = CreateFile(“\\\\.\\mailslot\\mailbox”,...); -> 해당 주소의 메일슬롯을 개방한다. (데이터를 전송하기 위한 데이터스트림을 형성한다)


//2. 데이터를 (데이터가 담긴 편지봉투를) 전송
CHAR message[50];
WriteFile(hMailSlot, message, …); -> 메일슬롯과의 데이터스트림에 해당하는 핸들을 이용해서 메시지 전달

* 데이터 스트림 역시 OS에 의해서 커널 오브젝트와 핸들의 생성을 동반한다.


  • 메일슬롯은 브로드캐스팅 방식의 통신을 지원



3. Signaled vs Non-Signaled

  • 커널 오브젝트의 두 가지 상태(State)

    • Windows에 의해 생성되는 커널 오브젝트는 두 가지 상태를 지닌다. 이는 리소스에 특정 상황이 발생되었음을 알리기 위한 용도로 사용된다.

    • Signaled 상태와 Non-Signaled 상태는 커널 오브젝트의 멤버변수에 저장된다.

    • 프로세스 실행 중 : 커널 오브젝트가 Non-Signaled 상태
      프로세스 종료 시 : 커널 오브젝트가 Signaled 상태

  • 커널 오브젝트의  두 가지 상태를 확인하는 용도의 함수

    • DWORD WaitForSingleObjec(
      HANDLE hHandle,
      DWORD dwMilliseconds
      );
      -> hHandle이 가리키는 커널 오브젝트가 Signaled 상태가 되었을 때 반환한다.
      함수 실패시, 반환값은 WAIT_FAILED.

      • hHandle : 상태 확인을 원하는 커널 오브젝트의 핸들

      • dwMilliseconds : 커널 오브젝트가 Signaled 상태가 될 때까지 기다릴 수 있는 최대 시간. INFINITE 전달시 무한정 기다림

      • 반환값

        • WAIT_OBJECT_0 : 커널 오브젝트가 Signaled 상태가 되었을 때

        • WAIT_TIMEOUT : 커널 오브젝트가 Signaled 상태가 되지 않고, dwMilliseconds 시간이 다 된 경우

        • WAIT_ABANDONED : 소유 관계와 관련하여 함수가 정상적이지 못한 오류 발생시

    • DWORD WaitForMultipleObjects(
      DWORD nCount,
      const HANDLE* lpHANDLES,
      BOOL bWaitAll,
      DWORD dwMilliseconds
      );
      -> 상태를 확인하고자 하는 커널 오브젝트가 둘 이상이고, 이들의 핸들이 배열로 묶여 있을 때 활용
      함수 실패시, 반환값은 WAIT_FAILED.

      • nCount : 배열에 저장되어 있는 핸들 개수

      • lpHandles : 핸들을 저장하고 있는 배열 주소

      • bWaitAll : 관찰 대상이 모두 Signaled 상태가 되기를 기다릴지(TRUE), 하나라도 Signaled 상태가 되면 반환할 것인지(FALSE)

      • dwMilliseconds : 타임아웃 설정