Search
🧸

프로세스 동기화

생성일
2023/08/15 04:37
태그
혼공컴구
운영체제
날짜
3 more properties

학습목표

동기화랑 무엇인가
공유 자원과 임계 구역 문제를 이해
임계 구역 문제를 해결하기 위한 동기화 기법들을 학습

동기화란

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가 호출되어 실행이 중단된 프로세스들이 삽입되는 큐(조건 변수에 대한 큐)
모니터에 이미 진입한 프로세스의 실행 조건이 만족될 때까지 잠시 실행이 중단되어 기다리게 만들어진 큐
는 서로 다른 큐다