어제의 나보다 성장한 오늘의 나

임계영역(critical section) 본문

CS/운영체제

임계영역(critical section)

NineOne 2021. 4. 25. 00:20

임계 영역이란?

  • 프로세스 간에 공유자원을 접근하는 데 있어서 문제가 발생하지 않도록 한 번에 하나의 프로세스만 이용하게끔 보장해줘야 하는 영역

임계 영역 문제를 해결하기 위해서는 3가지 조건을 충족해야 된다.

  1. 상호 배제(Mutual exclution)
    • 하나의 프로세스가 임계 영역에 들어가 있다면 다른 프로세스는 들어갈 수 없어야 한다.
  2. 진행(Progress)
    • 임계 영역에 들어간 프로세스가 없는 상태에서 들어가려 하는 프로세스가 여러 개라면 어느 것이 들어갈지 결정해줘야 한다.
  3. 한정 대기(Bounded waiting)
    • 다른 프로세스의 기아(Starvation)를 방지하기 위해, 한 번 임계 구역에 들어간 프로세스는 다음번 임계 영역에 들어갈 때 제한을 두어야 한다.
  • 임계 영역의 동시 접근을 해결하기 위한 방법으로는 Lock, Semaphore, monitor 등이 있다.

Lock이란?

  • 이름 그대로 걸어 잠 구는 행위를 의미한다.
  • 자원을 사용하고 있는 동안에는 문을 걸어 잠가서 자신 말고는 아무도 못 들어오게 하는 방식이다.
    1. 스레드 A가 공유자원에 Lock을 걸고 사용하는 동안 timer Interrupt가 걸렸다고 가정하자.
    2. B스레드가 수행되고 공유자원을 접근하려고 할 때 Lock이 걸려있을 경우 해제해주기를 기다리게 된다. (busy-waits)
    3. 그리고 다시 A스레드가 스케줄링에 의해 나머지를 다 수행하고 Lock을 해제하게 되면 그제야 B스레드가 수행되는 방식
  • Lock의 구현의 경우 bool 값을 통한 무한루프 문을 통해서 구현할 수 있다.
  • 해제해주기를 기다리는 부분에 무한루프를 빠져나오지 못하기 때문이다.
  • 이처럼 의미 없는 코드를 반복 수행하며 기다리는 것을 busy-waits라고 부른다. (비싼 CPU를 사용하면서 기다리므로..)

문제점

  • Lock의 문제점은 특정한 상황에서 제대로 작동하지 않는 문제가 있다.
  • A스레드가 Lock함수를 실행하여 무한루프를 돌게 하고 변수의 값을 변경하기 전에 인터럽트가 걸려 값을 변경하지 못하고 다른 스레드가 Lock 함수에 들어오게 된다면 두 개의 스레드가 임계 영역에 동시 접근을 하는 상황이 발생.

 

Semaphore는 중요한 내용이므로 다음 포스팅에서 자세히 다루겠습니다. The End.

 

출처

Comments