OS 공부 - CPU 스케줄러, Preemptive, Non-preemptive, context switch
os 공부 시작
os공부를 해보고자한다. 스터디에서 매주 공부하고 내용을 발표하기로했다. os 공룡책 (Operating System Concepts) 바탕으로 하는 자료와, 인터넷 강의로 진도를 나가보고자 한다.
5챕터 부터 정리한다.
배운점
CPU 스케줄링
멀티프로그램드된 운영체제에서 필수이다.
cpu는 한순간에 오직 하나의 프로세스만 실행할 수 있다.
cpu가 어떤 한 프로세스 실행을 마치고 다른 프로세스를 실행한다면 어떤 프로세스를 선택할 것인가.
cpu 스케줄링은 cpu가 다음에 수행할 프로세스의 실행 순서를 정하는 것
CPU-입/출력 버스트 사이클(CPU-I/O Burst Cycle)
프로세스 시행은 CPU실행과 입/출력 대기의 사이클로 구성된다.
프로세스들은 CPU가 프로세스를 실행하는 상태와 입/출력을 위한 상태를 교대로 왔다갔다한다.
CPU burset상태: 프로세스의 명령어를 수행하는 상태
I/O burst상태: 프로세스가 사용자로부터 입력받기를 기다리거나 명령어 수행 결과 출력하는 상태
I/O burst상태에서 CPU는 대기기하는 시간낭비 발생 , 이 상태에서 다른 프로세스를 사용하면 효율이 커질 것이다.
CPU Utilization 높이기 위해 CPU 스케줄링 필요.
CPU 스케줄러(CPU Scheduler)
운영체제는 준비 완료 큐에 있는 프로세스들 중에서 하나를 선택해 실행해야한다.
스케줄러는 실행 준비(ready)가 되어 있는 메모리 내의 프로세스들 중에서 선택하여, 이들 중 하나에게 CPU를 할당한다.
CPU 스케줄러는 실행 준비가 되어 있는 프로세들 중에서 하나를 선택하여 CPU에게 할당해주는 역할
이 메모리를 로드되어 있는 프로세서 중에 어느놈에게 CPU할당해 줄거냐
(ready)(wait 상태 고려 x)
ready 상태에 있는 프로세스를 allocation 해줄 수 있는 프로세스 선택하는 것: CPU 스케줄링 문제
CPU에 running 중인 프로세스, ready 큐(Linked List, BinaryTree..) 에 ready 된 프로세스들이 있다. 어느것을 선택할거냐?
큐: FIFO Queue : Fisrt-in First-out [o-o-o-o->cpu]
priority Queue: 우선순위를 정해준다. 우선순위를 부여하는 방법은 뭔가?
비선점 스케줄링 Non-preemptive
비선점 스케줄링은 CPU가 현재 실행중인 프로세스가 완료될때까지 다른 프로세스들은 대기하는 스케줄링.
오직 현재 실행중인 프로세스가 종료되거나 입/출력을 위하여 대기 상태(wating state)로 들어가는 경우에만 다른 프로세스들이 실행
어떤 CPU를 프로세스가 딱 선점하고 나면 그 프로세스가 릴리즈 할때까지(자발적으로 나올때까지) terminating 하거나 switching 해가지고 그 CPU를 그 프로세스가 쓰도록 내버려 둔다.
선점 스케줄링 Preemtive
선점 스케줄링은 CPU가 현재 프로세스를 실행중일때 스케줄러에 의해 현재 프로세스의 CPU 제어권을 다른 프로세스한테 넘기는 스케줄링. 실행중인 프로세스가 다른 프로세스에게 CPU 제어권을 선점당하면 Running 상태에서 Ready 상태로 변하고 입/출력을 위하여 대기 중인 상태에서 다른 프로세스가 CPU를 선점하면 Ready 상태로 전환됨
스케줄러가 그 어떤 이유에 의해 CPU 선점하고 있는 프로세스를 쫓아 낼 수 있다.
Preemptive VS Non-preemptive
선점형 비선점형
쫓아낼수있다. 못 쫓아낸다.
강제 자발적
Decision Making
1. running 상태 -> waiting 상태
2. running 상태 -> ready 상태
3. waiting 상태 -> ready 상태
4. 프로세스 terminate
1,4 의 경우 CPU 쓰다가 io를 하면 자발적 wait : non-preemptive
2,3 의 경우: running -> waiting 쫓아냄
waiting -> ready 갔을때 우선순위가 높으면 쫓아내고 들어갈수
있다.
non-preemtive 자발적으로 나오기 전까지 문제는 안 생기지만 비효율적이다.
dispatcher: 어떤 프로세서를 변경할지 선택하면 실제로 스위칭 해줌
CPU 코어에 컨트롤을 넘겨주는 것
running 상태를 waiting or ready 상태로 쫓아내고 그 다음 상태로 바꿔주는 것: context switch
문맥을 교환하는 일 (Context Switching)
사용자 모드(user mode)로 전환하는 일
프로그램을 다시 시작하기 위해 사용자 프로그램의 적절한 위치로 이동(jump)하는 일
디스패처는 모든 프로세스의 문맥 교환 시 호출되므로, 가능한 한 빨리 수행되어야 한다.
하나의 context를 하나의 process에서 다른 process를 넘겨줌
user mode로 바꿔준다.
새로운 process의 적당한 위치를 resume 해준다.
context switch
하나의 프로세스가 CPU를 사용중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기위해 이전의 프로세스상태(context)를 보관하고 새로운 프로세스의 상태 적재하는 작업
이 context switch 해주는 모듈이 : dispatcher
스케줄러: 선택해주는 것
디스패쳐: 실제로 스위칭
dispatcher는 엄청빨라야함
P0의 컨텍스트 세이빙과 PCB1의 context restoring 하는 시간 => 짧아야한다.
PCB에 context 저장됨
스케줄링 목표:
1.CPU utilization(CPU 이용률): CPU가 안 놀게 하겠다. to keep the CPU as busy as possible, : CPU 이용률은 0에서 100%까지 이름. 실제 시스템에서는 40%~90%까지의 범위를 가져야 한다.
2.Throughput(처리량) : 단위 시간 내에 process 완료하는 숫자를 높이자, 단위 시간당 완료된 프로세스의 개수
3.Turnaround time(총처리 시간): 실행해서 completion(종료) 까지submint(제출)하고 종료되는 시간까지 이 시간 최소화
메모리에 들어가기 위해 기다리며 소비한 시간 + 준비 완료 큐에서 대기한 시간 + CPU에서 실행하는 시간 + 입/출력 시간
4.waiting time(대기 시간): 어떤 process가 ready queue에서 대기하는 시간 최소화 ready time의 합을 최소화 시키자
5.response time(응답 시간): response하는 시간을 최소화 시키겠다. (응답속도) 하나의 요구를 제출한 후 첫번째 응답이 나올 때까지의 시간
CPU 이용률과 처리량을 최대화하고 총처리 시간, 대기시간, 응답시간을 최소화하는 것이 좋음