책 "쉽게 배우는 운영체제"를 참고하여 쓴 글입니다
프로세스 간 통신(IPC: Inter Process Communication)
프로세스 간 통신의 개념
- 프로세스 내부 데이터 통신: 하나의 프로세스 내에 2개 이상의 스레드가 존재하는 경우, 데이터 주고받는 방법을 프로세스끼리 알아서 결정
- 프로세스 간 데이터 통신: 같은 컴퓨터에 있는 여러 프로세스끼리 통신, 보통 파이프는 fork()로 만들어진 부모-자식 간 통신에 사용
- 네트워크를 이용한 데이터 통신: 여러 컴퓨터가 네트워크로 연결되어 있을때의 통신, 소켓을 이용한 통신, 같은 컴퓨터 내에서 소켓 통신은 비효율적, 임의의 포트를 정하고 해당 포트간의 대화를 통해 데이터 주고받는 방식
프로세스 간 통신의 분류
- 양방향 통신: 데이터를 동시에 양쪽 방향으로 전송할 수 있는 구조
- 반양방향 통신: 데이터를 양쪽 방향으로 전송할 수 있지만 동시 전송은 불가능
- 단방향 통신: 한쪽 방향으로만 데이터를 전송
바쁜 대기: 상태 변화를 살펴보기 위해 반복문을 무한 실행하며 기다리는 것
동기화: 데이터가 도착했음을 알려주는 것
- 대기가 있는 통신: 동기화 지원 통신
- 대기가 없는 통신: 동기화 지원하지 않는 통신, 반복문 무한 실행

프로세스 간 통신의 종류
- 전역변수를 이용한 통신
- 공동으로관리하는 메모리를 사용하여 데이터를 주고받음
- 전역 변수의 값이 변할 때까지 바쁜 대기를 돈다.
- 파일을 이용한 통신
- 파일을 엶 -> 쓰기 또는 읽기 -> 파일을 닫음
- wait() 함수로 자식 프로세스 작업이 끝날때까지 기다렸다가 작업을 함
- 파일을 엶: open(), fd를 반환(fd: 해당 파일에 접근할 수 있는 열쇠같은 존재), O_RDWR/O_RDONLY와 같이 어떤 권한을 부여 할 것인지 준다
- 쓰기 또는 읽기: read(),write()
- 파일을 닫음: close() 이용하여 닫음
- 파이프를 이용한 통신
- open() 으로 기술자를 얻고 작업을 한 후 close()로 닫는다
- 이름 없는 파이프: 부모와 자식 프로세스 혹은 같은 부모를 가진 자식 프로세스 간
- 이름 있는 파이프: FIFO라는 특수 파일 이용하여 관련 없는 프로세스 간 통신
- 소켓을 이용한 통신
- 여러 컴퓨터에 있는 프로세스끼리 통신
- 바인딩: 위와 같이 프로세스끼리 연결하는 작업

공유 자원과 임계구역
공유 자원의 접근
공유자원: 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일
경쟁 조건: 2개 이상의 프로세스가 공유 자원을 병행적으로 읽거나 쓰는 상황
임계구역
임계구역: 공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역
임계구역에서는 프로세스들이 동시에 작업하면 안된다 -> 어떤 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역 밖에서 기다려야 함
생산자-소비자 문제
원형 큐 이용
언제 문맥교환이 일어날지 몰라서 결과가 다르게 나온다
생산자: 데이터를 생산하는 쪽
소비자: 데이터를 소비하는 쪽

