하루에 하나씩
[06] 동기화 본문
동기화
- 협력하여 실행되는 프로세스들은 실행 순서 및 자원의 일관성을 보장해야함
- 동기화 필요
동기화의 의미
- 프로세스는 동시다발적으로 실행되며 서로 데이터를 주고받으면서 협력하여 실행
- 사전적인 의미
- 정보 통신 분야에서 동기화란, 작업들 사이의 수행 시기를 맞추는 것
- 프로세스 동기화
- 프로세스들 사이의 수행시기를 맞추는 것
- 다음의 두 종류가 있음
- 실행 순서 제어 : 프로세스를 올바른 순서대로 실행하기
- 상호 배제 : 동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하게 하기
- 프로세스 뿐 아니라 스레드도 동기화 대상
- 실행의 흐름을 갖는 모든 것이 동기화 대상임
- 실행 순서 제어를 위한 동기화
- 예를 들어, Writer 프로세스와 Reader 프로세스가 있다고 하면, Reader 프로세스는 Writer 프로세스가 끝나야만 실행이 가능
- 이를 올바르게 제어하기위해 동기화가 필요
- 상호 배제를 위한 동기화
- 상호 배제란, 공유가 불가능한 자원의 동시사용을 피하기 위해 사용하는 알고리즘
- 예시로, 계좌에 돈을 넣는 기능이 있음
- 어느 한 기능이 끝났을 때, 저장을 한 상태로 다음 프로세스로 넘어가야 함
생산자와 소비자 문제
- 생산자와 소비자 문제란, 생산(+)과 소비(-)가 동기화가 제대로 되지 않았을 때, 초기의 값이 기대한 대로 나타나지 않는 문제
- 이때 생산자와 소비자는 동시에 실행되는 스레드가 될 수도 있음
- 동기화가 필요한 이유
- 각 작업이 끝나기도 전에 총합을 수정해서 엉뚱한 결과가 발생
공유 자원과 임계 구역
- 공유 자원
- 전역 변수, 파일, 입출력 장치 보조기억장치 등 동시에 실행될 수 있는 자원
- 임계 구역
- 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역
- 임계 구역의 경우, 두 개 이상의 프로세스가 동시에 실행되면 안되는 영역이나 잘못된 실행으로 인하여 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 경우가 있음
- 이를 레이스 컨디션이라고 함
- 발생 시, 데이터의 일관성이 무너짐
운영 체제의 임계 구역 문제를 해결하는 세가지 원칙
- 상호 배제
- 한 프로세스가 임계구역에 진입한 경우, 다른 프로세스는 임계구역에 못 들어옴
- 진행
- 임계 구역에 어떤 프로세스도 진입하지 않았다면, 어느 프로세스라도 임계 구역에 진입하고자 하면 임계구역에 들어갈 수 있음
- 유한 대기
- 프로세스가 임계 구역에 진입하고 싶다면 프로세스는 언젠간 임계 구역에 들어올 수 있어야 함
동기화 기법
뮤텍스 락
- 옷가게에서 탈의실을 이용하는 것과 비슷
- 이 때 손님이 프로세스, 탈의실은 임계 구역
- 자물쇠가 걸려있으면 손님은 탈의실에 못들어감!
- 이때 뮤텍스 락(Mutex lock)은, 임계구역과 프로세스 사이에서 동시 접근을 막는 역할을 함
- 뮤텍스 락은 단순한 형태로 하나의 전역 변수와 두 개의 함수로 구현 가능
- 자물쇠 역할 : 프로세스들이 공유하는 전역 변수 lock
- 임계 구역을 잠그는 역할 : acquire 함수
- 임계 구역 잠금을 해제하는 역할 : release 함수
- acquire 함수
- 프로세스가 임계구역에 진입하기 전에 호출
- 임계 구역이 잠겨있으면, 지속적으로 확인하여 만약 열려있다면 잠그는 함수
- release 함수
- 임계구역의 작업이 끝나고 호출하는 함수
- 현재 잠긴 임계 구역을 열어주는 역할
acquire(){
while (lock == true) //임계 구역이 잠겨있다면
; //반복 확인
lock = true; //임계가 열려있으면 잠금
}
release() {
lock = false; //임계 작업 끝나면 잠금해제
}
- 이렇게 구현하면 하나의 프로세스만 임계구역에 진입 가능
- 생산자 소비자 문제도 해결!
- 이 때 while문에서, 지속적으로 반복하여 확인하는 것을 '바쁜 대기' 라고 함
세마포
- 뮤텍스 락과 비슷하나 조금 더 일반화된 방식의 동기화 도구
- 뮤텍스 락의 경우, 임계 구역이 하나일 때의 방식
- 여러개 있다면, 각 임계 구역에는 하나만 들어갈지라도 들어간 여러개의 프로세스는 각각 공유자원에 접근이 되어야 함
- 이진 세마포와 카운팅 세마포가 있으나 여기서는 카운팅 세마포를 지칭함
- 뮤텍스락과 비슷하게 하나의 변수와 두 개의 함수로 구현 가능
- 임계 구역에 진입 가능한 프로세스의 개수(사용 가능 공유 자원 수) S
- 임계 구역에 가도 되는지, 아닌지 알려주는 함수 wait
- 이제 가도 된다 라는 Go 신호를 보내주는 signal 함수
- 임계구역에 진입 전후로, wait과 signal 함수를 호출
wait(){
while(S <= 0) //임계구역에 진입가능한 프로세스가 0이하면
; //사용할수 있는 자원이 있는지 반복 확인
S--; //임계 구역에 진입 가능한 프로세스 개수가 하나 이상이면, 진입
}
signal(){
S++; //임계구역 작업을 마친 뒤 S를 1 증가
}
- 이 때, 사용가능한 자원이 없는 경우, wait에서 무한정 반복하여 끝낼 때 까지 기다려야 함
- CPU 주기를 낭비하게 됨
- 이런 이유로 뮤텍스 락과 다르게 세마포는 좋은 방법을 사용하는데
- wait함수에서 사용할 자원이 없는 경우 해당 프로세스를 대기 상태로 만들어 PCB를 세마포를 위한 대기 큐에 집어 넣음
- 이후 작업이 끝나면 큐에서 빼내 signal 함수로 준비중인 상태로 옮겨줌
wait(){
S--;
if(S < 0){
add this process to Queue;
sleep();
}
}
signal(){
S++;
if(S <= 0){
remove a process p from Queue;
wakeup(p);
}
}
- 두 언어 모두 많은 프로그래밍 언어에서 제공...
모니터
- 세마포에서 wait이나 signal 위치를 헷갈린 경우, 누락시키는 경우 문제가 생길 수 있음
- 또한, 일일이 wait signal을 작성해야 하기 때문에 불편함
- 이러한 불편함을 개선하기 위해 모니터라는 동기화 도구가 등장
- 모니터를 통해 공유 자원에 접근하려는 프로세스를 큐에 삽입하고 큐에 삽입된 순서대로 하나씩 공유 자원 이용
- 모니터 안에는 항상 프로세스 하나만 들어갈 수 있음(상호 배제)
- 이외에도 실행 순서제어를 위한 동기화도 제공
- 조건 변수를 사용하여 프로세스를 일시 중단하고 다른 프로세스를 불러들임
- 조건 변수란, 실행 순서 제어를 위해 사용하는 특별한 변수
- 모니터와 조건변수는 별개의 개념임 혼동 XXXX
- 조건 변수로는 wait과 signal 연산을 수행 가능
- 다른점으로, 상호 배제를 위한 큐와 조건 변수에 대한 프로세스를 저장하는 큐는 다름
- 상호 배제를 위한 큐는 한번에 하나의 프로세스만 진입 가능하도록 하는 큐
- 조건변수 관련 큐는 이미 진입한 프로세스의 실행 조건이 만족될 때 까지 중단된 프로세스를 저장하는 큐
- 다른점으로, 상호 배제를 위한 큐와 조건 변수에 대한 프로세스를 저장하는 큐는 다름
방식은 다음과 같음
- 특정 프로세스가 아직 실행될 조건이 되지 않았을 경우 wait을 통해 실행을 중단
- 특정 프로세스가 실행될 조건이 충족되었을 시 signal을 통해 실행 재개
'컴퓨터 구조' 카테고리의 다른 글
[08]가상 메모리 (0) | 2024.05.08 |
---|---|
[07] 교착 상태 - Dead Lock (0) | 2024.04.30 |
[05] CPU 스케줄링 (1) | 2024.04.17 |
[04] 운영체제 - 프로세스와 스레드 (0) | 2024.03.27 |
[03] 운영 체제 (0) | 2024.03.27 |