프로세스 동기화

동시성제어에는 운영체제 프로세스의 상호배제 동기화 개념들과 많이 연결되어 있습니다. 그래서 관련용어에 대해 전공서적을 읽어보고 정리해봤습니다.

동기화(synchronization)

  • 프로세스들 사이의 수행시기를 맞추는 것 을 의미하며, 프로세스 동기화 라고도 정의합니다. 프로세스들 사이의 수행시기를 맞춘다 함은 특정 자원에 접근할때 하나의 프로세스만 접근하거나 프로세스를 올바른 순서대로 실행하는 것을 두가지를 일컫습니다.

  • 실행순서제어 를 위한 동기화: 동시에 실행되는 프로세스를 올바른 순서대로 실행하는 것을 의미합니다.

  • 상호배제 를 위한 동기화: 상호배제는 공유가 불가능한 자원, 동시에 접근이 안되는 자원을 동시에 접근하지 못하게 하는 것을 의미합니다.


공유자원 과 임계구역 과 레이스컨디션

공유자원(shared resource)

공유자원은 여러 프로세스가 공동으로 사용하는 자원 을 의미합니다. 전역변수가 될 수도 있고, 파일이 될 수도, 입출력장치, 보조기억장치가 될수도 있습니다.

임계구역(critical section)

두개 이상의 프로세스가 동시에 실행되면 문제가 발생하는 코드영역 을 의미합니다.

만일 두개 이상의 프로세스가 임계 구역에 진입하고자 하면 둘 중 하나는 대기를 해야합니다. 임계구역에 먼저 진입한 프로세스의 작업이 마무리되면 그제서야 기다렸던 프로세스가 임계구역에 진입합니다.

레이스컨디션(race condition)

여러 프로세스가 동시다발적으로 임계 구역의 코드를 실행하여 데이터의 일관성이 깨지는 문제가 발생하는 것을 의미합니다.

상호배제를 위한 동기화는 두개이상의 프로세스가 임계구역에서 동시에 접근하지 못하도록 관리하는 것을 의미합니다. 운영체제는 이러한 임계구역 문제를 아래 세가지 원칙하에 해결하며 상호배제를 위한 동기화를 위해서는 3가지 원칙이 반드시 지켜져야합니다.

  • (원칙1) 상호배제: 한 프로세스가 임계구역에 진입했다면 다른 프로세스는 임계구역에 들어갈 수 없습니다.
  • (원칙2) 진행: 임계구역에 어떤 프로세스도 진입하지 않았다면 임계구역에 진입하고자하는 프로세스는 들어갈 수 있어야합니다.
  • (원칙3) 유한대기: 한 프로세스가 임계구역에 진입하고 싶다면 그 프로세스는 무한대기를 하지않고 언젠가는 임계구역에 들어올 수 있어야합니다.

뮤텍스락 과 세마포어

뮤텍스락 (mutex)

임계구역을 잠금으로써 프로세스간 상호배제를 이루는 동기화 도구 입니다.

mutex

일상생활에서 탈의실/화장실이 대표적인 예입니다. 앞에 줄이 없고 비어있다면 사용자는 빈 장소에 들어가서 탈의실/화장실 을 이용할 수 있습니다.

반대로 앞에 줄이 서있거나 탈의실/화장실이 자물쇠(잠금장치)로 잠겨있다면 앞의 사람이 먼저 이용중임을 판단하고 앞사람이 다할때까지 기다려야합니다.

앞의 사람이 잠금을 해제하고 열쇠를 반납했다면, 이용이 가능하므로 열쇠를 가져가서 ‘잠금’상태로하여 이용을 합니다. 이용을 다하면 잠금을 해제하고 열쇠를 반납하여 나옵니다.

  • 사람/이용자는 프로세스를 의미합니다.
  • 화장실/탈의실은 임계구역을 의미합니다.
  • 열쇠는 뮤텍스 입니다.

자물쇠(잠금장치)를 담당하는 뮤텍스는 상호배제를 위한 동기화 도구입니다. 락을 획득할 수 없다면 프로세스는 임계구역에 진입하지 못한채 무작정 기다리고 있어야하며, 락을 획득할 수 있다면 임계구역에 집입하여 잠근뒤에 임계구역에서 작업을 진행한뒤에 임계구역에 빠져나와서 임계구역의 잠금을 해제합니다.

세마포어 (semaphore)

semaphore

