목차
- 1. 프로세스 간 통신
- 2. 공유 자원과 임계구역
- 3. 임계구역 해결 방법
- 4. 파일, 파이프, 소켓 프로그래밍
1. 프로세스 간 통신
- 독립적인 프로세스끼리 작업을 하다 서로 데이터를 주고 받아야 할때, 통신을 사용한다.
- 프로세스 내부 데이터 통신 - 하나의 프로세스 내에서 2개 이상의 스레드가 존재하는경우, [전역변수] or [파일]을 이용
- 프로세스 간 데이터 통신 - 같은 컴퓨터에 있는 여러 프로세스 끼리 통신하는경우, [공용파일] or [운영체제 파이프라인]을 이용
- 네트워크를 이용한 데이터 통신 - 여러 컴퓨터가 네트워크로 연결되어 있을때, [소켓]을 이용
1.1 프로스세 간 통신의 분류
- 프로세스 간 통신은 동시에 실행되는 프로세스끼리 데이터를 주고 받은 작업을 의미.
- 데이터가 전송되는 방향에 따라 3가지로 나뉜다.
- 양방향 통신 - 데이터를 동시에 양쪽방향으로 전송할수 있는구조. (일반적인 통신은 양방향 통신 구조)
- 반양방향 통신 - 양쪽 방향으로 전송할수 있지만, 동시 전송은불가. 특정시점에 한쪽방향으로 전송할수 있는 구조 ( 무전기)
- 단방향 통싱 - 한쪽 방향으로만 데이터를 통신할수 있는 구조.
분류 방식 | 종류 | 예 |
통신 방향에 따른 분류 | 양방향 통신 | 일반적인 통신, 소켓 |
반양방향 통신 | 무전기 | |
단방향 통신 | 전역변수, 파일, 파이프 | |
통신 구현 방식에 따른 분류 | 대기가 있는 통신 (동기화 통신) | 파이프, 소켓 |
대기가 없는 통신 ( 비동기화 통신) | 전역변수, 파일 |
* 바쁜대기
- 전역변수를 사용하는경우 , 데이터를 받는쪽에선 언제 어떻게 알수없기에 반복적으로 전역 변수 상태 변화를 살피기 위해
반복문을 무한 실행하며 기다리는 상태.
* 동기화
- 바쁜 대기 문제를 해결하기 위해 나온 방안.
- 데이터가 도착했음을 알려줌.
1.2 대기가 있는 통신 / 대기가 없는 통신
- 대기가 있는 통신 - 동기화를 지원하는 방식 ( 데이터가 도착할때 자동으로 도착했음을 알려줌 )
- 대기가 없는 방식 - 동기화를 지원하지 않는 통신방식. ( 도착 여부를 직접 확인 )
1.3 프로세스 간 통신의 종류
1) 전역 변수를 이용한 통신
- 공동으로 관리하는 메모리를 사용해 데이터를 주고받는 통신.
- 주로 직접적으로 관련이 있는 프로세스 간에 사용
- 동기화 문제 / 바쁜 대기를 돌면서 계속 주시해야 한다.
2) 파일을 이용한 통신
- 파일을 읽고, 쓰거나 읽고, 연산을 한후, 파일을 닫는다.
- 파일 기술자 라는 개념이 있는데 파일 기술자를 통해서만 파일 접근이 가능하다.
- 부모 - 자식 관계 프로세스 간 통신에 많이 사용. 동기화를 제공하지 않음.
3) 파이프를 이용한 통신
- 프로세스 동기화 문제를 해결하는 방법.
- 운영체제가 제공하는 동기화 통신 방식. 파일 통신과 같이 기술자를 얻어서 작업을 한다. ( open -> operation -> close)
- 이름 없는 파이프 - 일반적으로 말하는 파이프. (부모-자식 프로세스 혹은 같은 서로 관련 있는 프로세스 간 통신에 사용)
- 이름 있는 파이프 - FIFO 라 불리는 특수 파일을 이용해 서로 관련 없는 프로세스 간 통신에 사용
4) 소켓을 이용한 통신
- 여러 컴퓨터에 있는 프로세스 끼리 통신 하는 방법.
- 네트워킹 상황에서의 통신은 원격 프로시저 호출이나 소켓을 이용. ( 다른 컴퓨터에 있는 함수를 호출 )
* 동기화를 지원하는 프로세스 간 통신 에는 open() , close() 함수가 사용
( open 으로 key를 받아 작업을 시작하고 자원을 다 사용하면 close()로 key 를 반납한다 )
종류 | 운영체제 동기화 지원 | open() / close() 사용 |
전역변수 | X(바쁜 대기) | X |
파일 | X( wait() 함수 이용) | O |
파이프 | O | O |
소켓 | O | O |
2) 공유 자원과 임계 구역
2.1) 공유 자원
- 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등을 말함.
- 공동으로 이용되기 때문에, 누가 언제 데이터를 읽거나 쓰느냐에 따라 결과가 달라질수 있다.
* 경쟁 조건 - 2개이상의 프로세스가 공유자원을 병행적으로 읽거나 쓰는 상황
2.2) 임계 구역
- 공유 자원 접근 순서에 따라 결과가 달라지는 프로그램의 영역 구간.
- 임계 구역에서는 프로세스들이 동시에 작업 금지. ( 한 프로세스가 작업을 하고 있다면 다른 프로세스는 대기 )
2.3) 생산자 - 소비자 문제
- 임계 구역과 관련된 전통적인 문제. ( 각 프로세스 마다 서로 독립적인 작업을 할때에 대한 이슈 .)
- 생산자와 소비자 각각 작업을 하는데, 하나의 전역변수를 바라보고 있는
생산자 - 소비자가 작업이 시작이 동시에 발생했을때 에 대한 됬을때에 대한 이슈. ( 개발하다가도 이런적 이슈가 있었다. )
2.4) 임계구역 해결 조건
- 상호 배제 - 한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역에 들어갈수 없다 라는 제약.
- 한정대기 - 특정 프로세스가 임계 구역에 진입하지 못하게 하면 안된다.
- 진행의 융통성 - 한 프로세스가 다른 프로세스의 진행을 방해해서는 안된다.
3) 임계구역 해결 방법
- 가장 단순한 방법은 잠금(Lock) 을 이용하는 것.
3.1) 소프트웨어 적으로 임계구역을 해결하는 방법
- 한 프로세스가 시작전에 전역변수에 작업 시작을 알리는 값을 세팅하고 작업을한다.
- 장점 - 제일 일반적인 방법. 간단하다.
- 단점 - 가끔 제대로 동작하지 않음.
(프로세스 1이 작업 도중 timeout 나면 프로세스 2는 프로세스 1이 작업이 완료 되지 않아, 작업 진행 불가 - 무한 루프)
3.2) 하드웨어적인 해결 방법
- 코드 잠금이 걸렸는지 검사하는 분기문 , 잠금 설정하는 로직을 하드웨어 적으로 두명령어를 동시에 실행하는 방법
- 검사와 지정 ( test-and-set ) 이라는 코드로 하드웨어의 지원을 받아 한꺼번에 실행.
3.3) 피터슨 알고리즘
- 임계구역에 진입하기 전에 1) 먼저 잠금을 한후. 2)turn 이라는 변수 값으로 프로세스의 실행 순서를 정한다.
- 장점 - 임계구역의 세가지 조건을 만족한다.
- 단점 - 2개의 프로세스만 사용가능하다. 여러 프로세스가 하나의 임계구역을 사용시 공유변수 추가 및 코드 변경 필요
3.4) 데커 알고리즘
- 머너저 잠금후, 잠금여부 확인 , 잠금을 걸었다면 누가먼저 인지 확인, 작업 시작.
- 임계구역 해결 세가지 조건 모두 만족, 프로세스가 늘어나면 전체적인 알고리즘이 복잡하다.
3.5) 세마포어
- 임계구역에 진입하기 전에 스위치를 사용중으로 놓고 임계구역에 들어감.
- 프로세스가 작업을 마치면 다음 프로세스에 임계구역을 사용하라는 동기화 신호를 보냄.
( 1. 전역변수 초기화 2. 잠금수행 3. 잠금해제와 동기화를 같이 수행 )
3.6) 모니터
- 보호할 자원을 임계구역으로 숨기고 임계구역에서 작업할수 있는 인터페이스만 제공.
- 임계구역으로 지정된 변수나 자원에 직접 접근하지 않고, 1. 작업을 요청 2. 요청받은 작업을 큐에 저장하고 순서대로 실행 3. 결과 응답
4) 파일, 파이프, 소켓 프로그래밍
4.1) 파일
- 파일을 포함해 모든 통신에 관련된 연산은 1. open 2. read/ write 3. close 구조.
open - 파일이 있는지 ? / 접근권한이 있는지 ? / 어떤 방식으로 열것인지? 에 대한 것을 충족한다면, 파일 기술자를 얻는다.
- 순차 파일 - 아무리 큰 파일이라도 파일 내의 데이터는 개념적으로 한줄로 저장. (파일 내의 데이터는 한줄로 길게 저장됨)
- 순차적 접근 - 순차 파일에 접근하는 방식.
- 파일 기술자 - 파일 접근 권한 외에 현재 파일의 어느 위치를 읽고 있는지에 대한 정보 보관
4.2) 파이프
- 파이프보다 기술자를 초기화 한후 읽기나 쓰기 연산을하고 close()로 기술자를 닫는 구조.
- 파일과 파이프의 기술자의 차이점이라면, 파이프는 read()와 , write() 기술자가 따로 존재해, 파이프는 open과 close를 각각 작업필요
4.3) 네트워킹
* 소켓 - 여러 컴퓨터에 있는 프로세스에 데이터를 전달하는 방법중 가장 대중화 된 방법
( open / read, write / close 구조 동일. 양방향 통신 지원 및 동기화 지원. )
'읽은 책 정리 > 쉽게 배우는 운영체제' 카테고리의 다른 글
[정리] 07 물리 메모리 관리 (0) | 2022.09.26 |
---|---|
[정리] 06 교착 상태 (1) | 2022.09.26 |
[정리] 04 CPU 스케줄링 (0) | 2022.08.31 |
[정리] 03 프로세스와 스레드 (0) | 2022.08.31 |
[정리] 02 컴퓨터의 구조와 성능 향상 (0) | 2022.08.18 |