배경(Background)
협력적 프로세스(cooperative process)는 시스템 내에서 실행 중인 다른 프로세스의 실행에 영향을 주거나 영향을 받는 프로세스이다.
협력 프로세스는 공유 메모리 또는 메시지 전달을 통해서 데이터를 공유한다.
공유 데이터에 접근하는 것은 데이터의 일관성에 문제를 발생시킬 수 있다.
따라서 협력적 프로세스들의 순차적 실행을 보장해서 데이터의 일관성을 유지해야 한다.
프로세스는 병행해서 혹은 병렬로 실행될 수 있다.
이는 공유 데이터의 무결성(integrity)에 문제를 일으킨다.
여러 프로세스가 동일한 데이터를 동시에 접근해서 조작하고, 그 실행 결과가 접근이 발생한 특정 순서에 의존하는 상황을 경쟁 조건(race condition)이라고 한다.
경쟁 조건으로부터 보호하기 위해, 한순간에 하나의 프로세스만이 데이터를 조작하도록 보장해야 한다.
이를 위해 프로세스들이 동기화되어야 한다.
os의 여러 부분에서 자원을 조작하므로 incorrect state 상황이 빈번하게 발생하고, 다중 스레드 응용이 중요해지면서 프로세스 동기화(process synchronization)와 조정(coordination)이 중요해졌다.
임계구역 문제(Critical Section Problem)
각 프로세스는 임계구역(critical section)이라고 부르는 코드 부분을 포함하고 있고, 그 안에서는 적어도 하나 이상의 다른 프로세스와 공유하는 데이터에 접근하고 갱신할 수 있다.
한 프로세스가 자신의 임계구역에서 실행하는 동안 다른 프로세스들은 그들의 임계구역에서 실행할 수 없다.
즉 동시에 두 개 이상의 프로세스가 임계구역에서 실행할 수 없다.
임계구역 문제는 프로세스들이 데이터를 협력적으로 공유하기 위해서 자신들의 활동을 동기화할 때 사용할 수 있는 프로토콜을 설계하는 것이다.
각 프로세스는 자신의 임계구역을 진입하기 위해서 허가를 요청해야 한다. 이를 entry section이라고 한다.
임계구역 뒤에는 exit section이 따라나올 수 있다.
코드의 나머지 부분들은 remainder section이라고 한다.
임계구역 문제에 대한 해결 방법은 다음 세 가지 요구 조건을 만족해야 한다.
1. 상호 배제(mutual exclusion):
한 프로세스가 자신의 임계구역에서 실행된다면, 다른 프로세스들은 그들 자신의 임계구역에서 실행될 수 없다.
2. 진행(progress):
임계구역에서 실행되는 프로세스가 없을 때, remainder section에서 실행 중이지 않은 프로세스들만 다음 임계구역에 진입할 프로세스를 정하는데 참여할 수 있다.
3. 한정된 대기(bounded waiting):
프로세스가 임계구역에 진입하려는 요청을 한 후에 그 요청이 허용될 때까지 다른 프로세스들이 임계구역에 진입하도록 허용되는 횟수에 한계가 있어야 한다.
즉, 프로세스가 진입 요청 후 무한히 대기할 수 없다.
커널 코드는 경쟁 조건이 발생하기 쉽다.
예시 1)
시스템의 모든 열린 파일의 리스트를 유지하는 커널 자료구조는 새 파일이 열리거나 닫히면 수정되어야 한다.
이때 두 프로세스가 동시에 파일을 여는 경우, 리스트의 갱신은 경쟁 조건을 일으킬 수 있다.
예시 2)
프로세스를 생성할 때, fork()는 새로 생성된 프로세스의 식별자를 부모 프로세스로 반환한다.
따라서 next_available_pid에 경쟁 조건이 있고, 동일한 프로세스 식별자 번호가 두 개의 다른 프로세스에 배정될 수 있다.
경쟁 조건이 발생하기 쉬운 커널 자료구조는 메모리 할당을 관리하는 자료구조, 프로세스 리스트를 유지하는 자료구조, 인터럽트 처리를 위한 자료구조 등이 있다.
single-core 시스템에서는 공유 변수가 수정되는 동안 인터럽트가 발생하는 것을 막을 수 있다면 임계구역 문제는 간단히 해결될 수 있다.
이는 현재 실행 중인 명령어들이 선점 없이 순서대로 실행될 수 있다는 것을 보장한다.
하지만, 위의 해결책은 multiprocessor 시스템에서는 실현할 수 없다.
인터럽트 메시지가 모든 프로세서로 전달되므로 실현하기 위해서 많은 시간이 소모되기 때문이다.
os 내에서 임계구역을 다루기 위해서 선점형 커널(preemptive kernel)과 비선점형 커널(nonpreemptive kernel) 두 가지 접근법이 사용된다.
비선점형 커널은 커널 모드에서 수행되는 프로세스의 선점을 허용하지 않고,
선점형 커널은 프로세스가 커널 모드에서 수행되는 동안 선점되는 것을 허용한다.
비선점형 커널은 한순간에 커널 안에서 실행 중인 프로세스가 하나뿐이므로 커널 자료 구조에 대한 경쟁 조건이 발생하지 않지만,
실시간 프로그래밍을 위해서 선점형 커널을 선호한다.
선점형 커널은 공유 커널 데이터에 대해 경쟁 조건이 없도록 신중하게 디자인되어야 한다.
'전공 > 운영체제' 카테고리의 다른 글
[운영체제] 동기화 도구들: 동기화를 위한 하드웨어 지원 (0) | 2021.12.16 |
---|---|
[운영체제] 동기화 도구들 - (2) (0) | 2021.12.16 |
[운영체제] CPU 스케줄링: 알고리즘의 평가 - (1) (0) | 2021.12.16 |
[운영체제] CPU 스케줄링: 실시간 CPU 스케줄링 - (3) (0) | 2021.12.02 |
[운영체제] CPU 스케줄링: 실시간 CPU 스케줄링 - (2) (0) | 2021.12.01 |