안녕하세요? 허니입니다. 운영체제에서 많이 쓰이는 동기화 기법으로 세마포어를 많이 씁니다. 세마포어는 프로세스의 순차적인 처리를 위해 만든 기법으로 프로세스들끼리 경쟁을 막아 원할한 자원 공유를 가능하게 합니다. 운영체제에서는 매우 중요하기 때문에 세마포어에 대해 자세하게 포스팅 하려고 합니다. 학생이나 연구원분들에게 많은 도움이 될 것이라고 생각하며 언제든지 질문은 환영입니다.

 


오늘의 주제

 

 SEMAPHORE

 교착상태(deadlock)

 ring buffer

 Monitor

 


세마포어(SEMAPHORE)

 

프로세스의 순차적인 처리로 데이터의 값을 보장하는 방법에 대해 자세히 모르신다면 제 블러그에서 프로세스 동기화를 주제로 한 포스트를 읽어보시고 세마포어에 대해 읽어보는 것이 좋다. 프로세스를 단순히 2개라고 가정한 채 critical section을 한 프로세스만을 접근시켜보았는데 프로세스가 10개, 20개, 30개라고 가정한다면 대단히 복잡한 문제로 발전할 수밖에 없다.  그렇기에 시스템 설계자들은 발상의 전환을 하기 시작했다. 바로 신호체계를 만든 것이다. 하나의 프로세스가 critical section내에서 수행되고 sleeping하는 것을 신호에 따라 조절될 수 있도록 말이다. 그러한 발상에서 semaphore가 고안되었다. 바로 wait(약어P)와 signal(약어V)의 함수를 적절히 호출함으로 여러 프로세스를 수행하게 되는 것이다.

 

wait(S) {

             while(S <= 0) ; //no-operation

             S--;

}

 

signal(S) {

             S++;

}

 

Semaphore의 동작을 간단히 살펴보면, S라는 변수를 두고 critical section내에 들어가기 전에 wait(S)함수를 수행하여 critical section 내에 다른 프로세스가 없는 상태를 기다린다. 이는 (S > 0)의 조건을 기다리는 것인데, 이 조건은 다른 프로세스가 signal(S)을 호출하거나 초기 상태에만 가능하다. 즉, 프로세스가 critical section에서 나올 때 signal(S)를 호출함으로써 (S > 0)의 조건이 만족되고, wait(S) 함수로 기다리던 프로세스들이 그것을 감지하여 critical section으로 진입하게 되는 것이다. 단 여기서 하나의 프로세스만이 critical section으로 진입하여야 하므로 while 구문을 가장 먼저 통과한 프로세스가 S를 다시 감소시켜 (S > 0)의 조건을 파괴하는 것이다. 그렇다면 critical section이 5개일 경우 1개의 semaphore를 구성하는 것이 효과적일까. 아니면 5개의 semaphore를 구성하는 것이 효과적일까. 각각의 critical section마다 semaphore를 둘 경우 동시수행이 가능해지기 때문에 처리능력이 향상된다. 그러나 교착상태(deadlock)의 위험이 도사리고 있는 것이 문제점으로 지적될 수 있다. 다음과 같은 경우를 한번 생각해 보자. 철학자 5명이 국수를 먹는다. 그러나 얄궂게도 젓가락이 5쌍이 아닌 5개밖에 없다. 여기에서 젓가락이 바로 critical section이 되는 것이다.

 

그림 22 Dining Philosophers

 

철학자들이 국수를 먹기 위해선 자신의 좌측 우측에 있는 젓가락을 잡아야 하는데, 이럴 경우 발생할 경우란 2사람의 철학자가 먹을 수 있는 경우와 아무도 먹을 수 없는 경우가 될 것이다. 다섯 명의 철학자가 젓가락을 하나씩 쥐고 계속 기다린다면 어떨까. 시간이 흘러도 그 상황은 계속 유지되어 철학자들은 계속 굶고 있을 수밖에 없는 것이다. 바로 교착상태(deadlock)이 발생하는 것이다. 바로 P와 V를 어떻게 사용해야 철학자들이 굶지 않을까 하는 것이 semaphore의 최대 관심거리인 것이다. 이러한 교착상태(deadlock)가 발생한 경우는 얼마간의 시간이 지나면 하나의 젓가락을 포기한 채 Synchronization을 다시 시도해야 한다. 교착상태(deadlock)가 발생하지 않기 위해서는 순서를 정해 양쪽 젓가락을 잡을 수 있도록 설계되어야 한다. 젓가락을 쓰는데 순서를 정해주면 2명씩의 철학자가 돌아가면서 국수를 먹을 수 있도록 말이다. 모자라는 자원의 최대 활용이라고나 할까....

 

 잠깐, 상식!

