🔗 정리한 깃허브 주소 (클릭 시 이동)
🧑🤝🧑 공유 자원과 임계 영역
🔎 공유 자원 (Shared Resource)
- 시스템 안에서 프로세스, 스레드가 함께 접근할 수 있는 자원이나 변수
- ex) 모니터, 프린터, 메모리, 파일, 데이터 ...
경쟁 상태 (Race Condition)
: 공유 자원을 두개 이상의 프로세스가 동시에 읽거나 쓰는 상황
🔎 임계 영역 (Critical Section)
- 둘 이상의 프로세스, 스레드가 공유 자원에 접근할 때, 순서 등의 이유로 결과가 달라지는 코드 영역
- 해결하기 위한 방법은 뮤텍스, 세마포어, 모니터가 있음
- 상호배제, 한정대기, 융통성 조건 만족
- 메커니즘 : 잠금(Lock)
💡 임계구역 해결 조건
상호 배제(mutual exclusion) : 한 프로세스가 임계 영역에 들어가면 다른 프로세스는 들어갈 수 없음
한정 대기(bounded waiting) : 특정 프로세스가 영원히 임계 영역에 들어가지 못하면 안됨
융통성(progress flexibility) : 한 프로세스가 다른 프로세스의 일을 방해해서는 안됨
🔐 뮤텍스 (Mutex)
- 프로세스나 스레드가 공유 자원을
lock()
을 통해 잠금 설정하고 사용한 후에는unlock()
을 통해 잠금 해제하는 객체 - 잠금 설정 시, 다른 프로세스나 스레드는 잠긴 코드영역에 접근 불가
- 잠금 / 잠금해제 라는 상태만 가짐
🔐 세마포어 (Semaphore)
- 일반화 된 뮤텍스
- 프로세스나 스레드가 공유 자원에 접근하면 wait() 수행, 해제하면 signal() 수행
wait(P)
: 자신의 차례가 올 때까지 기다리는 함수signal(V)
: 다음 프로세스로 순서를 넘겨주는 함수바이너리 세마포어
- 0, 1 만 가짐
- 뮤텍스와 구현이 유사
💡 뮤텍스 vs 바이너리 세마포어
뮤텍스 : 잠금 기반
바이너리 세마포어 : 신호 기반
카운팅 세마포어
- 여러개의 값을 갖는 세마포어 (최대 허용치 만큼 동시 사용자 접근 허용)
- 여러 자원에 대한 접근 제어
📺 모니터 (Monitor)
- 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 접근에 대해 인터페이스만 제공
모니터큐
를 이용해 공유 자원에 대한 작업들을 순차적으로 처리- 세마포어보다 구현하기 쉬움
- 모니터는 상호 배제 자동
- 세마포어는 상호 배제 명시
🚫 교착 상태 (DeadLock)
- 두개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태
- A -> B -> A
- 프로세스의 흐름을 보면
- 자원 요청(request)
- 자원 받음(allocate)
- 자원 사용(use)
- 자원 해제(release)
=> 모든 프로세스가 1번 상태에 있는 것이Deadlock
🔎 원인 (발생 조건)
상호 배제
(Mutual Exclusion) : 한 프로세스가 자원 독점 -> 다른 프로세스 접근 불가능점유 대기
(Hold and Wait) : 특정 프로세스가 점유한 자원을 다른 프로세스가 요청비선점
(No Preemption) : 다른 프로세스의 자원을 강제로 가져올 수 없음환형 대기
(Circular Wait) : 서로가 서로의 자원 요구 (위의 이미지와 같은 상태)
🔎 해결 방법
예방
(Prevention)- 교착상태가 발생할 수 있는 요구조건이 성립되지 않게 설계
- 자원 낭비가 가장 심함
회피
(Avoidance)- 교착상태 발생 시 적절히 피해가기
은행원 알고리즘
(Banker's Algorithm)
탐지 및 회복
(Detection And Recovery)- 교착상태가 발생할 경우 찾아내어 고침
탐지
: 교착상태 발견 알고리즘, 자원할당 그래프회복
: 교착 상태 프로세스 중지(제거 될때까지 하나씩), 자원 선점(교착 상태에 빠진 프로세스가 필요로 하는 자원을 강제 탈취 => 강종 후 재시작)
📰 Reference
'프로그래밍 > CS' 카테고리의 다른 글
[OS] 프로세스와 스레드 (0) | 2023.06.29 |
---|