동시다발적으로 실행되는 많은 프로세스는 서로 데이터를 주고받으며 협력하며 실행될 수 있습니다. 예를 들면 워드 프로세서에는 사용자로부터 입력을 받는 프로세스와 맞춤법을 검사하는 프로세스, 입력한 내용을 화면에 출력하는 프로세스 등이 있습니다.
이 프로세스는 각기 다른 독립적인 프로세스이지만 공동의 목표를 위해 협력하는 존재입니다.
이렇게 협력하는 프로세스들은 아무렇게나 실행되서는 안됩니다. 올바른 실행을 위해서는 동기화가 필수입니다.
프로세스 동기화란 프로세스들 사이의 수행 시기를 맞추는 것을 의미합니다. 수행 시기란 다음 두 가지를 의미합니다.
- 1.실행 순서 제어 : 프로세스를 올바른 순서대로 실행하기
- 2.상호 배제 : 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기
※프로세스뿐만 아니라 스레드도 동기화 대상입니다.
예를 들어 Book.txt에 있는 내용을 읽는 Reader 프로세스와 쓰는 Writer 프로세스가 있을 때 두 프로세스는 무작정 실행되서는 안 되고 Writer 프로세스가 Book.txt에 내용을 저장하고 Reader프로세스가 읽어야 합니다. 즉, Book.txt안에 내용이 존재해야 Reader 프로세스가 실행을 할 수 있는 겁니다.
이렇게 프로세스를 올바른 순서대로 실행하는 것이 실행 순서 제어를 위한 동기화입니다.
예를 들어, 계좌에 10만원이 있을 때, 프로세스 A는 2만원을 넣을려고 하고, 프로세스 B는 5만원을 넣을려고 합니다. 만약에 동기화 없이 A,B가 각 각 실행이 된다면 A는 현재 잔액 10만원에서 2만원 더해 12만원이 잔액이 될 것이고 B는 현재 잔액 10만원에서 5만원을 더해 잔액이 15만원이 될 것 입니다. 당연히 이렇게 되면 안 되겠죠?
그렇기 때문에 이 경우에는 A가 먼저 계좌에 접근해서 2만원을 넣을 때는 다른 프로세스가 리소스(계좌)에 접근하지 못하게 하고 A가 모든 실행을 끝내고 리소스를 놓아 준 다음에 B가 실행이 되어야 합니다.
즉 이렇게 동시에 접근해서는 안 되는 자원에 동시에 접근하지 못하게 하는 것이 상호 배제를 위한 동기화입니다.
공유 자원이란 앞서 본 예시에서처럼 '계좌의 잔액' 이라는 공동의 자원을 두고 잡업을 했습니다. 이러한 자원을 공유 자원이라고 합니다. 공유 자원은 전역 변수, 파일 ,입출력장치, 보조기억장치 등이 될 수 있습니다.
그리고 이렇게 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역을 임계 구역이라고 합니다.
즉, 두 개 이상의 프로세스가 임계 구역에 접근하려고 한다면 둘 중 하나는 대기해야 합니다.
이때 잘못된 실행으로 인해 여러 프로세스가 동시에 임계 구역 코드를 실행하여 문제가 발생하는 경우가 있습니다. 이를 레이스 컨디션이라고 합니다.
즉 race라고 하는 것은 경쟁하는 것이기 때문에 두 개의 프로세스가 하나의 자원을 놓고 사용하려고 경쟁한다고 보면 됩니다.
운영체제는 따라서 이런 문제가 발생하지 않도록 다음과 같은 원칙을 지켜야 합니다.
한 프로세스가 임계 구역에 진입 했다면 다른 프로세스는 임계 구역에 들어 올 수 없다.
임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
한 프로세스가 임계 구역에 진입하고자 한다면 그 프로세스는 언젠가는 임계 구역에 들어갈 수 있어야 한다. ( 즉 무한정 대기 해서는 안 된다.)