세마포어는 공유자원이 여러개 있는 임계 구역 문제도 해결할 수 있는 동기화 도구 입니다.

뮤텍스는 하나의 공유자원에 접근하는 프로세스를 상정한 방식입니다. 화장실/탈의실 1개만 있을 경우를 가정해서 만든 동기화 도구입니다.

화장실/탈의실 이 여러개 있을 경우에 여러개의 프로세스가 각각 공유자원에 접근이 가능해야 합니다. 만일 화장실/탈의실이 3개가 있지만 탈의실 1개당 한사람이 이용할 수 있지만 3명이 동시에 화장실/탈의실을 이용할 수 있습니다.


교착상태(deadlock)

프로세스를 실행하기 위해서 자원이 필요한데 두 개이상의 프로세스가 각자 가지고 있는 자원을 무작정 기다리게되면 교착상태가 됩니다.

식사하는 철학자문제 는 교착상태를 설명하는데 사용되는 문제상황입니다.

동그란 원탁에 다섯명의 철학자가 앉아있습니다. 철학자들 앞에서는 맛있는 식사가 있고 철학자들 사이 사이에는 식사에 필요한 포크가 있습니다. 철학자들 앞에 있는 식사는 두개의 포크로 먹을 수 있는 음식이라 가정합니다. 모든 철학자가 동시에 포크를 집어서 식사를 하게된다면 어떤 철학자도 식사를 할 수 없고 영원히 생각만 해야하는 상황이 발생할 수 있습니다. 다른 철학자가 포크를 내려놓을 때까지 기다리는겁니다.

일어나지 않을 사건을 무한히 기다리며 진행이 멈춰버리는 현상을 데드락이라고 합니다.

교착상태 발생조건

교착상태가 발생할 조건에는 ‘상호배제’, ‘점유와 대기’, ‘비선점’, ‘원형대기’ 로 4가지가 존재합니다. 아래 조건중 하나라도 만족하지 않다면 교착상태가 발생하지 않지만, 아래 조건중 하나를 만족하게 되면 교착상태가 발생할 가능성이 있습니다.

  • 상호배제(mutual exclusion) : 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없음을 의미하며, 자원을 사용하려면 1개의 프로세스만이 사용가능하며 다른 프로세스들은 작업이 완수할 때까지 기다려야합니다.
  • 점유와 대기(hold and wait) : 어떠한 자원을 할당 받은 상태에서 다른 자원을 할당 받기를 기다릴 경우를 의미합니다.
  • 비선점(nonpreemetive) : 비선점 자원은 그 자원을 이용하는 프로세스의 작업이 끝나야만 비로소 이용을 할 수 있습니다. 즉, 어떤 프로세스도 다른 프로세스의 자원을 강제로 뺏지 못하는 것을 의미합니다.
  • 원형대기(circular wait) : 프로세스들이 원의 형태로 자원을 대기하는 것을 의미합니다.

교착상태 해결방법

  • 교착상태 예방 : 프로세스들에 자원을 할당할 때, 상호배제/점유와 대기/비선점/원형대기 중 하나의 조건이라도 만족시키지않게 할당하는 방법입니다.
  • 교착상태 회피 : 교착상태가 발생하지 않을 정도로만 프로세스들에게 배분할 수 있는 자원의 양을 고려하여 자원을 할당받는 방식입니다.
    • 안전 상태 : 교착상태가 발생하지 않고 모든 프로세스가 정상적으로 자원을 할당받고 종료될 수 있는 상태
    • 불안전 상태 : 교착상태가 발생할 수 있는 상황
    • 안전 순서열 : 교착상태없이 안전하게 프로세스들에 자원을 할당할 수 있는 순서를 의미합니다.
  • 교착상태 검출후 회복 : 교착상태 발생을 인정하고 사후에 조치하는 방식입니다.
    • 선점을 통한 회복 : 교착 상태가 해결될 때까지 다른 프로세스로부터 자원을 강제로 뺏고, 한개의 프로세스씩 자원을 몰아주는 방식입니다. 하지만 자원을 뺏겨버려서 프로세스들의 작업내역을 잃을 가능성이 있습니다.
    • 프로세스 강제 종료를 통합 회복 : 프로세스를 모두 강제종료하거나 교착상태가 없어질 때까지 한개의 프로세스씩 강제로 종료하는 방법입니다. 하지만 교착 상태가 없어졌는지 확인하는 과정에서 오버헤드를 야기할 수 있습니다.