프로세스 간 통신
프로세스 간 통신의 종류

1. 프로세스 내부 데이터 통신 (전역변수, 파일) – 운영체제 도움 없음
2. 프로세스 간 데이터 통신 (파이프)
3. 네트워크를 이용한 데이터 통신 (소켓)
통신 방향에 따른 분류
양방향 통신, 반양방향 통신, 단방향 통신
Ex) 양방향-소켓, 반양방향-무전기, 단방향-전역변수, 파이프
통신 구현 방식에 따른 분류
- 대기가 있는 통신
-> 동기화를 지원하는 통신 방식 (도착하면 알려줌)
-> 데이터를 받는 쪽은 데이터가 도작할 때까지 대기 상태에 머물러 있음, 알림이 오면 동작하 면 됨 - 대기가 없는 통신
-> 동기화를 지원하지 않는 통신 방식
-> 바쁜 대기(언제 데이터가 오는지 계속 확인하면서 대기)를 사용해야 됨

프로세스 간 통신 방식
데이터를 주거나 받는 쓰기 연산과 읽기 연산으로 이루어짐

(GV: 전역 변수)
전역 변수를 이용한 통신
데이터를 보내는 쪽에서는 전역변수에 값을 쓰고, 데이터를 받는 쪽에서는 전역 변수의 값을 읽음

fork()를 이용해서 자식 프로세스를 먼저 만들고 진행
-> 전역변수가 복사돼서 공동으로 쓸 수 있음
(바쁜 대기를 함, open(),close()를 사용하지 않음)
파일을 이용한 통신

write: 하드디스크로 쓰기, read: 하드디스크에서 읽기
파이프를 이용한 통신

운영체제가 제공하는 동기화 통신 방식으로, 파일 입출력과 같이 open()함수로 기술자를 얻고 작업한 후 close() 함수로 마무리
(바쁜 대기를 하지 않음, 운영체제 동기화 지원)
소켓을 이용한 통신

떨어져있는 컴퓨터에서 통신을 할 때 소켓을 이용한다.
시스템에 잇는 프로세스가 소켓을 바인딩한 후 소켓에 쓰기 연산을 하면 데이터가 전송되고 읽기 연산을 하면 데이터를 받게 됨
(바쁜 대기를 하지 않음, 운영체제 동기화 지원)

공유 자원
여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등을 말함
(공동으로 이용되기 때문에 누가 언제 데이터를 읽거나 쓰느냐에 따라 그 결과가 달라질 수 있음)
경쟁 조건(공유 자원을 병행적으로 읽거나 쓰는 상황)이 발생할 수 있음

임계구역: 동시에 작업하지 못 하도록 지켜져야 되는 구역 (위는 25만원이 나와야 정상임)
어떤 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역 밖에서 기다려야 하며 임계구역의 프로세스가 나와야 들어갈 수 있음
생산자-소비자 문제
생산자는 수를 증가시켜가며 물건을 채우고 소비자는 생성자를 쫓아가며 물건을 소비
-> 생성자가 실행되는 중에 소비자가 실행되면 문제가 발생할 수 있음
Ex) 수가 증가되기도 전에 소비자에서 수를 빼버리면 문제가 발생할 수 있음
임계구역 해결 조건
상호 배제: 한 프로세스가 임계구역에 들어가면 다른 프로세스는 들어갈 수 없다
한정 대기: 어떤 프로세스도 무한 대기하지 않아야 함
진행의 융통성: 한 프로세스가 다른 프로세스의 진행을 방해해서는 안 된다는 것
상호 배제 조건을 충족하는 코드

임계구역에 접근할 때 자신의 lock을 true로 만듬
이후 상대방이 갖고 있는 lock이 false로 바뀔 때까지 기다림
상대방 lock이 false가 오면 임계구역에 들어감
-> 대기하다가 자신의 CPU 시간을 다 쓰면(타임 아웃) 무한 대기 가능성이 있음
Ex) p1이 lock1=true하고 타임아웃 -> p2는 lock2=true하고 대기(lock1이 true니까) -> p1 턴에 와도 lock2는 true니까 대기 -> p2턴이 와도 lock1이 true니까 대기 -> 서로 무한 대기
상호 배제와 한정 대기 조건을 충족하는 코드

-> 진행의 융통성 조건을 충족하지 못 함
-> 피터슨 알고리즘, 데커 알고리즘 등으로 해결
세마포어
임계구역에 진입하기 전에 스위치를 사용 중으로 놓고 임계구역으로 들어감
이후에 도착하는 프로세스는 앞의 프로세스가 작업을 마칠 때까지 기다림



모니터
공유자원을 내부적으로 숨기고 공유 자원에 접근하기 위한 인터페이스만 제공함으로써 자원을 보호하고 프로세스 간에 동기화를 시킴