운영체제에서 프로세스 동기화(Process Synchronization)란
여러 프로세스나 스레드가 공유 자원(shared resource)을 사용할 때
데이터의 일관성과 정확성을 보장하도록 실행 순서를 제어하는 것을 의미한다.
동기화가 제대로 이루어지지 않으면
Race Condition, Critical Section 문제, Deadlock과 같은 문제가 발생할 수 있다.
여러 프로세스 또는 스레드가 동시에 실행되는 환경에서는
다음과 같은 상황이 발생할 수 있다.
이로 인해 의도하지 않은 결과가 발생할 수 있으며,
이를 대표적으로 설명하는 개념이 Race Condition이다.
두 개의 연산이 동시에 공유 자원에 접근할 때,
결과가 일관성을 보장받지 못하는 상태
Race Condition은 다음 두 조건이 동시에 충족될 때 발생
Race Condition은 단순한 버그가 아니라
동기화가 없는 동시 실행 환경에서 필연적으로 발생할 수 있는 문제이다.
운영체제는 커널 내부에서도 Race Condition이 발생할 수 있기 때문에 이를 방지하기 위한 여러 방법을 사용한다.
중요한 데이터에 접근하고 있을 때는 인터럽트를 바로 처리하지 않고 해당 작업 이후에 처리한다.
커널 모드에서는 커널 주소 공간의 데이터를 사용하기 때문에 race condition이 발생할 수 있어서,
커널 모드에서 수행 중일 때는 CPU를 빼앗기지 않고 사용자 모드로 돌아갈 때 CPU를 반납한다.
다중 CPU 환경, 즉 여러 개의 CPU가 같은 데이터에 접근하는 경우에는 데이터 락(lock)을 사용함
커널 내부에 있는 각 공유 데이터에 접근할 때마다 그 데이터에 lock/unlock을 걸어서 다른 접근을 차단한다.
두 개 이상의 프로세스나 스레드가 동시에 접근하면 안 되는 공유 자원을 사용하는 코드 영역을 의미한다.
공유 자원의 데이터 일관성을 보장하기 위해 한 번에 하나의 프로세스 또는 스레드만 크리티컬 섹션을 실행할 수 있도록 제어해야 한다.
Race Condition은 크리티컬 섹션에 대한 접근 제어가 실패했을 때 발생한다고 볼 수 있다.
여러 프로세스가 동시에 크리티컬 섹션에 접근하면 Race Condition이 발생할 수 있어,
운영체제는 다음 세 조건을 만족하는 방법으로 크리티컬 섹션 문제를 해결한다.
한 번에 하나의 프로세스만 크리티컬 섹션에 진입할 수 있어야 한다.
크리티컬 섹션에 프로세스가 없다면 진입을 원하는 프로세스는 들어갈 수 있어야 한다.
대기 중인 프로세스가 일정한 시간 내에 크리티컬 섹션에 진입할 수 있어야 한다.
운영체제에서 여러 프로세스나 스레드가 공유 자원에 접근하는 것을 동기화하기 위해 사용하는 기술
세마포어는 정수 값을 사용하여 자원 접근 가능 여부를 제어함
※ Critical section의 길이가 짧으면 block/wakeup의 오버헤드가 더 커질 수 있어서 busy wait이 더 효율적인 경우도 있다.
두 개 이상의 프로세스가 서로가 소유한 자원을 요청하며 대기 상태에 빠져 더 이상 실행을 진행할 수 없는 상황
공유 자원이나 동기화 기법을 잘못 설계했을 때 발생함
예: 프로세스 A가 B의, B가 A의 자원을 요청
데드락이 발생하려면 4가지 조건이 모두 충족되어야 함
이 중 하나 이상의 조건을 충족하지 않도록 설계하여 데드락을 원천적으로 방지
공유 자원을 여러 프로세스가 동시에 사용할 수 있도록 설계
예: 읽기 전용 데이터는 동시 접근 허용
제한: 쓰기 작업은 여전히 상호 배제가 필요
자원을 점유한 상태에서 다른 자원을 요청하지 못하도록 설계
모든 필요한 자원을 한꺼번에 요청하도록 강제
단점: 자원 낭비 가능
자원이 점유 중일 경우, 자원을 강제로 회수하여 다른 프로세스가 사용할 수 있도록 설정
단점: 데이터 일관성 문제, 오버헤드
자원에 번호를 부여하고 증가 순서로만 요청
단점: 유연성 감소
시스템 상태를 평가하여 데드락이 발생하지 않을 경우에만 자원 할당
프로세스의 최대 자원 요구량을 미리 알아야 함
안전 상태(Safe State) 확인 후 자원 할당
(안전 상태: 모든 프로세스가 실행을 완료할 수 있는 상태)
동작
프로세스가 지원 요청
요청한 자원을 할당한 후의 시스템 상태를 시뮬레이션
할당 후에도 시스템이 안전 상태라면 자원을 할당, 아니라면 요청 거절
장점: 데드락 가능성 최소화
단점: 계산 비용 증가, 사전 정보 필요
데드락이 발생했는지 주기적으로 검사
자원 할당 그래프를 사용하여 데드락 상태(사이클 존재 여부)를 확인
데드락 상태를 탐지한 후 문제를 해결하기 위한 조치를 취함
프로세스 종료 또는 자원 선점
프로세스 종료: 데드락을 유발하는 프로세스를 하나 이상 종료
자원 선점: 특정 프로세스에서 자원을 강제로 회수
단점: 데이터 일관성 문제 발생 가능