Kim Jinung
6. 프로세스 동기화 그리고 데드락 본문
프로세스 동기화?
운영체제는 프로세스를 병행, 병렬로 실행하는 방향으로 발전했다. CPU 사용률을 최대화하기 위함이다. 하지만 이로 인해서 프로세스 간에 공유하고 있는 데이터의 조작 결과가 실행 순서에 의존하게 되는 문제가 발생한다. 이것이 경쟁 조건(Race condtion)이다. 다음으로 임계 구역(Critical section)은 공유 데이터가 조작될 수 있는, 즉 경쟁 조건이 발생할 수 있는 코드 영역이다. 그리고 이러한 임계 구역에서 발생하는 경쟁 조건 문제를 임계구역 문제(Critical section problem)으로 부른다.
프로세스 동기화를 위한 하드웨어 지원
- Memory Barries: 프로세서가 메모리 변경 결과를 다른 프로세서에 알린다.
- 하드웨어 명령어
*하드웨어 레벨에서의 제어는 복잡하며, 애플리케이션 프로그래머는 접근할 수 없다.
프로세스 동기화를 위한 여러 방법
- Peterson의 해결 방안: 임계 구역과 나머지 구역을 번갈아가며 실행한다. 현대 컴퓨터 시스템에서는 작동하지 않는다.
- Mutex Locks: 프로세스가 임계구역 진입 전 lock을 획득(acquire)하고 작업 완료 후 lock을 해제(release)한다.
- Semaphore: 뮤텍스는 lock을 소유하고 있는 스레드가 이를 해제해야하지만, 세마포어는 소유하지 않고 있는 스레드도 해제가 가능하다. 또한 뮤텍스는 최대 lock이 한 개이고, 세마포어는 여러 개 가능. busy waiting 방식과 sleep queue 방식이 존재한다.
- Monitor: 세마포어는 공유 리소스에 대한 lock, release를 직접 해야하지만 모니터는 이 작업을 상위 레벨에서 대신 해준다.
Busy waiting
Mutex locks의 문제점은 대기하는 프로세스들은 권한을 얻을 때까지 계속해서 acquire 함수를 호출해야 한다. 이러한 무한정 반복되는 루프(Spinlock)의 실행은 하나의 cpu 코어가 여러 프로세스에서 공유되는 멀티 프로그래밍 시스템에서 문제가 된다.
Deadlock
멀티 프로그래밍 환경에서 여러 스레드가 한정된 자원을 사용하려고 서로 경쟁할 수 있다. 한 스레드가 자원을 요청했을 때, 그 시각에 그 자원을 사용할 수 없는 상황이 발생할 수 있다. 이때 스레드가 대기 상태가 된다. 예시로 Thread A와 Thread B가 존재할 때 A는 현재 data1를 점유하고 다음 작업을 위해 data2가 필요한 상태이며 B는 현재 data2를 점유하고 있고, 다음 작업을 위해서 data1이 필요한 상태다. 이 상황에서 둘 다 공유 데이터에 접근이 불가능한 상태이므로 A, B 스레드가 영원히 대기 상태에서 벗어나지 못한다. 이게 데드락이다.
데드락이 발생하는 필요 조건
- 상호 배제: 최소한 하나의 자원이 비공유 모드로 점유되어야 한다. 비공유 모드란 한 스레드가 점유 중에는 다른 스레드가 접근하지 못하고 대기해야 함을 의미한다.
- 점유하며 대기: 스레드가 최소한 하나 이상의 자원을 점유한 채로, 다른 스레드가 점유 중인 자원을 대기하는 상태
- 비선점: 자원들이 강제적으로 방출 될 수 없다. 점유하고 있는 스레드만이 자원을 자발적으로 방출한다.
- 순환 대기: 대기하고 있는 스레드 집합 [0, 1, 2, 3] 에서 0은 1의 자원을 대기 1은 2의 자원을, 2는 3의 자원을 대기하고 있는 상태
데드락 처리 방법
- 데드락이 발생하지 않은 척 한다. - 대부분 운영체제의 방법
- 데드락 상태를 예방하거나 회피하는 프로토콜을 사용한다. - 개발자의 몫
- 시스템이 교착 상태를 허용하고, 이를 복구하는 방법 - DB (차후에 디비 아키텍처 공부해서 추가할 것)
데드락을 예방하는 방법은 위 필요 조건이 성립하지 않도록 보장하는 방법이고(말 그대로 예방이다.), 회피는 스레드가 사용할 자원에 대한 부가 정보를 미리 제공할 것을 요구하여 운영체제는 해당 스레드가 기다려야할지 여부를 판단한다. 예를 들어서 Thread A는 data1을 먼저 요청하고 다음으로 data2를 요청한다. Thread B는 data2를 먼저 요청하고 data1을 요청한다. (data1, 2는 모두 공유 리소스라고 가정한다.) 이때 스레드를 병행으로 작업하면 데드락에 빠질 수 있다. 따라서 스레드에서 필요로하는 자원에 대한 lock, release 정보를 작업 실행 전에 운영체제가 보고 받아서 A와 B를 동시에 실행 시킬지 아니면 한 쪽을 대기 시킬지 여부를 결정한다. 즉 회피 방법이다. (회피 방법에는 Banker's algorithm 등이 있다.)
데드락으로부터의 회복
- 프로세스와 스레드 종료: 리스크가 적은 스레드, 프로세스부터 종료시켜서 복구하는 방법
- 자원 선점: 공유 자원을 선점해서 다른 프로세스로 넘겨주는 방법
Summary
- 멀티 프로세싱의 등장으로 프로세스를 병렬 실행이 가능해졌다.
- 병렬 실행의 이점이 생겼지만, 공유 자원에 대해서 접근 순서에 따라 결과가 달라지는 문제가 발생했다. (임계 구역 문제)
- 또한 서로 다른 프로세스에서 필요로 하는 자원을 쥐고 이러지도 저러지도 못하는 상태가 데드락이다.
- 임계 구역 문제를 회피하기 위해서 뮤텍스 락, 세마포어, 모니터 등의 동기화 기법이 등장했다.
한 번에 이해하기 어려운 개념들이 많이 보이기 시작한다.
중요한 것은 왜 이러한 개념이 등장했는지를 정확히 이해하고, 이후에 해당 개념이 필요할 때 키워드를 떠올리고 리서치하는 것 암기식으로 공부 해봤자 시간이 지나면서 까먹어 버리면 아무 소용없다..
'Computer Science > Operating System' 카테고리의 다른 글
8. 대용량 저장장치 구조 (0) | 2023.01.11 |
---|---|
7. 메모리 관리 (0) | 2023.01.09 |
5. CPU 스케줄링 (0) | 2023.01.05 |
4. 스레드와 병행성 (0) | 2023.01.04 |
3. 프로세스 (0) | 2022.12.30 |