Search

12-1 동기화란

Last update: @1/7/2023
혼자 공부하는 컴퓨터구조 + 운영체제

운영체제

09 운영체제 시작하기

10 프로세스와 스레드

11 CPU 스케줄링

12 프로세스 동기화

13 교착 상태

14 가상 메모리

15 파일 시스템

프로세스 동기화(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) : 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 함(임계 구역에 들어오기 위해 무한정 대기해서는 안 됨)