교착상태란?
- 1번째 스레드는 2번째 쓰레드가 들고 있는 객체의 락이 풀리기를 기달리고, 2번째 쓰레드도 1번째 쓰레드가 들고 있는 객체의 락이 풀리기를 기다리는 상황.
- 즉, 모든 쓰레드가 "무한 대기 상태"
교착상태의 4가지 조건
1. 상호배제 : 한번에 한 프로세스만 공유 자원 사용. 공유 자원에 대한 접근 권한이 제한된다. 자원 양이 제한되어 있어도 교착상태 발생 가능.
2. Hold and Wait(점유대기) : 공유 자원에 접근권한을 가진 프로세스가 양보하지 않고 갖고 있는 상태로 다른 자원 접근 권한 요구.
3. 선취(비선점) : 한 프로세스가 다른 프로세스의 자원 접근 권한을 강제로 취소할 수 없다.
4. Circular Wait(순환대기) : 두 개 이상의 프로세스가 자원 접근을 기다리는데, 그 관계에 사이클이 존재.
교착상태 방지
https://velog.io/@jw0111/OS-데드락Deadlock이란
- 위 4가지 가운데 1개를 제거하면 된다.
- 대부분 순환대기를 막는데에 초점이 맞춰져있다.
- Single Instance의 경우
- Resource Allocation Graph(RAG)를 이용하여 cycle을 탐지합니다.
- Multiple Instance의 경우
- Banker's Algorithm의 Needs를 Request로 바꾸어 Needs 가 더 많을 경우 데드락이 발생한 것이므로 해당 원리를 이용하여 탐지합니다.
- 회복 방법
- Kill
- 모든 데드락과 연관된 프로세스를 종료합니다.
- cycle 이 제거될 때까지 프로세스를 하나씩 종료합니다.
- 리소스를 많이 요구하는 것부터 종료합니다.
- Rollback
- safe state로 가서 프로세스를 재수행합니다.
- context 값(registers, stack...)이 보존되어있어야 재수행이 가능한데, 이 값들은 check point 에 저장해둡니다.
- 그러므로 check point에서만 재수행이 가능합니다.
- Kill
사용자 수준 쓰레드와 커널 수준 쓰레드 차이
- Thread : 프로세스 내 작업 단위
- Thread 중 커널 수준 쓰레드 & 사용자 수준 쓰레드로 종류가 나뉜다.
커널 수준 쓰레드
- 주기억 장치에 여러 개가 적재되어 CPU 할당을 기다리며 동작.
- CPU에서 인터럽트 발생으로 현재 작업중인 프로세스가 Block 되고 다른 프로세스로 변경할 때, CPU 내 재배치 레지스터에 다음 실행할 프로세스 정보들로 교체하고 캐시를 비움 (= Context-Switching).
위 Context-Switching 중일 때는 CPU가 일을 못한다. 그래서 성능에 문제가 생김.
사용자 수준 스레드
- 쓰레드를 관리하는 라이브러리로 인하여 사용자 단에서 생성 및 관리되는 쓰레드.
- 커널이 관리하지 않고 커널이 이 쓰레드를 알지 못한다.
Q&A
Q1. 쓰레드는 프로세스 단위인데 운영체제 레벨인 커널 안이 아니라 커널 밖에서 생성하여 이용할 수 있는가?
A1. 전부 커널 내부에 있지만, 커널의 통제권 안에 있지 않은것. 즉,커널이 커널모드/사용자모드 중 사용자 모드인것.
Q2. 사용자 수준 쓰레드도 있는데 왜 이형태가 커널 수준 쓰레드 모델인 것인가?
A2. 프로세스는 기본적으로 1개 이상의 쓰레드를 가진다. 해당 프로세스에 대한 사용자의 입,출력을 받을 수 있도록 하는 작은 커널 통제권 밖의 작은 스레드일 뿐이다.
그러니 사용자 입출력이 필요로 한 프로세스는 실제로는 두개 이상인 스레드를 가지게 되는 것이다.
(입출력이 필요없는 스레드는 하나 이상 스레드를 가지게 되는 것)
따라서, 사용자 레벨에서 스레드 전용 라이브러리를 이용해서 여러 스레드를 생성한 것.
ex) JAVA에서 쓰레드 함수를 이용하면 위와 같이 된다.
사용자 수준 쓰레드
장점) Context-Switching이 없고, 쓰레드 교체로 인한 오버헤드 발생 X.
단점) 인터럽트를 당하면, 커널 수준 쓰레드와 다르게 사용자 수준의 쓰레드들은 모두 함께 Block 된다.
Q3. 쓰레드는 프로세스 내 작업 단위인데, 사용자 수준의 쓰레드는 어떻게 프로세스 없이 쓰레드만 생성 할 수 있나?
A3. 사용자 수준의 쓰레드는 생성할 때마다 프로세스 단위로 생성함(프로세스 겸 쓰레드). 이러한 특징 때문에 사용자 수준의 쓰레드는 커널 쓰레드와 달리 Multi-Thread 방식으로 동작하기 어렵다.
외부단편화와 내부 단편화
내부 단편화는 메모리 공간을 사용하고 남은 메모리가 있으면 내부 단편화라고 한다.
ex) 그러니까 내가 500원이 있는데 400원만 쓰고 100원 남으면 이걸 잔돈이 남았다고 하는데
운영체제에서는 이것을 메모리 공간으로 본다면, 내부단편화라고 한다.
메모리 사용하려고 하는데 못쓰면 그게 바로 외부 단편화다.
- 전체 메모리에서, 사용하고자 하는 메모리가 사용가능한것과 불가능한것이 있는데,
사용하고자 하는 메모리양 보다 사용가능한 메모리가 적으면, 사용이 불가능하므로 이를 외부 단편화라고 한다.
출처 : https://itgenerations.tistory.com/60
컨텍스트 스위칭(Context-Switching)
작업의 주체가 현재 Context를 잠시 중단하고 다른 Context를 실행하는 것을 Context Switching이라 한다.
* Context : (동작, 작업들의 집합)을 (정의, 관리, 실행)하도록 하는 (최소한의 상태, 재료, 속성)을 포함하는 (객체, 구조체, 정보)이다.
CPU의 코어가 1개(자원이 1개)라면 동시에 단 하나의 프로세스만 실행이 가능하다.
-> CPU scheduling을 통해 하나의 CPU를 여러 작업들이 공유할 수 있게 cpu 시간을 나누어 작업을 수행한다.
이때, 프로세서가 지금까지 실행되던 프로세스(A)를 중지하고 다른 프로세스(B)의 PCB정보를 바탕으로 프로세스(B)를 실행하는 것을 Process Context Switching이라고 한다.
동일한 프로세스 속에서 하나의 쓰레드(a)를 중지하고 다른 쓰레드(b)의 TCB정보를 바탕으로 쓰레드 (b)를 실행하는 것을 Thread Context Switching이라고 한다.
참고로, Process는 하나이상의 Thread로 동작하기 때문에 Context Switching의 최소 단위는 TCB이다.
Process 컨텍스트 스위칭 vs Thread 컨텍스트 스위칭
Thread context switching이 발생할 경우 processor는 stack영역의 주소와 registers 주소를 포함한 thread의 context 정보만을 변경하면 된다.
Process context switching이 발생할 경우 processor는 thread의 context뿐만 아니라 process의 context까지 모두 변경해야 한다.
Swapping
https://hyeo-noo.tistory.com/101
'SW마에스트로 13기 > CS스터디' 카테고리의 다른 글
TCP, UDP, VPN(Virtual Private Network) (0) | 2022.10.05 |
---|---|
동기와 비동기/프로세스 동기화/메모리관리전략/가상메모리/캐시의 지역성/자료구조 (1) | 2022.10.04 |
프로세스와 쓰레드 (0) | 2022.09.27 |