학습목표
•
동기화랑 무엇인가
•
공유 자원과 임계 구역 문제를 이해
•
임계 구역 문제를 해결하기 위한 동기화 기법들을 학습
동기화란
Synchronization
•
프로세스들은 공동의 목적을 올바르게 수행하기 위해 서로 협력하여 영향을 주고 받기도 한다
•
이런 프로세스들은 실행 순서와 자원의 일관성을 보장해야한다
•
즉, 동기화되어야한다
동기화의 의미
•
예시: 워드 프로세서
◦
사용자로부터 입력을 받는 프로세스
◦
입력한 애용의 맞춤법을 검사하는 프로세스
◦
입력한 내용을 화면에 출력하는 프로세스
•
동기화의 정의
◦
국어사전: 정보, 통신 분야에서의 동기화란 작업들 사이의 수행 시기를 맞추는 것
•
프로세스 동기화: 프로세스 사이의 수행 시기를 맞추는 것 의미. 즉,
◦
실행 순서 제어: 프로세스를 올바른 순서대로 실행하기
◦
상호 배제: 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기
프로세스뿐만 아니라 스레드도 동기화의 대상이다. 구체적으로 말하면 실행 흐름을 갖는 모든 것은 동기화의 대상이다.
첫째, 실행 순서 제어를 위한 동기화
•
예시, write → read 순서는 보장 돼야
둘째, 상호 배제를 위한 동기화
상호배제, Mutual Exclusion → 공유가 불가능한 자원의 동시 사용을 피하기 위해 사용하는 알고리즘
•
이렇게 동시에 접근해서는 안 되는 자원에 동시에 접근하지 못하게 하는 것이 상호 배제를 위한 동기화
상호 배제: 생산자와 소비자 문제
•
고전적이고 유명한 문제
•
생산자와 소비자는 동시에 실행되는 스레드가 될 수 있다
•
총합: 생산자와 소비자가 공유하는 데이터
•
생산자는 버퍼에 물건을 넣은 후, 물건의 총합에 해당하는 변수에 +1
•
소비자는 버퍼에 물건을 빼낸 후 물건의 총합에 -1
•
여기서 생산자와 소비자를 동시에 100,000번 동시에 실행하면?
•
총합 변수는 10으로 유지될 것으로 예상되나, 실행 결과는?
◦
이는 동기화가 되어 있지 않기 때문에 발생하는 문제
공유 자원과 임계 구역
•
공유 자원, shared resource
◦
동시에 실행되는 프로세스들이 동시에 접근 가능한 자원
◦
전역 변수, 파일, 입출력장치, 보조기억장치, 등등
•
임계 구역, critical section
◦
위처럼 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역
•
두 개 이상의 프로세스가 임계 구역에 진입하고자 하면 둘 중 하나는 대기해야
•
앞서 진입한 프로세스의 작업이 마무리 되면 그제서야 비로소 기다렸던 프로세스가 임계 구역에 진입
레이스 컨디션
Race Condition
•
임계구역은 두 개 이상의 프로세스가 동시에 실행되면 안 되는 영역
•
잘못된 실행으로 인해 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제 발생할 수도
•
이를 레이스 켠디션이라고 한다
•
레이스 컨디션
◦
예시: 계좌 잔액 문제, 생산자와 소비자 문제
◦
데이터의 일관성이 깨지는 문제 발생
•
왜 발생할까?
◦
컴퓨터는 저급 언어를 실행하고, 이는 여러개로 나뉘어질 수 있기 때문 → 문맥 교환시 문제됨
임계 구역 문제 해결 방법
세 가지 원칙을 반드시 지켜야한다
1.
상호 배제, mutual exclusion
•
한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없다
2.
진행, progress
•
임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세는 들어갈 수 있어야 한다
3.
유한 대기, bounded waiting
•
한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언제가는 임계 구역에 들어올 수 있어야 한다
•
즉, 무한정 대기해서는 안 된다
동기화 기법
•
프로세스 동기화는 어떻게 이루어질까?
◦
어떻게 해야 임계 구역에 오직 하나의 프로세스만 진입할 수 있게 하고, 올바른 실행 순서를 보장할 수 있을까?
◦
뮤텍스 락, 세마포, 모니터
뮤텍스 락
•
analogy: 탈의실
◦
탈의실: 임계구역
◦
손님: 프로세스
•
대기 중인 손님은 일단 탈의실을 열어보고 자물쇠가 걸려 있다면 탈의실에 사람이 있다고 판단하고 기다린다
•
자물쇠가 걸려있지 않다면 탈의실을 이용한다
→ 뮤텍스 락, mutex lock, mutual exclusion lock
◦
뮤텍스 락은, 동시에 접근해서는 안 되는 자원에 동시에 접근하지 않도록 만드는 도구, 즉
◦
상호 배제를 위한 동기화 도구
구현: 가장 단순한 형태
•
하나의 전역변수 + 두 개의 함수로 구현 가능
•
자물쇠: 프로세스들이 공유하는 전역 변수 lock
•
임계 구역을 잠그는 역할: acquire 함수
•
임계 구역의 잠금을 해제하는 역할: release 함수
acquire 함수
•
프로세스가 임계 구역에 진입하기 전에 호출하는 함수
•
만약 잠겨있다면, 열릴 때까지 임계 구역을 반복적으로 확인 (while lock ≠ false)
•
열려 있다면 임계 구역을 잠그는 함수 (lock = true)
release 함수
•
잠긴 임계 구역을 열어주는 함수 (lock = false)
바쁜 대기, busy wait
세마포
Semaphore
•
뮤텍스 락과 비슷하지만 더 일반화 된 동기화 도구
•
공유 자원이 하나가 아니라 여러개인 경우
◦
각 공유 자원에는 하나의 프로세스만 진입이 가능해야할 지라도
◦
여러 개의 프로세스가 각각의 공유 자원에 접근이 가능해야
•
예시
◦
탈의실 세 개
◦
프린터 세 대
•
세마포 어원: 철도 신호기
◦
멈춤, 가도 좋다 → 보고 기차 움직입
구현
•
임계 구역에 진입할 수 있는 프로세스의 개수를 나타내는 전역 변수 S
•
임계 구역에 들어가도 좋은지, 기다려야 할지를 알 수 있는 wait 함수
•
임계 구역 앞에서 기다리는 프로세스에 ‘이제 가도 좋다’고 신호를 주는 signal 함수
wait 함수
S: 임계 구역에 진입할 수 있는 프로세스의 개수
signal 함수
문제점
•
mutex lock에서도 해당되는 문제
•
바쁜 대기를 반복해야 함 → CPU 낭비
◦
실제 Semaphore는 더 좋은 방법을 사용
1.
wait 함수는 만일 사용할 수 있는 자원이 없을 경우 해당 프로세스를 대기 상태로
2.
그 프로세스를 PCB 세마포를 위한 대기 큐에 넣는다
3.
다른 프로세스가 signal을 호출하면 signal 함수는 대기 중인 프로세스를 대기 큐에서 제거
4.
프로세스 상태를 준비 상태로 변경한 뒤 준비 큐로 옮긴다
모니터
•
세마포어의 단점: 모든 경우에 wait과 signal을 명시해야한다
•
모니터: 최근에 등장한 동기화 도구
◦
공유 자원과 공유 자원에 접근하기 위한 인터페이스 (통로)를 묶어 관리
◦
또한, 프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근
•
모니터를 통해 공유자원에 접근하고 싶다? → 해당 프로세스를 큐에 삽입
•
순서대로 공유 자원을 이용
•
모니터는 공유 자원을 다루는 인터페이스에 접근하기 위한 큐(모니터에 진입하기 위한 큐)를 만들고
•
모니터 안에 항상 하나의 프로세스만 들어오도록 하여 상호 배제를 위한 동기화 제공
조건 변수
•
세마포와 마찬가지로 실행 순서 제어를 위한 동기화도 제공
•
특정 조건을 바탕으로 프로세스를 실행하고 일시 중단하기 위해 모니터는 조건 변수 사용
◦
조건 변수, condition variable → 프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수
◦
조건 변수로 wait와 signal 연산을 수행할 수 있다
◦
wait: 호출한 프로세스의 상태를 대기 상태로 전환하고 일시적으로 조건 변수에 대한 대기 큐에 삽입하는 연산
주의)
•
모니터에 진입하기 위해 삽입되는 큐(상호 배제를 위한 큐)와
◦
모니터에 한 번에 하나의 프로세스만 진입하도록 하기 위해 만들어진 큐
•
wait가 호출되어 실행이 중단된 프로세스들이 삽입되는 큐(조건 변수에 대한 큐)
◦
모니터에 이미 진입한 프로세스의 실행 조건이 만족될 때까지 잠시 실행이 중단되어 기다리게 만들어진 큐
•
는 서로 다른 큐다