synchronization
synchronization
동시다발적으로 실행되는 프로세스들은 서로 데이터를 주고 받으며 협력하며 실행 될 수 있습니다.
예를 들어서 메모장 프로세서에는 사용자로부터 입력을 받는 프로세스, 내용을 화면에 보여주는 프로세스 등 다양한 프로세스들이 있습니다.
이들은 각기 다른 프로세스들이지만 공동의 목표를 위해 서로 협력하는 존재입니다.
이렇게 협력하여 실행되는 프로세스들은 아무렇게나 실행되서는 안되고, 실행 순서와 자원의 일관성을 보장하기 위해 반드시 동기화가 되어야합니다.
프로세스 동기화는 프로세스들 사이의 수행 시기를 맞추는 것을 의미합니다.
크게 2가지가 존재합니다.
실행 순서 제어
예를 들어 메모장에 관한 프로세서 A(Open),B(Writer),C(Save)가 있다고 가정 해보겠습니다.
메모장에 어떠한 내용을 저장할때를 가정하면, 프로세서 A,B,C는 아무렇게나 실행이 되면 안됩니다.
즉, 메모장을 열어서 쓰고 저장한다고 가정을하면, A프로세스가 실행이되어야 B프로세스가 실행이 되고, 그리고 C프로세스가 실행이 되기 때문입니다.
이렇게 동시에 실행되는 프로세스를 올바른 순서대로 실행하는 것이 첫 번째 프로세스 동기화입니다.
상호배제
상호배제는 공유 불가능한 자원의 동시사용을 피하기 위해 사용되는 알고리즘 입니다.
간단히 예를 들어서 A프로세스는 박스에 있던 사과 15개중에서 5개를 가져가고, B프로세스는 박스에 다시 사과를 10개 넣는다고 가정해보겠습니다.
프로세스 A와 B의 실행되는 과정은 간략하게 이렇습니다.
프로세스 A
- 박스안에 있는 사과의 갯수를 읽어들입니다.
- 읽어들인 사과의 갯수에서 5개를 뺍니다.
- 남아있는 사과의 갯수를 저장합니다.
프로세스 B
- 박스안에 있는 사과의 갯수를 읽어들입니다.
- 읽어들인 사과의 갯수에 10개를 더합니다.
- 남아있는 사과의 갯수를 저장합니다.
위의 프로세스대로 잘 실행이 되면 결론적으로 박스에 남아있는 사과의 갯수는 20개가 될 것 입니다.
하지만 동기화가 제대로 이루어지지 않는 경우 엉뚱한 값인 25개가 저장됩니다.
이렇게 엉뚱한 값이 저장된 이유는 A,B 프로세스 모두 공유자원을 사용하는데, A프로세스가 끝나기도 전에 B프로세스가 공유 자원인 남아있는 사과의 갯수를 읽어버렸기 때문입니다.
A,B프로세스를 올바르게 사용하기 위해서는 한 프로세스가 공유 자원(박스에 있는 사과 갯수)에 접근했을때 다른 프로세스는 기다려야합니다.
이렇게 동시에 접근해서는 안되는 자원인 공유 자원에 동시에 접근하지 못하게 하는 것이 상호 배제를 위한 동기화입니다.
공유 자원과 임계 구역
공유 자원은 여러개의 프로세스들이 공동으로 사용하는 자원을 뜻합니다.
공유 자원은 전역 변수가 될 수도 있고, 입/출력 장치, 파일, 보조기억 장치가 될 수 있습니다.
그리고 공유 자원중에 두 개이상의 프로세서들이 동시에 실행하면 문제가 발생하는 자원이 존재합니다.(앞서 말한 사과안의 박스)
이렇게 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역을 임계 구역이라고 합니다.
임계 구역은 두 개 이상의 프로세스가 진입하고자 하면 둘 중 하나는 무조껀 대기 해야합니다.
먼저 앞서 들어간 프로세스의 작업이 마무리 되면 이떄 대기하던 프로세스가 임계 구역에 진입 합니다.
만약에 잘못된 실행으로 인해 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생한다면, 이를 레이스 컨디션 이라고 합니다.
결론
동시 다발적으로 실행되는 프로세스들은 서로 데이터를 주고 받으며 협력할 수 있습니다.
이렇게 실행되는 프로세스들 중에서 서로 협력하는 프로세스들이 있고, 이런 프로세스들은 무분별하게 실행이 되어서는 안됩니다. 그래서 이렇게 서로 협력하는 프로세스들은 반드시 동기화가 되어야 합니다.
동기화에는 실행 순서제어가 있고, 상호 배제를 위한 동기화도 있습니다.
상호 배제를 위한 동기화는 3가지의 원칙을 반드시 지켜야 합니다.
- 상호베제
- 하나의 프로세스가 임계구역에 있다면, 다른 하나의 프로세스는 대기 해야 한다.
- 진행
- 임계 구역에 프로세스가 하나도 없다면 임계 구역에 진입하고자 하는 프로세스는 임계구역에 들어갈 수 있어야 한다.
- 유한대기
- 대기하고 있는 프로세스는 무한정 대기해서는 안된다.