[운영체제] 프로세스 동기화

diveintoo·2024년 3월 19일
0

혼공컴운

목록 보기
12/15

📑 본 글은 <혼공컴운>을 읽고 정리한 글입니다.

1. 동기화란

1-1. 동기화의 의미

동기화

  • 실행 순서 제어 : 프로세스를 올바른 순서로 실행한다.
  • 상호 배제(Mutual Exclusion): 동시에 접근하면 안 되는 자원에 하나의 프로세스만 접근하게 한다.

1-2. 생산자와 소비자 문제

상호 배제를 위한 동기화 관련 고전 문제

생산자 프로세스 → ‘총합’ 변수 +1

소비자 프로세스 → ‘총합’ 변수 -1

함께 사용하는 총합이라는 데이터를 동시에 사용하는데 소비자가 생산자 작업이 끝나기 전에 총합을 수정함.

→ 프로세스와 소비자 프로세스가 제대로 동기화되지 않았기 때문이다.

→ 동시에 접근해서는 안 되는 자원에 동시에 접근했기 때문이다.

1-3. 공유 자원과 임계 구역

공유 자원(shared resource)

  • 동시에 실행되는 프로세스들이 함께 사용할 수 있는 자원
  • 전역 변수, 파일, 입출력장치, 보조기억장치 등
  • 이들 중 동시에 접근해서는 안 되는 자원이 있을 수 있음

임계 구역(critical section)

  • 동시에 실행하면 문제가 발생하는 자원에 접근하려는 코드 영역
  • 하나가 들어가면 나머지는 기다린다. 걔가 끝나면 다른 애 하나가 들어간다.

레이스 컨디션(race condition)

  • 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 경우
  • 데이터의 일관성이 깨질 수 있다. (like 생상자와 소비자 문제)
  • 저급 언어를 실행하는 과정에서 Context switching이 일어나기 때문에 발생한다.

🔑 상호 배제를 위한 동기화

→ 두 개 이상의 프로세스가 임계 구역에 동시에 접근하지 못하도록 관리하는 것

3원칙

  • 상호 배제(mutual exclusion) : 하나만 임계 구역에 들어갈 수 있다.
  • 진행(progress) : 임계구역에 아무도 없으면 들어갈 수 있다.
  • 유한 대기(bounded waiting) : 임계 구역에 들어오기 위해 무한정 대기해서는 안 된다.

2. 동기화 기법

2-1. 뮤텍스 락

뮤텍스 락(MUTEX Lock: Mutual Exclusion Lock)

  • 화장실 자물쇠 역할 : 프로세스들이 공유하는 전역 변수 lock
  • 임계 구역을 잠그는 역할 : acquire 함수
  • 임계 구역의 잠금을 해제하는 역할 : release 함수
acquire() {
	while (lock == true) // 임계 구역이 잠겨있으면
			;                // 잠겨있는지 반복적으로 확인 -> Busy wait
	lock = true;
}

release() {
	lock = false;
}

Busy Wait : 임계 구역이 잠겨 있을 경우 프로세스는 반복적으로 lock을 확인한다.

2-2. 세마포

세마포(Semaphore)

  • 뮤텍스 락 + 공유 자원이 여러 개 있는 상황
  • 전역 변수 S : 임계 구역에 들어갈 수 있는 프로세스의 개수(사용 가능한 자원의 개수)
  • wait(P) 함수 : 임계 구역에 들어가도 됨?
    • 사용할 수 있는 자원이 없으면, 그 프로세스의 PCB세마포를 위한 대기 큐에 집어넣는다.
    • 프로세스를 대기 상태로 만든다.
  • signal(V) 함수 : 임계 구역 앞에서 기다리는 프로세스에게 고고 신호를 준다.
    • 대기 중인 프로세스를 대기 큐에서 제거, 프로세스 상태를 준비 상태로 변경, 준비 큐로 옮겨준다.
wait() {
	S--; // 명부 적고 감요
	if (S < 0) // 사용할 수 있는 자원이 없으면
		add this process to Queue;  // 프로세스의 PCB를 세마포를 위한 대기 큐에 집어넣는다.
		sleep();  // 프로세스 -> 대기 상태로
}

signal() {
	S++; // 자원 반납합니다요
	if (S <= 0) // 쓰고 싶은 사람이 있네
		remove process p from Queue;  // 대기 중인 프로세스를 대기 큐에서 제거
		wakeup(p);  // 프로세스 -> 준비 상태로
}

Semaphore for 실행 순서 제어를 위한 동기화

  • S = 0 세팅
  • 먼저 실행할 프로세스 뒤에 signal()
  • 나중에 실행할 프로세스 앞에 wait()

2-3. 모니터

모니터(Monitor)

  • 세마포처럼 직접 코드를 작성하지 않아도 되게 만든 동기화 도구
  • 공유 자원과 공유 자원에 접근하기 위한 인터페이스를 묶어서 관리한다.
  • 프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근할 수 있다.
    • 공유 자원을 다루는 인터페이스에 접근하기 위한 큐(모니터에 진입하기 위한 큐)를 만든다.
    • 모니터 안에는 항상 하나의 프로세스만 들어오도록 한다.

Monitor for 실행 순서 제어를 위한 동기화

아래의 개념은 모니터의 개념 혹은 모니터에 진입하기 위해 삽입되는 큐와는 다른 것이다.

  • 조건 변수 사용: 프로세스나 스레드의 실행 순서를 제어하기 위해 사용
  • wait() : 호출한 프로세스의 상태 → 대기, 조건 변수에 대한 큐에 삽입한다.
  • signal() : wait을 호출해서 큐에 들어간 프로세스의 실행을 재개한다.

0개의 댓글