프로세스 간 통신
프로세스 간 통신의 개념
프로세스 간 통신 (IPC; Inter Process Communication)의 종류
- 공유 메모리나 공유 파일을 이용한 통신
- 일정한 메모리 영역이나 파일을 공유하고 이를 통해 데이터를 주고 받음
- 데이터를 주고받는 방법을 프로세스끼리 알아서 결정해야 하므로 가장 원시적인 방법
- 파이프를 이용한 통신
→ 단방향 통신
- 파이프(pipe)는 프로세스 간 통신을 위해 운영체제가 제공하는 통신 기법
- 보통, 파이프는 fork()로 만들어진
부모-자식
간 통신에서 사용
- 소켓을 이용한 통신
- 소켓 (socket)은 네트워크로 연결된 컴퓨터에서 데이터를 주고받기 위한 통신 기법
- 소켓 방식은 초기화할 내용도 많고 시스템 자원도 많이 사용하므로 같은 컴퓨터 내에서 소켓으로 통신하는 것은 비효율적

통신 방향에 따른 분류
- 양방향 통신 (duplex communication)
- 데이터를 양쪽 방향으로 동시 전송할 수 있는 구조로, 일반적인 통신은 모두 양방향 통신
- 프로세스 간 통신에서는 소켓 통신이 양방향 통신에 해당
- 반양방향 통신 (halfduplex communication)
- 데이터를 양쪽 방향으로 전송할 수 있지만 동시 전송은 불가능하고 특정 시점에 한쪽 방향으로만 전송할 수 있는 구조
- 대표적인 예는 무전기 → 예를 들면 군대에서 사용하는 PRC-96k와 같음ㅋㅋ
- 단방향 통신 (simplex communication)
- 모스 신호처럼 한쪽 방향으로만 데이터를 전송할 수 있는 구조
- 프로세스 간 통신에서는 공유 메모리 / 공유 파일 이용 통신, 파이프 이용 통신이 해당
- 대기가 있는 통신 (blocking communication)
- 동기화를 지원하는 통신 방식 (synchronous communication)
- 데이터를 받는 쪽은 데이터가 도착할 때까지 자동으로 대기 상태에 머물러 있음
- 대기가 없는 통신 (non-blocking communication)
- 동기화를 지원하지 않는 통신 방식 (asynchronous communication) → 비동기처리방식
- 데이터를 받는 쪽은 바쁜 대기를 사용하여 데이터가 도착했는지 여부를 직접 확인
정리
-
통신 방향에 따른 분류
종류 | 통신 기법 | 통신 기기 |
---|
양방향 통신 | 소켓 이용 통신 | 전화 |
반양방향 통신 | | 무전기 |
단방향 통신 | 공유 메모리나 공유파이리 이용 통신, 파이프이용통신 | 모스 부호 |
-
통신 구현 방식에 따른 분류
종류 | 통신기법 | 통신기기 |
---|
대기가 있는 통신(동기화 통신) | 파이프 이용 통신, 소켓 이용 통신 | 전화 |
대기가 없는 통신(비동기화 통신) | 공유 메모리나 공유파일 이용 통신 | 전보 |
파일을 이용한 통신
- 파일 열기
- open("com.txt", O_RDWR) : com.txt 파일을 읽기와 쓰기를 할 수 있는 형태로 준비
- 파일이 열리면 open 함수는 그 파일에 접근할 수 있는 권한인 파일 기술자 fd를 사용
- 파일 쓰기 또는 ㅇ릭기
- write(fd, "Test", 5) : fd, 즉 com.txt 파일에 Test라는 문자열을 쓰라는 뜻
- read(fd, buf, 5) : fd, 즉 com.txt 파일에서 5B를 읽어 변수 buf에 저장
- 파일 닫기
- close(fd) : fd가 가리키는 파일, 즉 com.txt 파일을 닫음
파이프를 이용한 통신

- 운영체제가 제공하는 동기화 통신 방식, 파일 입출력과 같이 open() 함수로 기술자를 얻고 작업 후 close() 함수로 마무리
- 파이프로 양방향 통신을 하려면 파이프 2개 사용
- 파이프에 쓰기 연산을 하면 데이터가 전송, 읽기 연산을 하면 데이터를 받음
이름 없는 파이프 (anonymous pipe)
- 일반적으로 파이프라고 하면 이름 없는 파이프를 가르킴
이름 있는 파이프 (named pipe)
- FIFO라 불리는 특수 파일을 이용하며 서로 관련 없는 프로세스 간 통신에 사용
소켓을 이용한 통신
- 여러 컴퓨터에 있는 프로세스끼리 통신하는 방법
- 네트워크에서 데이터를 보내는 것은 클라이언트 소켓이 서버 소켓에 데이터를 보내는 것이므로 네트워크 프로그래밍을 소켓 프로그래밍이라 부름
- 프로세스가 소켓에 쓰기 연산을 하면 데이터 전송, 읽기 연산을 하면 데이터를 받음
공유 자원과 임계구역
공유 자원에 대한 접근
공유 자원 (shared resource)
- 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등을 말함
- 공동으로 이용되기 때문에 누가 언제 데이터를 읽거나 쓰느냐에 따라 그 결과가 달라질 수 있음
경쟁 조건 (race conditon)
- 2개 이상의 프로세스가 공유 자원을 병행적으로 읽거나 쓰는 상황
- 경쟁 조건이 발생하면 공유 자원 접근 순서에 따라 실행 결과가 달라짐
공유 자원의 접근 예

