5-1.[os] 프로세스 간 통신
프로세스 간 통신의 개념
- 통신(IPC): 프로세스끼리 데이터를 주고받는 것
- 컴퓨터 내에 있는 프로세스뿐만 아니라 네트워크로 연결된 다른 컴퓨터에 있는 프로세스와의 통신도 포함
프로세스 내부 데이터 통신:
- 하나의 프로세스 내에 2개 이상의 스레드가 존재하는 경우의 통신
- 프로세스 내부의 스레드는 전역 변수나 파일을 이용하여 데이터를 주고받는다.
프로세스 간 데이터 통신:
- 같은 컴퓨터에 있는 여러 프로세스끼리 통신
- 공용 파일 또는 운영체제가 제공하는 파이프를 사용하여 통신한다.
네트워크를 이용한 데이터 통신:
- 여러 컴퓨터가 네트워크로 연결되어 있을 때
- 프로세스는 소켓을 이용하여 데이터를 주고받음
- 네트워킹: 소켓을 이용하는 프로세스 간 통신
- 다른 컴퓨터에 있는 함수를 호출하여 통신하는 원격 프로시저 호출도 포함
프로세스 간 통신의 분류
통신 방향에 따른 분류
양방향 통신:
- 데이터를 동시에 양쪽 방향으로 전송할 수 있는 구조
- 일반적인 통신
- 소켓 통신
반양방향 통신:
- 데이터를 양쪽 방향으로 전송할 수 있지만 동시 전송은 불가능하고 특정 시점에 한쪽 방향으로만 전송할 수 있는 구조
- ex) 무전기
단방향 통신:
- 한쪽 방향으로만 데이터 전송할 수 있는 구조
- ex) 전역 변수, 파이프
- 전역 변수가 단방향 통신인 이유
- 양방향으로 데이터 보내면 2개 중 하나는 지워짐
- 양방향으로 하려면 전역 변수 2개
통신 구현 방식에 따른 분류
- 전역 변수- 데이터를 받는 쪽에서는 상대방이 데이터를 언제 보낼지 모른다
바쁜 대기(busy waiting):
- 데이터 받는 쪽에서 반복적으로 전역변수 값 점검
- 상태 변화를 보기 위해 반복문을 무한 실행하며 기다림
- 구린 프로그램의 예
동기화(synchronization):
- 바쁜 대기를 하지 않아도 데이터가 도착했다고 운영체제가 알아서 알려준다
- 대기가 있는 통신(blocked communication):
- 동기화 O
- 데이터를 받는 쪽은 데이터가 도착할 때까지 자동으로 대기 상태
- 대기가 없는 통신(non-blocking communication)
- 동기화 X
- 데이터를 받는 쪽은 바쁜 대기를 사용하여 데이터가 도착했는지 여부를 직접 확인
- = asynchronous communication
프로세스 간 통신의 종류
- 전역 변수를 이용한 통신
- 공동으로 관리하는 메모리를 사용하여 데이터를 주고 받음
- 직접적으로 관련이 있는 프로세스 간에 사용
- 예) 부모 프로세스가 전역 변수를 선언한 후 자식 프로세스를 만들면 부모 프로세스와 자식 프로세스가 통신
동기화 문제가 있음 - 동시에 읽고 쓰기 불가능
전역 변수의 값이 변할 때까지 바쁜 대기를 돌면서 계속 주시
파일을 이용한 통신
- 저장장치에 파일을 읽고 쓰는 코드
- 열기, 쓰기, 읽기, 닫기
파일 열기
- open()
- 준비 단계
- 파일이 있는지, 쓰기 권한이 있는지
- 정상: fd를 준다
- fd(file descriptor, 파일 기술자)
- 파일에 접근할 수 있는 권한
- 작업이 끝나면 fd를 돌려줌
파일 닫기
- 저장장치의 데이터를 읽고 쓰는 것: 일반 프로세스와 입출력 프로세스 간의 통신
- 부모 프로세스가 wait() 함수로 자식 프로세스가 끝날 때까지 기다렸다가 작업함
파이프를 이용한 통신
- 파이프: 운영체제가 제공하는 동기화 통신 방식
- 단방향 통신
- 양방향 하려면 파이프 2개
- A에서 읽고 있는 도중에 B가 쓰고 있으면 A가 대기
- 쓰기가 완료되면 대기 상태가 풀려서 동기화가 이루어짐
이름 없는 파이프: 일반적 파이프, 부모, 형제 등 서로 관련있는 프로세스 간 통신
이름 있는 파이프: FIFO 특수 파일을 이용하여 서로 관련 없는 프로세스 간 통신
소켓을 이용한 통신
- 네트워킹: 여러 컴퓨터에 있는프로세스 간 통신
원격 프로시저 호출, 소켓
프로시저 호출: 한 컴퓨터에 있는함수를 호출
- 원격 프로시저 호출: 다른 컴퓨터에 있는함수를 호출
- 바쁜 대기를 하지 않아도 됨
소켓은 하나만 사용해도 양방향 통신이 가능
네트워크 프로그래밍을 흔히 소켓 프로그래밍이라고 부르는 이유는 네트워킹의 기본이 소켓이기 때문
정리
- 프로세스 간에 데이테를 주고받는 행위는 읽기와 쓰기 연산으로 단순화
- 부모-자식 관계로 연결되어 있는 프로세스끼리는 전역 변수, 파일, 이름 없는 파이프등 을 이용하여 통신
- 서로 다른 시스템에 있는 프로세스끼리는 소켓을 이용하여 통신
- 동기화를 지원하는 프로세스 간 통신에는 open()과 close() 함수가 사용됨
- 전역 변수는 동기화 기능이 없기 때문에 open()과 close() 함수를 사용할 필요가 없음