프로세스 간 통신
- 프로세스 간 통신 개념
- 프로세스간의 통신에는 같은 컴퓨터 내에 있는 프로세스뿐만 아니라 네트워크로 연결된 다른 컴퓨터에 있는 프로세스와의 통신도 포함된다.
- 프로세스 내부 데이터 통신
- 하나의 프로세스 내에 2개 이상의 스레드가 존재하는 경우의 통신
- 프로세스 간 데이터 통신
- 같은 컴퓨터에 있는 여러 프로세스끼리 통신하는 경우
- 네트워크를 이용한 데이터 통신
- 여러 컴퓨터가 네트워크로 연결되어 있을 때도 통신이 가능한데 이 경우 프로세스는 소켓을 이용해 데이터를 주고 받는다.
- 프로세스 간 통신의 분류
- 통신 방향에 따른 분류
- 양방향 통신
- 일반적인 통신 구조로서, 데이터를 동시에 양쪽 방향으로 전송할 수 있는 구조
- 반양방향 통신
- 데이터를 양쪽 방향으로 전송할 수 있지만 동시 접속은 안되고 특정시점에 한쪽 방향으로만 전송 가능
- 단방향 통신
- 한쪽 방향으로만 데이터를 전송 할 수 있다. 프로세스 간 통신에서는 전역 변수와 파이프가 단방향 통신에 해당된다.
- 통신 구현에 따른 분류
- 전역변수를 사용하는 통신 방식(단방향)의 가장 큰 문제는 언제 데이터를 보낼지 데이터를 받는 쪽에선믄 모른다. 때문에 데이터를 받는 쪽에서는 반복적으로 전역 변수의 값을 점검하는 수밖에 없다.
- 상태 변화를 살펴보기 위해 반복문을 무한 실행하며 기다리는 것을 바쁜 대기(busy waiting)라고 한다. (비효율적)
- 바쁜 대기의 비효율을 해결하기 위해 동기화를 사용해 데이터가 도착했음을 알려준다.
- 동기화 기능의 유무에 따라 blocking(대기가 있는 통신)과 non-blocking(대기가 없는 통신)으로 나눈다.
- blocking (대기가 있는 통신)
- 동기화를 지원하는 방식이다. 데이터를 받는 쪽은 데이터가 도착할 때까지 자동으로 대기 상태에 머물러 있다.
- non-blocking(대기가 없는 통신)
- 동기화를 지원하지 않는다. 데이터를 받는 쪽은 바쁜 대기를 사용해 데이터가 도착했는지 여부를 직접 확인한다.
- 보내는 쪽과 받는 쪽 모두 동기화되지 않는다.
- 통신 오버헤드는 적지만 사용자가 직접처리해야하는 작업이 많다.
- 프로세스 간 통신의 종류
프로세스 간 통신은 데이터를 주거나 받는 동작으로 이루어지며 이는 쓰기 연산과 읽기 연산으로 간소화할 수 있다.
- 전역 변수를 이용한 통신
- 전역변수를 이용한 통신은 공동으로 관리하는 메모리를 사용하여 데이터를 주고받는 것이다. 데이터를 보낸느 꼭에서는 전역 변수나 파일에 값을 쓰고 데이터를 받는 쪽에서는 전역 변수의 값을 읽는다.
- 동기화 문제가 발생할 수 있다. 때문에 전역 변수 값이 변할 때까지 바쁜 대기를 돌면서 주시해야한다.
- 파일을 이용한 통신
- 파일 열기
- open 함수를 이용해서 사용하고자 하는 파일이 있는지, 권한이 있는지 확인한다.
- 파일 정상 이용이 가능하면 file descriptor를 반환한다.
- 쓰기 또는 읽기 연산
- write(fd, “file name”, filesize)
- read(fd, buf, filesize)
- 파일 닫기
- 파일을 이용한 통신은 부모-자식 관계 프로세스 간 통신에 많이 사용되며 운영체제가 프로세스 동기화를 제공하지 않는다.
- 파이프를 이용한 통신
- 프로세스 동기화 문제를 해결하는 방법 중 하나이다.
- 운영체제가 제공하는 동기화 통신 방식
- 단방향 통신이다. 양방향 통신을 하려면 파이프 2개를 사용해야 한다.
- 이름 없는 파이프
- 일반적으로 파이프라고하면 이름없는 파이프를 지칭한다.
- 이름 있는 파이프
- FIFO라 불리는 특수 파일을 이용해서 서로 관련 없는 프로세스 간 통신에 사용된다.
- 소켓을 이용한 통신
- 네트워킹
- 네트워킹 상황에서 통신은 원격 프로시저 호출이나 소켓을 이용한다.
- 원격 프로시저 호출
- 다른 컴퓨터에 있는 함수를 호출한다.
- 원격 프로시저 호출은 소켓을 이용하여 구현한다.
- 원격지의 시스탬 내 어떤 프로세스와 통신할지 결정해야 한다.
- 소켓에 쓰기 연산을 하면 데이터가 전송되고 읽기 연산을 하면 데이터를 받게 된다.
- 동기화를 지원한다.
- 소켓은 하나만 사용해도 양방향 통신이 가능하다.
공유 자원과 임계구역
프로세스는 공유된 자원을 가지고 공동 작업을 할 수도 있다.
- 공유 자원의 접근
- 공유 자원은 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등을 말한다.
- 공유 자원은 공동으로 이용되기 때문에 누가 언제 데이터를 읽고 쓰냐에 따라 그 결과가 달라질 수 있다.
- 프로세스들의 공유 자원 접근 순서를 정해서 예상치 못한 문제가 발생하지 않도록 해야 한다.
- 경쟁 조건(race condition)이 발생할 수 있다.
- 2개 이상의 프로세스가 공유 자원을 병행적으로 읽거나 쓰는 상황을 말한다.
- 임계 구역 (critical 앞으로의 상황에 영향을 미치는 section)
- 공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역을 임계구역이라고 한다.
- 임계구역에서는 프로세스들이 동시에 작업하면 안된다. 어떤 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역 밖에서 기다려야 하며 임계구역의 프로세스가 나와야 들어갈 수 있다.
- 생산자-소비자 문제
- 생산자 프로세스와 소비자 프로세스가 서로 독립적으로 작업을 한다. 생산자는 계속 물건을 생상해 버퍼에 넣고 소비자는 계속 버퍼에서 물건을 가져온다.
- 버퍼는 작업을 계속하기 위해서 원형 버퍼를 사용한다.
- 버퍼가 비었는지 가득 찼는지 확인하기 위해 sum이라는 전역 변수
- 문제점
- 생산자와 소비자가 전역 변수에 접근하는 타이밍을 못 맞추고 동시에 실행되면 문제가 발생
- 해결
- 임계구역 해결 조건
- 상호 배제
- 한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역에 들어갈 수 없다.
- 한정 대기
- 어떤 프로세스도 무한대기하지 않아야 한다. 즈, 특정 프로세스가 임계구역에 진입하지 못하면 안된다.
- 진행의 융통성
- 한 프로세스가 다른 프로세스의 진행을 방해해서는 안 된다는 것을 의미한다.
임계구역 해결 방법
임계구역 문제를 해결하는 단순한 방법은 잠금을 이용하는 것이다.
임계구역 해결 조건을 고려한 코드 설계
- 상호 배제 문제
- 작동과정
- P1, P2는 임계구역에 진입하기 전에 코드로 잠금여부를 확인
- 잠겨있으면 다른 프로세스가 임계구역에서 작업하고 있다는 뜻 (잠금이 해제될 때까지 무한루프로 기다린다.)
- 임계구역에서 프로세스가 돌아와 잠금을 해제하면 무한루프를 마치고 작업을 한다.(작업시에는 임계구역에 다른 프로세스가 못들어오게 한다.)
- 한정 대기 문제
- 잠금을 2개 사용한다. 일단 잠금을 하고 다른 프로세스가 잠겼는지 확인해 두 프로세스의 상호 배제가 보장된다.
- 단점
- 진행의 융통성 문제
- 공유변수 lock의 값을 이용해 다른 프로세스가 임계구역에 있는지 확인하고 없으면 진입한다. 임계구역을 빠져나올 때 lock을 2로 바꾼다.
- 상호 배제와 한정 대기를 보장한다.
- 단점
- 프로세사가 번갈아가면서 실행된다는 것이 문제다.
- 경직된 동기화 문제
- 하드웨어적인 해결방법
- test and set 코드를 이용하면 명령어 실행 중간에 타임아웃이 걸려 임계구역을 보호하지 못하는 문제가 발생하지 않는다.
- 단점
- 임계구역을 하드웨어적으로 해결하는 방법은 편리하지만 바쁜대기를 사용하여 검사하기 때문에 자원 낭비가 있다.
- 피터슨 알고리즘
- turn이라는 공유변수를 사용한다.
- 작동
- P1은 임계구역에 진입하기 전에 먼저 잠금을 하고 turn을 2로 설정
- P1, P2 동시에 lock을 설정했어도 turn을 이용하여 양보한다.
- 만약 P2가 잠금을 설정하지 않았거나 잠금을 설정했더라도 turn = 1로 바꾸면
P1은 임계구역에 진입하여 작업을 마친 후 잠금을 해제하고 임계구역을 빠져나온다.
- 단점
- 임계구역 해결의 3가지 조건을 모두 만족하지만 2개의 프로세스만 사용가능하다는 한계가 있다.
- 데커 알고리즘
- 임계구역 해결의 세가지 조건을 모두 만족하는 알고리즘
- 하드웨어 도움 없이 해결할 수 있다.
- 작동
- 프로세스 P1는 먼저 잠금을 건다.
- 프로세스 P2의 잠금이 걸렸는지 확인한다.
- 만약 P2도 잠겨있으면 누가 먼저인지 확인한다.
- 만약 P1차례면 임계구역으로 진입하고, P2차례면 P1은 잠금을 풀고 프로세스 P2가 작업을 마칠 때까지 기다리다가 P2작업이 끝나면 임계구역으로 들어간다.
- 세마포어
- 내부 코드
- semaphore(n)
- 전역 변수 RS를 n으로 초기화한다. RS에는 현재 사용 가능한 자원 수가 저장된다.
- P()
- 잠금을 수행하는 코드로
- RS가 양수면 (사용 가능한 자원이 있음) 1만큼 감소 시키고 임계구역에 진입
- RS가 음수면 (사용 가능한 자원 없음) 0보다 커질 때까지 기다린다.
- V()
- 잠금 해제와 동기화를 같이 수행하는 코드
- RS 값을 1증가 시키고 세마포어에서 기다리는 프로세스에게 진입해도 좋다는 wake_up신호를 보낸다.
- 장점
- 임계구역이 잠겼는지 직접 점검하거나 바쁜 대기를 하거나 동기화 메시지를 보낼 필요가 없다.
- 단점
- 잘못된 사용으로 인해 임계구역이 보호받지 못한다.
- 모니터
- 공유작원을 내부적으로 숨기고 공유 자원에 접근하기 위한 인터페이스만을 제공함으로써 자원을 보호하고 프로세스 간에 동기화를 시킨다.
- 보호할 자원을 임계구역으로 숨기고 임계구역에서 작업할 수 있는 인는 인터페이스만 제공하여 자원을 보호한다.
- 작동 원리
- 임계구역으로 지정된 변수나 자원에 접근하고자 하는 프로세스는 직접 p()나 v()를 사용하지 않고 모니터에게 작업을 요청한다.
- 모니터는 요청받은 작업을 모니터 큐에 저장한 후 순서대로 처리하고 그 결과만 해당 프로세스에 알려준다.
- 모니터는 임계구역 보호와 동기화를 위해 내부적으로 상태 변수를 사용한다.
- wait() 모니터 큐에서 자신의 차례가 올 때까지 기다린다. 세마포어의 P()에 해당
- signal() 모니터 큐에서 기다리는 다음 프로세스에 순서를 넘겨누다. 세마포어의 V()에 해당된다.
파일, 파이프, 소켓 프로그래밍
-
파일
- 순차파일
- 파일 내의 데이터는 한 줄로 길게 저장되는데 이것을 순차 파일이라고 한다.
- 예제
b. 파일 기술자
- open(), read()/write() close() 구조이다.
- 파일 기술자는 파일 접근 권한, 파일이 현재 어느 위치를 읽고 있는지에 대한 정보도 보관한다.
c. 파일을 이용한 통신
-
파이프
- 동기화를 지원하는 단방향 통신 시스템
- 서로 관련있는 프로세스 간 통신에 사용된다.
- 파이프에서는 read 와 write의 기술자가 따로 존재해 동기화가 가능하다. (파일은 파일 기술자를 공유해서 동기화 불가)
- 파이프는 대기가 있는 통신이기 때문에 wait()이 없다.
- 네트워킹
- 소켓을 이용한 네트워킹이 제일 유명하다.
- open, read, write close 구조다.
- 양방향 통신을 지원하고 동기화도 지원한다.