Last update: @1/7/2023
•
프로세스 동기화(process synchronization)
: 프로세스들 사이의 수행 시기를 맞추는 것을 의미함
◦
프로세스뿐만 아니라 스레드, 정확히 말하면 실행의 흐름을 갖는 모든 것은 동기화의 대상임
◦
프로세스들 사이의 수행 시기를 맞추는 것은 크게 아래 두 가지를 일컫음
▪
실행 순서 제어
: 프로세스를 올바른 순서대로 실행하기
•
한 프로세서가 완료된 후 다음 프로세서가 실행되어야 할 경우(같은 파일에 대해 읽고 쓰는 경우 등)
▪
상호 배제(mutual exclusion)
: 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하는 경우
•
계좌 잔액 문제
•
생산자와 소비자 문제
◦
물건을 계속해서 생산하는 프로세스(생산자)와 물건을 계속해서 소비하는 프로세스(소비자)가 있다고 가정
◦
생산자와 소비자는 ‘총합’이라는 데이터를 공유하고 있음
◦
생산자는 버퍼에 물건을 넣은 후, 물건의 총합에 해당하는 변수를 1 증가시킴
◦
소비자는 버퍼에 물건을 빼낸 후 물건의 총합에 해당하는 변수를 1 감소시킴
◦
이 상태에서 생산자와 소비자를 같은 횟수만큼 동시에 실행하면 초기값이 아니라 엉뚱한 값이 나옴. 이는 생산자 프로세스와 소비자 프로세스가 제대로 동기화되지 않았기 때문임
•
위의 예시에서 ‘잔액’, ‘총합’ 같은 자원을 공유 자원(shared resource)이라고 함
◦
공유 자원은 전역 변수가 될 수도 있고, 파일이 될 수도 있고, 입출력장치, 보조기억장치가 될 수도 있음
•
동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역을 임계 구역(critical section)이라고 함
◦
두 개 이상의 프로세스가 임계 구역에 진입하고자 하면 둘 중 하나는 대기해야 함
◦
임계 구역에 먼저 진입한 프로세스의 작업이 마무리되면 그제서야 비로소 기다렸던 프로세스가 임계 구역에 진입함
◦
임계 구역은 두 개 이상의 프로세스가 동시에 실행되면 안 되는 영역이지만, 잘못된 실행으로 인해 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 경우가 있는데, 이를 레이스 컨디션(race condition)이라고 함
◦
컴퓨터는 고급 언어가 아닌 저급 언어를 실행하기 때문에 여러 줄의 저급 언어로 변환된 고급 언어 한 줄을 실행하는 과정에서 문맥 교환이 일어날 수 있음
// 고급 언어
총합++;
총합--;
Java
복사
// 저급 언어
r1 = 총합; // 총합 변수를 레지스터에 저장
r1 = r1 + 1; // 레지스터 값 1 증가
총합 = r1; // 레지스터 값을 총합 변수에 저장
r2 = 총합; // 총합 변수를 레지스터에 저장
r2 = r2 - 1; // 레지스터 값 1 감소
총합 = r2; // 레지스터 값을 총합 변수에 저장
Java
복사
•
상호 배제를 위한 동기화
: 위와 같은 임계 구역 문제가 발생하지 않도록 두 개 이상의 프로세스가 임계 구역에 동시에 접근하지 못하도록 관리하는 것
◦
상호 배제를 위한 동기화를 위해서는 아래 세 가지 원칙이 반드시 지켜져야만 함
▪
상호 배제(mutual exclusion)
: 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없음
▪
진행(progress)
: 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로
세스는 들어갈 수 있어야 함
▪
유한 대기(bounded waiting)
: 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 함(임계 구역에 들어오기 위해 무한정 대기해서는 안 됨)