본문 바로가기
컴퓨터공학/운영체제

OS 7. 동기화 예제

by Jinger 2023. 4. 6.

서론

 임계구역 문제를 제시하고 여러 병행 프로세스가 데이터를 공유할 때 어떻게 경쟁 조건이 발생할 수 있는지에 중점을 두었다. 계속해서 경쟁 조건이 발생하지 않도록 하여 임계구역 문제를 해결하는 몇 가지 도구를 검토하였다.


고전적인 동기화 문제들(Classical Problems of Synchronization)

유한 버퍼 문제(Bounded-Buffer Problem)

 이 문제는 일반적으로 동기화 프리미티브(primitive)들의 능력을 설명하기 위하여 사용된다. 어느 특정 구현에 국한됨 없이 이 해결 방법의 일반적인 구조를 제시한다.

int n;
// 필수 세마포
semaphore mutex = 1;
semaphore empty = n;
semaphore ful = 0;

 N개의 버퍼로 구성된 풀(pool)이 있으며 각 버퍼는 한 항목(item)을 저장할 수 있다고 가정하자. mutex 이진 세마포는 버퍼 풀에 접근하기 위한 상호 배제 기능을 제공하며 1로 초기화된다. empty와 full 세마포들은 각각 비어 있는 버퍼의 수와 꽉 찬 버퍼의 수를 기록한다. 세마포 empty는 n 값으로 초기화되고, 세마포 full은 0으로 초기화된다.

producer and consumer의 구조

Readers - Writers 문제

 하나의 데이터베이스가 여러 동시 프로세스 간에 공유된다고 하자. 데이터 세트를 읽기만 하는 자는 Readers로 데이터 세트를 읽고 쓰고(갱신) 싶어 하는 자를 Writers로 두 가지 유형의 프로세스 유형을 구분할 수 있다. 만약 하나의 writer와 어떤 다른 스레드(reader or writer)가 동시에 데이터베이스에 접근하면, 혼란이 생긴다. 이 문제를 readers-writers 문제라 하고 이러한 문제를 발생하지 않도록 보장하기 위해, 우리는 writer가 쓰기 작업 동안에 공유 데이터베이스에 대해 배타적 접근 권한을 가지게 할 필요가 있다.

Readers - Writers 해결안

 reader 프로세스 다음과 같은 자료구조를 공유한다.

semaphore mutex = 1;
semaphore wrt = 1;
int readcount = 0

 mutex와 wrt 이진 세마포는 각각 1로 초기화되고 readcount는 0으로 초기화된다. wrt세마포는 reader와 writer가 모두 공유한다. mutex 세마포는 readcount를 갱신할 때 상호 배제를 보장하기 위해 사용된다. readcount는 현재 몇 개의 프로세스들이 객체를 읽고 있는지 알려준다. wrt 세마포는  writer들을 위한 상호 배체 세마포이다.

식사하는 철학자 문제(Dining - Philosophers Problem)

 많은 부류의 병행 제어 문제의 예로 식사하는 철학다즐 문제는 고전적인 동기화 문제 중 하나이다. 식사하는 철학자 문제는 5명의 철학자가 원탁에 앉아서 식사를 하는 상황을 모델링한 문제이다. 각 철학자들은 식사를 하기 위해 "생각"하고 있거나 "먹고" 있거나 "기다리는" 세 가지 상태를 가지고 있다. 원탁 위에는 5개의 젓가락이 있으며, 각 철학자는 왼쪽과 오른쪽에 젓가락이 필요하다. 그러나 모든 철학자가 동시에 자신의 왼쪽과 오른쪽에 있는 젓가락을 들 수는 없기 때문에, 젓가락을 공유하는 문제가 발생한다. 상호 배제를 위해 한 번에 한 철학자만 식사를 하도록 제한하고, 교착 상태 방지를 위해 여러 방안이 제안되어 왔다.

세마포 해결안

 간단한 해결책은 각 젓가락을 하나의 세마포로 표현하는 것이다. 철학자는 그 세마포에  wait() 연산을 실행하여 젓가락을 집으려고 시도한다. 그는 또한 해당 세마포에 signal() 연산을 실행함으로써 자신의 젓가락을 놓는다. 그러므로 공유 자료는 다음과 같다.

semaphore chopstick[5];

여기서 chopstick의 원소들은 모두 1로 초기화된다. 이 해결안은 인접한 두 철학자가 동시에 식사하지 않는다는 것을 보장하지만, 교착 사태를 야기할 가능성이 있다.


리눅스 동기화(Linux Synchronization)

 리눅스는 장기간 잠금(lock)의 경우 block & wakeup 세마포어를 제공하거나  기간이 짧은 잠금의 경우 바쁜 대기(busy waiting, spinlock)를 제공한다. 상황에 따라 다중 프로세서에 스핀록 획득/해제하고 단일 프로세서에서 커널 선점을 비활성화/활성화한다.


핵심

  • 프로세스 동기화의 고전적인 문제에는 제한된 버퍼, 독자-작성자, 식당-철학자 문제가 포함된다.
  • Linux는 원자 변수, 스핀록 및 뮤텍스 잠금을 포함하여 경쟁 조건으로부터 보호하기 위해 다양한 접근 방식을 사용한다.
반응형

'컴퓨터공학 > 운영체제' 카테고리의 다른 글

OS 9. Main Memory  (0) 2023.05.18
OS 8. Deadlocks  (1) 2023.05.16
OS 6. 동기화 도구(Synchronization Tools)  (0) 2023.04.06
OS 5. CPU 스케줄링  (0) 2023.04.06
OS 4. Threads& Concurrency  (0) 2023.04.05

댓글