[컴퓨터 기초] 원자성, 동기화 그리고 교착상태

Robert.Yang·2023년 3월 20일
1

컴퓨터 기초

목록 보기
15/28
post-thumbnail

이 강좌는 널널한 개발자님의 강의를 기반으로 작성한 글입니다.

원자성, 동기화 그리고 교착상태

원자성

동시성을 애기하면 따라오는 단어가 원자성이다. 동시성은 저번에 설명했듯이, A라는 일과 B라는 일이 서로 상호간섭없이 일을 하는 것이 동시성이라고 하는데 만약에 A라는 일과 B라는 일이 어떤 요소를 동시에 접근하고 먼저 선점하려고 노력한다고 보자. 쉽게 애기하면 화장실을 들어가는 예를 들어보자. 화장실을 순서로 표현하면 다음과 같을 것이다.

  1. 화장실을 가고싶어하는 신호를 받는다.
  2. 화장실로 향한다.
  3. 노크를 한다.
  4. 진입을 한다.
  5. 볼일을 보고 물을 내린다.
  6. 손을 씻는다.
  7. 화장실에 나온다.

이런 순서에서 가장 중요한 부분이 3번과 4번과정 사이이다. 3번과정에 노크하는 과정은 화장실이라는 자원을 다른 누군가가 선점하였는지 조사를 하는 행위이며, 진입과정은 화장실이라는 자원을 아무도 선점하지 않았을 때, 진행이된다. 이때, 화장실 문을 잠구듯이 선점된 자원을 Lock을 건다. 그리고 손을 씻는 행위까지 Lock이 걸리다가 화장실을 나오는 순간에 Unlock을 해줌으로 자원을 반납하는 행위를 한다. 즉, Lock이 걸린 부분들 4~ 6번까지의 과정이 원자성이 보장된다고 할 수 있다. 만약 노크를 하는 과정에 누군가가 있다고 하면 wait을 해야하는 과정이 있다. 그런데 만약 집에서 나 혼자 자취를 하는 상황이라면 3번 노크하는 과정은 없을 것이다. 즉, 원자성은 동시성이 발생 안되었을 때는 항상 보장받기 때문에 따로 신경을 안써줘도 된다.

동기화

동기화는 우리가 익숙하게 아는 용어처럼 보인다. 원본이 변경되었을 때 사본을 '동기화'해준다는 표현을 많이 쓸 것이다. 하지만 지금부터 설명하려는 용어는 이것과 다른 용어이다.

동기화란 신호등과 잠금 장치의 필요성과 유사하다.

위의 화장실 예를 들어보면 우린 화장실을 들어갈지 안 할지 노크하는 과정으로 판단한다. 또한 교통체계에서 이 길을 건너도 되는지 아닌지 판별은 신호등으로 판별한다. 즉, 이런 상황을 정리해주는 판별해주는 것을 동기화라고 말할 수 있다. 이런 동기화과정 즉, 이런 판별장치 혹은 장금장치를 OS에서 보통 제공해준다.

교착상태(DeadLock)

휴지가 없어서 못 나가는 자, 나와야 들어가는 휴지 든 자

항상 동기화 개념이 나오면 문제가 되는 것이 논리적인 오류 문제가 나오는데 바로 이런 문제를 교착상태라고 한다. 예를들어보면 내가 화장실이라는 자원을 선점해서 볼일을 보고 있다고 가정하자. 그런데, 이제 휴지로 마무리를 할려고 하는데 휴지가 없다고 가정해보자. 그러면 나는 나가지도 못하고 wait라는 상태가 되고 휴지라는 자원을 기달리게 된다. 즉, 휴지라는 자원이 없어서 나는 기달리게 되는데 밖에 화장실이라는 자원이 필요한 다른 누군가는 휴지라는 자원을 가지고 있다고 해보자. 즉, 화장실 밖 사람은 내가 나오기를 화장실이 Unlock이 되기를 기다라는 것이다. 즉, 지금 상황이 이러지도 저러지도 못하는 상태가 되었는데 이런 상태를 바로 DeadLock이라고 부른다. 이런 상태의 원인 논리적인 하자로 인하여 발생한다.

즉, 우리가 S/W를 개발할 때, 발생가능한 오류나 예외상황을 생각하지 않고 개발할 때 나올 수 있는 상태이다. 또한 프로그램 2개나 동시성 이슈가 터지면서 시스템이 무너지는 현상이 발생할 수 있다. 또한 무언가를 우리가 접근함에 있어서 이것을 접근하는거든 연산을 하든 여러 연산주체가 동시에 접근할때 발생할 문제를 막기 위해서 Lock도 걸고 동기화도 하면서 원자성을 보장받지만 그게 잘못된 특히, 외부자원에 대한 무언가를 요구함으로써 특히 양단간에 의존성이 존재하는 자원들끼리 동시에 무언가 하다가 교착상태에 빠질 수 있다.

profile
모든 것을 즐길 줄 아는 개발자, 양성빈입니다.

0개의 댓글