프로세스는 시스템 내에서 독립적으로 실행되기도 하고 데이터
를 주고받으며 협업하기도 한다. 프로세스가 다른 프로세스와 데이터를 주고받는 프로세스 간 통신에는 같은 컴퓨터 내에 있는 프로세스뿐만 아니라 네트워크로 연결된 다른 컴퓨터에 있는 프로세스와의 통신도 포함된다.
프로세스 간 통신의 종류
분류 방식 | 종류 | 예 |
---|---|---|
통신 방향에 따른 분류 | 양방향 통신 | 일반적 통신, 소켓 |
반양방향 통신 | 무전기 | |
단방향 통신 | 전역 변수, 파일, 파이프 | |
통신 구현 방식에 따른 분류 | 동기화 통신(대기 O) | 파이프, 소켓 |
비동기화 통신(대기 X) | 전역 변수, 파일 |
프로세스 간 통신은 데이터를 주거나 받는 동작으로 이루어지며 이는 쓰기 연산과 읽기 연산으로 간소화할 수 있다. 프로세스 간 통신에서 가장 중요한 것은 동기화이다. 동기화를 통해서 데이터를 받는 쪽에서 데이터가 도착했음을 바로 알 수 있다.
전역 변수
를 이용한 통신
공동으로 관리하는 메모리를 사용하여 데이터를 주고받는 것이다. 전역 변수를 이용한 통신 방식은 주로 직접적으로 관련이 있는 프로세스 간에 사용한다.
전역 변수를 이용한 양방향 통신
전역 변수를 이용한 양방향 통신을 구성해본다면 다음과 같이 두 개 이상의 전역 변수를 선언하여 사용할 수 있다. 하지만 각 프로세스가 데이터를 언제 쓸지 알 수 없기 때문에 프로세스는 전역 변수를 계속 확인해야 한다.
파일
을 이용한 통신
파일 입출력 통신
파일을 이용한 통신은 부모-자식 관계 프로세스 간 통신에 많이 사용되며 운영체제가 프로세스 동기화를 제공하지 않는다.그래서 프로세스가 알아서 동기화를 해야 하는데 주로 부모 프로세스가 wait() 함수를 이용하여 자식 프로세스의 작업이 끝날 때까지 기다렸다가 작업을 시작한다.
파이프
를 이용한 통신
프로세스 동기화 문제를 해결하는 방법으로 파이프가 있다. 파이프는 운영체제가 제공하는 동기화 통신 방식이며, 단방향 통신이다.
파이프를 이용한 통신
만약 프로세스가 쓰기 연산을 다 하기 전에 읽기 연산이 들어온다면 읽기 연산을 요청한 프로세스는 쓰기 연산이 끝날 때까지 대기하여 동기화를 진행한다.
소켓
을 이용한 통신
지금까지는 한 컴퓨터에 있는 프로세스 간 통신이었다면, 여러 컴퓨터에 있는 프로세스끼리의 통신(네트워킹)도 가능하다. 다른 컴퓨터에 있는 프로세스와 통신을 하려면 그 컴퓨터의 위치를 파악하고, 원격지의 시스템 내 여러 프로세스 중 어떤 프로세스와 통신을 할지도 결정해야 한다.
소켓은 프로세스 동기화를 지원하므로 데이터를 받는 쪽의 프로세스가 바쁜 대기를 하지 않아도 되며, 양방향 통신이 가능하다.
종류 | 운영체제 동기화 지원 | open() / close() 사용 |
---|---|---|
전역 변수 | X (바쁜 대기) | X |
파일 | X (wait() 함수 이용) | O |
파이프 | O | O |
소켓 | O | O |
공유 자원은 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등을 말한다. 공유 자원을 잘못 사용하여 2개 이상의 프로세스가 공유 자원을 병행적으로 읽거나 쓰는 상황을 ‘경쟁 조건(race condition)’ 이 발생했다고 한다.