728x90
반응형
1) 동기화란
1-1) 동기화의 의미
1-2) 생산자와 소비자 문제
1-3) 공유 자원과 임계 구역
2) 공유 자원과 임계 구역
2-1) 뮤텍스 락
2-2) 세마포
2-3) 모니터
1) 동기화란
1-1) 동기화의 의미
- 동기화(synchronization) : 특정 자원에 접근할 때 한 개의 프로세스만 접근하게 하거나(상호 배제), 프로세스를 올바른 순서대로 실행하게 하는 것(실행 순서 제어)을 의미함
- 실행 순서 제어 : 프로세스를 올바른 순서대로 실행하기
- 상호 배제 : 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기
1-2) 생산자와 소비자 문제
- 생산자와 소비자 문제는 상호 배제를 위한 동기화와 관련된 고전적이고 유명한 문제임
- 생산자와 소비자 문제는 물건을 계속해서 생산하는 프로세스인 생산자와 물건을 계속해서 소비하는 프로세스인 소비자로 이루어져 있음
- 생산자와 소비자는 '총합'이라는 데이터를 공유하고 있으며, 생산자는 버퍼에 물건을 넣은 후 물건의 총합에 해당하는 변수를 1 증가시키고, 소비자는 버퍼에 물건을 빼낸 후 물건의 총합에 해당하는 변수를 1 감소시킴
- 이처럼 생산자와 소비자는 '총합'이라는 데이터를 동시에 사용하는데, 만일 소비자가 생산자의 작업이 끝나기도 전에 총합을 수정했고, 생산자가 소비자의 작업이 끝나기도 전에 총합을 수정했기 때문에 엉뚱한 결과가 발생함
- 즉, 동시에 접근해서는 안 되는 자원에 동시에 접근했기에 발생한 문제라고 볼 수 있음
1-3) 공유 자원과 임계 구역
- 공유 자원(shared resource) : 공동으로 사용하는 자원으로, 전역 변수가 될 수도 있고, 파일이 될 수도 있고, 입출력장치, 보조기억장치가 될 수도 있음
- 임계 구역(critical section) : 공유 자원에 접근하는 코드 중 동시에 실행하면 문제가 발생하는 코드 영역을 의미함(그리고 임계 구역에 진입한 프로세스가 있다면 다른 프로세스는 임계 구역 밖에서 기다려야 함)
- 레이스 컨디션(race condition) : 임계 구역은 두 개 이상의 프로세스가 동시에 실행되면 안 되는 영역이지만, 잘못된 실행으로 인해 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 경우가 있는데 이 경우를 의미함
- 임계 구역 문제를 해결하기 위한 운영체제의 세 가지 원칙
- 상호 배제(mutual exclusion) : 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없음(한 프로세스가 임계 구역에서 작업 중이면 다른 프로세스가 임계 구역에 들어갈 수 없도록 제어하는 것을 의미함)
- 진행(progress) : 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 함
- 유한 대기(bounded waiting) : 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 함(임계 구역에 들어오기 위해 무한정 대기해서는 안 됨)
2) 공유 자원과 임계 구역
2-1) 뮤텍스 락
- 뮤텍스 락(Mutex lock; MUTual EXclusion lock) : 동시에 접근해서는 안 되는 자원에 동시에 접근하지 않도록 만드는 도구, 다시 말해 상호 배제를 위한 동기화 도구임(즉, 임계 구역을 잠금으로써 프로세스 간의 상호 배제를 이룸)
- 뮤텍스 락의 매우 단순한 형태
- 자물쇠 역할 : 프로세스들이 공유하는 전역 변수 lock
- 임계 구역을 잠그는 역할 : acquire 함수
- 임계 구역의 잠금을 해제하는 역할 : release 함수
- acquire 함수 : 프로세스가 임계 구역에 진입하기 전에 호출하는 함수(만일 임계 구역이 잠겨 있다면 임계 구역이 열릴 때까지[lock이 false가 될 때까지] 임계 구역을 반복적으로 확인하고, 임계 구역이 열려 있다면 임계 구역을 잠그는[lock을 true로 바꾸는] 함수)
- release 함수 : 임계 구역에서의 작업이 끝나고 호출하는 함수로 현재 잠긴 임계 구역을 열어주는(lock을 false로 바꾸는) 함수라고 보면 됨
- acquire 함수와 release 함수를 임계 구역 전후로 호출함으로써 하나의 프로세스만 임계 구역에 진입할 수 있음
- acquire 함수를 다시 보면 임계 구역이 잠겨 있을 경우 프로세스는 반복적으로 lock을 확인하는 것을 알 수 있는데 이런 대기 방식을 바쁜 대기(busy wait)라고 함
2-2) 세마포
- 뮤텍스 락은 하나의 공유 자원에 접근하는 프로세스를 상정한 방식인 반면, 세마포는 공유 자원이 여러 개 있는 상황에서도 적용이 가능한 동기화 도구임
- 세마포(semaphore) : 공유 자원이 여러 개 있는 임계 구역 문제도 해결할 수 있는 동기화 도구
- 세마포 구성 요소
- 임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원의 개수)를 나타내는 전역 변수 S
- 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 wait 함수
- 임계 구역 앞에서 기다리는 프로세스에 '이제 가도 좋다'고 신호를 주는 signal 함수
- 뮤텍스 락을 사용할 때는 임계 구역 전후로 acquire()와 release()를 호출했듯이 세마포도 임계 구역 진입 전후로 wait()와 signal()을 호출함
- 세마포를 이용하면 상호 배제를 위한 동기화 기법과 실행 순서 제어를 위한 동기화 기법 모두 구현 가능함
2-3) 모니터
- 모니터(monitor) : 세마포에 비해 사용자가 사용하기에 훨씬 편리한 동기화 도구로 공유 자원과 공유 자원에 접근하기 위한 인터페이스(통로)를 묶어 관리하며, 프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근하도록 함
- 모니터는 공유 자원을 다루는 인터페이스에 접근하기 위한 큐(모니터에 진입하기 위한 큐)를 만들고, 모니터 안에 항상 하나의 프로세스만 들어오도록 하여 상호 배제를 위한 동기화를 제공함
- 모니터는 세마포와 마찬가지로 실행 순서 제어를 위한 동기화도 제공하는데 특정 조건을 바탕으로 프로세스를 실행하고 일시 중단하기 위해 모니터는 조건 변수(condition variable)를 사용함
- 조건 변수 : 프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수
- 조건 변수로는 wait와 signal 연산을 수행할 수 있음
- 이 과정에서 wait이 호출되어 실행이 중단된 프로세스들이 삽입되는 큐(조건 변수에 대한 큐)가 형성됨(모니터에 이미 진입한 프로세스의 실행 조건이 만족될 때까지 잠시 실행이 중단되어 기다리기 위해 만들어진 큐를 의미함)
- wait 연산으로 일시 중지된 프로세스는 다른 프로세스의 signal 연산을 통해 실행이 재개될 수 있음(즉, signal은 wait을 호출하여 큐에 삽입된 프로세스의 실행을 재개하는 연산임)
- 모니터가 조건 변수를 이용하여 아래와 같이 프로세스 실행 순서 제어를 위한 동기화를 제공함
- 특정 프로세스가 아직 실행될 조건이 되지 않았을 때에는 wait을 통해 실행을 중단함
- 특정 프로세스가 실행될 조건이 충족되었을 때에는 signal을 통해 실행을 재개함
'Computer Structure & Operating System > 2025 version' 카테고리의 다른 글
Computer Structure & OS(14) - 가상 메모리 (0) | 2025.03.16 |
---|---|
Computer Structure & OS(13) - 교착 상태 (0) | 2025.03.12 |
Computer Structure & OS(11) - CPU 스케줄링 (0) | 2025.03.10 |
Computer Structure & OS(10) - 프로세스와 스레드 (0) | 2025.03.08 |
Computer Structure & OS(9) - 운영체제 시작하기 (0) | 2025.03.04 |