프로세스 동기화프로세스 동기화바쁜 대기 쓰는 상호배제1) 인터럽트 끄기 → 비추천(권한 남용)2) 락 변수 사용(Lock Variables) → 실패(조건 1_상호배제 x)3) 엄격한 교대(Turn) → 실패(조건 3_x)4) Peterson의 해법 → 성공(Turn 변형)5) TSL 명령 (Lock + 하드웨어)바쁜 대기 안 쓰는 상호배제1) 바쁜 대기의 단점2) Sleep and Wakeup → 실패(Race Condition 발생)3) 세마포어4) 뮤텍스5) 모니터하루 정리
프로세스 동기화
프로세스 동기화
- 정의) 여러 개의 프로세스나 스레드가 공유 자원을 사용할 때, 경쟁 상태를 막기 위한(데이터의 무결성과 일관성을 보장하기 위한) 기법
- 관련 용어)
- 경쟁 상태(Race Condition)
- 정의) 둘 이상의 프로세스가 동시에 공유데이터에 접근할 때 누가 언제 수행되느냐에 따라 결과 바뀌는 상황
- 예시) 스풀러 디렉터리
- 방지 조건)
- 상호 배제 제공해 어느 두 프로세스도 동시에 임계구역에 있지 못하게 함
- CPU 개수나 속도에 대한 가정을 하지 않음
- 임계구역 밖의 프로세스는 다른 프로세스를 block시키면 안 됨 (임계구역에 들어가려는 다른 프로세스 막으면 안되서)
- 임계구역에 들어가려고 무한히 기다리는 프로세스 없어야 함
- 상호 배제(Mutual Exclusion)
- 정의) 한 프로세스가 공유데이터 읽거나 쓰고 있으면 다른 프로세스들은 똑같은 일을 수행하지 못하도록 하는 것
- 임계 구역(Critical Region)
- 정의) 공유메모리에 접근하는 프로그램의 코드 부분.
- 공유메모리 그 자체 아님.
- 바쁜 대기(Busy Waiting)
- 정의) 변수가 특정 값이 될 때까지 계속 검사하는 것
- 특징)
- CPU 시간이 낭비되기에 기다리는 시간이 짧을 것으로 예상될 때만 사용함
- 스핀 락 : 바쁜 대기를 사용하는 락
바쁜 대기 쓰는 상호배제
1) 인터럽트 끄기 → 비추천(권한 남용)
- 정의) 임계구역에 진입한 직후 모든 인터럽트를 비활성화하고, 떠나기 직전 다시 활성화함
- 인터럽트 비활성화하면 process switch가 일어나지 않아서 상호배제가 제공됨
- 단점) 사용자 프로세스에게 인터럽트를 껐다 켤 수 있는 권한 주는 거라 바람직 x
2) 락 변수 사용(Lock Variables) → 실패(조건 1_상호배제 x)
- 락 변수 : 임계구역에 프로세스가 있고 없고를 나타내는 공유변수.
- 0이면 임계구역에 프로세스 없음.
- 1이면 임계구역에 프로세스 있음.
- 정의) 임계구역 들어가기 전에 락 변수를 살펴봄.
- 0 → 1로 변경하고 임계 영역에 들어감.
- 1 → 0이 될 때까지 기다림
- 단점) Lock 검사 후 값 변경하는 사이에 스위치 일어나면 상호배제 깨짐
3) 엄격한 교대(Turn) → 실패(조건 3_x)
- Turn 변수 : 임계구역에 진입할 순번 나타내는 공유변수.
- 0이면 A차례
- 1이면 B차례
- 정의) 임계구역 들어가기 전에 turn 변수를 살펴봄.
- A
- 0 → 1로 변경하고 임계 영역에 들어감.
- 1 → 0이 될 때까지 기다림
- B
- 1 → 0로 변경하고 임계 영역에 들어감.
- 0 → 1이 될 때까지 기다림
- 장점) 조건1_상호배제 제공함
- 단점) 조건3 위반
- 비임계구역의 프로세스가 다른 프로세스를 차단함
- 예시)
- B가 임계구역 실행 후 turn=0으로 변경함
- A는 임계구역 실행 후 turn=1로 변경함
- B는 비임계구역 실행 중임
- A가 B보다 먼저 임계구역 실행을 원한다면?
- A는 B가 다시 임계구역 실행해서 turn을 0으로 변경해줄 때까지 block됨
4) Peterson의 해법 → 성공(Turn 변형)
- interested[N] : 임계구역에 들어가고 싶은 의사를 표현 (관심 있음을 표현)
- interested[0]의 값이 true면 프로세스 0이 임계구역에 들어가고 싶은 의사를 표현한 것
- 정의) 임계구역 들어가기 전에 turn 변수와 interested 변수를 살펴봄
- 장점) 엄격한 교대 요구하지 않으면서 상호 배제 제공함
5) TSL 명령 (Lock + 하드웨어)
- 정의) Lock 변수 값을 register에 복사해두고 lock 변수값을 무조건 1로 세팅한 후, register에 복사해둔 이전 Lock값을 살펴봄
- 0 → 1로 변경하고 임계 영역으로 들어감
- 1 → 0이 될 때까지 대기함
- TSL 명령
- test and set lock
- lock 값 읽어서 레지스터에 저장하고 lock에 0이 아닌 값을 저장함
- TSL 명령 수행 끝날 때까지 메모리 버스 잠겨서 다른 어떤 CPU도 메모리 접근 불가함
- vs. 인터럽트 비활성화 → 인터럽트 끄는 것은 다른 CPU 못막음
→ 하나의 연산. 분할 불가능. 연산 중간에 process switch 일어날 수없음
- 특징)
- 하드웨어 도움 받음
- 분할 불가능함(indivisible)
- 단점)
- 프로세스가 enter_region, leave_region을 제때 호출안하면 상호배제 실패함
바쁜 대기 안 쓰는 상호배제
1) 바쁜 대기의 단점
- 임계구역 진입이 허용되지 않을 때 루프를 돌며 CPU 시간 낭비
2) Sleep and Wakeup → 실패(Race Condition 발생)
- 정의) 임계구역 진입이 허용되지 않을 때 바쁜 대기 안하고, block함
- Sleep
- 호출자를 block 상태로 만드는 시스템 호출
- 다른 프로세스가 Wakeup 시스템 호출로 깨워줄 때까지 block 상태에 머물게 됨
- Wakeup
- 깨울 프로세스를 인자로 가져 깨워서 ready 상태로 보내주는 시스템 호출
- 사용 예) 생산자-소비자 문제
- 정의) 생산자는 공유버퍼에 아이템 계속 생산하고, 소비자는 아이템 계속 소비하는 개념
- 두 프로세스가 고정된 크기의 버퍼를 공유함
- 생산자가 정보를 버퍼에 넣고, 소비자는 정보를 버퍼에서 꺼내옴
- 해결)
- 생산자가 새로운 아이템을 버퍼에 넣고 싶은데 버퍼가 이미 꽉 찬 경우 소비자가 버퍼에서 아이템 꺼내갈 때까지 sleep 상태가 됨
- 소비자가 아이템 버퍼에서 꺼내오고 싶은데 버퍼에 아무것도 없는 경우 생산자가 버퍼에 아이템 넣어줄 때까지 sleep 상태가 됨
- 따라서, 생산자는 아이템 넣었을 때 소비자를 wakeup 해줘야하고, 소비자는 아이템 꺼내 제거했을 때 생산자를 wakeup 해줘야함.
- 단점
- 정의) 아직 sleep 상태가 아닌 프로세스에게 wakeup 전송하는 경우 wakeup이 소실되어 둘다 영원히 잠들게 되는 결과 초래됨
- 원인) sleep() 콜하기 직전에 process switch 일어나면(교묘하게 스케줄링 되면) sleep() 안된 상태로 wakeup() 받는 상황 발생함
3) 세마포어
- 정의) 미래를 위해 미리 호출한 wakeup 회수를 저장해주는 변수 타입
- 다익스트라가 제안한 새로운 변수 타입
- 정수 변수
- 0 → wakeup이 저장 안됨
- 양수값 → 하나 이상의 wakeup이 대기 중
- 장점) 경쟁조건 방지, 동기화 문제 해결
- 세마포어 연산의 원자성이 보장되어 연산 시작하면 연산 완료되거나 프로세스가 잠들 때까지 다른 프로세스가 세마포어에 접근 불가
- 연산
- down(P)
- up(V)
- mutual exclusion 제공하는 법: down 연산 → critical region → up 연산
- up, down연산은 원자성 보장되어 실행 중 중단되지 않음.
- 일반적으로 인터럽트 비활성화하는 시스템호출로 구현됨
- 따라서 down에서 세마포어 값 검사한 후 감소시키는 중간에 process switch가 일어나지 않음.
- 사용 예) 생산자-소비자 문제
4) 뮤텍스
- 정의) 세마포어의 개수 세는 능력이 빠진 단순화된 버전
- 언락: 임게구역 사용 가능 → 0
- 락: 임계구역 사용 안됨 → 1
- 특징)
- 상호배제용으로 씀
- mutex_lock, critical region, mutex_unlock 순으로 사용
- 뮤텍스는 세마포어가 아님
- 스레드 패키지에 유용
- 프로시저 레벨이 아닌 스레드 레벨에서 부르는 코드
5) 모니터
- 정의) 모듈 또는 패키지에 모아진 프로시듀어, 변수, 자료구조의 모음
- 특징)
- 높은 수준의 동기화 프리미티브
- 상호배제 제공
- 모니터의 자료구조는 모니터 내부의 프로시듀어만 직접 접근 가능하고,
- 프로세스는 모니터의 프로시듀어를 호출함
- 모니터 프로시듀어 호출 시 다른 프로세스가 모니터에서 활동 중인지 검사함
- 활동 중인 프로세스 O → 다른 프로세스가 모니터에서 나올 때까지 중단됨
- 활동 중인 프로세스 X → 모니터에 진입함
- 상호배제 구현은 이진 세마포어나 뮤텍스 사용해 컴파일러가 함. (잘못될 가능성↓)
단 하나의 프로세스만 한 순간에 모니터에서 활동 가능
- 단점
- 컴파일러에서 지원해야 함
- 분산 환경에서 적용할 수 없음
- 코드
하루 정리
TIL 작성하기
소공
과제하기
자소서 쓰기!!!!!!
CS 스터디 준비
4월 7일은 내 생일이었다. 생일을 맞아 오랜만에 그동안 서로 바쁘단 이유로 못 만나던 친구들을 모두 만났다. 1월, 2월, 3월 세 달 동안 정말 휴식 없이 달렸었는데 4월은 좀 푹 쉰 거 같다.
동아리 지원서를 쓰기도 했고, 전공 과제도 하긴 했지만, 개발은 조금 쉬었다. 잔디가 3일 연속으로 비어 있는 게 좀 속상하지만,,, 푹 쉬었으니 됐다. 요즘 스타텁 일로 개발하는 건 private 레포라서 더 잔디가 빈다,, 내가 담당한 스프링 파트 레포 따로 팔 땐 public으로 파야겠다,,,,
