CS
프로세스 동기화
망재이
2023. 6. 14. 15:00
★ 동기화의 의미
- 프로세스 동기화 : 프로세스들 사이의 수행 시기를 맞추는 것
- 실행 순서 제어 : 프로세스를 올바른 순서대로 실행하기
- 상호 배제 : 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기
* 프로세스뿐만 아니라 스레드도 동기화 대상! 실행의 흐름을 갖는 모든 것은 동기화의 대상이 됨
⭐︎ 실행 순서 제어를 위한 동기화
예를 들어, Book.txt 파일에 값을 저장하는 Writer 프로세스와 Book.txt 파일에 값을 읽어 들이는 Reader 프로세스가 존재한다고 가정할 때, 무작정 아무 순서대로 실행되면 안됨!
Reader 프로세스는 ‘Book.txt 안에 값이 존재한다’는 특정 조건이 만족되어야만 실행을 이어나갈 수 있음
동시에 실행되는 프로세스를 올바른 순서대로 실행하는 것이 실행 순서 제어를 위한 동기화
⭐︎ 상호 배제를 위한 동기화
예를 들어, 잔액이 10만 원인 계좌에 2만 원을 입금하는 프로세스 A와 5만 원을 입금하는 프로세스 B가 동시에 실행되었다고 가정했을 때, 동기화가 제대로 이루어지지 않을 경우 엉뚱한 결과가 나올 수 있음
동시에 접근해서는 안 되는 자원에 동시에 접근하지 못하게 하는 것이 상호 배제를 위한 동기화
★ 생산자와 소비자 문제
상호 배제와 관련된 고전적인 문제
생산자 : 버퍼에 물건을 넣은 후, 물건의 총합을 1 증가시킴
소비자 : 버퍼에서 물건을 뺀 후, 물건의 총합을 1 감소시킴
둘은 ‘총합’이라는 데이터를 공유하고 있음
총합 = 10
생산자() {
버퍼에 데이터 삽입
‘총합’ 변수 1 증가
}
소비자() {
버퍼에서 데이터 빼내기
‘총합’ 변수 1 감소
}
=> 예상과 다르게 완전 엉뚱한 갯수가 나옴. 이는 동기화가 제대로 이루어지지 않았기 때문!!
★ 공유 자원과 임계 구역
- 공유 자원 : 전역 변수, 파일, 입출력장치, 보조기억장치 등 공동의 자원
- 임계 구역 : 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역
- 레이스 컨디션 : 잘못된 실행으로 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 경우
- 레이스 컨디션이 일어나는 근본적인 이유 : 컴퓨터는 고급 언어를 저급 언어로 변환하여 실행하기 때문에 문맥 교환이 일어날 수 있음
총합++; =>
r1 = 총합; // 총합 변수를 레지스터에 저장
r1 = r1 + 1; // 레지스터 값 1 증가
총합 = r1; // 레지스터 값을 총합 변수에 저장
- 상호 배제를 위한 동기화를 위한 원칙!(반드시 지켜야 함)
⭐︎ 상호 배제 : 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없다.
⭐︎ 진행 : 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세슨느 들어갈 수 있어야 한다.
⭐︎ 유한 대기 : 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 한다.(임계 구역에 들어오기 위해 무한정 대기해서는 안 된다.)
★ 뮤텍스 락
- 임계 구역에 진입한 프로세스가 있는지 없는지를 자물쇠를 통해서 확인하는 방법
- 전역 변수 lock, 임계 구역을 잠그는 acquire 함수, 임계 구역의 잠금을 해제하는 release 함수로 구현할 수 있음
- 바쁜 대기 : 임계 구역이 잠겨 있을 경우 반복적으로 lock을 확인하는 대기 방식
acquire() {
while(lock==true) //만약 임계구역이 잠겨있다면
; //임계 구역이 잠겨 있는지를 반복적으로 확인
lock = true; //만약 임계 구역이 잠겨 있지 않다면 임계 구역 잠금
}
release() {
lock = false; //임계 구역 작업이 끝났으니 잠금 해제
}
임계 구역 전후로 함수를 호출하여 하나의 프로세스만 임계 구역에 진입할 수 있도록 설정
acquire();
//임계 구역 작업 진행
release();
★ 세마포
- 뮤텍스 락과 비슷하지만, 조금 더 일반화된 방식으로 공유 자원이 여러 개 있는 상황에서도 적용이 가능한 동기화 도구
- 임계 구역 앞에서 ‘멈춤’ 신호와 ‘가도 좋다’ 신호를 통해 임계 구역 접근 권한을 받는 방법
- 공유 자원의 개수 전역 변수 S, 들어가도 좋은지 기다려야 하는지 알려주는 wait 함수, 기다리는 프로세스에게 가도 좋다고 신호를 주는 signal 함수
wait() {
while(S <= 0) //만약 임계 구역에 진입할 수 있는 프로세스 개수가 0 이하라면
; //사용 가능 자원이 있는지 반복적으로 확인하고
S—; //진입할 수 있는 자원이 있으면 S를 1 감소시키고 임계 구역 진입
}
signal() {
S++ //임계 구역에서 작업을 마친 뒤 S를 1 증가시킴
}
임계 구역 전후로 함수를 호출하여 하나의 프로세스만 임계 구역에 진입할 수 있도록 설정
wait();
//임계 구역 작업 진행
signal();
- 뮤텍스 락과 마찬가지로 사용할 수 있는 공유 자원이 없는 경우 프로세스는 바쁜 대기를 반복하는데, 이 과정은 CPU를 주기를 낭비하게 됨
- 실제 세마포는 프로세스의 상태를 변경하고 큐를 이용하여 이를 관리함
wait() {
S—;
if(S < 0) {
add this process to Queue; //프로세스 PCB를 대기 큐에 삽입
sleep(); //대기 상태로 만듦
}
}
signal() {
S++;
if(S <= 0) {
remove a process p from Queue; //대기 큐에 있는 프로세스 p를 제거
wakeup(p); //대기 상태에서 준비 상태로 만듦
}
}
★ 모니터
- 공유 자원과 공유 자원에 접근하기 위한 인터페이스를 묶어 관리하며 프로세스는 반드시 인터페이스를 통해서만 자원에 접근할 수 있음
- 접근하고자 하는 프로세스를 큐에 삽입하고, 삽입된 순서대로 하나의 프로세스만 모니터 안의 인터페이스에 접근할 수 있음(상호 배제를 위한 동기화)
- 실행 순서 제어를 위해 조건 변수를 사용한 동기화도 제공
- 조건 변수 : 프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수
- 특정 프로세스가 아직 실행될 조건이 되지 않았을 때는 wait를 통해 실행을 중단하고, 실행될 조건이 충족되었을 때는 signal을 통해 실행 재개
728x90