교착상태(deadlock)란?

프로세스들이 서로 작업을 진행하지 못하고 영원히 대기 상태로 빠지는 현상을 교착상태라고 한다. 이러한 교착상태가 발생하는 원인은 프로세스 사이에 할당된 자원의 충돌로 인하여 발생하게 된다. 예를 들어 A와 B라는 2개의 프로세스가 동작을 한다고 하자. 그리고 이들은 각각 a와 b라는 자원을 할당 받아 사용하고 있다고 가정하자. 이때 프로세스 A 에서는 작업을 계속 진행하기 위해서 b라는 자원을 요청하고 프로세스B에서는 a라는 자원을 요청하게 되면 각각의 프로세스가 요청한 자원이 이미 다른 프로세스에 할당되어 있기 때문에 할당이 풀릴 때까지 대기 상태에 들어가게 된다. 그런데 A와 B 프로세스 모두 상대방이 자원을 내놓기를 기다리면서 대기 상태로 들어가기 때문에 이들은 영원히 대기 상태에 머무는 교착상태에 빠지게 되는 것이다.

 

또 다른 semaphore의 쓰임새를 살펴보자. 앞서 예로 들었던 은행 잔고가 잘못 기록되는 문제점에 대한 해결 열쇠 또한 semaphore가 쥐고 있는 것이다. 은행 잔고를 처리하는 부분을 semaphore로 관리하면 되는 것이다. 지금까지 살펴보았듯 semaphore를 사용하게 되면 Synchronization을 보다 효율적으로 구현할 수 있다. 그러나 앞에서도 잠깐 언급했듯이 Synchronization을 구현하는 것은 사용자의 필요성에 의해 각자에게 맡겨진 것이다. 어떠한 1명이 고의적으로 또한 P와 V의 구조를 잘못 이해해서 실수를 범하게 된다면 그 결과는 아무도 예측하지 못하게 된다. 바로 미꾸라지 하나가 Synchronization를 엉망으로 만들 수 있는 것이다. 그렇기에 이러한 문제점의 해결방안으로 Monitor가 구성되었다. Monitor는 P, V와 같은 함수의 정의가 언어로 표현되어 사용자들이 보다 쉽게 Synchronization을 구현 할 수 있도록 한 것이다.

 


요점정리

 세마포어(Semaphore)란?

wait(약어P)와 signal(약어V)의 함수를 적절히 호출함으로 여러 프로세스를 수행하는 방법이다.

 

 

목 차

 운영체제를 시작하는 분들을 위해

 운영체제의 역사와 구체적으로 어떤 일들을 수행하나요?

 운영체제의 목표와 역할이 미래에도 계속 증대될까요?

 운영체제를 이해하기 위해 필요한 기본 개념들은 무엇인가요?

 운영체제 프로세스 생애주기(Process Lifecycle)는 무엇인가요?

 운영체제 프로세스 관리(Process Management)는 어떻게 하나요?

 운영체제 프로세스(Process)의 처리 속도는 어떻게 높일까?

 운영체제 스레드(Thread)는 무엇인가요?

 운영체제 스케줄링 (Scheduling)은 어떻게 하나요?

 운영체제 스케줄링 알고리즘의 비교 기준이 있나요?

 운영체제 프로세스 동기화가 무엇인가요?

 운영체제에서 세마포어(Semaphore)란?

 운영체제 메모리 관리(Memory Management)는 어떻게 하나요?

 운영체제 메모리 분할 방법은 어떻게 하나요?

 운영체제 가상메모리(Virtual Memory)는 무엇인가요?

 운영체제 Page in/out, Swapping 등이 Page Table Entry와 어떤 관계인가요?

 운영체제 메모리 관련해서 알아야 할 개념은 어떤것이 있나요? (TLB, Locality, Working Set, Overlay)

 운영체제 Page replacement (페이지 대체) 알고리즘이란?

 운영체제 파일시스템(File System)은 어떻게 운영되나요?

 운영체제 파일시스템 내부구조는 어떻게 되나요?

 운영체제 디스크 공간 할당(Disk Space Allocation) 알고리즘과 효과적 알고리즘의 판단 기준은?

 운영체제 파일시스템에서 접근 시간, 디스크 스케줄링을 위한 알고리즘, I/O 시스템이란?

 리눅스 인터럽트 (Interrupt)에 대해 자세히 설명해 주세요.

 인텔 구조에서 운영체제 가상 메모리 (Virtual Memory)는?

 운영체제 아키텍처의 종류는 얼마나 있나요?

 

+ Recent posts