프로세스 간 통신과 임계구역
Table of contents
프로세스 간 통신
프로세스 간 데이터를 주고 받는 통신을 IPC(Inter-Process Communication)라고 한다.
함수 호출은 하나의 프로세스에서 실행되기 때문에, 통신이라고 할 수 없고 동시에 실행되는 프로세스 끼리 데이터를 주고받을 때 프로세스 간 통신이라고 한다.
1. 프로세스 내부 데이터 통신
- 하나의 프로세스 내에 2개 이상의 스레드가 존재하는 경우의 통신이다. 전역 변수나 파일을 이용하여 데이터를 주고받는다.
2. 프로세스 간 데이터 통신
- 같은 컴퓨터에 있는 여러 프로세스끼리 통신하는 경우로, 공용 파일 또는 운영체제가 제공하는 파이프를 사용하여 통신한다.
3. 네트워크를 이용한 데이터 통신
- 네트워크로 연결되어 있는 경우, 다른 컴퓨터에 있느 프로세스와 소켓을 사용하여 통신할 수 있다. (네트워킹)
통신의 분류
통신은 데이터가 전송되는 방향에 따라 양방향 통신, 반양방향 통신, 단방향 통신으로 나뉜다.
- 양방향 통신 : 데이터를 동시에 양쪽 방향으로 전송할 수 있는 구조
- 반양방향 통신 : 양쪽 방향으로 전송할 순 있지만, 특정 시점에 한쪽 방향으로만 전송할 수 있는 구조 (무전기)
- 단방향 통신 : 한쪽 방향으로만 데이터를 전송할 수 있는 구조 (전역 변수와 파이프)
전역 변수를 사용하는 통신 방식의 가장 큰 문제는, 언제 데이터를 보낼지 받는 쪽에서 모른다는 것이다.
따라서 데이터를 받는 쪽에서는 전역 변수의 값을 수시로 점검하는 수밖에 없다.
상태 변화를 살펴보기 위해 반복문을 무한 실행하며 기다리는 것을 바쁜 대기(busy waiting) 이라고 하고, 큰 자원 낭비이다.
바쁜 대기 문제를 해결하기 위해 동기화 (synchronization) 을 사용하고, 동기화 기능의 유무에 따라 대기가 있는 통신(동기화 통신), 대기가 없는 통신(비동기화 통신) 으로 나누어진다.
전역 변수를 이용한 통신
공동으로 관리하는 메모리를 사용하여 데이터를 주고받는 방식이다.
데이터를 보내는 쪽에서는 전역 변수나 파일에 값을 쓰고, 받는 쪽에서는 전역 변수나 파일을 읽는다. (자바에서 static 변수와 유사)
파일을 이용한 통신
- 파일 열기 :
open()
함수로 사용하고자 하는 파일이 있는지 확인하고, 있다면 파일에 접근할 수 있는 권한인 fd(file descriptor)를 얻고, 작업이 다 끝나면 fd를 돌려준다. - 파일 읽기 · 쓰기 · 연산 :
wrtie()
혹은read()
함수로 파일을 쓰고 읽는다. - 파일 닫기 :
close(fd)
로 fd가 가리키는 파일을 닫는다.
전역 변수를 이용한 통신과 파일을 이용한 통신은 동기화를 제공하지 않는 대기가 없는 통신이다.
파이프를 이용한 통신
파이프는 운영체제가 제공하는 동기화 통신 방식이다.
프로세스 B가 파이프 1에 대해 read()
연산을 수행했는데, 프로세스 A가 아직 쓰기 연산을 하지 않았다면, 대기 상태가 된다.
그리고 프로세스 A가 쓰기 연산을 하는 순간, 대기 상태가 풀려 동기화가 이루어진다.
서로 관련 있는 프로세스 간 통신에 사용되는 파이프를 보통 이름 없는 파이프 라고 하고 관련 없는 프로세스 간 통신에 사용되는 파이프를 이름 있는 파이프라고 한다.
소켓을 이용한 통신
소켓을 이용하면 네트워크로 연결되어 있는 다른 컴퓨터의 프로세스와 통신을 할 수 있다.
소켓은 통신하려는 프로세스의 위치를 알고있고, 통신하려는 프로세스의 소켓끼리 연결되어있어, 소켓에 쓰기 연산을 하는 순간 데이터가 전송된다.
지금까지의 통신 예시들과는 다르게, 소켓은 하나만 있어도 양방향 통신이 가능하다.