Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

원자화

signal(신호)의 도착에 의해 작업이 중단되지 않음을 의미한다. 어떤 자원 s가 있고, s를 변경할 수 있는 p와 v연산이 있을 때, 한 순간에 오직 하나의 프로세스만이 s를 변경할 수 있는 것을 의미한다.

원자화된 연산. 한 순간에 하나의 프로세스만 a의 값을 변경할 수 있다.
a = a + 1;

원자화 되지 않은 연산. sleep(1)는 시그널의 도착에 의해 작업이 중지 될 수 있으므로 원자화 조건을 만족하지 않는다. 또한 여러 개의 프로세스가 a를 변경할 수 있다.
b = a + 1;
sleep(1);
a = b;

프로그램의 원자화를 보장하기

원자화는 세마포어(:12)와 thread(:12)의 mutex(:12), 파일:::잠금(:12), 레코드:::잠금(:12)등으로 보장할 수 있다.

세마포어

세마포어의 작동원리를 보여주는 의사코드다.
p(s)
{
    if(s!= 0)
        s의 값을 1만큼 감소 한다.
    else
        p 연산을 하며 s가 0이면 대기한다.
}

v(s)
{
    s의 값을 하나 증가.
}
임계 영역, 즉 하나의 프로세스만이 접근할 수 있는 코드 영역에 진입하기 위해서, p(s)로 접근이 가능한지를 확인한다. 만약 p(s)가 1이라면 임계 영역에 다른 프로세스가 없음으로 임계 영역에 접근할 수 있음을 의미한다. 임계영역에 접근을 하면 p는 s의 값을 1만큼 감소한다. 이제 s가 1이 아니므로 다른 프로세스는 접근할 수 없는 상태가 된다. 임계 영역에서 연산을 마친 프로세스는 v(s) 함수를 호출해서 s를 1만큼 증가시키고 임계영역을 벗어난다. s가 1보다 크므로 임계 영역 밖에서 기다리던 프로세스는 임계영역에 진입할 수 있게 된다.

p함수는 기다리기 위해서 v함수는 (진입해도 된다는)신호를 보내기 위해서 작동함을 알 수 있다. 실제 p와 v는 wait와 signal의 네델란드에서 나온 말이다. 세마포어는 네덜란드의 이론가 E. W. Dijkstra가 제안한 프로세스 동기화 방법이다. 이때문에 대부분의 용어가 영어에서 유래된데 반해, 세마포어 관련 용어는 네델란드에서 유래된 것으로 보인다.

위의 코드는 세마포어의 작동원리를 보여주는 의사 코드로 아래의 아래의 조건을 충족해야 한다. (물론 세마포어는 아래의 조건을 충족하고 있다.)
  • busy wait 상태에 놓이면 안된다. 위 코드에서 p함수는 busy wait 상태에서 s 값을 검사한다.
  • 위의 연산은 원자화 되어야 한다.