병행 수행 중인 비동기적 프로세스들이 공유자원에 동시에 접근하게 된다면 문제가 발생할 수 있는데요, 이를 위해 필요한 것이 동기화입니다.
여러 프로세스들이 동시에 데이터에 접근하는 상황에서, 어떤 순서로 데이터에 접근하느냐에 따라 결과 값이 달라질 수 있는 상황을 말합니다.
공유 데이터의 동시접근은 데이터의 불일치 문제를 발생시킬 수 있습니다.
따라서 경쟁상태를 막고 일관성을 유지하기 위해서는 협력 프로세스 간의 실행 순서를 정해주는 메커니즘인 동기화
가 필요합니다.
코드 상에서 경쟁상태가 발생할 수 있는 특정 부분을 말합니다. 즉, 공유데이터를 접근하는 코드 부분을 말합니다.
- 해결방법
상호배제
: 한 프로세스가 임계영역에 들어갔을 때 다른 프로세스는 들어갈 수 없습니다.한정대기
: 특정 프로세스가 영원히 임계영역에 들어가지 못하면 안됩니다.진행
: Critical Section에서 작업 중인 프로세스가 없다면, Critical Section에 진입하고자 하는 프로세스가 존재하는 경우 진입할 수 있어야 한다.
이 세가지 조건들을 만족해야합니다.
이때 사용되는게 동기화 알고리즘이 있습니다
현재 임계구역에 들어갈 프로세스가 어떤 프로세스인지를 한 변수로 나타내어 일치하는 프로세스만 진입하도록 하는 단순한 방식입니다. 하지만 이 알고리즘은 상호배제는 만족하는데 progress는 만족하지 못합니다.
특정 프로세스가 임계구역에 진입할 준비가 되었다는 것을 나타내는 변수를 두어, 다른 프로세스가 임계구역에 진입하려고 한다면 현재 프로세스는 기다리게하는 방법입니다. 근데 이것도 진행 조건을 만족하지 못합니다.
**페테르송 알고리즘**
임계구역을 해결하는 모든 조건을 만족하지만 임계구역의 진입을 계속 기다리면서 CPU와 메모리를 사용하는 Busy Waiting의 문제점이 있습니다.
뮤텍스는 공유자원을 사용하기 전에 설정하고 사용한 후에 해제하는 잠금입니다.
잠금이 설정되면 다른 스레드는 잠긴 코드 영역에 접근할 수 없습니다. 또한 뮤텍스는 하나의 상태만 가집니다.
세마포어는 일반화된 뮤텍스입니다.
즉, 프로세스가 공유자원에 접근하면 세마포어에서 wait()작업을 수행하고 프로세스가 공유자원을 해제하면 세마포어에서 signal()작업을 수행합니다.
세마포어에는 조건 변수가 없고 프로세스가 세마포어 값을 수정할 때 다른 프로세스는 동시에 세마포어 값을 수정할 수 없습니다.
모니터는 둘 이상의 스레드나 프로세스가 공유자원에 안전하게 접근할 수 있도록 공유자원을 숨기고 해당 접근에 대해 인터페이스만 제공합니다.
모니터
는세마포어
보다 구현하기 쉬우며모니터
에서 상호배제는 자동인 반면에,세마포어
에서는 상호 배제를 명시적으로 구현해야한다는 차이가 있습니다.
테이블에 앉은 철학자는 자신의 양쪽에 놓인 수저를 집어야 식사가 가능하다. 근데 만약 동시에 자신의 왼쪽에 있는 수저를 잡는다면? 모두가 아무것도 할 수 없는 deadlock 교착상태가 발생한다.
- 세마포 해결안
- 최대 4명의 철학자만이 테이블에 앉을 수 있도록 한다.
- 한 철학자가 젓가락 두 개를 모두 집을 수 있을 때만 젓가락을 집도록 허용한다. (임계구역 안에서만 젓가락을 집을 수 있다.)
- 홀수 번호의 철학자는 왼쪽 젓가락을 먼저 집고 다음에 오른쪽 젓가락을 집는다. 짝수는 반대로 한다. 이를 비대칭 해결안 이라고 한다.
**교착 상태를 해결한다고 해서 기아 상태를 해결하는 것은 아님을 주의하자.**