임계구역 해결 조건
상호 배제: 한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역에 들어갈 수 없다
한정 대기: 어떤 프로세스도 무한대기 하지 않아야 한다
진행의 융통성: 한 ㅍ로세스가 다른 프로세스의 진행을 방해해서는 안된다
임계구역 해결 방법
lock을 이용하는 것이 가장 단순
//기본코드
main(){
while(lock==true);
lock=true;
balance+=10;
lock=false;
}
임계구역 해결 조건을 고려한 코드 설계
상호 배제 문제
- boolean lock=false;
- lock을 공유 변수로 선언한다.
- 하지만, 동시 신입 상황이 생겨서 상호 배제 조건을 충족하지 못할 수 있다
한정 대기 문제
- 프로세스 갯수만큼 lock 공유 변수 선언한다.
- 하지만 두 프로세스가 모두 임계구역에 진입하지 못하는 무한 대기 현상이 일어날 수 있다. 또한 확장성 문제, 프로세스가 늘어났을때 검사해야 하는 lock의 갯수가 늘어난다는 문제도 발생할 수 있다.
- 교착 상태: 프로세스가 살아 있으나 작업이 진행되지 못하는 상태
진행의 융통성 문제
- int lock=1; 로 설정해 놓고 해당 임계구역에 들어갈수 있는 lock을 지정해 놓는다
- 하지만, 서로 번갈아 가면서 실행된다는것이 문제, 한 프로세스가 두 번 연달아 임계구역에 진입하고 싶어도 할 수 없음
하드웨어적인 해결 방법
- 두 명령어를 동시에 실행한다.
- 하지만 바쁜 대기를 사용하여 검사하기 때문에 자원 낭비가 있다.
피터슨 알고리즘
- turn이라는 공유변수를 하나 더 사용
- 두 프로세스가 동시에 lock을 설정하여 임계구역에 못 들어 가는 상황 대비, turn을 사용하여 다른 프로세스에 양보
- 임계구역 해결의 세 가지 조건을 모두 만족하지만 2개의 프로세스만 사용가능
데커 알고리즘
- 하드웨어의 도움 없이도 임계구역 문제 해결
세마포어
사용가능한 자원의 수를 변수로 지정하고 +1,-1 처리를 한다.
- Semaphore(n): 전역 변수 RS를 n으로 초기화, RS에는 현재 사용 가능한 자원의 수가 저장
- P(): 잠금 수행 코드, RS>0(==사용 가능한 자원이 있음) 이라면 1만큼 감소시키고 임계구역에 진입. 만약 RS<=0(사용 가능한 자원이 없음) 이라면 0보다 커질 때까지 기다린다.
- V(): 잠금 해제와 동기화를 같이 수행, RS 값을 1 증가시키고 세마포어에서 기다리는 프로세스에게 임계구역에 진입해도 된다는 wake_up신호를 보낸다.

문제점
- 프로세스가 세마포어를 사용하지 않고 바로 임계구역에 들어간 경우
- P()를 두 번 사용하여 wake_up 신호가 발생하지 않은 경우. 프로세스 간의 동기화가 이루어 지지 않아 세마포어 큐에서 대기하고 있는 프로세스들이 무한 대기에 빠진다.
- P() 와 V()를 반대로 사용하여 상호 배제가 보장되지 않은 경우
모니터
공유 자원을 내부적으로 숨기고 공유 자원에 접근하기 위한 인터페이스만 제공, 자원을 보호하고 프로세스간 동기화를 시킨다.
- 임계구역에 접근하고자 하는 프로세스는 직접 P(), V() 사용하지 않고 모니터에 작업 요청을 함
- 모니터는 요청받은 작업을 모니터 큐에 저장한 후 순서대로 처리하고 그 결과만 해당 프로세스에 알려줌
- 임계구역 보호와 동기화를 위해 내부적으로 상태 변수를 사용
- wait(): 모니터 큐에서 자신의 차례가 올 때까지 기다림 = P()
- signal(): 모니터 큐에서 기다리는 다음 프로세스에 순서를 넘겨준다. = V()
'전공 > 운영체제' 카테고리의 다른 글
[운영체제]7장 물리 메모리 관리 (3) | 2023.06.10 |
---|---|
[운영체제]6장 교착 상태 (0) | 2023.04.23 |
[운영체제]4장 CPU 스케줄링 (0) | 2023.04.16 |
[운영체제]3장 프로세스와 스레드 (0) | 2023.04.15 |
[운영체제] 2장 컴퓨터의 구조와 성능 향상 (0) | 2023.04.14 |