IPC
프로세스 간 통신(inter-Process Communication)
프로세스들 사이에서 서로 데이터를 주고받는 방법이나 경로
- 프로세스는 종종 다른 프로세스와 통신할 필요가 있음
- 인터럽트를 사용하지 않는 잘 정의된 형태의 프로세스간 통신에 대한 필요성이 존재하는데 이것이
IPC
주요 방식
1. 파이프(익명 PIPE)
- 하나의 프로세스는 데이터를 쓰기만, 다른 하나는 데이터를 읽기만 가능 ➡️ 단방향 통신
- 통신할 프로세스를 명확히 알 수 있는 경우에 사용한다. (ex. 부모-자식 프로세스 간 통신)
- 부모프로세스가 자식 프로세스를 생성하는 경우에 파일 지정 번호를 상속받아 익명파이프로 통신 (형제 관계도 가능)
- 송/수신을 모두 하기를 원한다면 두개의 파이프를 만들어야 함
2. 지명 파이프(Named PIPE)
- 프로세스 통신을 위해 이름이 있는 파일을 사용
- 전혀 모르는 상태의 프로세스들 사이의 통신에 사용
- 단방향 통신
3. 메시지 큐(Message Queue)
- 입출력 방식은 Named PIPE와 동일
- 파이프가 아니라 어디에서나 물건을 꺼낼 수 있는 컨테이너 벨트라고 보면 된다
- 메시지 큐에 쓸 데이터에 번호를 붙임으로써 여러 개의 프로세스가 동시에 데이터를 쉽게 다룰 수 있다.
- 단방향 통신
4. 메모리 맵 파일
- 메모리 맵 파일을 통해 프로세스의 가상 메모리 주소공간에 파일을 매핑한 뒤 가상 메모리 주소에 직접 접근하는 것으로 파일 읽기/쓰기를 대신
- 대용량 자료를 처리할 때 유리
5. 공유 메모리
- 여러 프로그램이 동시에 접근할 수 있는 메모리
- 공유 메모리는 프로세스간 메모리 영역을 공유해서 사용할 수 있도록 허용
- 과다한 복사를 피하거나 프로그램 간 통신을 위해 고안
- 중개자 없이 곧바로 메모리에 접근할 수 있어서 IPC 중에 가장 빠르게 작동
6. 소켓
- 네트워크 소켓 통신을 통해 데이터를 공유
- 클라이언트와 서버가 소켓을 통해서 통신하는 구조로, 원격에서 프로세스 간 데이터를 공유할 때 사용
IPC 통신에서 프로세스 간 데이터를 동기화하고 보호하고자 세마포어와 뮤텍스를 사용 ( 공유된 자원에 여러 프로세스가 동시 접근하는 것을 막기 위해)
PCB
프로세스 제어 블럭((Process Control Block)
"PCB는 운영 체제가 프로세스를 표현한 것이다."
- 특정한 프로세스를 관리할 필요가 있는 정보를 포함하는 운영 체제 커널의 자료 구조
포함 정보
- 프로세스 식별자(Process ID)
- 프로세스 상태(Process State)
- 프로그램 카운터(Program Counter)
- 프로세스가 다음에 실행할 명령어의 주소를 가리킴
- 레지스터(Register)
- CPU 스케줄링 정보
- 메모리 정보
- 해당 프로세스의 주소 공간
- 프로세스 계정 정보
- 페이지 테이블, 스케줄링 큐 포인터, 소유자, 부모 등
- 입출력 상태 정보
PCB 위치
- 중요한 정보를 담고 있어 보호된 메모리에 위치
- 커널 스택에 위치하곤 함
- 프로세스의 문맥이 저장되어 있음
➡️ 문맥 교환 시 이용
문맥 교환
context switch
프로세스(또는 스레드)에서 다른 프로세스(또는 스레드)로 CPU (중앙 처리 장치)를 전환하는 것
프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해, 현재 프로세스의 상태(=문맥)를 보관하고 새로운 프로세스의 상태를 적재하는 작업
커널이 CPU에서 한 프로세스의 실행을 일시 중단하고 이전에 일시 중단된 다른 프로세스의 실행을 재개하는 것
문맥
특정 시점의 CPU 레지스터 및 프로그램 카운터의 내용
과정
- 한 프로세스의 진행을 일시 중단, 해당 프로세스의 CPU 상태(=문맥)을 메모리에 저장
- 메모리에서 다음 프로세스의 문맥을 CPU 레지스터에서 복원
- 프로세스를 재개하기 위해 프로그램 카운터에 표시된 위치(프로세스가 중단된 코드라인)로 복귀
특징
- 커널 모드에서만 발생
- 멀티 태스킹 운영체제에서 여러 프로세스가 동시에 실행되는 것 처럼 보이도록 동작하는데 이는 아주 빠르게(초당 수십~수백번) 이뤄지는 문맥 교환을 통해 달성
언제 발생?
- 프로세스가 자발적으로 CPU 활용 시간을 포기
- 프로세스의 CPU 타임 슬라이스를 모두 사용했을 때 스케줄러가 전환
- 하드웨어 장치(예: 키보드, 마우스, 모뎀 또는 시스템 클록)에서 커널로 보내는 신호인 하드웨어 인터럽트가 발생
비용
- 문맥 교환은 일반적으로 집약적인 계산이 필요
- 초당 수십-수백개에 달하는 문맥 교환에 나노 초 정도의 상당한 시간이 필요
- 문맥 교환은 CPU 시간 측면에서 상당한 비용을 나타냄. 실제로 운영체제에서 가장 비용이 많이 드는 작업이 될 수 있음
➡️ 운영체제 설계에서 불필요한 문맥 교환을 줄이는 것이 중요
➡️ 실제로 달성하기는 어려운 목표
➡️ CPU 클럭 속도를 증가시키는 방향으로 발전
참조 링크
위키백과 - IPC
프로세스 간 통신
문맥 교환 - 마이크로소프트 개발자 네트워크 (MSDN)
프로세스 간 통신 방법