스물두줄

컴퓨터시스템응용기술사 · 개념서 · 컴퓨터 구조 및 운영체제

세마포어

설명 영상 세마포어 (Semaphore) · 2:50

왜 배우는가: 세마포어는 공유 자원 접근과 태스크 간 순서를 제어하는 가장 기본적인 동기화 도구이며, 운영체제·임베디드·멀티스레드 프로그래밍 전반에서 쓰인다. 교착 상태, 우선순위 역전 등 동기화 문제의 출발점이라 시험에서 개념 정의와 P·V 연산을 묻는 문제로 반복 출제된다.

출제 이력: 제132회 1교시 4번, 제126회 1교시 9번, 제108회 3교시 4번

1. 한 줄 정의와 핵심 키워드

세마포어는 정수형 공유 변수 S와 원자적 연산 P(wait), V(signal)로 공유 자원 접근을 제어하는 동기화 기법이다.

  • 세마포어(Semaphore)
  • P연산(wait)
  • V연산(signal)
  • 원자적 연산(atomic operation)
  • 카운팅 세마포어(Counting Semaphore)
  • 이진 세마포어(Binary Semaphore)
  • 임계구역(Critical Section)
  • 상호배제(Mutual Exclusion)

2. 개념 풀이

세마포어는 열쇠 개수를 세는 계수기에 비유할 수 있다. 사용 가능한 열쇠가 남아 있으면 들어가고, 없으면 밖에서 기다린다. 열쇠를 반납하면 기다리던 사람 한 명이 들어간다.

세마포어는 다익스트라(Dijkstra)가 제안한 동기화 기법이다. 하나의 정수 변수 S와 이 변수를 조작하는 두 연산으로 구성된다. 변수 S는 자원 사용 가능 수를 나타내며, 초기값은 시스템에서 허용하는 동시 접근 수로 정한다. 세마포어 변수는 초기화 연산과 P, V 연산으로만 접근한다.

P연산(wait) 은 자원을 얻으려는 연산이다. S값이 0보다 크면 S를 1 감소시키고 임계구역에 진입한다. S값이 0 이하이면 호출한 프로세스를 블록(block)하여 대기 큐에 넣는다.

V연산(signal) 은 자원을 반납하는 연산이다. S값을 1 증가시키고, 대기 큐에 프로세스가 있으면 하나를 깨워 자원을 넘긴다.

원자적 연산(atomic operation) 은 P와 V가 중간에 끼어들 수 없이 한 번에 실행된다는 뜻이다. 이 조건이 깨지면 S값 갱신에서 경쟁 조건이 생긴다. 그래서 P와 V 자체가 동기화되어야 세마포어가 성립한다.

카운팅 세마포어(Counting Semaphore) 는 S가 0 이상의 임의 정수를 가질 수 있는 형태다. 자원이 여러 개인 경우, 예를 들어 DB 연결 풀이나 스레드 풀에 쓴다. 이진 세마포어(Binary Semaphore) 는 S가 0 또는 1만 갖는다. 이 경우 상호배제 용도로 쓰이며, 뮤텍스와 비슷한 역할을 한다. 이진 세마포어로 계수 세마포어를 구현할 수도 있다.

임계구역(Critical Section) 은 여러 프로세스가 공유하는 자원을 접근하는 코드 영역이다. 세마포어는 이 영역에 한 번에 들어갈 수 있는 프로세스 수를 제한한다.

3. 등장 배경과 필요성

멀티프로그래밍 환경에서 여러 프로세스나 스레드가 같은 데이터를 동시에 갱신하면 결과가 실행 순서에 따라 달라진다. 이를 경쟁 조건(race condition)이라 한다. 공유 자원을 보호하려면 한 시점에 하나의 프로세스만 임계구역에 들어가도록 제어해야 한다.

초기 방법으로 소프트웨어 해법이 제시되었으나 구현이 복잡하고 하드웨어 명령에 의존했다. 세마포어는 정수 변수와 두 연산만으로 상호배제, 자원 개수 관리, 실행 순서 제어를 모두 표현할 수 있게 했다. 그래서 운영체제 커널과 실시간 운영체제에서 기본 동기화 도구로 자리 잡았다.

이어지는 내용

로그인하면 하루 5페이지까지 무료로 전체를 읽을 수 있습니다.

앱에서 이 단원 읽기