[OS] 5. 프로세스 동기화

Park H·2021년 1월 5일
0

OS

목록 보기
5/9

1. 프로세스간 통신

프로세스 통신의 개념

  • 동시에 실행되는 프로세스끼리 데이터를 주고받는 작업

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

  1. 프로세스 내부 데이터 통신
    : 하나의 프로세스 내에 2개이상의 스레드가 존재하는 경우
    ⇒ 내부스레드는 "전역변수"나 "파일"을 이용하여 통신함

  2. 프로세스간 통신
    : 여러 프로세스끼리 통신
    ⇒ 운영체제가 제공하는 파이프를 이용하여 통신

  3. 네트워크를 이용한 데이터 통신 (컴퓨터)
    : 소캣을 이용하여 통신한다.

2) 프로세스간 통신의 분류

  • 통신 방향에 따른 분류

    1. 양방향 통신: 데이터를 동시에 양방향으로 전송할 수 있는 구조

    2. 반양방향 통신: 양방향으로 전송할 수 있지만 동시전송은 불가능한 구조
      ex) 무전기

    3. 단방향 통신: 모스 신호처럼 한쪽 방향으로만 데이터를 전송할 수 있는 구조
      ex) 전역변수, 파이프
      ⇒ 양방향으로 통신을 하려면 2개를 사용하여야 한다.


  • 통신 구현 방식에 따른 분류

    1. 바쁜대기: 상태 변화를 살펴보기 위해 반복문을 무한 실행하며 대기하는 것

      • 동기화 : 데이터가 왔다는 신호를 알려주는 것
      • 동기화를 지원하지 않으면, 반복적으로 전역부스이 값을 점검해야한다.
    2. 대기가 있는 통신 : 동기화를 지원하는 통신 (대기상테에 머물며 기다린다.)

    3. 대기가 없는 통신 : 동기화 X (데이터를 반복적으로 직접 계속해서 확인한다.)
      ex) 전역변수

3) 프로세스 통신의 종류

  1. 전역 변수를 이용한 통신
  • 공동으로 관리하는 메모리를 사용해 데이터를 주고받는 것

  • 직접적으로 관련이 있는 프로세스 간에 사용,

ex) 부모 프로세스와 자식 프로세스
:부모프로세스가 전역변수를 선언한 후 자식 프로세스를 만들면 통신 가능

  • 전역 변수의 값이 변할 때까지 바쁜대기가 필요, 동기화 문제

  1. 파일을 이용한 통신
  • 파일 열기, 쓰기(읽기), 닫기로 구성

  • 부모-자식 관계 프로세스 간 통신에 많이 사용

  • 동기화를 제공하지 않음

  1. 파이프를 이용한 통신
  • 운영체제가 제공하는 동기화 통신 방식

  • 단방향 통신이므로 양방향 통신을 위해선 파이프 2개를 사용해야 함

  • 이름 없는 파이프: 서로 관련 있는 프로세스 간 통신에 사용

  • 이름 있는 파이프: FIFO라는 특수 파일을 이용하며, 서로 관련 없는 프로세스 간 통신에 사용

  1. 소켓을 이용한 통신
  • 네트워킹: 여러 컴퓨터에 있는 프로세스 간 통신

  • 네트워킹의 통신은 "원격 프로시저 호출(자바 객체 호출)"이나 "소켓"을 이용함

  • 통신하고자 하는 프로세스는 자신의 소켓과 상대의 소켓을 연결, 이를 바인딩이라 함

  • 프로세스 동기화를 지원

  • 양방향 통신이 가능


2. 공유자원과 임계 구역

1) 공유 자원의 접근

  • 공유 자원: 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등

  • 공유 자원은 공동으로 이용되기 때문에 누가 언제 데이터를 읽고 쓰느냐에 따라 결과가 달라질 수 있음

  • 경쟁 조건 발생: 2개 이상의 프로세스가 공유 자원을 병행적으로 읽거나 쓰는 상황