임계 구역
임계 구역 (critical section)
- 공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역
- 믹서는 공유가 불가능한 자원으로서 주방의 임계구역
- 임계구역에서는 프로세스를 동시에 작업하면 안 됨
- 어떤 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역 밖에서 기다려야 하며 임계구역에 들어간 프로세스가 나와야 들어갈 수 있음
생산자 - 소비자 문제
코드 및 실행 순서에 따른 결과
- 생산자는 수를 증가시키며 물건을 채우고 소비자는 생산자를 쫓아가며 물건 소비
- 생산자 코드와 소비자 코드가 동시에 실행되면 문제 발생

임계구역 문제 해결 조건
상호 배제 (mutual exclusion)
- 한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역에 들어갈 수 없음
한정 대기 (bounded waiting)
- **어떤 프로세스도 무한 대기 (infinite postpone) 하지 않아야 함
진행의 융통성 (progress flexibility)
- 한 프로세스가 다른 프로세스의 진행을 방해해서는 안 됨
임계구역 문제 해결 방법
기본 코드 소개
임계구역 해결 방법을 설명하기 위한 기본 코드
#include <stdio.h>
typedef enum {false, true} boolean;
extern boolean lock=false;
extern int balance;
main() {
while(lock==true_;
lock=true;
balance=balance+10;
lock=false;
}
임계구역 해결 조건을 고려한 코드 설계
전역 변수로 잠금을 구현한 코드

문제점 P1 프로세스와 P2 프로세스가 동시에 도착하면 둘다 임계구역에 진입 → 상호 배제 조건 미충족
상호 배제 조건을 충족하는 코드

문제점 : P1 프로세스와 P2 프로세스가 동시에 들어가면 둘다 무한 루프에 빠짐 → 한정 대기 조건 미충족
상호 배제와 한정 대기 조건을 충족하는 코드

문제점 : 서로 번갈아가면서 실행되는 것이 문제, 즉 한 프로세스가 연달아 임께구역에 진입하고 싶어도 그럴 수가 없다. 결국 한프로세스가 들어가서 종료가 되고 다른 프로세스가 도착할때까지 기다려야한다. 다른프로세스가 도착해서 종료되야 들어갈 수 있기 때문 즉, P2 프로세스가 P1 프로세스의 진행을 방해하는 구조이다.
→ 진행의 융통성 조건 미충족
임계구역 문제의 하드웨어적인 해결 방법
- 검사와 지정 (test-and-set) 코드로 하드웨어의 지원을 받아
le(lock==true);
문과 lock=true;
문을 한꺼번에 실행
- 검사와 지정 코드를 이용하면 명령어 실행 중간에 타임아웃이 걸려 임계구역을 보호하지 못하는 문제가 발생하지 않음

문제점 : 바쁜 대기를 사용하여 검사하기 때문에 자원 낭비가 있다. 일부 하드웨어에서는 바쁜 대기 없이 잠금을 동기화해주기도 하지만, 성능 좋은 하드웨어에서나 가능한 일
피터슨 알고리즘
피터슨 알고리즘
- 임계구역 문제 해결의 세 가지 조건을 모두 만족
- 2개의 프로세스만 사용 가능하다는 한게가 있음

데커 알고리즘
데커 알고리즘

데커 알고리즘의 동작
- 프로세스 P1은 우선 잠금을 건다
lock1=true;
- 프로세스 P2의 잠금이 걸렸는지 확인한다
[while(lock2==true)]
.
- 만약 프로세스 P2의 차례라면
turn==1
임계구역으로 진입하고 프로세스 P2의 차례라면 turn==2
4번으로 이동
- 프로세스 P1은 잠금을 풀고
lock1=false;
프로세스 P2가 작업을 마칠 때까지 기다린다 [while(turn==2);]
프로세스 P2가 작업을 마치면 잠금을 걸고 lock1==true;
임계구역으로 진입
세마포어⭐️
세마포어(semaphore)
- 프로세스가 임게구역에 진입하기 전에 스위치를 사용 중으로 놓음
- 후에 도착하는 프로세스는 앞의 프로세스가 작업을 마칠 때까지 기다림
- 프로세스가 작업을 마치면 세마포어가 다음 프로세스에 임게구역을 사용하라는 동기화 신호를 보냄

세마포어 내부 코드
- Semaphore(n) : 전역 변수 RS를 n으로 초기화, RS에는 현재 사용 가능한 자원의 수 저장
- P() : 잠금을 수행하는 코드로 RS가 0보다 크면 (사용 가능한 자원이 있으면) 1만큼 감소시키고 임계구역에 진입, RS가 0보다 작으면 (사용 가능한 자원이 없으면) 0보다 커질 때까지 기다림
- V() : 잠금 해제와 동기화를 같이 수행하는 코드로, RS 값을 1 증가시키고 세마포어에서 기다리는 프로세스에게 임계구역에 진입해도 좋다는 wake_up 신호를 보냄

모니터
모니터 (monitor)
- 공유 자원을 내부적으로 숨기고 공유 자원에 접근하기 위한 인터페이스만 제공해 자원을 보호하고 프로세스 간의 동기화를 시킴
모니터의 작동원리
- 임계구역으로 지정된 변수나 자원에 접근하려는 프로세스는 직접 P()나 V()를 사용하지 않고 모니터에 작업 요청
- 모니터는 요청받은 작업을 모니터 큐에 저장 후 순서대로 처리하고 결과만 해당 프로세스에 알려줌
