손영배 블로그 누구나 쉽게 이해하고 습득하기
비동기식 병행 실행 본문
상호배제 mutual exclusion
한마디로 말해서 : 어느 한 스레드가 공유 변수를 갱신하는 동안에는 다른 스레드들이 동시에 접근하는 일을 막는다.
예) 사용자로부터 이메일을 하나 수신할 때 마다 프로세스 전체에 공유하는 변수 mailCount의 값이 1씩 증가한다. 이때 두 스레드가 이 변수의 값을 동시에 증가시키려고 할 때
static int mailCount = 99;
첫번째 스레드가 mailCount(99)잃어서 1증가시키고 100을 저장하려고 대기하는 순간
두번째 스레드가 접근해서 아직 변하지 않은 mailCount(99)를 잃어서 1증가시켜 자신도 100이라는 숫자를 저장하려고 한다.
두개의 스레드가 접근해서 mailCount는 100이 되버린다. 만약에 상호배제 되었다면 101이 되어야 맞는 것이다. 단순히 이메일 관리에서는 하나 잘 못 카운트 한개 별 개 아닌 문제가 될 수 있지만 항공기 운행을 통제하는 시스템, 중대한 임무를 수행하는 미션 크리티컬 응용프로그램에서는 막대한 인명 피해를 초래한다.
멀티스레딩 사례연 2 : 생산자/소비자
생산자 : 데이터를 생산해 공유 객체에 저장
소비자 : 공유 객체에서 데이터를 읽어 사용, 소비
예)프린터의 스풀링 기능에서 생산자/소비자 관계의 예를 찾아 볼 수 있다. 문서 작업이 버터(보통 파일)에 데이터를 차곡차곡 쌓으면, 데이터는 프린터에서 문서를 출력할 때마다 소비된다.
오류상황
생산자가 공유 버퍼에 쓰는 모든 값을 정확히 한 번씩 순서대로 소비해야 되는데, 스레드들을 동기화하지 않았다. 즉, 각 스레드가 자신의 일을 수행할 때 서로 협력하지 않는다. 그러므로 소비자가 이전 데이터를 소비하기도 전에 생산자가 새 값을 넣어 이전 데이터를 덮어쓰거나, 생산자가 다음 값을 넣기 전에 소비자가 같은 값을 여러 번 읽는 오류가 발생 할 수 있다.
임계영역 critical section
한마디로 : 스레드가 수정 가능한 공유 데이터에 접근할 때 스레드가 임계영역에 있다고 말한다. 그래서 임계영역안에서 공유 데이터에 대해 이뤄지는 작업들을 배타적 접근권한 상호배제가 잘 이뤄져야 한다.
임계영역에 있는 스레드가 종료되면 운영체제는 종료 정리 작업termination housekeeping을 수행할 때 상호 배제를 해제해 다른 스레드들이 임계 영역에 들어올 수 있게 해야 한다.
while(true){
이메일 수신
enterMutualExclusion()
mailCount 증가
exitMutualExclusion()
}
하드웨어/ 소프트웨어 적 해결책들이 있다. 예시는 시스템에 하나의 프로세스만 있다고 가정하고 한다. 실제로는 여러 개가 동시에 접근 할 수도 있다.
상호 배제 문제에 대한 소프트웨어 해결책
데커의 알고리즘 Dekker's Algorithm
'OS' 카테고리의 다른 글
교착상태 deadlock (0) | 2019.10.24 |
---|---|
CPU 스케줄러 (0) | 2019.10.03 |
프로세스와 스레드 기초 (0) | 2019.10.03 |
프로세스 스케줄러 (0) | 2019.10.02 |