8. 상호배제와 동기화
■ 상호배제
- 병행 프로세스에서 프로세스 하나가 공유 자원 사용 시 다른 프로세스들이 동일한 일을 할 수 없도록 하는 방법이다.
- 읽기는 동시에 접근 가능
- 그러나 쓰기 작업의 경우, 동시에 하면 데이터 손상이 나타남.
■ 동기화 :
- 공유 자원을 동시에 사용하지 못하게 해서, 실행을 제어하는 방법
- 프로세스 간 동기화 라고 부를 수 있다.
■ 임계 영역 : 공유 메모리를 말함.
■ P1이 사용중이다. 그래서 P2가 진입이 불가능. 이러한 개념을 프로세스 간 동기화(상호배제) 라고 함
■ 생산자 소비자 프로세스
- 여러 프로세스가 공통 작업을 수행하기 위해, 서로 협력하는 대표적인 예시
- 병행처리 예시
- 협력관계의 대표적인 예시
■ 버퍼
- 위의 가운데 문자, 어셈블리 코드, 적재 모듈에 대해
- 생산자가 만든 생산물을 저장하는 공간. 즉 버퍼라고 부름
■ 버퍼의 구조
- 가운데 빙글빙글 돈다. 즉, 유한적인 공간, 버퍼를 효율적으로 쓰는 모습이다.
- 회전초밥집을 생각하자. 음식을 만들면 컨베이어 벨트에 올린다. 그러면 소비자는 그것을 사용해서 쓴다. 비어진 공간이 요리사 앞으로 오면 새로운 요리를 올린다. 이런 개념으로 생각하면 될듯 하다.
- 생산자와 소비자 간의 동기화가 잘된 구조라고 생각하자.
■ 버퍼에 대한 문제
- a는 가득찬 상태다. 생산자가 데이터를 생산해도 저장할 공간이 없음
- c는 소비자가 쓸 데이터가 없는 상태다.
- 결론 : 생산자, 소비자 사이에 동기화가 제대로 이루어져야 함. 안그러면 문제가 생김.
■ 공유 버퍼에 상호배제 개념을 넣어, 생산자와 소비자 문제를 해결!
- 하나 생산하면, 생산된 값을 가져갈 수 있도록,
- 생산하지 않았다면 가져가지 못하도록 대기!
- 가득 생산하면 더이상 버퍼에 프로세스들이 생산하지 못하도록!
■ 왼쪽 그림 : 생산자 입장
- 가득참? 쓰지마
■ 오른쪽 그림 : 소비자 입장
- 비어있음? 쓰지마!
■ 생산자, 소비자 프로세스를 프로그램 알고리즘으로 나타낸 것.
■ 왼쪽 그림 : 생산자
- 버퍼 사이즈와 같을 때까지는 계속 실행함.
- 그러나 카운터가 버퍼사이즈보다 오버될 경우(버퍼 꽉찼어!), while문을 빠져나오게 된다. 즉 중단이다!
■ 오른쪽 그림 : 소비자
- 버퍼 사이즈 내에서 계속 사용한다. 즉 맨 아래 counter --; 를 보다시피 계속해서 소비를 함
- 위와는 반대로 0 이하가 되면, 즉 아무것도 없을 경우(버퍼가 싹 비었어!) 는 while문을 빠져나가게 된다. 중단이다!
■ 경쟁상태
- 병행 프로세스 중에 발생하는 오류로 보면 된다.
- 즉, 마지막 프로세스가 쓴 값, 결과로 인해 발생하는 오류라고 생각하자.
- 이를 해결하기 위해서는, 적절한 순서가 보장되어야 해결된다.
■ 경쟁상태
- 위에서 언급했다시피, 적절한 순서가 보장되어야 해결된다.
- 읽기를 먼저, 그다음 쓰기 명령을 수행하게 한다.
■ 결론
- 경쟁상태를 방지하기 위해서는, 동기화가 필요하다.
- 동기화를 제대로 수행하기 위해서는 상호배제와 임계영역이 필요하다.
■ 임계영역 :
- 임계영역은 공유 메모리가 참조되는 프로그램의 부분으로 다수의 프로세스가 접근 가능한 영역이면서 한 순간에 하나의 프로세스만 사용할 수 있는 영역을 의미한다.
- 임계자원을 이용하는 그 영역을 말한다. 즉, 다수의 프로세스가 접근은 가능함. 하지만 하나가 점유하면 다른 프로세스는 사용하지 못한다.
■ 진입영역
- 특정 프로세스가 임계영역으로 들어가기 전에 먼저 요청해야하는 곳이다.
■ 출구영역 (잔류영역)
- 특정 프로세스가 임계영역을 다쓰고 나가는 곳이다.
■ 임계영역을에서 사용하는 코드 라고 생각하자
■ 진입영역
- 계속 대기중인 곳이라 생각하자. 즉, 아직 임계영역에 진입하지 못한 상황
- /* 임계영역 */ : 임계영역 안으로 들어와서 수행하는 모습이다. 코드는 없는 모습. 그냥 해당 위치라고 보자.
■ 탈출영역
- 나가는 곳!
■ 임계영역의 3가지 조건
■ 상호배제 : 작업중임. 들어오지마!
■ 진행
- 임계영역에 진행중인 프로세스가 없음. 즉 비어있음.
- 다수의 프로세스들이 임계영역으로 들어와서 작업을 할려고 함
- 이 때, 프로세스 선정 알고리즘에 의해서 다음 임계영역에서 수행할 프로세스를 선정하는 과정이 필요하다.
- 그리고 비어있는 임계영역은 프로세스들을 대기시키며, 무한정 미룰 수 없다.
■ 제한된 대기
- 한 프로세스가 임계영역 사용을 계속해서 기다리게 하는 것이 아닌 것을 보장한다고 생각하자.
- 즉, 내가 요청하면, 얼마 후에는 반드시 임계영역에 들어갈 수 있다!
■ 데커 알고리즘
- 임계영역을 설명하고자하는 대표적인 프로그램 알고리즘.
■ 프로세스 간의 동기화를 위해 만들어진 데커알고리즘의 예제다. 살펴보기만 하자.
■ 세마포 :
- 프로세스 간의 동기화를 해결하기 위한 개념.
- P, V 연산과 관련됨.
■ 세마포어 개념:
- 세마포를 의미하는 S는 표준 단위 연산 P(프로세스 대기하게 하는 wait 동작, 임계 영역에 진입하는 연산)와 V(대기 중인 프로세스 깨우려고 신호 보내는 signal 동작, 임계 영역에서 나오는 연산)로만 접근하는 정수 변수이다.
■ 세마포어 정의
■ 세마포 공유자원 접근관리 모습
- 공유자원이 있을 떄, wait 기다리고 singal 신호를 보내고
- 신호를 통해 임계영역에 들어가게 되면, 해당하는 정보 공유 자원을 사용한다.
- 다 쓰면 나간다.
- 그리고 누군가 쓸 땐 다시 기다리는 형태다.
■ 세마포 동기화
- signal, wait 라는 값을 통해 동기화를 하고 있는 모습이다.
■ 학습정리
병행 프로세스간 상호작용
- 병행 프로세스에서 프로세스 하나가 공유 자원 사용 시 다른 프로세스들이 동일한 일을 할 수 없도록 하는 방법이다.
임계영역
- 임계영역은 공유 메모리가 참조되는 프로그램으 부분으로 다수의 프로세스가 접근 가능한 영역이면서 한 순간에 하나의 프로세스만 사용할 수 있는 영역을 의미한다.
세마포어
- 세마포를 의미하는 S는 표준 단위 연산 P(프로세스 대기하게 하는 wait 동작, 임계 영역에 진입하는 연산)와 V(대기 중인 프로세스 깨우려고 신호 보내는 signal 동작, 임계 영역에서 나오는 연산)로만 접근하는 정수 변수이다.