프로세스 간의 통신 개념
=> 스레드는 하나의 프로세스 내에서 자원을 공유하는 실행 단위이다.
공유 메모리나 공유 파일을 이용한 통신: 프로세스 간 통신 중 가장 원시적인 방법이다. 일정한 메모리 영역이나 파일을 공유하고 이를 통하여 데이터를 주고받는다.
파이프를 이용한 통신: 하나의 컴퓨터 내에서 프로세스 간 통신에 많이 사용되는 수단은 파이프이다. 파이프는 프로세스 간 통신을 위하여 운영체제가 제공하는 통신 기법이다. Fork( )로 만들어진 부모-자식 간 통신에 사용된다.
소켓을 이용한 통신: 컴퓨터와 컴퓨터가 네트워크로 연결된 경우의 통신에 주로 사용되는 수단은 소켓이다. 소켓은 네트워크로 연결된 컴퓨터에서 데이터를 주고받기 위한 통신 기법이다.
통신 방향에 따른 분류
- 양방향 통신: 데이터를 양쪽 방향으로 동시에 전송할 수 있는 구조이다. 일반적인 통신은 모두 양방향 통신이며, 프로세스 간 통신에는 소켓을 이용한 통신이 양방향 통신이다.
- 반양방향 통신: 데이터를 양쪽 방향으로 전송할 수 있지만, 동시 전송은 불가능하고 특정 시점에 한쪽 방향으로만 전송할 수 있는 구조이다. 무전기가 대표적인 예제이다.
- 모스 부호처럼 한쪽 방향으로만 데이터를 전송할 수 있는 구조이다. 공유 메모리나 공유 파일을 이용한 통신과 파이프를 이용한 통신이 단방향 통신이다.
대부분의 통신은 양방향이지만 공유메모리나 공유 파일을 이용한 통신과 파이프를 이용하는 통신은 단방향이다. 양방향 통신을 구현하고 싶으면 공유 메모리 2개를 사용하면 되고, 파이프도 2개를 사용하면 된다.
통신 구현에 따른 분류
바쁜대기: 상태 변화를 살펴보기 위해 반복문을 무한 실행하여 기다리는 것.
동기화: 바쁜대기 문제를 해결하기 위해 데이터가 도착했음을 알려주는 것. 알림이 대표적인 예제이다.
동기화 통신 = 대기가 있는 통신: 데이터를 받은 쪽은 데이터가 도착할 때까지 자동으로 대기 상태에 머물러 있다.
비동기화 통신 = 대기가 없는 통신: 데이터를 받는 쪽은 바쁜 대기를 사용하여 데이터가 도착했는지 여부를 직접 확인한다.
파일을 이용한 통신
=> 파일을 열고, 쓰고/읽고, 연산을 하고 파일을 닫는다.
Open( )은 일종의 준비 단계이다. 또한 그 파일이 있다면 쓰기 권한이 있는지 확인한다.
Fd는 해당 파일에 대한 접근 권한을 가지므로 쓰기나 읽기 연산의 맨 앞에는 언제나 fd를 사용한다.
Close( )함수를 사용해서 함수를 닫는다.
쓰기를 요구하면 데이터가 저장되고, 읽기를 요구하면 입출력 관리 프로세스로부터 데이터를 가져온다. 쓰기 연산은 하드디스크에 데이터를 전송하는 명령, 읽기 연산은 하드디스크로 데이터를 가지고 오는 명령이므로 파일 입출력 또한 통신이다. 저장장치의 데이터를 읽고 쓰는 것도 일반 프로세스와 입출력 프로세스 간의 통신이다.
파일을 이용한 통신은 부모-자식 관계의 프로세스 간 통신에서 많이 사용하며 프로세스 동기화를 제공하지 않는다.
파이프를 이용한 통신
=> 공유 메모리나 공유 파일을 이용한 통신과 마찬가지로 단방향 통신이다. 쓰기 연산을 하면 데이터가 전송되고 읽기 연산을 하면 데이터를 받는다.
- 이름 없는 파이프: 일반적인 파이프로, 서로 관련이 있는 프로세스 간 통신에 사용된다.
- 이름 있는 파이프: FIFO라 불리는 특수 파일을 이용하여 서로 관련 없는 프로세스 간 통신에 사용된다.
소켓을 이용한 통신
=> 여러 컴퓨터 프로세스간 통신에 사용되며 이를 네트워킹이라 한다. 인터넷을 사용하려면TCP/IP가 있어야 한다. IP의 역할은 목적지까지 데이터를 전송하는 것이며, 이때 사용되는 주소가 IP주소이다.
하나의 포트에 여러 클라이언트를 연결하려면 소켓이 필요하다. 네트워크에서 데이터를 보낸다는 것은 클라이언트 소켓이 서버 소켓에 데이터를 보내는 것이다. 그래서 네트워크 프로그래밍을 소켓 프로그래밍이라 한다. 또한 컴퓨터에 있는 프로세스와 통신하려면 그 컴퓨터의 위치를 파악하고, 원격지의 시스템 내 여러 프로세스 중 어떤 것과 통신할지 결정해야 한다. 소켓은 프로세스의 동기화를 지원하므로 데이터를 받는 쪽의 프로세스가 바쁜 대기를 하지 않아도 된다.
공유 자원에 대한 접근
공유자원: 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등을 말한다. 누가 언제 데이터를 읽거나 쓰느냐에 따라 결과가 달라질 수 있다.
경쟁조건: 프로세스가 공유 자원을 병행해서 읽거나 쓰는 상황을 경쟁조건이 발생했다고 한다.
임계 구역: 공유자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역을 임계구역이라 한다. 보통 한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역 밖에서 기다려야 하며, 임계구역에 들어간 프로세스가 나와야만 밖에 있던 프로세스가 들어갈 수 있다.
임계구역 해결조건
- 상호 배제: 한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역에 들어갈 수 없다. 이것이 지켜지지 않으면 임계구역을 설정한 의미가 없다.
- 한정대기: 어떤 프로세스도 임계구역에 진입하지 못하여 무한대기 하지 않아야 한다.
- 진행의 융통성: 한 프로세스가 다른 프로세스의 진행을 방해해서는 안 된다.
임계구역 문제 해결
=>상보배제, 한정대기, 진행의 융통선을 모두 만족하는 잠금, 잠금해제, 동기화 구현 방법이 있다.
Lock(잠금): 잠금 해제와 동시에 동기화 신호를 보낸다.
공유변수: 프로세스가 공유하는 변수
임계구역: 임계구역으로 보호되어야 할 부분
교착상태: while문을 빠져나오지 못하고 무한 루프에 빠져서 임계구역에 진입하지 못하는 상태. 교착상태는 프로세스는 살아있으나 작업이 진행되지 못하는 상태이다.
경직된 동기화: 프로세스의 진행이 다른 프로세스로 인해 방해받는 현상
하드웨어로 해결방법: 검사와 지정(test and set)이라는 코드로 하드웨어의 진행을 받아 while(lock=true)와 lock=true문을 한꺼번에 실행한다. 검사와 지정 코드를 이용하면 명령어 중간에 타임아웃이 걸려 임계구역을 보호하지 못하는 문제가 발생하지 않는다.
피터슨 알고리즘
=>임계구역 문제 해결의 세 가지 조건을 모두 만족하지만 2개의 프로세스만을 사용 가능하다는 한계가 있다. 여러 프로세스가 1개의 임계구역을 사용하려면 공유 변수를 추가하고 코드를 변경해야 한다. 피터슨 알고리즘을 제외하고 임계구역 문제를 해결하려면 검사/지정 같은 하드웨어의 도움이 필요하다.
데커 알고리즘
=> 하드웨어의 도움 없이 임계구역의 문제를 해결한다.
=> 피터슨/데커 알고리즘은 임계구역 문제 해결의 세 가지 조건을 모두 만족하지만 매우 복잡하다. 프로세스가 늘어나면 변수도 늘어나고, 전체적으로 알고리즘이 복잡해진다. 임계구역을 보호하기 위해 알고리즘을 구현하는 것은 바람직한 접근 방법이 아니다.
세마포어
=> 프로세스가 임계구역에 진입하기 전에 스위치를 사용 중으로 놓고 임계구역으로 들어간다. 이후 도착하는 프로세스는 앞의 프로세스가 작업을 마칠 때까지 기다린다. 프로세스가 작업을 마치면 세마포어는 다음 프로세스에 임계구역을 사용하라는 동기화 신호를 보낸다. 세마포어 알고리즘에서는 다른 알고리즘과 달리 임계구역이 잠겼는지 직접 점검하거나, 바쁜 대기를 하거나, 다른 프로세스에 동기화 메시지를 보낼 필요가 없다. 세마포어는 초기화가 끝난 후 프로세스가 임계구역에 들어가기 전에 사용 중이라고 [P( )], 임계구역ㅇ르 나올 때 비었다고 표시하는 [V( )] 간단한 방법으로 임계구역을 보호한다.
세마포어에서 잠금이 해제되기를 기다리는 프로세스는 세마포어 큐에 저장되어 있다가 wake_up신호를 받으면 큐에서 나와 임계구역으로 진입한다. 따라서 바쁜 대기를 하는 프로세스가 없다. 또한 세마포어는 공유자원이 여러개일 때도 사용할 수 있다.
세마포어의 문제점: 잘못된 사용으로 인한 임계구역을 보호받지 못한다.
세마포어 단점
- 프로세스가 세마포어를 사용하지 않고 바로 임계구역으로 들어가면 임계구역을 보호할 수 없다.
- P( )를 두 번 사용하여 wake_up( )신호가 발생하지 않은 경우, 프로세스간 동기화가 이루어지지 않아 세라포 큐에서 대기하던 프로세스들이 무한 대기에 빠진다.
- P( )와 V( )를 반대로 사용하여 상호 배제가 보장되지 않는 경우 임계구역으로 보호 못한다.
시스템 호출
=>운영체제가 시스템 자원을 사용자로부터 숨기고 사용자 요구 사항을 처리할 수 인터페이스
시스템 호출과 같은 방법으로 모니터도 보호할 자원을 숨기고 임계구역에서 작업할 수 있는 인터페이스만 제공하여 자원을 보호한다.
모니터 동작원리
- 임계구역으로 지정된 변수나 자원에 접근하고자 하는 프로세스는 직접 P( )나 V( )를 사용하지 않고 모니터에 작업 요청을 한다.
- 모니터는 요청받은 작업을 모니터 큐에 저장한 후 순서대로 처리하고 그 결과만 해당 프로세스에 알려준다.
파일, 파이프, 소켓 프로그래밍
순차파일: 파일 내의 데이터는 한 줄로 길게 저장되는데 이러한 파일을 순차파일이라고 한다.
순차적 접근: 순차 파일에 접근하는 방식
모든 통신과 관련된 명령어는 open( ), read( )/write( ), close( )이다
네트워킹: 프로세스에 데이터를 전달하는 방법 중 가장 대중화된 것이다.