길고 긴 운영체제를 보고 드디어 절반이 왔다. 절반까지 왔으니 요약으로 먼저 시작하겠다!
0. 개요부터 쓰레드까지
1. 운영체제의 개요
- 운영체제가 하는 일: 컴퓨터라는 하드웨어을 잘 쓰기 위한 것 (효율적, 안정적, 확장적, 편리함)
- 그런데, 컴퓨터는 한정된 자원을 여럿이서 사용해야한다. (다중 프로그래밍 방식을 통해)
- 이를 위해 프로세스, 메모리, 파일, 장치, 네트워크, 보안 기능들이 존재한다.
2. 프로세스와 쓰레드
- 위의 기능을 수행하기 위해 나온 개념이 프로세스와 쓰레드이다.
- 폰 노이만 구조에서 프로그램은 프로세스가 되어야 한다. (즉, 메모리에 적재되어야 한다.)
- 이것을 잘하기 위한 방법 : 프로세스 생명 주기와 Context Switching, TCB
- 메모리에 올릴 때는 로더를 통해 메모리 할당
- 하지만, 프로세스를 만드는 것은 어렵다. -> fork(), exec()라는 syscall 함수 이용
- 또한, 프로세스는 굉장히 무거운 개념이기 때문에 프로세스를 쪼개는 쓰레드라는 개념이 등장했다.
결론 : 여러 프로그램을 돌리기 위해 메모리에 어떻게 잘 올리고 잘 Switching할 것인가를 알아본 것!
하지만, 우리가 봐야할 포인트 : '언제', '누구'를 처리하지? → 이를 위해 스케줄링이라는 개념이 도입되었다!
1. CPU 스케줄링의 개요
우리가 일상생활에서 한정된 자원을 공유하면서 사용한다. 예를 들어 우리가 식당에서 밥을 먹을 때에도 한정된 자리에서 밥을 먹기 위해 줄을 서서 기다리거나 예약을 함으로써 우선순위를 받는다. 컴퓨터도 마찬가지이다. 그러면 컴퓨터에서 스케줄링은 어떤 것이 있을까?
1. 컴퓨터 시스템 안에서의 스케줄링
- 작업 스케줄링 : 대기 중인 배치 작업 중에서 메모리에 적재할 작업
- CPU 스케줄링 : 프로세스/스레드 중 하나를 선택하여 CPU 할당
- 디스크 스케줄링 : 디스크 장치 내에서이 입출력 순서 할당
현대의 운영체제는 다중 프로그래밍 방식이다. 다중 프로그래밍 방식에서는 하나의 CPU에서 여러 작업(프로세스)를 돌아가면서 사용해야하기 때문에 어떤 순서로 작업시켜야 할지가 굉장히 중요한 문제이다. 이걸 잘하면 그만큼 CPU의 활용률이 향상되는 것이다!
2. 스케줄링 단계에 따른 구분
1) 고수준 스케줄링 : 시스템 내의 전체 작업 수를 조절하는 것이다. 어떤 작업을 받아들이고 거부할지 결정 (=장기 스케줄링)
2) 중수준 스케줄링 : 시스템의 활성화 된 프로세스 수를 조절하여 과부하를 막는다.
3) 저수준 스케줄링 : 어떤 프로세스에 CPU를 할당할지, 어떤 프로세스를 대기 상태로 보낼지 등을 결정 (=단기 스케줄링)

3. 스케줄링의 Time Slice
타임 슬라이스란 스케줄된 스레드에게 한 번 할당하는 CPU 시간을 말한다. 프로세스는 CPU 사용 + I/O 대기시간으로 나타내는데 너무 긴 쓰레드는 다음 쓰레드에게 영향을 주기 때문에 시간을 쪼개서 그 단위로 스케줄링을 한다. 그렇다면 Time Slice의 기준은 뭘까?
■ Time Slice의 Criteria
1. CPU 활용률 2. 처리능력 3. 공평성
4. 응답 시간 5. 대기 시간 6. 소요 시간
2. CPU 스케줄링의 기본
1. CPU 스케줄링이 실행되는 4가지 상황
1) 스레드가 시스템 호출 끝에 I/O를 요청하여 블록될 때 (CPU 활용률 향상 목적)
2) 스레드가 자발적으로 CPU를 반환할 때(CPU의 자발적 양보)
3) 스레드의 타임 슬라이스가 소진되어 타이머 인터럽트 발생 (균등하게 분배 목적)
4) 더 높은 순위의 스레드가 요청한 입출력 작업 완료 (우선순위 지키기 위한 목적)
2. 스케줄러 & 디스패처
- 스케줄링 관련 코드는 커널 내 코드 형태로 있음
- 스케줄러 : 스케줄러 타이머가 주기적으로 인터럽트를 발생
- 디스패쳐 : Context Switching을 실행하는 커널 코드
→ 스케줄러와 디스패처 모두 실행 시간이 짧도록 작성
3. 선점과 비선점 그리고 우선순위
1) 비선점 스케줄링
- 현재 실행 중인 쓰레드를 강제 중단시키지 않음
- 일단 쓰레드가 CPU를 할당받아 실행을 시작하면, 완료되거나 더 이상 CPU를 사용할 수 없을 때까지 중단을 시키지 않는다.
- 처리율은 뛰어나지 않지만 문맥 교환이 적어 오버헤드가 적다.
2) 선점 스케줄링
- 현재 실행 중인 스레드를 강제 중단 시키고 다른 스레드를 선택한다.
- 처리율은 뛰어나지만 오버헤드가 많다.
3) 우선순위
우선순위도 스케줄링 순서에 영향을 준다. 운영체제마다 우선순위의 기준이 다르다. (어떤 운영체제는 숫자가 높을수록 우선순위가 높다)
4. Starvation(기아) & Aging(에이징)
1) Starvation (기아)
: 스레드가 스케줄링에서 선택되지 못한 채 오랫동안 준비 리스트에 있는 상황
2) Aging(에이징)
: 기아 현상의 해결책
3. 스케줄링 알고리즘
1. 스케줄링 알고리즘의 평가 기준
: 대기 시간, 반환 시간이 주요 기준이 된다.

