#12. 컴퓨터 구조 및 운영체제

Maengkkong·2024년 1월 4일
0

스터디

목록 보기
12/14

동기화 (Synchronization)

특정 자원에 접근할 때 한 개의 프로세스만 접근하는 것
프로세스를 오바른 순서대로 실행하는 것

프로세스 동기화

프로세스들 사이의 수행 시기를 맞추는 것

  • 실행 순서 제어 : 동시에 실행되는 프로세스를 올바른 순서대로 실행
  • 상호 배제(mutual exclusion) : 동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하게 하기
  • 스레드 또한 동기화 대상
  • 실행의 흐름을 가지고 있는 모든 것은 동기화의 대상

공유 자원 (Shared resource)

공동으로 이용하는 변수, 파일, 장치 등의 자원

임계 구역 (Critical sectioni)

공유 자원에 접근하는 코드 중 동시에 실행하면 문제가 발생하는 코드 영역

두 개 이상의 프로세스가 임계 구역에 진입하고자 하면 둘 중 하나는 대기해야한다. 임계 구역에 먼저 진입한 프로세스의 작업을 마무리한 후 대기 중이던 프로세스가 임계 구역에 진입해야 한다.

레이스 컨디션 (Race condition)

잘못된 실행으로 인해 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 경우

운영체제는 이러한 임계 구역 문제를 3가지 원칙하에 해결

  • 상호 배제 (mutual exclusion)
    : 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없다.
  • 진행 (progress)
    : 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
  • 유한 대기 (bounded waiting)
    : 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 한다. (무한정 대기가 이루어지면 X)

동기화 기법

뮤텍스 락 (Mutex lock : MUTual EXclusion lock)

동시에 접근해서는 안되는 자원에 동시에 접근하지 않도록 만드는 도구
(= 상호 배제를 위한 동기화 도구)
하나의 공유 자원에 접근하는 프로세스를 상정한 방식

  • 하나의 전역 변수 & 두 개의 함수로 구현
    1) 자물쇠 역할 : 프로세스들이 공유하는 전역 변수 lock
    2) 임계 구역을 잠그는 역할 : acquire 함수
    3) 임계 구역의 잠금을 해제하는 역할 : release 함수

acquire 함수
: 프로세스가 임계 구역에 진입하기 전에 호출하는 함수

  • (lock > false가 될 때까지)
    만일 임계 구역이 잠겨 있다면 임계 구역이 열릴 때까지 임계 구역을 반복적으로 확인
  • (locke > true)
    임계 구역이 열러 있다면 임계 구역을 잠그는 함수

release 함수
: 임계 구역에서의 작업이 끝나고 호출하는 함수
: 현재 잠김 임계 구역을 열어주는 함수 (lock > false)

acquire(); // 자물쇠 잠겨 있는 확인, 잠겨 있지 않다면 잠그고 들어가기
// 임계 구역 // 임계 구역에서의 작업 진행
release(); // 자물쇠 반환

바쁜 대기 (busy wait)
: acquire 함수는 임계 구역이 잠겨 있을 경우 프로세스는 반복적으로 lock을 확인합니다. 이는 쉴 새 없이 반복하며 확인하는 것이기에 이런 대기 방식을 바쁜 대기라고 합니다.

세마포 (semaphore)

뮤텍스 락과 비슷하지만, 조금 더 일반화된 방식의 동기화 도구
공유 자원이 여러 개 있는 상황에서도 적용이 가능한 동기화 도구

  • 세마포 종류
    1) 이진 세마포 (binary semaphore)
    2) 카운팅 세마포 (counting semaphore)

세마포를 이용한 상호 배제를 위한 동기화

  • 하나의 변수 & 두 개의 함수로 구현
    1) 전역 변수 S : 임계 구역에 진입할 수 있는 프로세스의 개수 (사용 가능한 공유 자원의 개수)를 나타냄
    2) wait 함수 : 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 함수
    3) signal 함수 : 임계 구역 앞에서 기다리는 프로세스에 '가도 좋다'는 신호를 주는 함수

wait()
// 임계 구역
signal()

: wait 함수는 만일 사용할 수 있는 자원이 없을 경우 해당 프로세스 상태를 대기 상태로 만듦
: 그 프로세스의 PCB를 세마포를 위한 대기 큐에 집어 넣음
: 다른 프로세스가 임계 구역에서의 작업이 끝나고 signal 함수를 호출하면 signal 함수는 대기 중인 프로세스를 대기 큐에서 제거 > 프로세스 상태를 준비 상태로 변경 > 준비 쿠로 옮김


세마포를 이용한 실행 순서 제어를 위한 동기화

1) 세마포 변수 S를 0으로 둔다.
2) 먼저 실행할 프로세스 뒤에 signal 함수를 붙인다.
3) 다음에 실행할 프로세스 앞에 wait 함수를 붙인다.

결과)
무엇을 먼저 실행되는 반드시 설정한 순서대로 실행된다.


세마포 단점

세마포는 임계 구역에 앞뒤로 wait와 signal 함수를 명시하는 것이 번거로우며, 잘못된 코드로 예기치 못한 결과를 얻을 수 있다는 단점이 있다.


세마포의 잘못된 사용 예시

1) 세마포를 누락한 경우
2) wait와 signal 순서를 헷갈린 경우
3) wait와 signal을 중복해서 사용한 경우


모니터 (monitor)

공유 자원과 공유 자원에 접근하기 위한 인터페이스(통로)를 묶어 관리
프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근

1) 모니터를 통해 공유 자원에 접근하고자 하는 프로세스를 큐에 삽입
2) 큐에 삽입된 순서대로 하나씩 공유 자원을 이용
3) 모니터는 공유 자원을 다루는 인터페이스에 접근하기 위한 큐(모니터에 진입하기 위한 큐)를 만든다.
4) 모니터 안에 항상 하나의 프로세스만 들어오도록 하여 상호 배제를 위한 동기화를 제공

  • 조건 변수(condition wariable)
    : 특정 조건을 바탕으로 프로세스를 실행하고 일시 중단하기 위해 사용
    : 프로세스, 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수

조건 변수는 wait, signal 연산 수행 가능
: wait는 호출하는 프로세스의 상태를 대기 상태로 전환하고 일시적으로 조건 변수에 대한 대기 큐에 삽입하는 연산
: signal은 wait를 호출하여 큐에 사입된 프로세스의 실행을 재개하는 연산

  • 헷갈리면 안되는 점 : 1), 2)는 다르다.
    1) 상호 배제를 위한 큐
    : 모니터에 진입하기 위해 삽입되는 큐
    : 모니터에 한 번에 하나의 프로세스만 진입하도록 하기 위해 만들어진 큐
    2) 조건 변수에 대한 큐
    : wait가 호출되어 실행이 중단된 프로세스들이 삽입되는 큐
    : 모니터에 이미 진입한 프로세스의 실행 조건이 만족될 때까지 잠시 실행이 중단되어 기다리기 위해 만들어진 큐

모니터는 조건 변수를 이용하여 1), 2)와 같은 프로세스 실행 순서 제어를 위한 동기화를 제공

1) 특정 프로세스가 아직 실행 조건이 되지 않았을 때 > wait를 통해 실행 중단
2) 특정 프로세스가 실행될 조건이 충족되었을 때 > signal을 통해 실행을 재개


혼자 공부하는 컴퓨터구조 + 운영체제
12. 프로세스 동기화 (340p - 362p)

0개의 댓글