프로세스 동기화
프로세스 동기화는 프로세스 간의 수행 시기를 맞추는 것을 의미한다.
수행 시기를 맞춘 다는 것은 프로세스를 올바른 순서대로 실행하고, 동시에 접근하면 안 되는 자원에는 한 번에 하나의 프로세스만
접근이 가능하게 하는 것이고 이는 각각 실행 순서 제어와 상호 배제가 된다.
이 때 동시에 접근하면 안 되는 자원은 공유 자원, 공유 자원에 접근하는 코드 영역을 임계 영역(CS - Critical Section)이라고 한다.
임계 영역에 하나의 프로세스만 배정될 수 있도록 하기 위해 사용되는 것이 바로 동기화 기법이다.
동기화 기법
동기화 기법에는 대표적으로 스핀락, 뮤텍스(Mutex), 세마포(Semaphore), 모니터가 있다.
스핀락
임계 구역에 lock이 걸려있는 경우, 해당 lock이 해제되고 자신이 임계 구역 내에서 공유 자원을 사용할 수 있게 될 때까지
무한 루프를 돌며 대기하는 방식으로, 바쁜 대기가 일어난다. (바쁜 대기의 개념을 거의 그대로 이용한 것이 스핀락이다.)
뮤텍스
뮤텍스 방식 또한 임계 구역에 진입할 수 없다면 무작정 기다리고, 임계 구역에 진입이 가능해진 경우 작업을 위해
임계 구역으로 프로세스를 이동시키고 다른 프로세스들의 임계 구역으로의 진입을 막는다.
이렇게만 들으면 스핀락 == 뮤텍스 라고 생각이 들법하지만, 약간의 차이점이 존재하고 그 내용은 밑에서 서술하겠다.
세마포
뮤텍스 방식이 임계 구역의 lock을 담당하는 변수를 통해 하나의 프로세스에 대해 임계 구역 출입을 관리했다면,
세마포는 공유 자원이 여러 개인 경우에 사용되는 방식이다.
동기화는 상호 배제의 역할을 위함도 있지만 실행 순서 제어를 위한 것 또한 동기화를 의미하고, 이러한 순서 제어에
세마포가 사용되기도 한다. 먼저 실행할 프로세스가 임계 구역에서 나오고 난 뒤에 Release() 해주고,
나중에 실행할 프로세스가 임계 구역에 접근하기 전에 Acquire()를 호출해주면
먼저 실행할 프로세스가 Release() 하기 전까지, 나중에 실행되는 프로세스는 Acquire()하지 못해 대기하게 된다.
모니터
세마포가 임계 구역 앞뒤로 Acquire()과 Release()를 해야하는 번거로움을 가지고 있어 등장하게 된 방식이다.
공유 자원에 접근하기 위한 인터페이스를 만들어 해당 인터페이스를 통해서만 프로세스가 공유 자원에 접근하게 구성한다.
인터페이스에 접근하려는 프로세스들은 큐에 담겨 관리되는 방식이다.
뮤텍스 VS 스핀락
스핀락과 뮤텍스 모두 바쁜 대기를 하며 lock이 풀리고 임계 구역에 접근할 때까지 기다리는 점은 동일하지만 약간의 차이점이 존재한다.
뮤텍스는 lock이 풀릴 때까지 대기하면서 문맥 교환이 실행된다. 즉, 문맥 교환을 거쳐 다른 작업을 수행하기 위해
CPU를 양보할 수 있다는 것을 의미한다. 그렇다보니 대기중이었던 lock이 비교적 짧은 시간 내로 풀리는 경우
오히려 문맥 교환의 과정으로 인해 자원을 낭비하는 경우가 생긴다.
스핀락의 경우 해당 프로세스가 실행될 때까지 CPU를 양보하지 않으므로, 임계 구역에 비교적 짧은 시간 내로 들어가는 경우
뮤텍스에 비해 효율적이라고 할 수 있지만, 대기 시간이 길어질 수록 뮤텍스 방식이 더 효율적이라고 할 수 있다.
뮤텍스 VS 세마포
뮤텍스는 공유 자원이 한 개일 때 사용하고, 세마포는 동기화 대상이 여러 개일 때 사용한다.
뮤텍스는 자원을 프로세스 혹은 스레드가 소유하여 작업 후 반환하는 소유의 개념이지만,
세마포는 자원의 사용 상태에 대해 나타내는 변수의 개념이다.
뮤텍스는 결과적으로 동기화 대상이 자원 하나이고, 세마포는 여러 개이기 때문에 세마포는 뮤텍스가 될 수 있지만
반대의 경우는 불가능하다.
교착상태(Deadlock)
교착 상태란 일어나지 않을 일을 무한히 대기하는 것을 의미한다.
둘 이상이 프로세스가 서로 다른 프로세스가 점유 중인 자원을 필요로 하는 상태에 빠질 때, 교착 상태에 빠졌다고 한다.
예를 들어 프로세스 A가 x 자원을 사용하기 위해 임계 구역에 들어간 뒤 lock을 걸어두고, y자원을 기다리는 상황이라고 가정한다.
프로세스 B는 y 자원을 사용하기 위해 임계 구역에 있는 상태였고, x 자원을 사용하여 임계 구역에 나오고자 하는 상태인 경우
프로세스 A와 B는 각자가 가진 자원을 필요로 하며 무한히 대기 상태에 빠지게 된다.
이러한 교착 상태에 빠지게 될 조건은 상호 배제, 점유와 대기, 비선점, 원형 대기가 있으며,
이 네 가지 조건이 모두 만족될 때 교착 상태가 발생할 가능성이 생기게 된다.
상호 배제
한 프로세스가 사용중인 자원을 다른 프로세스가 사용할 수 없는 상황을 의미한다.
점유와 대기
프로세스가 자원을 점유 중인 상태로 다른 자원을 사용하기 위해 대기하는 것을 의미한다.
비선점
자원을 비선점하게 되면, 프로세스의 작업이 끝날 때까지 다른 프로세스가 자원을 뺏을 수 없기 때문에 교착상태에 빠질 수 있게 된다.
원형 대기
프로세스들과 프로세스들이 점유 중인 자원들이 원의 형태를 유지 중인 경우, 어느 하나의 프로세스가 자원 점유를 해제하기 전까지
원형을 이루는 모든 프로세스들이 교착상태에 빠지게 된다.
References
'Dev > CS' 카테고리의 다른 글
[네트워크] Day 1 (0) | 2023.11.08 |
---|---|
[운영체제] 가상 메모리, 파일 시스템 (1) | 2023.10.31 |
[운영체제] 프로세스와 스레드, CPU 스케쥴링 (0) | 2023.10.17 |
[컴퓨터 구조, 운영체제] 입출력장치, 운영체제 시작하기 (1) | 2023.10.10 |
[컴퓨터 구조] 메모리와 캐시메모리, 보조기억장치 (0) | 2023.09.29 |
댓글