본문 바로가기
Computer Science/Operating System

[Pluto의 컴퓨터이야기] 운영체제의 동기화 기법

by Dev. Pluto 2022. 2. 21.
반응형

안녕하세요 플루토입니다! 오늘은 운영체제의 동기화 기법에 대해서 알아보는 시간을 갖도록 하겠습니다. 

 

 

 

이 글을 읽고 난 뒤 여러분은
1. 컴퓨터 시스템의 공유자원에 대해 설명할 수 있습니다.
2. 프로세스/스레드의 임계영역(Critical Section)에 대해 이해하고 설명할 수 있습니다.
3. 데이터의 일관성을 보장하기 위해 운영체제가 사용하는 각종 동기화 기법을 이해하고 설명할 수 있습니다. 

 

 

1. 컴퓨터 시스템의 공유자원

컴퓨터 시스템의 공유되는 여러 자원(파일이나 메모리 등)은 여러 프로세스나 스레드가 접근하여 사용할 수 있습니다. 하지만 동시에 여러 프로세스가 접근하여 이런 공유자원에 접근하여 데이터의 변경을 일으킨다면 데이터의 불일치가 발생할 수 있습니다.

(특히 금융이나, 의료분야와 같은 데이터의 일관성이 매우 중요한 애플리케이션에서는 매우 큰 피해를 일으킬 수 있습니다.)

 

 

여러 스레드가 하나의 공유자원에 동시에 접근하면 일관성이 보장받을 수 없다.

 

 

따라서 운영체제는 공유되는 자원에 대해서 데이터의 일관성을 보장해주기 위해서 이런 자원에 대해 동시의 프로세스가 접근하지 못하도록 제한하는 여러 기법을 사용합니다. 이런 개념을 "동기화" 라고 부르게 됩니다. 

 

 

 

 

2. 임계영역 (Critical Section)

또한 프로그램의 명령어 중에서 컴퓨터의 공유 자원에 접근하는 모든 코드영역을 임계영역(Critical Section)이라 부르게 됩니다. 

운영체제는 하나의 프로세스가 특정 공유데이터에 대해 접근하고 있을 때 다른 프로세스가 해당 자원에 대해 접근하지 못하도록 보장해야 합니다.

 

보통 코드를 실행하는 것은 프로세스 내의 스레드 이므로, 스레드를 주로 다루겠습니다.

 

   2-1. 임계영역 내부에서 동기화가 잘 지켜기지 위한 조건

 

     - Mutal exclusion : 공유자원에 대해 한 번에 하나의 스레드만 접근하여야 한다.

     - Progress: 임계영역 내에 들어간 스레드는 반드시 진행이 되고 종료되어야 한다.

     - Bounded wating: 특정 스레드가 임계영역 진입을 기다리고 있다면, 언젠가는 반드시 들어가도록 보장해야한다

     - Performance: 동기화의 매커니즘이 낮은 overhead 인 것이 좋다.

 

 

 

3. 운영체제에서의 동기화 기법 ( Lock, Semaphore, Monitor, Message)

 

Locks

qcquire(), release() 두 가지 함수로 이루어지며 Lock을  선점한 스레드가 임계영역 내부의 코드를 실행하는 동안 다른 스레드가 같은 공유자원에 대해 접근하려는 스레드의 임계영역 실행을 막는 방식으로 동작을 합니다. 

각각의 함수에 대한 설명과 동작의 흐름으로 설명하겠습니다.

 

acquire(): lock이 풀릴 때까지 wating하는 함수입니다. 락이 풀리면 free한 상태인 락을 획득하는 기능을 합니다 (락을 잡을 때까지 함수의 return이 이루어지지 않습니다.)

 

release():  스레드가 잡고있는 락을 푸는 함수입니다. (free상태로 변환) 만약 락의 획득을 기다리고 있는 스레드가 존재한다면 일려줍니다.

 

동작의 흐름

 

1. 스레드가 acquire() 함수를 통해 임계영역 내부에 들어가기 이전에 준비를합니다.

2. 임계영역을 실행합니다.

3. release() 함수를 실행해 락을 free상태로 바꾸어 놓습니다

 

즉, acquire <--> release 사이에는 1개의 스레드가 존재하고 있다고 생각해도 무방합니다. 

 

이처럼 락 방식의 동기화 기법은 간단하지만 문제점을 내포하고 있습니다. 락 방식의 한계점과 솔루션은 다음 포스트로 다루어 보도록 하겠습니다.

 

3-1. Higher-level Synchronization

qcquire() 함수를 호출하고 락을 잡을 때까지 루프를 돌며 계속 CPU를 사용하던 락 방식과 추가적인 개선사항이 반영된 동기화 기법들입니다.

 

Semaphore

락 방식의 busy wating(락을 잡을때 까지 루프를 도는 작업)하지 않으며 작업 큐(Queue)형태의 구조를 가지고 있습니다 

락 방식과 비슷한 두 가지 함수를 제공하여 운용합니다.

 

Monitor

프로그래머가 동기화 코드를 작성해야하는 세마포어 와는 다르게 컴파일러가 자동으로 동기화 코드를 추가하고 실행 시 동기화를 강제하는 방법입니다.

반응형