⚡ 운영체제 (3)
📌 스레드와 멀티스레딩
⭐ 스레드
🔷 프로세스의 실행 가능한 가장 작은 단위
- 프로세스는 여러 스레드를 가질 수 있다.
- 코드, 데이터, 스택, 힙을 각각 생성하는 프로세스와는 달리 스레드는 코드, 데이터, 힙을 스레드끼리 서로 공유한다. 그 외의 영역은 각각 생성된다.
⭐ 멀티스레딩
🔷 프로세스 내 작업을 여러 개의 스레드, 멀티스레드로 처리하는 기법
- 스레드끼리 서로 자원을 공유하기 때문에 효율성이 높다.
- 새 프로세스 생성 대신 스레드를 사용하는 웹 서버는 훨씬 적은 리소스를 소비하고 작업의 중단 없이 빠른 처리가 가능하다.
동시성
에 장점을 갖고 있다.
- 다만 한 스레드에 문제가 생길 때 연쇄적으로 다른 스레드에도 영향을 끼친다는 단점이 있다.
💡 동시성
서로 독립적인 작업들을 작은 단위로 나누고 동시에 실행되는 것처럼 보여주는 것
📌 공유 자원과 임계 영역
⭐ 공유 자원 (Shared Resource)
🔷 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 메모리, 파일, 데이터 등의 자원이나 변수
🔷 경쟁 상태 (race condition)
- 공유 자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황
- 동시에 접근을 시도할 때 접근의 타이밍이나 순서 등이 결괏값에 영향을 줄 수 있다.
⭐ 임계 영역 (Critical Section)
🔷 둘 이상의 프로세스, 스레드가 공유 자원에 접근할 때 순서 등의 이유로 결과가 달라지는 코드 영역
🔷 임계 영역을 해결하기 위한 방법은 크게 세 가지가 있으며 모두 잠금(lock) 매커니즘을 기반으로 한 상호 배제, 한정 대기, 융통성이란 조건을 만족한다.
🌈 화장실로 알아보는 임계 영역 해결 세 가지 조건
상호 배제
: 한 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없다. (문 잠금)
한정 대기
: 특정 프로세스가 영원히 임계 영역에 들어가지 못하면 안 된다. (나도 똥 좀 싸자!!)
융통성
: 한 프로세스가 다른 프로세스의 일을 방해해서는 안 된다. (나오던 똥도 안나오니까 조용히 해라!)
🔷 임계 영역 해결 방법 세 가지
- 뮤텍스(Mutex)
- 프로세스나 스레드가 공유 자원을
lock()
을 통해 잠금 설정하고, 사용한 후에는 unlock()
을 통해 잠금 해제하는 객체
- 잠금이 설정되면 다른 프로세스나 스레드는 해제 전까지 잠긴 코드 영역에 접근할 수 없다.
- 세마포어(Semaphore)
- 일반화된 뮤텍스로서 간단한 정수 값과 두 가지 함수
wait
(또는 p 함수
), signal(또는 v 함수
)로 공유 자원에 대한 접근을 처리한다.
wait()
: 자신의 차례가 올 때까지 기다리는 함수
signal()
: 다음 프로세스로 순서를 넘겨주는 함수
- 세마포어에는 조건 변수가 없고, 프로세스나 스레드가 세마포어 값을 수정할 때 다른 프로세스나 스레드는 동시에 세마포어 값을 수정할 수 없다.
1) 바이너리 세마포어
- 0과 1의 두 가지 값만 가질 수 있는 세마포어
- 구현은 뮤텍스와 유사하지만 뮤텍스가 잠금 기반이라면 세마포어는 신호 기반이라는 점에서 다르다.
2) 카운팅 세마포어
- 여러 개의 값을 가질 수 있는 세마포어
- 여러 자원에 대한 접근을 제어하는 데 사용
- 모니터
-
둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 해당 접근에 대해 인터페이스만 제공한다.
-
세마포어보다 구현하기 쉬우며 모니터에서 상호 배제는 자동인 반면에, 세마포어에서는 상호 배제를 명시적으로 구현해야 하는 차이점이 있다.
⭐ 교착 상태 (Deadlock)
🔷 두 개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태
- 한 화장실을 두고 먼저 똥 싸려 하는 두 사람과 같다. (양보가 쉽지 않다.)
🔷 교착 상태의 원인
- 상호 배제
- 한 프로세스가 자원을 독점하고 있으며 다른 프로세스들의 접근을 불허한다.
- 3대 1000을 치는 사람이 혼자서 화장실을 독차지하고 들어오는 족족 팬다.
- 점유 대기
- 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하는 상태이다.
- 그 남자 앞에서 오래 참아서 너무 급하다고 무릎 꿇고 빌고 있다.
- 비선점
- 다른 프로세스의 자원을 강제로 가져올 수 없다.
- 3대 1000치는 남자를 제끼고 들어갈 순 없는 법이다.
- 환형 대기
- 프로세스 A는 프로세스 B의 자원을 요구하고, 프로세스 B는 프로세스 A의 자원을 요구하는 등 서로가 서로의 자원을 요구하는 상황을 말한다.
- A: 나 그냥 니네 집에서 쌀래. B: 나는 니네 집에서 싸려 했는데?
🔷 교착 상태의 해결 방법
- 자원을 할당할 때 애초에 조건이 성립되지 않도록 설계한다.
- 교착 상태 가능성이 없을 때만 자원 할당되며, 프로세스당 요청할 자원들의 최대치를 통해 자원할당 가능 여부를 파악하는
은행원 알고리즘
을 사용한다.
💡 은행원 알고리즘
총 자원의 양과 현재 할당한 자원의 양을 기준으로 안정 또는 불안정 상태로 나누고 안정 상태로 가도록 자원을 할당하는 알고리즘
- 국민은행 화장실 청소아주머니: 지금은 화장실 칸이 널널하니 전부 들어가세요.
- 교착 상태가 발생하면 사이클이 있는지 찾아보고 이에 관련된 프로세스를 한 개씩 지운다.
- 3대 1000을 치는 남자가 화장실을 독점하다 검거되었다.
- 교착 상태는 매우 드물게 일어나기 때문에 이를 처리하는 비용이 더 크다. 그래서 현재 운영체제는 이런 상태가 발생하면 사용자가 작업을 종료하게 유도한다. 그 빡치는 '응답없음'의 이유 중 하나가 이런 교착 상태이다.
- ???: 화장실 사람 많다고 관리 직원을 배치해??? 다른 곳에 가서 싸든 바닥에 싸든 하라 하고 직원은 빼!!!
📌 CPU 스케줄링 알고리즘
⭐ CPU 스케줄러와 CPU 스케줄링 알고리즘
🔷 CPU 스케줄러는 CPU 스케줄링 알고리즘에 따라 프로세스에서 해야하는 일을 스레드 단위로 CPU에 할당한다.
- CPU 이용률은 높인다.
- 주어진 시간에 많은 일을 한다.
- 준비 큐(Ready queue)에 있는 프로세스는 적게 유지한다.
- 응답 시간은 짧게 설정한다.
⭐ 비선점형 방식
🔷 프로세스가 스스로 CPU 소유권을 포기하는 방식
- 강제로 프로세스를 중지하지 않고 컨텍스트 스위칭으로 인한 부하가 적다.
- FCFS(First Come, First Served)
- 가장 먼저 온 것을 가장 먼저 처리하는 알고리즘
- 프로세스가 길게 수행 되어
준비 큐에서 오래 기다리는 현상
이 발생할 수도 있다.
💡 Convoy Effects
CPU 사용시간이 긴 프로세스에 의해 사용시간이 짧은 프로세스들이 오래 기다리는 현상으로"호위 효과 ” 라고도 하며, 이로 인해 평균 대기시간이 길어지게 된다.
- SJF(Shortest Job First)
- 우선순위
- 기존 SJF 스케줄링의
starvation
을 보완하기 위해 오래된 작업일수록 우선 순위를 높이는 방법(aging
)을 사용한 알고리즘
⭐ 선점형 방식
🔷 지금 사용하고 있는 프로세스를 알고리즘에 의해 중단시켜 버리고 강제로 다른 프로세스에 CPU 소유권을 할당하는 방식
1. 라운드 로빈(RR, Round Robin)
- 현대 컴퓨터가 쓰는 스케줄링인
우선순위 스케줄링(priority scheduling)
의 일종
- 각 프로세스는 동일한 할당 시간을 주고 그 시간 안에 끝나지 않으면 다시 준비 큐의 뒤로 간다.
- 일반적으로 전체 작업 시간은 길어지지만 평균 응답 시간은 짧아진다.
- 로드밸런서에서 트래픽 분산 알고리즘으로도 쓰인다.
💡 로드밸런서
서버에 가해지는 부하(=로드)를 분산(=밸런싱)해주는 장치 또는 기술,
한 대의 서버로 부하가 집중되지 않도록 트래픽을 관리해 각각의 서버가 최적의 퍼포먼스를 보이게 한다.
2. SRF
- 중간에 더 짧은 작업이 들어오면 수행하던 프로세스를 중지하고 해당 프로세스를 수행하는 알고리즘
3. 다단계 큐
- 우선순위에 따른 준비 큐를 여러 개 사용하고, 큐마다 라운드로빈이나 FCFS 등 다른 스케줄링 알고리즘을 적용한 것
- 프로세스 이동이 안 되므로 스케줄링 부담이 적지만 유연성이 떨어진다.