초보 개발자의 성장기

컴퓨터 구조 파헤치기 ... (프로세스 동기화, 뮤텍스, 세마포어, 데드락) 본문

BackEnd 지식

컴퓨터 구조 파헤치기 ... (프로세스 동기화, 뮤텍스, 세마포어, 데드락)

개발자 김케빈 2023. 10. 15. 22:59
병행성과 병렬성

병행성(동시성)과 병렬성은 비슷하지만 다른 개념입니다.

  • 병행성 : 동시에 실행되는 것처럼 보이는 것
    즉, 여러가지 일을 동시에 하는 것이 아니라 한가지 일을 조금씩 나눠서 하는 것
  • 병렬성 : 실제로 동시에 작업이 처리되는 것.
    N코어 N개의 쓰레드가 동시에 작업

프로세스 동기화

 

프로세스 동기화란 여러 프로세스가 공유하는 자원의 일관성을 유지하는 것을 말합니다.

여러 프로세스가 서로 협력해 공유자원을 사용하는 상황에서 경쟁조건(race condition)이 발생하면
공유자원의 신뢰성이 떨어집니다.
이를 방지하기 위해 프로세스들이 공유자원을 사용할 때 특별한 규칙을 만드는 것을 뜻합니다.

 

위에서 말하는 race condition 에 대해서 조금 더 자세히 알아보겠습니다.

race condition 이란? 여러 프로세스들이 동시에 데이터에 접근하는 상황에서 어떤 순서로 데이터에
접근하느냐에 따라 결과 값이 달라질 수 있는 상황
을 말합니다.
동시에 접근할 때 자료의 일관성을 해치는 결과가 나올 수 있습니다.

대표적으로 3가지 경우에서 발생할 수 있습니다.

  1. 커널 모드로 수행 중 인터럽트가 발생하는 경우
    이 경우는 커널 모드의 수행이 끝나기 전에는 인터럽트를 받지 않도록 하는 방법(disable/enable)으로
    문제를 해결할 수 있습니다. 
  2. 프로세스가 시스템 콜을 호출해서 커널 모드로 수행 중인데 Context switch가 발생하는 경우
    이 경우는 커널 모드를 수행 중일 땐 CPU가 preempt 되지 않도록 하고, 커널 모드에서 유저 모드로 돌아갈 때
    preempt 되도록
     함으로써 해결할 수 있습니다. 
  3. 멀티 프로세서에서 공유 메모리 내의 커널 데이터에 접근하는 경우
    이 경우는 커널 내부에 있는 각 공유 데이터에 접근할 때마다 그 데이터에 대해서만 lock/unlock을 하는 방식으로
    해결할 수 있습니다. 

그렇다면 race condition은 어떻게 해결할 수 있을까요?
커널 내부에 있는 각 공유 데이터에 접근할 때마다, 그 데이터에 대한 lock/unlock을 하는 방법으로 해결할 수 있는데
Semaphore / Mutex로 해결할 수 있습니다.

  • Semaphore : 공유된 자원의 데이터를 여러 프로세스가 접근하는 것을 막는 방법입니다.
    세마포어는 2가지 유형으로 나뉩니다.
    • 이진 세마포어 (Binary Semaphore) : 0 또는 1의 값을 가지며, 주로 상호배타적 lock (뮤텍스)을 구현하는데 사용됩니다. 세마포어 값은 두 가지 연산인 "P" (proberen, 얻다)와 "V" (verhogen, 증가)을 사용하여 조작합니다.
      "P"는 세마포어 값을 감소시
      키고, 0보다 작아지면 대기하도록 스레드를 차단합니다.
      "V"는 세마포어 값을 증가시키고 대기 중인 스레드 중 하나를 깨우는 역할을 합니다.
    • 카운팅 세마포어 (Counting Semaphore): 정수 값을 가지며, 한정된 수의 리소스를 나타내는데 사용됩니다.
      여러 스레드가 동시에 해당 리소스에 접근할 수 있는 스레드 수를 제한하는 데 사용됩니다.
  • Mutex : 공유된 자원의 데이터를 여러 스레드가 접근하는 것을 막는 방법입니다.
    뮤텍스는 이진 세마포어와 유사하게 사용됩니다.
    뮤텍스는 상호 배타적인 락(lock)을 표현하는데 사용됩니다.
    뮤텍스를 소유하고 있는 스레드만이 임계 영역(critical section)에 접근할 수 있습니다.
    다른 스레드는 해당 뮤텍스를 얻을 때까지 대기합니다.
    뮤텍스는 단일 프로세스 내에서 상호 배타적 접근을 조절하는데 사용됩니다.
    다중 프로세스 간에는 사용할 수 없습니다.

race condition에서 발생하는 공유 자원 접근 순서에 따라 실행 결과가 달라지는 영역을
임계 구역 (critical section) 이라고 하는데, critical section 문제를 해결하는 것이  중요합니다.

  • 상호 배제 (mutual exclustion)
    한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역에 들어갈 수 없습니다.
  • 한정 대기 (bounded waiting)
    상호 배제 때문에 기다리게 되는 프로세스가 무한 대기하지 않아야 합니다.
    즉, 틍정 프로세스가 임계구역에 진입하지 못하면 안됩니다.
  • 진행의 융통성 (progress flexibility)
    임계구역에 프로세스가 없다면 어떠한 프로세스라도 들어가서 자원을 활용할 수 있습니다.
    한 쪽에서 자원을 안쓰고 있다고 해서 다른 한 쪽 프로세스가 자원을 쓰고싶어도
    자신의 turn이 아니라고 기다리는 것은 효율적이지 못하다는 것입니다.

데드락 (DeadLock)

데드락이란 프로세스가 자원을 얻지 못해 다음 처리를 하지 못하는 상태로, 
즉, 둘 이상의 프로세스가 다른 프로세스가 점유하고 있는 자원을 서로 기다릴 때 무한 대기에 빠지는 상황을 일컫습니다.

데드락이 발생하기 위한 조건은 크게 4가지로 말할 수 있습니다.

  • 상호배제
    한 번에 프로세스 하나만 해당 자원을 사용할 수 있습니다.
    사용 중인 자원을 다른 프로세스가 사용하려면 요청한 자원이 해제될 때까지 기다려야 합니다.
  • 점유 대기
    자원을 최소한 하나 보유하고, 다른 프로세스에 할당된 자원을 점유하기 위해 대기하는 프로세스가 존재해야 합니다.
  • 비선점
    이미 할당된 자원을 강제로 빼앗을 수 없습니다.
  • 순환 대기
    대기 프로세스의 집합이 순환 형태로 자원을 대기하고 있어야 합니다.

데드락을 해결하기 위해 3가지 방법이 있습니다.

  • 데드락이 발생하지 않도록 예방하기
  • 데드락 발생 가능성을 인정하면서도 적절하게 회피하기
  • 데드락 발생을 허용하지만 데드락을 탐지하여, 데드락에서 회복하기
Comments