본문 바로가기
프로그래밍 기초/운영체제

프로세스 동기화(Process Synchronization) - 1

by junsday 2017. 6. 5.

프로세스 동기화(Process Synchronization)란?


공유 데이터에 대한 동시 접근은 데이터 불일치(data inconsistency)를 초래할 수 있다. 따라서 데이터 일관성 유지를 위해서는 협력 프로세스들이 순차적으로 수행되는 것을 보장하는 메커니즘이 필요하다.


기계어 명령의 특성 : 원자성(atomicity), 분리불가능(Indivisible)

-> 한 기계어 명령어 실행도중에 인터럽트(interrupt) 받지 않음



1. Atomicity(원자성)이란?

원자단위 연산(Atomic Operation)은 실행중에 중단(inturruption)하지 않는, 하나 이상의 순차적인 기계어 명령(machine instruction)으로 이루어져있다. 대개 2개이상의 기계어 명령으로 이루어진 경우에는 원자단위 연산이라 하지 않는다. 명령 실행 도중에 운영체제가 다른 작업을 위해, 현재 진행중인 명령을 중지(suspend)시킬 수 있기 때문이다. 만약 여러 명령들이 원자성을 가지게 하고싶다면, locking등의 동기화 방법을 사용해야 한다. 단, 하나의 기계어 명령은 항상 원자성을 갖는다는 점을 기억하자(CPU는 하나의 기계어 명령을 수행하는 도중 멈추지 않는다). 이로서 알수있는 것은, 어떤 C++ 구문이 하나의 기계어 명령으로 표현되어진다면 그것은 자연적으로 원자성을 갖는다(naturally atomic)는 것이며, 이러한 경우, 굳이 명시적인 동기화 방법을 사용하지 않아도 된다는 것이다.


2. 그럼 어떤 C++ 구문이 자연적으로 원자성을 가지는가?
하드웨어 종류에 따라 c++구문을 처리하는 방식이 다를 수 있기 때문에, 공통적인 규칙이라고 할 수 있는 사항은 많지 않다. 많은 서적에서 ++, -- 단항 연산자들이 int, pointer에서 원자성을 갖는다고 적어놓는다. Dennis Ritchie와 Brian Kernighan이 C를 처음 설계했을 때 이 연산자들을 추가했는데, 이를 통해 많은 기기들이 지원하는 빠른 INC(increment) 어셈블리 지시어(directive)의 장점을 살리고자 했기 때문이었다. 하지만, C나 C++ 표준에는 이러한 연산자들이 원자성을 가진다는 보장은 하지 않는다. 또한 Ritchie와 Kernighan은 C언어 설계에 있어 원자성 보다는 수행 속도에 중점을 두었다. 따라서 컴파일러의 결과를 확인하지 않은 채, ‘특정 C++구문이 원자성을 가질것이다’라는 가정을 해서는 안된다. c++구문에서는 한줄로 표현되는 구문이 실제로는 길고 복잡한 기계어 명령으로 이루어 질지도 모른다.

*참고 : 종종 혼용되긴 하지만, 기계어와 어셈블리어는 동일한것이 아니다. 어셈블리어는 inc와 add와 같은 니모닉(mnemonic) 예약어(keyword)를 사용하지만, 기계어는 CPU가 이해할 수 있는 바이너리 형태의 코드를 사용한다. 즉, 어셈블리어는 인간이 알아볼 수 있도록 한, 기계어의 표현방법인 것이다.


출처 : http://frontjang.info/entry/C에서의-원자성Atomicity설명과-그-예




다음은 기계어 수준의 데이터 접근을 나타낸 그림이다.

명령 수행 과정 (1)

-> 1 - 2 - 3 - A - B - C  또는  A - B - C - 1 - 2 - 3

결과 : data = 2


명령 수행 과정 (2)

-> 1 - 2 - A - B - C - 3

결과 : data = 1



명령 수행 과정 (2)에서 확인할 수 있듯이 공유 데이터에 대한 동시 접근은 데이터 불일치를 일으킬 수 있다.

따라서 명령 수행 과정 (1)과 같이 프로세스들이 순차적으로 실행될 필요가 있다. 이러한 메카니즘을 프로세스 동기화라고 한다.


댓글