- 이전 게시글
본 포스팅 글은 이전 게시글에 대해 이어지는 내용을 작성합니다. 해당 게시글을 확인하지 않으신 분은 먼저 이전 글을 읽고 오시기 바랍니다.
프로세스 통신
개요
프로세스 종류
- 독립적으로 작동하는 프로세스
- 협력적으로 작동하는 프로세스
- 협력적으로 작동하는 프로세스는 서로 영향을 준다.
협력 프로세스를 사용하는 이유
- 정보 공유
- 연산속도 향상
- 모듈화
- 편의성
IPC
- IPC: Interprocess Communication
- 협력 프로세스가 원활하게 동작하기 위한 방법을 의미한다.
- IPC의 종류
- Shared Memory
- Message Passing
프로세스 통신 모델
Message Passing vs Shared Memory
- Message Passing
- Message Queue를 통해 메시지를 주고받는다.
- Kernel을 통해, Message를 교환하여 Kernel Overhead가 발생할 수 있다.
- 프로세스간 직접적으로 통신을 하지 않는다.
- Shared Memory
- 공유메모리를 통해 프로세스가 서로 소통한다.
- 동기화(Sync)를 통해서 동시성 문제를 극복한다.
공유 메모리
공유 메모리 원리
생산자 소비자 문제
- 생산자, 소비자는 협력 프로세스가 서로 통신하기 위해 필요하다.
- 생산자: 공유할 데이터를 생산(Write)한다.
- 소비자: 공유할 데이터를 소비(Read)한다.
-
시각화
읽고 쓰는 속도가 동일해야 한다.
버퍼
버퍼의 종류
- 무한 버퍼
- 유한 버퍼
유한 버퍼
- 유한 버퍼는 공유 메모리에서 사용된다.
-
시각화
-
유한 버퍼 소스코드
#define BUFFER_SIZE 10 typedef struct { //... } item; item buffer[BUFFER_SIZE]; int in = 0; //Write 할 곳의 index int out = 0; //Read 할 곳의 index
- 즉, 유한버퍼는 큐 형태를 가진다.
- 버퍼 상태
- empty 상태
- “in == out” 일 때, 버퍼는 빈 상태가 된다.
- full 상태
- ”((in+1)%BUFFER_SIZE) == out” 일 때, 버퍼는 꽉 찬 상태가 된다.
- 원형 큐의 상태와 동일하다.
- empty 상태
유한버퍼: 생산자
-
아래 코드는 버퍼에 생산자가 공유할 데이터를 생산하는 예시코드이다.
item next_producted; while(((in+1)%BUFFER_SIZE)==out) { //buffer가 full상태인 경우 //Do Nothing } buffer[in] = next_produced; //비어있는 곳(변수 in)에 item을 삽입(생산)한다. in = (in+1) % BUFFER_SIZE; //변수 in이 다음 비어 있는 원소를 가리키도록 한다.
((in+1)%BUFFER_SIZE)==out
- 해당 조건은 원형 큐 형태인 버퍼가 full 상태인지 판단한다.
while
문을 통해, 버퍼가 꽉 차있으면 공유할 데이터를 삽입하지 않도록 한다.
-
환형 버퍼(원형 버퍼) 예시
- 사용자는 최대 ‘BUFFER_SIZE-1’개 만큼의 버퍼를 사용할 수 있다.
- 마지막 공간까지 데이터가 채워진다면, full 상태와 empty 상태를 구분할 수 없기 때문이다.
자세한 내용은 이전에 포스팅한 글 “[데이터구조] 큐“를 참고하자.
유한버퍼: 소비자
-
아래 코드는 버퍼에 소비자가 공유할 데이터를 소비하는 예시코드이다.
item next_consumed; while (true) { while (in==out) { //공백 상태일 때 //Do Nothing } next_consumed = buffer[out]; // 읽기 out = (out+1) % BUFFER_SIZE; // 변수 out이 다음에 읽을 위치를 가르키도록 } buffer[in] = next_produced; //비어있는 곳(변수 in)에 item을 삽입한다. in = (in+1) % BUFFER_SIZE; //변수 in이 다음 비어 있는 원소를 가리키도록 한다.
in==out
- 해당 조건은 원형 큐 형태인 버퍼가 empty 상태인지 판단한다.
while
문을 통해, 버퍼가 비어있으면 공유할 데이터를 소비하지 않도록 한다.
Message Passing (메시지 전달)
개요
- Message Passing은 IPC의 한 종류이다.
- 또다른 종류로는 Shared Memory (공유 메모리)가 존재한다.
- Message Passing에서 사용하는 동작들
- send(message)
- 메시지 송신
- receive(message)
- 메시지 수신
- send(message)
- Message Passing을 위해 준비해야하는 것
- 프로세스 간의 통신 링크 만들기
- send와 receive를 통해, 메시지 교환하기
- 주요 이슈
- 어떻게 링크를 만들 것인가?
- 링크는 단방향인가, 양방향인가?
- 통신 링크의 종류
- 물리적 링크
- Shared Memory
- Hardware Bus
- Network
- 논리적 링크
- 동기, 비동기 링크
- 자동적, 명시적 버퍼
- 물리적 링크
직접 통신
- P2P 방식의 통신이다.
- 행동
- send(P, message)
- 프로세스 P에게 메시지를 보낸다.
- receive(Q, message)
- 프로세스 Q로부터 온 메시지를 받는다.
- send(P, message)
- 통신 링크의 속성
- 자동 링크 연결
- 한 쌍의 통신 프로세스만 연관되어 있다.
- 단방향, 양방향 링크 존재
-
시각화
간접 통신
- 메일박스(포트)를 통해서 통신하는 방법이다.
- 프로세스가 서로 직접적으로 통신하지는 않는다.
- 메일박스
- Mailbox는 port라고 불리기도 한다.
- 각 메일박스는 유일한 식별자를 가지고 있다.
-
시각화
- 특징
-
링크가 여러 프로세스와 연결되어 있을 수 있다.
-
프로세스들이 여러 개의 링크를 가질 수 있다.
-
- 연산의 종류
- 새 메일박스(포트) 만들기
- 메일박스를 통해서 send, receive 하기
- 메일박스 삭제하기
Message Passing 종류
Message Passing은 여러가지 종류가 있다.
- Message Passing의 종류
- 봉쇄형
- 비봉쇄형
봉쇄형
- 봉쇄(Blocking)을 통해, 동기(Sync)를 할 수 있다.
- 봉쇄형의 종류
- 봉쇄형 송신
- sender는 보낸 메시지가 받아질 때까지 Block된다.
- 봉쇄형 수신
- receiver는 메시지가 도착할 때까지 Block된다.
- 봉쇄형 송신
-
시각화
비봉쇄형
- 비봉쇄(Unblocking)을 통해, 비동기(async)를 할 수 있다.
- 비봉쇄형의 종류
- 비봉쇄형 송신
- sender는 메시지를 보내고, 할일을 계속한다.
- 비봉쇄형 수신
- receiver는 ‘유효한 메시지를 받거나’, ‘Null 메시지라도 받아서’ 작업을 계속한다.
- 비봉쇄형 송신
-
시각화
랑데부
- 랑데부란?
- send와 receive가 동시에 Block인 상태를 뜻한다.
버퍼링
버퍼링이란
- 직접, 간접 통신 모두 프로세스 간에 교환되는 메시지는 임시 큐에 들어간다. 이것을 버퍼링이라고 한다.
- 버퍼링 종류
- Zero Capacity
- 오직 한개씩만 주고 받는다.
- Queue의 길이가 1인 것
- 즉, 큐잉이 불가능하다.
- Bounded Capacity
- 유한 용량
- Unbounded Capacity
- 무한 용량
- Zero Capacity
-
시각화
IPC 예시
Mach 시스템
- msg_send() : 메시지를 메일박스에 보낸다.
- msg_receive() : 메일박스에서 메시지를 수신한다.
윈도우즈 시스템
- 윈도우즈는 “advanced local procedure call (LPC)”을 통해 Message Passing을 사용한다.
- 즉, 고급 로컬 프로시저 호출 기능에 기반한 윈도우즈는 메시지 전달 기법을 사용한다.
Client-Server 시스템
주요 포인트
- Socket
- Remote Procedure Calls (RPC)
- Pipes
- Remote Method Invocation (Java에서)
소켓
- 소켓은 연결의 종단점을 뜻한다.
- 소켓의 구성요소
- Ip
- Port
- 포트
- 1024번 이하 포트는 주로 사용되는 메인 포트이다.
- 개발, 테스트 용으로 포트를 사용할 때는 1024번 이상 포트를 사용해야 한다.
- Loopback 주소
- localhost
- 127.0.0.1
- 자기 자신으로 돌아오는 주소이다.
-
시각화
-
자바에서의 소켓
Remote Procedure Calls
- RPC란?
- 원격지에 존재하는 프로시저를 호출하는 방법이다.
- 프로시저: 일종의 로직
- Big-endian
- 최상위 바이트를 먼저 저장한다.
- Little-endian
- 최하위 바이트를 먼저 저장한다.
- Big-endian과 Little-endian을 서로 변환, 해석할 해석기가 필요하다.
- 왜냐하면, 통신하는 시스템들이 Big-endian과 Little-endian 을 모두 사용하기 때문이다.
Pipes
- 파이프는 두 프로세스가 통신할 수 있게 하는 전달자 역할을 한다.
- 초기 UNIX에서 제공한 것으로 현재는 윈도우에서도 사용한다.
- 고려사항
- 단방향 vs 양방향
- 반이중 vs 전이중
- 반이중: 동시에 양방향 통신 X, 시점을 구분하여 송신과 수신을 따로 진행한다.
- 전이중: 동시에 양방향 통신 O
- 파이프의 종류
- Ordinary Pipes
- 일반 파이프
- Named Pipes
- 지명 파이프
- Ordinary Pipes
일반 파이프
- 부모-자식 프로세스 간의 통신시 아래 그림처럼
fd
가 구분되어 사용된다.fd
: file descriptor
지명 파이프
- 양방향 통신이 가능하다.
- 통신할 프로세스가 부모-자식 관계여야만 사용할 수 있다는 제한도 존재하지 않는다.
RMI
- RMI란?
- Remote Method Invocation
- RMI 방식의 원리와 RPC 방식의 원리는 서로 같다.
- 성결대학교 컴퓨터 공학과 강영명 교수님 (2021)
- Siberschatz et. al., 『Operating System Concepts 10th Ed.』