관리 메뉴

코딩하는 락커

05. 프로세스간 통신: Chapter 3. Processes 본문

📀 운영체제

05. 프로세스간 통신: Chapter 3. Processes

락꿈사 2022. 5. 22. 19:27

3.4 프로세스 간 통신 Interprocess Communication(IPC)

  • 운영 체제 내에서 실행되는 병행 프로세스들은 독립적이거나 협력적
    • 독립적인 프로세스: 프로세스가 시스템에서 실행 중인 다른 프로세스들과 데이터를 공유하지 않는 프로세스
    • 협력적인 프로세스: 프로세스가 시스템에서 실행 중인 다른 프로세스들과 데이터를 공유하는 프로세스
  • 협력적 프로세스들은 데이터를 보내거나 받을 수 있는 프로세스 간 통신(Interprocess communication, IPC) 기법이 필요함
  • 프로세스 통신 모델
    • 공유 메모리shared memory 모델
      • 협력 프로세스들에 의해 공유되는 메모리 영역이 구축됨
    • 메시지 전달message passing 모델
      • 통신이 협력 프로세스들 사이에 교환되는 메시지를 통하여 이루어짐

 

공유 메모리 시스템에서의 프로세스 간 통신

  • 생산자-소비자 문제
    • 생산자 프로세스: 정보를 생산
    • 소비사 프로세스: 정보를 소비
  • 생산자-소비자 문제 예시
    • 컴파일러(생산자, 어셈블리 코드 생성) - 어셈블러(소비자, 어셈블리 코드 소비)
    • 어셈블러(생산자, 목적 모듈 생산) - 로더(소비자, 목적 모듈 소비)
    • 웹 서버(생산자, HTML 파일 등 웹 콘텐츠 생선)  - 브라우저(소비자, 웹 콘텐츠 소비)
  • 생산자-소비자 문제 해결책
    • 공유 메모리 사용
      • 생산자가 정보를 채워넣을 수 있고 소비자가 소모할 수 있는 항목들의 버퍼가 반드시 사용 가능해야 함
      • 버퍼는 생산자와 소비자가 공유하는 메모리 영역에 존재함
      • 생산자는 한 항목 생성 / 소비자는 그 동안에 다른 항목 소비
    • 무한 버퍼unbounded buffer를 사용하는 경우
      • 생산자: 계속 새로운 항목을 생산할 수 있음
      • 소비자: 새로운 항목을 기다려야 할 수도 있음
    • 유한 버퍼bounded buffer를 사용하는 경우
      • 생산자: 모든 버퍼가 채워져 있으면 반드시 기다려야 함 
      • 소비자: 버퍼가 비어 있는 경우 반드시 기다려야 함
  • 생산자-소비자 문제 코드 
// Shared Buffer
#define BUFFER_SIZE 10
typedef struct {
    ...
    item;
};

item buffer[BUFFER_SIZE];
int in = 0;
int out = 0;
// Producer
item next_produced;

while (true){
    // produce an item in next-produced  

    while(((in + 1)% BUFFER_SIZE) == out);

    buffer[in] = next_produced;
    in = (in + 1) % BUFFER_SIZE;
}
// Producer
item next_consumed;

while (true){
    // produce an item in next-produced  

    while(in == out);

    next_consumed = buffer[out];
    out = (out + 1) % BUFFE_SIZE;

    // consume the item in next_consumed
}

 

3.6 메시지 전달 시스템에서의 프로세스 간 통신 

  • shared memory 통신 방법은 프로세스들이 메모리 영역을 공유해야 하며, 공유 메모리에 접근하고 조작하는 코드가 응용 프로그래머에 의해 명시적으로 작성되어야 함
  • 메시지 전달 방법message passing system
    • 운영체제가 메시지 전달 시스템을 통하여 서로  협력하는 프로세스 간의 통신 수단을 제공
    • 동일한 주소 공간을 공유하지 않고도 프로세스들이 통신을 하고, 그들의 동작을 동기화 할 수 있도록 허용하는 기법 제공
  • message passing system의 두 가지 연산
    1. send(message)
    2. recevice(message)
  • 프로세스 P와 프로세스 Q가 통신을 원하면 반드시 서로 메시지를 보내고 받아야 함
  • P와 Q 사이에 통신 연결communication link이 설정되어야 함
  • 통신 연결을 구현하는 3가지 방법
    1. 직접 또는 간접 통신
    2. 동기식 또는 비동기식 통신
    3. 자동 또는 명시적 버퍼링

 

명명

  • 직접 통신
    • 통신을 원하는 프로세스는 통신의 수신자 도는 송신의 이름을 명시해야 함
      • send(P, message) : 프로세스 P에게 메시지를 전송한다
      • receive(Q, message): 프로세스 Q로부터 메시지를 수신한다
    • 특성
      • 통신은 원하는 각 프로세스의 쌍들 사이에 연결이 자동으로 구축되며, 프로세스들은 통신하기 위해 상대방의 신원identity만 알면 됨
      • 연결은 정확히 두 프로세스 사이에만 연결됨
      • 통신하는 프로세스들의 각 쌍 사이에는 정확히 하나의 연결이 존재해야 함
  • 간접 통신
    • 메시지들이 메일 박스mail box 또는 포트port로 송신되고, 그로 부터 수신됨
    • 메일 박스는 추상적으로 프로세스들에 의해 메시지들이 넣어지고 메시지들이 제거될 수 있는 객체라고 볼 수 있음
    • 각 메일 박스는 고유의 id를 가짐
      • send(A, message):  메시지를 메일 박스A 로 송신한다
      • receive(A, message): 메시지를 메일 박스A 로 수신한다
    • 특성
      • 한 쌍의 프로세스들 사이의 연결은 이들 프로세스가 공유 메일 박스를 가질 때만 구축
      • 연결은 두 개 이상의 프로세스들과 연관될 수 있음
      • 통신하고 있는 각 프로세스들 사이에는 다수의 서로 다른 연결이 존재할 수 있고, 각 연결은 하나의 메일 박스에 대응됨
    • 메일 박스는 한 프로세스 또는 운영체제에 의해 소유될 수 있음
    • 운영체제가 간접 통신을 위해서 한 프로세스에게 제공해야 하는 기법
      • 새로운 메일 박스 생성
      • 메일 박스를 통해 메시지를 송신하고 수신
      • 메일 박스 삭제
    • 코드
// Producer
message next_produced;

while(true){
    // produce an item in next_produced
    send(next_produced)
}
// Consumer
message next_consumed;

while(true){
    receive(next_consumed);

    // consume an item in next_consumed
}

 

동기화synchronization

  • 프로세스 간의 통신은 send와 receive 프로세스에 대한 호출에 의해 발생함
  • send와 receive를 설계하는 옵션
    • 봉쇄형blocking (동기식synchronous)
      • blocking send: 송신하는 프로세스는 수신 프로세스 또는 메일 박스에 의해 수신될 때 까지 봉쇄한다(기다린다)
      • blocking receive: 메시지가 이용 가능할 때 가지 수신 프로세스가 봉쇄된다(기다린다)
    • 비봉쇄형non-blocking (비동기식asynchronous)
      • non-blocking send: 송신하는 프로세스는 메시지를 보내고 작업을 재시작한다
      • non-blocking receive: 송신하는 프로세스가 유효한 메시지 또는 Null을 받는다

 

Comments