Contents
병행성(Concurrency)
운영체제의 핵심 기능 중 하나는 프로세스와 스레드 관리와 연관되어있다.
대표적으로 다음과 같은 것들이 있다.
- 멀티프로그래밍(Multiprogramming) : 하나의 CPU로 다수의 프로세스 관리
- 멀티프로세싱(Multiprocessing) : 다수의 CPU로 다수의 프로세스 관리
- 분산처리(Distributed Processing) : 다수의 분산된 컴퓨터 시스템들에서 수행되는 다수의 프로세스 관리
이러한 분야들에서 핵심은 병행성이다.
병행성은 프로세스간 통신, 자원에 대한 공유와 경쟁, 동기화, 프로세서 할당 등 다양한 이슈들이 포함된다.
\(\rhd\)경쟁 상태(Race Condition)
다수의 프로세스나 스레드가 공유 자원을 동시에 읽거나 쓰려고 하는 상태를 의미한다.
최종 수행 결과는 프로세스들의 수행 순서에 따라 달라진다.
\(\rhd\)임계 자원(Critical Resource)과 임계 영역(Critical Section)
임계 자원이란 두개 이상의 프로세스가 동시에 사용할 수 없는 자원을 의미한다.
그리고 해당 자원에 접근하는 코드 블록을 임계 영역(Critical Section)이라고 한다.
\(\rhd\)상호 배제(Mutual exclusion)
한 시점에서 단 하나의 프로세스만이 임계영역에 들어가도록 한다.
만약 상호 배제가 보장되지 않는다면 임계 자원의 결과가 어떤식으로 될지 예측이 불가능해진다.
상호 배제의 보장은 뒤에서 다룰 교착상태와 기아라는 문제를 발생시킬 수 있다.
\(\rhd\)상호 배제 기법
- 세마포어(Semaphore)
임계 영역에 접근하는 프로세스들을 제어하는데 사용된다.
세마포어는 S라는 정수값과, P, V라는 함수를 가진다.
S는 최초에 음이 아닌 값으로 초기화된다.
임계 영역에 접근하고자 하는 프로세스는 P(Decrement) 함수를 호출하며,
해당 함수는 S를 한개 감소시키고, S가 음수가 되면 해당 프로세스를 블록 상태로 바꾼다.
S가 음수가 아니라면 해당 프로세스는 임계 영역에 접근하여 연산을 수행한다.
연산을 마친 프로세스는 V(Increment) 함수를 호출하여 S의 값을 하나 증가시킨다.
그 후 S가 0과 같거나 작으면 블록된 프로세스를 꺼낸다.
이진 세마포어(Binary semaphore) 는 S값이 0 또는 1만을 가질 수 있는 세마포어이다.
- 뮤텍스(Mutex)
이진 세마포어와 유사하다.
차이점은 뮤텍스에 락을 획득(값을 0으로 설정)한 프로세스가 반드시 그 락을 해제(값을 1로 설정)해야 하는 것이다.
\(\rhd\)교착 상태(Deadlock)
상호 배제에 의하여 나타나는 문제점 중 하나이다.
두개 이상의 프로세스가 각각 임계 자원을 점유한 상태로 다른 프로세스가 점유한 임계 자원을 요구하며 대기하는 상태이다.
교착 상태가 발생하기 위해서는 기본적으로 다음의 4가지 조건이 필요하다.
- 상호 배제 조건 : 한 순간에 한 프로세스만이 자원을 사용할 수 있다.
- 점유 대기 조건 : 이미 자원을 보유한 프로세스가 다른 자원을 요청하며 기다리고 있다.
- 비선점 조건 : 프로세스에 의해 점유된 자원을 다른 프로세스가 강제적으로 빼앗을 수 없다.
- 환형 대기 조건 : 각 프로세스들은 환형 모양으로 다음 프로세스가 요구하는 자원을 가지고 있다.
\(\rhd\)교착 상태 해결 기법
교착 상태를 해결하기 위한 전략은 크게 3가지 종류로 나뉜다.
- 예방
설계 단계에서 교착상태가 발생할 가능성을 없애는 전략이다.
위에서 소개한 교착 상태가 발생하는 조건 중 하나를 설계 단계에서 배제하는 것이다.
- 회피
회피 전략은 교착 상태 발생 조건을 허용한다.
대신 프로세스가 자원을 요청할 때 할당 전에 이 할당이 교착상태를 발생시킬 가능성이 있는지 조사한다.
만약 가능성이 있다면 할당해주지 않는다.
하지만 사실상 이 방법은 현재 자원의 가용 개수와 프로세스의 자원 요구량들을 미리 알고 있어야 가능하다.
- 발견
앞의 방법들에 비해 매우 낙관적인 전략이다.
어떠한 제한도 두지 않고 프로세스들이 실행하도록 놔둔다.
단, 주기적으로 시스템에 환형 대기 조건이 발생했는지 검사하고, 발생했다면 그것을 해결해준다.
\(\rhd\)기아(Starvation)
기아 문제는 교착 상태는 아니지만 특정 프로세스가 오랜 기간동안 자원을 사용하지 못하는 상태이다.
세 개의 프로세스가 특정 임계 자원을 요구하고 있을 때, 두 프로세스만 번갈아가며 사용하는 경우이다.
이러한 상황이 반복되면 나머지 한개의 프로세스는 교착 상태가 아님에도 무한히 해당 임계 자원을 사용할 수 없는 상황이 된다.