읽은 책 정리/쉽게 배우는 운영체제

[정리] 05 프로세스 동기화

포포015 2022. 9. 12. 13:00

목차

  • 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 구조 동일. 양방향 통신 지원 및 동기화 지원. )