✔️ 프로세스 동기화
동기화 문제
- 임계 영역이란 여러 프로세스가 데이터를 공유하며 수행될 때, 각 프로세스에서 공유 데이터를 접근하는 프로그램 코드 부분
- 이렇게 공유된 자원에 여러 프로세스가 동시에 접근하면 문제가 발생할 수 있음
- 그러므로 공유된 자원의 데이터는 한 번에 하나의 프로세스만 접근할 수 있도록 제한을 둬야함
- 동기화 기법에는 유저 모드의 동기화와 커널 모드의 동기화가 존재
- 유저 모드의 동기화
커널의 힘을 빌리지 않는 동기화 기법으로 임계 구역 기반의 동기화와 인터락 함수 기반의 동기화가 존재 - 커널 모드의 동기화
커널에서 제공하는 동기화 기능을 이용하는 방법으로 세마포어, 뮤텍스, 모니터 등이 존재
- 유저 모드의 동기화
세마포어(Semaphore)란?
- 멀티프로그래밍 환경에서 공유 자원에 대한 접근을 제한하는 방법
- 세마포어 연산으로는 P 연산과 V 연산이 존재
- P : 임계 구역에 들어가기 전에 수행하며 프로세스 진입 여부를 자원의 개수(S)를 통해 결정
- V : 임계 구역에서 나올 때 수행하며 자원 반납을 알리고 대기 중인 프로세스를 깨움
- P와 V를 사용하여 임계 구역에 대한 상호배제 구현이 가능하게 됨
- 가용한 개수를 가진 자원에 대한 접근 제어용으로 사용되며, 가용한 자원의 개수로 초기화 되므로 카운팅 세마포어라고도 함
procedure P(S) --> 최초 S값은 1임
while S=0 do wait --> S가 0면 1이 될때까지 기다려야 함
S := S-1 --> S를 0로 만들어 다른 프로세스가 들어 오지 못하도록 함
end P
--- 임계 구역 ---
procedure V(S) --> 현재상태는 S가 0임
S := S+1 --> S를 1로 원위치시켜 해제하는 과정
end V
뮤텍스(Mutex)란?
- 임계 구역을 가진 스레드들이 실행시간이 서로 겹치지 않고 각각 단독으로 실행되게 하는 기술
- 상호 배제(Mutual Exclusion)의 약자
- 해당 접근을 조율하기 위해 lock과 unlock을 사용
- lock : 현재 임계 구역에 들어갈 권한을 얻으며 만약 다른 프로세스나 스레드가 수행 중이면 종료할 때까지 대기함
- unlock : 현재 임계 구역을 모두 사용했을 대 알리며 이후 대기 중인 다른 프로세스나 스레드가 임계 구역에 진입할 수 있음
- 뮤텍스는 동기화 대상이 오직 하나뿐이므로 상태가 0, 1로 이진 세마포어로 부르기도 함
- 뮤텍스 알고리즘으로는 데커 알고리즘, 피터슨 알고리즘, 제과점 알고리즘이 존재
- 데커 알고리즘 : flag와 turn 변수를 통해 임계 구역에 들어갈 프로세스/스레디를 결정하는 방식
- 피터슨 알고리즘 : 데커 알고리즘과 유사하지만 상대방 프로세스/스레드에게 진입 기회를 양보할 수 있음
- 제과점 알고리즘 : 여러 프로세스/스레드에 대한 처리가 가능하며 가장 작은 수의 번호표를 가지고 있는 프로세스가 진입
교착 상태(DeadLock)란?
- 두 개 이상의 프로세스나 스레드가 서로 자원을 얻지 못해서 다음 처리를 하지 못하는 상태
- 무한히 다음 자원을 기다리게 되는 상태
- 시스템적으로 한정된 자원을 여러 곳에서 사용하려고 할 때 발생
- 교착 상태의 발생 조건 : 4가지 모두 성립해야 교착 상태가 발생함
- 상호 배제
자원은 한 번에 한 프로세스만 사용할 수 있음 - 점유 대기
최소한 하나의 자원을 점유하고 있으면서
다른 프로세스에 할당되어 사용하고 있는 자원을 추가로 점유하기 위해 대기하는 프로세스가 존재 - 비선점
다른 프로세스에 할당된 자원은 사용이 끝날 때가지 강제로 빼앗을 수 없음 - 순환 대기
프로세스의 집합에서 순환 형태로 자원을 대기하고 있어야 함
- 상호 배제
- 교착 상태를 예방하기 위해서는 교착 상태 발생 조건 중 하나를 제거하면서 해결하도록 함
- 여러 프로세스가 공유 자원을 사용할 수 있도록 상호 배제를 부정
- 프로세스 실행 전 모든 자원을 할당하여 점유 대기를 부정
- 자원 점유 중인 프로세스가 다른 자원을 요구할 때 가진 자우너을 반납하도록 하여 비선점을 부정
- 자원에 고유번호를 할당한 후 순선대로 자원을 요구하도록 하여 순환 대기를 부정
- 하지만 이러한 방법들은 자원 낭비가 심하게 발생
- 교착 상태가 발생 시 회피하기 위해서는 은행원 알고리즘을 사용
- 프로세스가 자원을 요구할 때, 시스템은 자원을 할당한 후에도 안정 상태로 남아있게 되는지 사전에 검사
- 안정 상태로 남아있을 경우에는 자원을 할당하고, 그렇지 않을 경우 다른 프로세스들이 자원을 해지할 때까지 대기하도록 함
- 교착 상태가 발생했을 때 이를 허용한 후에 회복할 수도 있음
- 자원 할당 그래프를 통해 교착 상태를 탐지
- 탐지를 통해 교착 상태를 일으킨 프로세스를 종료하거나, 할당된 자원을 해제시켜 회복
경쟁 상태(Race Condition)란?
- 공유 자원에 대해 여러 프로세스가 동시에 접근할 때, 결과값에 영향을 줄 수 있는 상태
- 동시 접근 시 자료의 일관성을 해치는 결과가 나타나게 됨
- 경재 상태가 발생하는 경우
- 커널 작업을 수행하는 중에 인터럽트가 발생할 때
- 프로세스가 시스템 콜을 하여 커널 모드로 진입하여 작업을 수행하는 도중 문맥 교환이 발생할 때
- 멀티 프로세서 환경에서 공유 메모리 내의 커널 데이터에 접근할 때
- 이를 방지하기 위해 CPU 제어권을 가져가지 못하도록 하거나, lock/unlock을 하도록 하여 데이터를 조작하지 못하도록 함
'Tech Interview > Operating System' 카테고리의 다른 글
[Operating System] 메모리 관리 (0) | 2023.12.18 |
---|---|
[Operating System] 동기와 비동기 (0) | 2023.12.16 |
[Operating System] CPU 스케줄링 (0) | 2023.12.14 |
[Operating System] IPC (0) | 2023.12.13 |
[Operating System] 프로세스와 스레드 (0) | 2023.12.12 |