2. 그리고 좀 많은 알고리즘들...
여기 기다리고 있는 쓰레드들이 있다.

스케줄링을 통해 어떤 순서대로 쓰레드를 실행시킬지 해보겠다.
1) FCFS (선입선출) : 가장 단순한 형태 기본적, 먼저 도착한 쓰레드 먼저 스케줄링한다. (비선점)

T1이 가장 먼저 도착하였으므로 T1이 먼저 실행된 뒤 도착 순서(T2->T3->T4)대로 실행한다.
2) SJF (최단 작업 우선 스케줄링) (비선점, 선점일 경우 : SRTF)
- 예상 실행 시간이 가장 짧은 쓰레드를 선택하여 실행 시간이 짧은 순으로 큐에 삽입한 뒤 큐의 맨 앞에 있는 쓰레드를 선택한다.

- SJF 알고리즘의 경우에는 기아 발생 가능성이 있다.
- 또한, 실행 시간의 예측이 불가하여 거의 사용되지 않는다.
3) RR (라운드 로빈) : 쓰레드들에게 공평한 실행 기회를 주기 위해 큐에 대기 중인 쓰레드들을 타임 슬라이스 주기로 돌아가며 선택

- 선점 스케줄링 기법으로 타임 슬라이스가 작을수록 오버헤드가 커진다.
- 타임 슬라이스가 크면 FCFS, 타임 슬라이스가 적으면 SJF/SRTF에 가깝다.
4) 우선순위 (Priority) : 우선순위에 따라 쓰레드를 실행시킨다.
- 선점, 비선점 둘 다 사용되며 선점 스케줄링이 더 많이 사용된다.
- 기아 발생 가능성이 있으며, 높은 우선순위의 쓰레드일수록 대기 혹은 응답시간이 짧다.

5) HRN 스케줄링 (Highest Response ratio Next)
우선순위 = (대기시간 + CPU 사용시간) / CPU 사용시간이다.
나머지는 SJF 스케줄링 기법과 거의 흡사하다. (하지만, 이 스케줄링 기법은 무조건 비선점이다.)
-> 대기 시간이 긴 쓰레드일수록 우선순위가 높아진다.
6) MLQ (Multi-Level Queue) : 쓰레드들을 n개의 우선순위 레벨로 구분, 레벨이 높은 쓰레드들을 우선적으로 처리
- 고정된 n개의 큐 사용, 각 큐에 고정 우선순위 할당
- 각 큐마다 나름의 기법으로 스케줄링
- 계층 간의 이동이 허용되지 않는 기법이다.
7) MLFQ (Multi-Level Feedback Queue) : MLQ 기법에서 계층 간의 이동이 허용되는 기법이다.
<4. 멀티코어 CPU 스케줄링>
- 멀티코어 CPU 스케줄링의 어려움
: 서로 다른 코어에 걸쳐서 Context Switching이 발생 -> 오버헤드 증가 문제, 코어별 부하 불균형 문제 발생
- 이에 대한 해결책
1) CPU 피닝 : 쓰레드를 동일한 코어에서만 실행하도록 스케줄링 한다.
2) 부하 균등화 기법 : 코어 사용량 감시 쓰레드가 작업을 재할당하여 부하를 분산시킨다.
- 푸시 마이그레이션 : 짧거나 빈 큐를 가진 코어에 다른 큐의 쓰레드를 옮겨놓는 방법
- 풀 마이그레이션 : 코어가 처리할 쓰레드가 없게 되면, 다른 코어의 쓰레드 큐에서 자신이 큐에 가져와 실행시킨다.
끝!
'CS 전공 > OS' 카테고리의 다른 글
[운영체제] 8. 교착상태 (0) | 2024.06.23 |
---|---|
[운영체제] 7. 프로세스와 쓰레드의 동기화 (Synchronization) (0) | 2024.06.23 |
[운영체제] 5. 쓰레드 (1) | 2024.04.20 |
[운영체제] 4. 프로세스 (2) (2) | 2024.04.18 |
[운영체제] 3. 프로세스 (1) (0) | 2024.04.18 |