ecsimsw

Exclusive control / Semaphore / Mutex / Dead Lock 본문

Exclusive control / Semaphore / Mutex / Dead Lock

JinHwan Kim 2019. 2. 16. 01:19
  • Exclusive control(배타적 제어)
    - 여러 개의 프로세스가 하나의 공통된 자원을 액세스하면 잘못된 처리를 야기할 수 있다. 이를 막기 위해 처리가 끝날 때까지 한 프로세스에서 자원을 독점하고 처리 후 다른 프로세스에게 넘기는 것, 즉 자원을 한 프로세스에서 독점시키는 것을 Exclusive control, 배타적 제어라고 한다.
      plus) 공유 잠금은 다른 프로세스가 데이터에 참조는 할 수 있지만 변경은 하지 못하고, 배타 잠금은 다른 프로세스가 데이터에 참조, 변경 모두 불가능한 잠금을 의미한다.
  • Semaphore
    - 지정된 수의 프로세스만 공유 자원을 엑세스 하도록 제어하는 장치이다. 카운터를 지정하고, 엑세스하는 프로세스마다 카운터를 하나씩 줄여 0이된다면 OS는 이를 확인하고 더이상의 자원 할당을 불가능하게 한다.
  • Mutex
    - 하나의 프로세스만이 자원을 처리할 수 있도록 한다. 우선 카운터가 하나뿐인 세마포어라고 이해한다.
  • Dead Lock
    - 서로 다른 프로세스가 각자의 자원을 잠근 채로 다른 포로세스의 잠긴 자원을 액세스하려다가, 둘 다 대기 상태에 빠져 무한 대기 모드에 빠지는 것을 데드락이라고 한다.

  • Critical section(임계 영역)
    - ex1) 값이 10인 정수형 변수 i를 두 스레드 A,B에서 각각 i++ 을 실행한다고 생각해보자.
    "정상적인 경우" 1. thread main) i=10이 메인 메모리에 저장되어 있음 2. thread A) 메인 메모리의 i=10를 꺼내 연산을 위해 레지스터에 저장 3. thread A) 레지스터의 i=10에 1을 더해 i=11 값을 얻음 4. thread A) i=11을 메인 메모리에 저장 후 context change. 5. thread B) 메인 메모리의 i=11를 꺼내 연산을 위해 레지스터에 저장 6. thread B) 레지스터의 i=11에 1을 더해 i=12 값을 얻음 7. thread B) i=12을 메인 메모리에 저장 후 context change. 8. thread main) i=12이 메인 메모리에 저장되어 있음 "자원이 동시에 접근" 1. thread main) i=10이 메인 메모리에 저장되어 있음 2. thread A) 메인 메모리의 i=10를 꺼내 연산을 위해 레지스터에 저장 3. thread A) 레지스터의 i=10에 1을 더해 i=11 값을 얻음 4. thread B) 메인 메모리의 i=10를 꺼내 연산을 위해 레지스터에 저장 5. thread B) 레지스터의 i=10에 1을 더해 i=11 값을 얻음 6. thread A) i=11을 메인 메모리에 저장 6. thread B) i=11을 메인 메모리에 저장 7. thread main) i=11이 메인 메모리에 저장되어 있음
      i라는 전역 변수 자원이 두 스레드에서 사용되면서 동시에 엑세스되어 예상하지 못한 결과를 얻었다.
    ex2) i=10에 threadA에선 1을 더하고 threadB에선 10을 곱하고 최종 결과로 i를 출력하는 소스를 만들어 보았다.
    class Program { static int i = 10; static void Main(string[] args) { Thread threadA = new Thread(new ThreadStart(Add)); Thread threadB = new Thread(new ThreadStart(Mul)); threadA.Start(); threadB.Start(); Thread.Sleep(1000); Console.WriteLine(i); } static void Add() { for (int j = 0; j < 3; j++) { i ++; Console.WriteLine("add "+ i); Thread.Sleep(100); } } static void Mul() { for (int j = 0; j < 3; j++) { i*=10; Console.WriteLine("mul "+i); Thread.Sleep(100); } } }
      i는 스레드에 임의의 딜레이(처리시간)에 따라 매 실행마다 다른 i를 출력한다.
      이렇게 여러 작업이 한 자원을 공유할 때, 이 자원을 엑세스하는 코드 부분 자체를 critical section 이라고 한다. 이 섹션에서 작업의 시간 차에 따라 매번 다른 결과를 야기하므로 동기적 작업을 진행하거나 자원을 한번에 여러개의 프로세스가 연산하지 못하도록 막아야한다.

'Computer Science > Operating system' 카테고리의 다른 글

Memory - RAM / ROM  (0) 2019.02.18
Inter Process Communication  (0) 2019.02.17
Scheduling / Scheduling Algorithm  (0) 2019.02.14
Process / Preemption, Dispatch / PSW / PCB  (0) 2019.02.14
Interrupt  (0) 2019.02.12
Comments