동기화

컴퓨터 과학에서 동기화(Synchronization)란, 여러 개의 프로세스나 스레드가 공유 자원(Shared Resource)에 접근하거나 동시에 실행될때, 일관성과 올바른 실행 순서를 보장하기 위한 기법을 말합니다.

여기서 공유 자원은 메모리, 파일, 변수 등을 의미합니다.

임계 구역

임계 구역(Critical Section)이란, 여러 스레드 또는 프로세스가 동시에 접근하면 문제가 발생할 수 있는 공유 자원에 접근하는 코드 영역을 말합니다.

만약 동시에 진입하면 데이터 불일치나 프로그램 오류와 같은 문제가 발생할 수 있습니다.

레이스 컨디션

레이스 컨디션(Race Condition)은 두 개 이상의 프로세스 혹은 스레드가 동시에 임계 구역을 실행하면서 실행 결과가 접근 순서에 따라 달라지는 상황을 의미합니다.

레이스 컨디션이 발생하면 자원의 일관성이 손상될 수 있습니다.
그러므로, 2개 이상의 프로세스 혹은 스레드가 임계 영역에 진입하고자 한다면 둘 중 하나는 작업이 끝날 때까지 대기해야합니다.

이를 방지하려면 임계 구역에 접근하는 스레드를 조율해야 하며, 상황에 맞는 동기화 기법이 필요합니다.

동기화의 조건

동기화는 크게 두 가지 조건을 만족해야합니다.

  1. 실행 순서 제어: 프로세스 및 스레드를 올바른 순서로 실행한다.
  2. 상호 배제(Mutual Exclusion): 동시에 접근해서는 안되는 자원에는 반드시 하나의 프로세스 또는 스레드만 접근한다.

동기화 기법

뮤텍스 락

뮤텍스 락(Mutex Lock)은 하나의 자원에 대해 상호 배제를 보장하는 가자 기본적인 동기화 도구입니다.

  • 임계 구역에 접근하려면 반드시 acquire(락 획득) 호출이 필요합니다.
  • 작업이 끝나면 release(락 해제)를 호출해야 합니다.
  • 다른 스레드는 락이 해제되기 전까지 대기해야 합니다.

파이썬, C/C++ 등의 프로그래밍 언어에서 뮤텍스 락을 지원합니다.

세마포어

세마포어(Semaphore)는 동시에 N개의 스레드가 자원에 접근할 수 있도록 제어하는 동기화 도구입니다.

세마포어는 하나의 정수 값과 두 개의 함수로 구성됩니다.

  • 변수는 현재 사용 가능한 공유 자원의 개수를 나타내는 변수입니다.
    • 현재 사용 가능한 공유 자원의 개수는 임계구역에 진입할 수 있는 프로세스의 개수와 같습니다.
  • 함수는 waitsignal로 나뉩니다.
    • wait함수는 임계 구역 진입 전 호출(자원 사용 가능 여부 확인)
    • signal함수는 임계 구역 진입 후 호출(자원 반환)

이진 세마포어

이진 세마포어(Binary Semaphore)는 변수가 0과 1의 값을 가지는 세마포어입니다.
사실상 뮤텍스와 유사하게 동작합니다.

자원을 하나만 보호할 때 사용됩니다.

카운팅 세마포어

카운팅 세마포어(Counting Semaphore)는 변수 값이 자원의 개수를 의미합니다.

여러 개의 자원을 관리할 때 사용합니다. 즉, 세마포어를 설명한 예시는 카운팅 세마포어이며, 일반적으로 세마포는 카운팅 세마포어를 칭하기도 합니다.

조건 변수와 모니터

조건 변수

조건 변수(Condition Variable)는 특정 조건이 충족될 때까지 스레드 실행을 제어하는 동기화 도구입니다.

조건 변수에 대해 wait함수와 signal함수를 호출할 수 있습니다.

  • wait: 프로세스 및 스레드의 상태를 대기 상태로 전환합니다.
  • signal: 일시 중지된 프로세스 및 스레드의 실행을 재개합니다.

모니터

모니터(Monitor)는 공유 자원과 해당 자원을 다루는 연산(인터페이스)로 구성된 고수준 동기화 도구입니다.
상호 배제를 위한 동기화뿐만 아니라 실행 순서 제어를 위한 동기화까지 가능합니다.

항상 하나의 프로세스 또는 스레드만 모니터 내에서 실행이 가능합니다.
만약, 이미 모니터 내로 진입하여 실행 중인 프로세스 및 스레드가 있다면 큐(Queue)에서 대기합니다.

모니터는 조건 변수를 함께 활용하면, 실행 순서 제어가 가능해집니다.

스레드 안전

스레드 안전(Thread-Safe)이란 멀티스레드 환경에서 여러 스레드가 동시에 어떤 함수, 객체, 변수에 접근하더라도 레이스 컨디션이 발생하지 않고 올바르게 동작하는 상태를 말합니다.

스레드 안전하지 않은 경우 레이스 컨디션이 발생할 수 있다는 의미입니다.
스레드 안전인 경우 데이터의 일관성이 보장되는 상태를 의미합니다.

스레드 안전(Thread-Safe)이란 멀티스레드 환경에서 어떤 변수나 함수, 객체에 동시 접근이 이루어져도 실행에 문제가 없는 상태를 의미합니다.

레이스 컨디션이 발생했다면 이는 스레드 안전하지 않은 상황입니다.
반대로 어떤 함수가 스레드 안전하다면, 이는 여러 스레드에 의해 호출되어도 레이스 컨디션이 발생하지 않습니다.

ComputerScience 카테고리 내 다른 글 보러가기

댓글남기기