[운영체제] 임계구역 해결방법

Robert.Yang·2023년 4월 12일
1

OS

목록 보기
13/22
post-thumbnail

이 포스트는 널널한 개발자님의 강의를 듣고 작성한 글입니다.

임계구역 해결방법

많은 사람들을 보면 임계구역을 많이들 힘들어 한다. 그 이유는 임계구역을 어디를 어떤 근거로 선택하는것부터 막히기 때문이다. 사실 이 부분에 대한 것은 완벽하게 경험에 비롯된다. 사실 임계구역 해결방법은 정답이라고 할 수 있는 것이 과연 있는지 잘 모르겠다. 왜냐하면 임계구역 설정하는 것이 경험도 중요하지만 더 중요한 것은 현재 상황이다. 전공서에는 임계구역 해결방법으로 상호배제, 한정대기등등 나와있는 것들이 있지만 그것은 굉장히 일반적인것이고 현재 상황이라는 특수상황에서는 이런 일반적인 것들을 적용하기 힘들다.

간단하게 보면 boolean형 타입으로 전역변수 설정 후 무한루프를 돌고 플래그로 전역변수를 두는 상황이다.

boolean type은 integer형으로 하드웨어 수준에서 CPU가 lock을 걸어준다. 그래서 동기화걱정은 신경 안써도 되고 코드로 볼 때 lock이라는 전역변수로 true, false로 임계구역 lock, unlock을 구현함으로 임계구역을 해결한다. 하지만 실제 특수상황을 봐보자.

C/C++에서 주소록 예제를 보았을 때 주소록을 Single Linked List 자료구조로 이루어져 있다고 볼 때 이런 자료구조는 전역형태로 구현이 된다. 그래서 보통 head같은 것이 전역으로 선언이 되는데 어떤 문제가 발생할까?

프로그래밍 설계를 할때 UI적인것과 service 로직을 나누는 것이 일반적인데 UI부분에서 어느 데이터를 조회 혹은 추가 혹은 수정 혹은 삭제를 하는데 있어서 전역 리스트에 무조건 접근하게 되어있다. 그리고 서비스 부분은 DB와 연결되어있다고 하면 DB에 접근해 데이터를 가져와야 하는데 그럼 여기서 나오는게 socket이고 socket이 나오면 N/W I/O는 기본적으로 비동기 처리를 한다. 그러면 UI부분과 서비스 부분을 각각의 스레드로 처리한다고 하면 이 둘은 동시성을 가진다. 왜냐하면 UI에 동기화버튼이 있어서 DB의 데이터를 select해서 리스트에 반영해야하고 삭제를 눌르면 삭제요청이 서비스쪽으로 날라가야함으로 이 둘은 동시성을 가질 수 밖에 없다. 여기서 문제는 만약에 데이터를 추가하는 동안 다른곳에서 추가를 했다면 간발의 차로 데이터 검색이 온전히 이루어질 수 없을 것이고 더 끔찍한 것은 간발의 차로 어느 한 데이터를 삭제했을때 그 데이터를 접근하여 검색하려 한다면 프로그램은 죽어버린다.

즉, 임계구역 애기가 나오면 반드시 알아야 할 것이 전역자료구조가 되고 추가+삭제+읽기 예를 들어 전체검색을 하는동안 추가+삭제가 일어나면 안된다. 또한 추가하는 동안 삭제도 일어나면 안된다. 이런 경우를 임계구역이라 할 수 있다. 그러면 무엇을 임계구역이라 할 것인가? 일단 제일 흔한 것은 전역적 자료구조에 대해 동시접근할 때 가장 흔히 발생한다. 만약 DB를 쓴다고 하면 DB자체적으로 동시성을 해결해줌으로 신경을 안 써도 되지만 그게 아니고 이런 자료구조형태를 직접 구현해야 한다고 하면 자료구조에 대한 접근은 굉장히 위험한 행위이다. 위에서 설명했던 것처럼 메모리 손상을 야기할 수도 있다. 즉 이를 막기위해 기능적인 단위에 대한 연산을 하나의 단위화하여 원자성을 부여한다.

또한 결론적으로 이를 막기위한 방법은 모니터방법이다. 스레드든 프로세스든 뭔가 동기화 목표달성을 위해 항상 등장하는 것이 Queue다. Queue가 왜 필요하냐면 어떤 스레드가 하나 있는데 스레드 내부에 하는 어떤 연산이 있을 것이고 그 할 처리를 Queue에 담다두었다가 하나씩 꺼내서 처리한다. 그 전에 해야할 일을 외부에서 누군가 추가하는 것이다. 그럼 여기서 Queue도 자료구조형태로 이중연결리스트형태이다.

즉, 주소록 예제에서 각각 UI, 서비스 부분에 Queue를 두어서 UI에서 서비스로의 요청은 서비스 Queue에 담아두고 서비스에서 UI쪽은 UI Queue에 담아두고 이 Queue들을 통제해서 스레드를 동기화시키는 방법이 모니터이다.

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

0개의 댓글