2) 임계구역

  • 임계구역: 공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역

  • 임계구역에서는 프로세스들이 동시에 작업하면 안 된다.

3) 임계구역 해결 조건

  1. 상호 배제 - 임계구역 내에는 한 번에 하나의 프로세스만 있어야 한다.

  2. 한정 대기 - 어떤 프로세스도 무한 대기하지 않아야 함, 특정 프로세스가 임계구역에 진입하지 못하면 안된다.

  3. 진행의 융통성 - 한 프로세스가 다른 프로세스의 진행을 방해해서는 안된다.

3. 임계구역 해결 방법

  • 임계구역 문제를 해결하는 단순한 방법은 잠금을 이용하는 것

1) 임계구역 해결 조건을 고려한 코드 설계

  1. 상호 배제 문제

  • 프로세스 P1과 P2는 코드가 같음

(과정)

  1. 프로세스 P1과 P2는 임계구역에 진입하기 전에 임계구역에 잠금이 걸려있는지 확인(lock == true)

  2. 잠겨있는 경우 잠금이 해제될 때 까지 무한 루프를 돌면서 대기[while(lock == true);]

  3. 임계구역에 있는 프로세스가 작업을 마치고 잠금을 해제하면(lock = false;) 루프에서 빠져나와 작업

  4. 새로 임계구역에 진입하는 프로세스는 잠금을 걸고(lock = true;) 작업

  5. 작업을 마치면 다른 프로세스가 사용할 수 있도록 잠금 해제(lock = false;)


  • 동시 진입 상황(상호 배제 조건을 충족하지 않는 경우)

    1. 프로세스 P1이 무한 루프를 빠져나와 다음 문장을 실행하려 할 때 타임아웃하여 준비상태로 옮겨짐

    2. 문맥교환이 발생하고 프로세스 P2가 실행상태로 바뀜

    3. 프로세스 P1이 아직 잠금을 걸지 않았기 때문에 P2가 진입할 수 있음

    4. 프로세스 P1, P2 모두 lock = true;문을 실행해 임계구역에 진입

  • 잠금이 풀리기를 기다리려면 바쁜 대기를 해야 해 시스템 자원의 낭비

  1. 한정 대기 문제
  • 잠금을 2개 사용해, 일단 잠금을 하고 다른 프로세스가 잠겼는지 확인하므로 상호 배제가 보장

  • 무한 대기 상황(한정 대기 조건을 충족하지 않는 경우)

    1. 프로세스 P1, P2가 각각 lock1 = true;, lock2 = true; 문을 실행한 후 타임아웃

    2. 프로세스 P2가 lock2 = true;문을 실행했기 때문에 P1은 while(lock2 == true);문에서 무한루프에 빠짐

    3. 프로세스 P1이 lock1 = true;문을 실행했기 때문에 P2는 while(lock1 == true);문에서 무한루프에 빠짐

    4. 프로세스의 개수가 늘어날 수록 검사해야하는 lock의 개수도 늘어나 확장성 면에서 비효율적

  1. 진행의 융통성 문제
  • 잠금을 확인하는 문장이 하나이므로 상호 배제와 한정 대기를 보장

(문제점)

  • 한 프로세스가 두 번 연달아 임계구역에 진입할 수 없음

  • 프로세스 P1은 P2가 임계구역에 진입했다 나와야 다시 진입할 수 있으므로 P2가 P1의 진행을 방해

⇒ "경직된 동기화" 라고도 함

  1. 하드웨어적인 해결 방법

  • 상호 배제 문제의 경우 하드웨어적으로 두 명령어를 동시에 실행하면 쉽게 해결

  • 바쁜 대기를 사용해 검사하기 때문에 자원 낭비

  • 동기화 명령어: cpu가 지원하는 동기화 명령어를 활용하는 방법

    · 상호 배제 조건은 쉽게 충족시킬 수 있지만, 한정 대기 조건은 문제마다 차이가 있음

    · Test and Set

    · Swap:

