프로세스 간 동기화 및 통신
6장 프로세스 간 동기화 및 통신
더 깊은 내용
두개이상의 일을 하나의 프로세스가 수행할때 어케 하는가
- 병행 프로세스
두개 이상의 프로세스들이 동시에 수행됨
협력하여 하나의 기능을 수행
협력시 동기화 또는 통신이 필요함
병행 프로세스 처리는 제한된 자원을 공유하기 위하여 상호작용이 필요함 -> 누가 먼저 사용할것인지
상호작용:프로세스는 순서에 맞게 실행되도록 동기화되어야함
상호작용하는 프로세스들을 동기화 하지 않으면?
1.교착상태문제, 2.임계구역문제, 3.결과예측 불가 등이 발생 할 수 있음
반드시 해결해야할 내용
공유자원은 상호 배타적인 사용을 보장해야함,동기화 문제 해결 -> 한번에 같이 할수없음
항상 같은 결과를 얻을 수 있어야함 -> 순서만 다른것
교착상태 해결 -> 둘다 수행 못하지 않게
통신문제 해결
임계구역
중요한지역!
교차로 = 동시에 임계구역에 오면 안되기 때문에 상호 배제를 보장해야함
상호배제 : 하나 오면 다른 하나는 못오게 막는것 - 누가해줌? 운영체제
임계구역에 있는 애는 가능한 빨리 수행되어야함
상호배제의 문제점
다수의 프로세스들이 하나의 공유 자원을 상호 배타적으로 사용
(동시사용불가) => 동시사용하면? 예측할수 없는 결과가 나온다.
상호배제 알고리즘의 요구 조건
- 공유자원에 대해서는 어느 한 순간에 반드시 하나의 프로세스만이 임계구역에 진입해야함(상호배제)
- 무한 대기 하지 않아야함(진행)
- DEADlock, Starvation 이 발생하지 않아야한다.(힌정된 대기, 교착상태)
- 사용중이아니면 임계구역에 진입하기 원하는 프로세스에게 즉시 진입하도록 허용해야함(가능한 빨리)
- 진입한 프로세스는 일정한 시간 내에 임계구역을 빠져나와야함(나와야함)
상호배제 알고리즘
1단계 상호배제 프리미티브(1단계 알고리즘)
- 한순간에 단지 하나의 프로세스만이 임계구역에 진입하도록 보장함
- 프로세스들이 임계구역에서 교대로 수행되는 알고리즘
(한개의 processnumber 변수 사용)
진행순서 : p1,p2 동시수행 -> processnumber 변수에 따라 수행 -> 수행 후 양보
문제점
- 임계 구역 진입을 교대로 진입해야함, 빠른 프로세스가 느린 프로세스를 기다려야함
- 한 프로세스가 임계구역 내에서 중지된다면 다른 프로새스도 수행을 할 수 없음
- 공유변수 설정에 따라 시작되는 순서가 결정됨(무조건 p1이 먼저됨) -> 순서가 정해짐
장점 : 상호배제는 보장됨
2단계 상호배제 알고리즘
-2개의 변수를 가지고 상호배제를 해결하고자함
진행순서 : 둘다 F -> 실행할때 확인 후 T로 변경하고 수행 -> 수행 완료 후 반납
문제점
2개의 프로세스가 동시에 임계구역 진입한 경우가 발생하여 상호배제가 보장되지 않음
3단계 상호배제 알고리즘(2단계에서 문제 해결)
자신의 플래그를 true로 미리 변경함
문제점
데드락(교착상태)-> 둘다 진행 못할 수 있음
-두 프로세스가 while문 이전에 차례대로 true로 변경하면, 내부의 while문에서 무한루프를 돔
4단계 상호배제 알고리즘(1단계와 3단계 결합)
세 개의 변수 사용
processnumber로 순서도 정하고, 미리 자신의 플래그를 true로 변경도 함
하드웨어적임 임계구역 문제해결
일부분을 하드웨어로 바꿈
똑같은데 while부분만 하드웨어로 바꿈
공유변수가 변경되는 동안 다른 인터럽트 발생을 허용하지 않도록 설정하면됨
더 이상 분할이 불가능한 특별한 하드웨어 명령->하드웨어칩이 1개
하드웨어 칩 부분
수행순서 : 칩이 F->T로 변경되고 수행후 다시 F로 변경
세마포어(임계구역에서 프로세스들의 동기화 방법) 정의 -> 다른점이 있다면 공간차지에 대한 이야기
임계구역에 들어가기전에 P수행 들어간 후 에 V수행
p = wait(진입하기 위한 연산)
v = signal(대기중인 프로세스를 깨우기 위한 연산)
s = 세마포어, 접근제어(0, 1)
세마포어를 이용한 생산자 소비자(데이터의 생산자/소비자) 문제해결
생산자 = 버퍼를 채우는사람
소비자 = 버퍼에서 쓰는사람
버퍼에다가 데이터를 넣고 빼는 행위
상호배제를 위한
데이터가 꽉찼는데 채우고 싶다를 방지
데이터가 없는데 꺼내고 싶다를 방지
생산자는 빈 공간을 체크 -> 다른놈 못들어 오게 막고->채우고-> 반납 -> 데이터 증가
소비자는 빈 공간을 체크 -> 다른놈 못들어 오게 막고->지우고-> 반납 -> 데이터 증가꺼내고
만약 공간이 없다면 empty(빈공간이 0)에서 정지되어있다.
버퍼에 다 채워져있다면
세마포어를 활용한 읽기/쓰기 문제해결
한놈이 쓰기 쓸동안 아무도 못들어옴
여러명이 읽기를 쓸수 있음 하지만 쓰기는 못들어옴
다 읽었으면, 반환
모니터란?
-세마포어와 비슷하지만 제어하기가 용이함 왜? 객체지항 개념을 넣었기때문에
구조 :
x.wait()
다른 프로세스를 중단시킴= 세마코어P와 유사 x는 S와 유사
x.signal()
중단된 프로세스를 재개시킴= 세마코어V와 유사
ring_buffer_has_space
생산자 프로세스가 확인= 세마포어empty와 동일
ring_buffer_has_data
소비자 프로세스가 확인= 세마포어full과 동일
세마코어랑 모두 비슷하고 class형식일 뿐이다.
세마코어가 뭔지 왜나왔는지 PSVEF알고
모니터가 뭔지 정도만 알기
메시지란? 별로 안중요
프로세스간의 통신 및 동기화에 적합한 비교적 단순한 메커니즘
- 공유변수 이용은 공유변수의 변목현상 문제발생
->이를 프로세스간 직접 통신해서 상호간에 순서를 정하여 동기화 문제를 해결하고자함
메세지 정의
- 송신측 프로세스와 수신측 프로세스 간에 교환될 수 있는 정보의 집합
- 분산운영체제에서 메시지 메커니즘의 사용이 보편화 되어 있음
형식
송신,수신,길이,형식,실제 데이터
고려사항
직접할것인가 간접할것인가
직접 :
송신측이 특정 수신측을 설정해야하고
반대로 메세지 수신을 희망하는 수신측은 송신측 설정
간점 :
우편함이라고 부름
모든 프로세스 간의 메세지 교환은 이 우편함을 통하여 수행됨
복사문제 :
메세지 복사가 기억장치와 cpu사이클을 방해
버퍼링 문제 :
송신은 일단 버퍼에 보내고 수신이 나중에 받음
길이 문제 :
고정길이 : 구현은 쉽지만 성능은…
가변길이 : 성능을 좋지만 구현이 어려움