Search
Duplicate

원자성이란 무엇인가?

간단소개
동기화를 위한 요소인 semaphore, 그 속에 등장하는 원자성에 대해서 알아보자.
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
Thread
컴퓨터구조
Scrap
태그
9 more properties

원자성이란 무엇인가?

세마포어에 대한 간단한 이해
원자성

1. 세마포어에 대한 간단한 이해

세마포어란 그 이름도 유명하신 네덜란드의 수학자, 에츠허르 다익스트라가 고안한 동기화 기법이다. 세마포어의 목적은 여러 실행 흐름이 동시에 작동하는 동시성 프로그램 환경에서 공유자원에 대한 오염을 방지하는 것이다.
세마포어는 하나의 부호있는 정수 변수(sem)와, 이 변수를 조작하는 두 함수(wait, signal)로 구성된다. sem은 설정된 영역에 대한 진입을 통제한다. sem값 만큼 해당 영역에 진입할 수 있음을 뜻하며, 이는 최초에 변수를 초기화 하는 과정에서 결정할 수 있다.
wait함수는 공유자원에 대한 접근을 통제하는 역할이다. wait함수에 진입하면 먼저 sem의 값을 확인한다. sem의 값이 0보다 크다면, 이는 접근 가능한 상태로, sem의 값을 1 줄이고 영역에 진입한다. 반대로 sem값이 0이면 wait을 호출한 실행 흐름은 block되며 waiting하게 된다. 이를 간단하게 수도코드로 표현하면 다음과 같다.
// 세마포어 변수를 활용한 간단한 wait의 구현, 실제와는 다름. int sem; void wait() { while (sem == 0) // sem의 값을 확인하고, { sleep(time); // sem값이 0이라면 일정 시간동안 대기한다. } sem-- ; return ; }
C++
복사
signal함수는 wait과는 반대로, 공유자원에 대한 접근을 허용하는 역할이다. 공유자원에 대한 접근이 끝나고 호출되며 sem값을 증가시켜서 다른 실행 흐름이 접근 가능하도록 제한을 푸는 역할을 한다.
void signal() { sem++; return (); }
C++
복사
일반적으로 공유자원에 접근하기 전에 wait함수를 호출하여 접근 가능성을 확인하고, 상황에 따라서는 기다린다. 이후 공유자원에 대한 처리를 완료하면 signal함수를 호출하여 다른 실행 흐름에게 진입 가능성을 전달한다.

2. 원자성이란 무엇인가?

1) 원자성 atomicity

원자성의 원자는 우리가 물리에서 베우는 바로 그 원자이다. 원자 atom은 a+tom, 즉 분리할 수 없음을 뜻하는 그리스어 아트모스에서 유래했다. 즉 분절이 불가능한, 온전한 하나를 뜻한다.

2) 원자성은 어떻게 세마포어를 구원하는가?

앞서 세마포어에 대해서 살펴본 바에 따르면, 동기화 문제를 해결하는 wait, signal 두 함수 모두 sem변수에 대한 접근을 시도함을 알 수 있다. semaphore의 문제는 바로 이 sem 변수가 공유자원이라는 데에 있다.
즉 semaphore는 공유자원에 대한 접근을 근본적으로 제거한 것이 아니라, 하나의 공유자원 sem에 동기화의 위험성을 집중시킨 것에 불가능하다. 따라서 본래 의도한 동기화 문제를 해결하기 위해서는 별도의 처리가 필요한데, 그것이 바로 원자성이다.
동기화 문제는 근본적인으로 context switching의 예측불가능함에 기인한다. 우리가 작성한 코드는 컴파일되어 cpu instruction으로 번역되며, context switching은 이들 인스트럭션 사이 어디서든 발생할 수 있다. 원자성은 이를 봉쇄하는 방식으로, 동기화 문제를 예방한다.
원자성을 달성하는 방법은 크게 2가지 방법을 생각할 수 있다. 하나는 context switching을 금지하는 것이다. 일시적이나마 interrupt의 발생을 금지시키면, 즉 애초에 분절될 수 있는 가능성 자체를 봉쇄하는 것이다. 다만, 인터럽트의 발생을 봉쇄하면, 퍼포먼스에 대한 심대한 영향을 미치므로, 남발해서는 안될 것으로 생각된다.
다른 하나는 sem에 대한 값의 확인, 증가 및 감소 등을 모두 하나의 인스트럭션으로 구성하여 분절이 불가능한 특수한 인스트럭션으로 구성하는 것이다. 이 방식의 경우에는 하드웨어 제조사(cpu제조사)와 커널 개발자, 컴파일러 개발자 등 여러 관련자의 합의를 통해서 구현된다.