2) 피터슨 알고리즘

  • 두 프로세스가 동시에 lock을 설정해 임계구역에 못 들어가는 상황에 대비하기 위해 공유변수 turn을 사용

  • 프로세스 P1은 임계구역에 진입 전에 잠금을 한 후 turn을 2로 설정

  • 프로세스 P2가 잠금을 설정하지 않았거나 설정했더라도 trun = 1로 바꾸면 P1은 임계구역에 진입해 작업을 마치고 잠금을 해제한 뒤 빠져나옴

  • 2개의 프로세스만 사용할 수 있다는 한계

3) 데커 알고리즘

  • 하드웨어의 도움 없이 임계구역 문제를 해결할 수 있음

  • 데커 알고리즘의 작동 방식

    · 프로세스 P1이 우선 잠금을 건다(lock1 = true;)

    · 프로세스 P2의 잠금이 걸렸는지 확인 [while(lock2 == true)]

    · 잠금이 걸려있는 경우, 누가 먼저인지 확인[if(turn == 2)]

    · 프로세스P1의 차례라면(turn = 1) 임계구역으로 진입, 프로세스 P2의 차례라면(turn = 2)

    · 프로세스 P1의 잠금을 풀고(lock1 = false;) P2의 작업 종료를 기다림[while(turn == 2);]

    · 프로세스 P2가 작업을 마치면 잠금을 걸고(lock1=true;) 임계구역으로 진입

  • 임계구역 해결의 3가지 조건을 모두 만족하지만 매우 복잡

✨4) 세마포어

  • 임계구역에 진입하기 전에 스위치를 사용한다.

(과정)

  1. Semaphore(n): 전역변수 RS를 n으로 초기화, RS에는 현재 사용 가능한 자원의 수가 저장

  2. P(): 잠금을 수행하는 코드, RS가 0보다 크면 1만큼 감소시키고 임계구역에 진입, 0보다 작으면 대기

  3. V(): 잠금 해제와 동기화를 같이 수행하는 코드, RS값을 1 증가시키고 프로세스에게 진입 신호를 보냄

  4. 프로세스는 세마포어 큐에 대기하다가 V()에게서 신호를 받으면 임계구역에 진입하기 때문에 바쁜 대기가 없음

  5. P()와 V()코드가 실행 중에 다른 코드가 실행되면 상호 배제와 한정 대기 조건의 보장이 불가

-> P()와 V()의 내부 코드는 검사와 지정을 사용해 분리 실행되지 않도록 해야 함


(문제점)

  1. 사용자의 고의나 실수로 인해 임계구역이 보호받지 못할 가능성이 있음

(해결방안)

  1. 사용자가 제어하지않고 P() 와 v()함수를 자동적으로 처리하도록 한다.

EX) 모니터


  • 계수 세마포어

    · 초기값은 가능한 자원의 수로 정해지며, 세마포어 값의 범위가 정해져 있지 않음

  • 이진 세마포어

    · 세마포어 값으로 0 또는 1을 가짐

    · 계수 세마포어보다 간단히 구현할 수 있음

    · Test and Set 등 하드웨어가 지원하는 기능을 이용해 구현하기도 함

    · 이진 세마포어를 이용해 계수 세마포어를 구현할 수도 있음

5) 모니터

  • 공유자원을 숨기고 접근을 위한 인터페이스만 제공해 자원을 보호하고 프로세스 간에 동기화를 시킴

  • 임계구역으로 지정된 변수나 자원에 접근하고자 하는 프로세스는 모니터에 작업 요청

  • 모니터는 작업 요청받은 작업을 모니터 큐에 저장, 순서대로 처리 후 결과를 프로세스에 알려줌

  • 임계구역 보호와 동기화를 위해 내부적으로 상태 변수를 사용

    · wait(): 모니터 큐에서 자신의 차례가 올 때까지 기다림, P()에 해당

    · signal(): 모니터 큐에서 기다리는 다음 프로세스에 순서를 넘겨줌, V()에 해당

0개의 댓글