동기화
프로세스는 서로 데이터를 주고받으며 협력하며 실행됩니다. 이렇게 협력적으로 실행되는 프로세스들은 일정한 순서에
맞게끔 실행되어야 합니다. 그래서 동기화가 필요합니다. 동기화란 프로세스들 사이에서 수행 시기를 맞추는 것을
의미합니다.
프로세스 간에 수행 시기를 맞추는 것은 크게 2가지를 내포하고 있습니다.
1. 실행 순서 제어
프로세스를 올바른 순서대로 실행하는 것을 의미합니다. 글을 쓰는 프로세스와 글을 읽는 프로세스가 있다고 가정해봅시다. 만약 두 프로세스를 아무 순서대로 실행하게 된다면, 글을 쓰기도 전에 글을 읽는 프로세스가 실행될 것입니다.
글을 읽는 프로세스는 글 안에 값이 존재해야만 읽을 수 있는 특정 조건이 만족되어야 실행을 이어나갈 수 있습니다.
따라서 글을 읽기전에 글을 쓰는 프로세스가 먼저 실행되어야 할 것입니다.
이것이 실행 순서 제어를 위한 동기화입니다.
2. 상호 배제
동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 만드는 것을 의미합니다. 간단한 예시를 들자면,
A와 B라는 두 사람이 동일 계좌에 2만원가 5만원을 넣는다고 가정해봅시다. 계좌에는 잔액이 없다고 할 때,
A라는 사람이 실행하는 프로세스는 다음과 같을 것입니다.
- 계좌의 잔액을 읽어들인다 (0원)
- 읽어 들인 잔액에 2만원을 넣는다 (20000원)
- 더한 값을 저장한다 (20000원)
A가 실행되고 난 후에 B프로세스가 실행된다면 20000 + 50000 원 이므로 70000원이 계좌에 남아있어야 겠지만
동시에 실행된다면 어떻게 될까요? A가 계좌에 20000원을 더한 값을 미처 저장하지 못한 상태에서 B프로세스가
작동된다고 가정해봅시다. 프로세스는 다음과 같이 작동할 것입니다.
- 계좌의 잔액을 읽어들인다.(0원)
- 읽어 들인 잔액에 5만원을 넣는다 (50000원)
- 더한 값을 저장한다 (50,000원)
70000원이 남아야할 계좌에 50000원이 남는 문제가 발생되게 됩니다. 계좌 이체 예시처럼 동시에 접근해서는
안되는 자원에 동시 접근을 막는 것이 상호 배제를 위한 동기화라고 합니다.
그렇다면, 동시에 접근해서는 안되는 자원이란 무슨 자원을 뜻할까요?
공유 자원과 임계 구역
계좌 이체와 같이 동시에 실행되는 프로세스들은 전액 변수라는 공동의 자원을 두고 작업을 했습니다. 이러한 자원을
공유 자원이라고 합니다. 공유자원은 동시에 접근해서는 안됩니다. 위의 계좌 이체 사례처럼, 정상적인 프로세스 동작이
되지 않기 때문입니다. 공유자원은 전역 변수 또는 파일 또는 입출력 장치가 될 수 있습니다. 이러한 공유자원에
접근하는 코드 영역을 임계 구역이라고 합니다.
두 개 이상의 프로세스가 작동된다고 가정할 때, 한 개의 프로세스가 임계 구역에 진입하면, 나머지 한 개의 프로세스는
해당 프로세스의 작업이 끝날 떄 까지 기다려야 합니다. 만약 이 떄 프로세스가 순서를 지키지 않고 동시에 접근하게 되면
문제가 발생하게 됩니다. 이를 레이스 컨디션이라고 부릅니다.
레이스 컨디션이 발생되면, 계좌 이체 사례처럼 데이터의 일관성이 깨지는 문제가 발생하게 됩니다.
상호 배제를 위한 동기화는 프로세스가 동시에 임계구역에 접근하지 못하도록 관리하는 것을 의미합니다. 운영체제는 이를 세 가지 원칙으로 해결합니다.
- 상호 배제 : 한 프로세스가 임계 구역에 진입한다면, 다른 프로세스는 들어 올 수 없다.
- 진행 : 임계 구역에 어떤 프로세스도 진입하지 않았다면, 임계 구역에 들어가고자 하는 프로세스는 들어갈 수 있다.
- 유한 대기 : 한 프로세스가 임계구역에 진입하고 싶다면, 언젠가는 임계 구역에 들어가야한다.
앞서 동기화에는 실행 순서 제어를 위한 동기화와 상호 배제를 위한 동기화가 있다고 했습니다. 해당 동기화는 어떤 식으로 구현될까요?
동기화 기법
동기화 기법중에 대표적인 예로 3가지가 있습니다. 뮤텍스 락, 세마포, 모니터입니다. 하나씩 차례대로 살펴보도록 하겠습니다.
1. 뮤텍스 락
탈뮤텍 스락은 상호 배제를 위한 동기화 도구 입니다. 특정 프로세스가 임계구역에 접근하면, 뮤텍스 락을 활용하여
자신이 임계 구역에 있다는 표시를 합니다. 임계 구역 안에 들어 간다음, 자물쇠로 다른 프로세스들이 접근하지 못하도록
막는 것으로 이해하시면 됩니다. 다른 프로세스들은 뮤텍스락이 걸려있다면 기다리고, 걸려있지 않다면 임계 구역에
진입하게 됩니다.
뮤텍스 락은 전역변수와 2개의 함수로 구현 가능합니다.
전역변수는 동시에 접근해서는 안되는 자원이라 가정 했을 때, 2개의 함수는 무엇일까요?
하나는 acquire 함수입니다. 프로세스가 임계 구역에 진입하기 전에 호출되는 함수입니다. 임계 구역에 잠겨 있다면
열릴 떄 까지 반복적으로 확인합니다. 임계 구역이 열려 있다면 프로세스를 실행하고 임계 구역을 잠그는 함수입니다.
다른 하나는 release 함수입니다. 임계 구역 작업이 끝나면 호출됩니다. 다시 말하자면 임계 구역 잠금을 열어주는
역할을 수행하는 함수입니다.
acquire 함수는 락이 걸려있는지 반복적으로 확인합니다. 즉 쉴새없이 접근할 수 있는지 확인하고 있기에 이런 대기 방식을
바쁜 대기라고 부릅니다.
2. 세마포
뮤텍스락은 공유자원이 하나일 때 사용할 수 있는 기법이지만, 세마포는 공유자원이 여럿일 때도 사용 할 수 있는 조금 더
일반화된 동기화 도구입니다. 세마포는 멈춤 신호와 출발 신호로 임계 구역을 관리합니다. 이를 위해 2개의 함수를
사용하여 구현합니다.
하나는 임계 구역에 들어가기 전에 기다려야 할지 알려주는 wait 함수입니다.
다른 하나는 임계 구역에 들어가도 좋다고 프로세스에게 알리는 signal 함수입니다.
원리는 뮤텍스 락과 비슷합니다. 만약 P1, P2, P3 3개의 프로세스가 2개의 공유 자원에 접근한다고 가정해봅시다.
순서는 다음과 같이 처리됩니다.
- 프로세스 P1이 wait를 호출합니다. 어떠한 프로세스도 공유자원 S에 접근하고 있지 않으므로 P1이 공유자원 S에 접근합니다. 그리고 공유자원 갯수를 하나 줄여 줍니다.
- 프로세스 P2도 P1과 마찬가지로 공유자원에 접근합니다.
- 프로세스 P3는 현재 공유자원이 0이므로 무한히 반복하며 S 갯수가 0에서 벗어났는지 확인합니다. 만약 P1이 작업을
끝나면 S를 1증가시키고 signal함수를 호출합니다. 그제서야 P3가 S를 1 감소시키고 임계 구역에 진입합니다.
여기서 뮤텍스락과 동일한 문제가 발생합니다. 바로 S가 0에서 벗어났는지 무한정 반복하며 확인해야 된다는 것입니다.
이것을 확인할 시간에 다른 일을 한다면 CPU는 더 생산성 있는 작업을 할 수 있습니다. 이를 위해 세마포는 더 좋은 방법을
사용합니다.
위의 예시에서 프로세스 P3가 S 갯수가 0인지 아닌지를 계속 확인한다고 했습니다. 이를 하지 않는 대신에 프로세스 P3의
PCB를 세마포를 위한 대기 큐에 집어 넣습니다. P1 또는 P2 둘중에 하나가 작업이 끝나면 signal 함수를 호출 할 것입니다.
signal 함수가 호출되면 P3를 대기 큐에서 제거하고 준비 상태로 변경 뒤에 준비 큐로 옮겨줍니다.
3. 모니터
모니터는 세마포 처럼 앞뒤로 일일이 wait와 signal 함수를 명시할 필요가 없습니다. 공유 자원과 그에 접근하기 위한
인터페이스(통로)를 묶어 관리하기 때문입니다. 프로세스는 반드시 이통로를 통해 공유자원에 접근해야 합니다. 공유 자원에 접근하고자 하는 프로세스를 큐에 삽입하고 큐에 삽입된 순서대로 공유자원을 이용합니다.
이로써 모니터 안에는 항상 하나의 프로세스만 들어오게됩니다.
'CS > 운영체제' 카테고리의 다른 글
가상 메모리란? (4) | 2023.05.07 |
---|---|
연속 메모리 할당의 문제점은? (0) | 2023.05.03 |
교착 상태 (0) | 2023.04.07 |
PCB와 Context Switching이란? (0) | 2023.03.01 |
프로세스와 스레드에 대하여 (0) | 2023.03.01 |