프로세스 스케줄링
- 다중 프로그래밍 목적
- CPU 이용을 최대화하기 위해 항상 어떤 프로세스를 실행하는 것
- CPU 이용을 최대화하기 위해 항상 어떤 프로세스를 실행하는 것
- 시분할의 목적
- 프로세스들 사이에서 CPU 코어를 계속 교체하는 것
← 각 프로그램이 실행되는 동안 사용자가 상호작용 할 수 있도록 하기 위해
- 프로세스들 사이에서 CPU 코어를 계속 교체하는 것
- 시분할과 다중 프로그래밍의 목적을 달성하기 위해 프로세스 스케줄러가 존재
- 프로세스 스케줄러 : 코어에서 실행 가능한 프로세스 중 하나를 선택
- 각 CPU 코어는 한 번에 하나의 프로세스만 실행 가능
→ 코어보다 많은 프로세스가 있는 경우, 초과 프로세스는 코어가 사용 가능해지고,
다시 스케줄 될 때까지 대기
- 현재 메모리에 있는 프로세스 수를 다중 프로그래밍 정도라고 함
- 현재 메모리에 있는 프로세스 수를 다중 프로그래밍 정도라고 함
- 각 CPU 코어는 한 번에 하나의 프로세스만 실행 가능
- 프로세스 스케줄러 : 코어에서 실행 가능한 프로세스 중 하나를 선택
- 프로세스는 대부분 2가지로 나눌 수 있음
I/O 바운드 프로세스
: 계산에 소비하는 것보다 I/O에 더 많은 시간을 소비하는 프로세스CPU 바운드 프로세스
: 계산에 더 많은 시간을 사용하여 I/O 요청을 자주 생성하지 않는 프로세스
스케줄링 큐
- 프로세스가 시스템에 들어가면 준비(ready) 큐에 준비 상태가 되어 CPU 코어에서 실행되길 기다림
- 큐(queue)는 일반적으로 연결 리스트로 저장
- 준비 큐 헤더에는 리스트의 첫 번째 PCB에 대한 포인터 저장,
각 PCB에는 준비 큐의 다음 PCB를 가리키는 포인터 필드가 포함
- 프로세스에 CPU 코어가 할당되면 프로세스는 잠시 실행되고,
종료되거나 인터럽트 되거나 특정 이벤트 발생까지 기다린다. → 기다리는 곳이 위의 대기 큐
- 프로세스가 디스크 같은 장치에 I/O 요청 → 장치는 프로세서보다 상당히 느림
→ 프로세스는 I/O가 사용 가능해질 때까지 대기 큐에서 대기
- 프로세스가 디스크 같은 장치에 I/O 요청 → 장치는 프로세서보다 상당히 느림
큐잉 다이어그램
- 프로세스의 일반적인 표현은 아래의 큐잉 다이어그램으로 나타냄
- 원 : 큐에 서비스를 제공하는 자원
- 화살표 : 시스템의 나타나는 프로세스 흐름
- 준비 큐와 대기 큐의 집합의 두 가지 유형의 큐가 제시되어 있음
- 과정
- 새 프로세스는 처음에 준비 큐에 놓임
- 프로세스는 실행을 위해 선택되거나 또는 디스패치 될 때까지 기다림
- 프로세스는 실행을 위해 선택되거나 또는 디스패치 될 때까지 기다림
- 프로세스에 CPU 코어가 할당되고 실행 상태가 되면 아래의 이벤트 중 하나가 발생
입출력 요청
: 프로세스가 I/O 요청을 공표한 다음 I/O 대기 큐에 놓일 수 있다.- 대기 상태에서 준비 상태로 전환된 다음, 다시 준비 큐로 들어감
- 대기 상태에서 준비 상태로 전환된 다음, 다시 준비 큐로 들어감
타임슬라이스 종료
- 대기 상태에서 준비 상태로 전환된 다음, 다시 준비 큐로 들어감
- 대기 상태에서 준비 상태로 전환된 다음, 다시 준비 큐로 들어감
자식 프로세스 생성
새 자식 프로세스 생성 후, 자식의 종료를 기다리는 동안 대기큐에 놓임인터럽트를 기다림
: 인터럽트가 만료되어 프로세스가 코어에서 강제로 제거되어 준비 큐로 돌아감
- 새 프로세스는 처음에 준비 큐에 놓임
- 프로세스는 종료될 때까지 해당 주기를 반복
- 종료 시점에 모든 큐에서 제거되고 PCB 및 자원이 반환
CPU 스케줄링
- CPU 스케줄러의 역할 : 준비(ready) 큐에 있는 프로세스 중 하나를 선택해서 CPU 코어를 할당하는 것
- I/O 바운드 프로세스는 I/O 요청을 대기하기 전에 몇 밀리초 동안만 실행 가능
- CPU 바운드 프로세스는 오랜 시간 동안 CPU 필요하지만, 스케줄러는 장기간 부여할리가 없음
→ 프로세스에서 CPU를 강제로 제거하고 실행될 다른 프로세스를 스케줄 할 가능성이 높음
→ CPU 스케줄러가 더 자주 실행되는 건 맞음, 하지만 100밀리 초의 실행 간격은 가지고 있음 - 스와핑 - 중간 형태의 스케줄링
- 메모리에서 프로세스를 제거하여 다중 프로그래밍의 정도를 감소시키는 것이 유리함
- 프로세스를 메모리에 다시 적재될 수 있으며 중단된 위치에서 실행을 계속할 수 있다.
- 스와핑은 일반적으로 메모리가 초과 사용되어 가용공간을 확보할 때만 필요
문맥 교환
- 인터럽트는 운영체제가 CPU 코어를 현재 작업에서 뺏어 커널 루틴을 실행할 수 있게 한다.
- 이러한 연산은 범용 시스템에서 자주 발생
- 인터럽트가 발생하면, 시스템은 인터럽트 처리 후에 문맥을 복구할 수 있도록
현재 실행 중인 프로세스의 현재 문맥을 저장할 필요가 있음
- 인터럽트 발생 시 CPU의 현재 상태를 저장하는 작업을 수행하고,
연산을 재개하기 위해 상태 복구 작업을 수행 - 문맥은 프로세스의 PCB에 표현
- 문맥은 CPU 레지스터의 값, 프로세스 상태, 메모리 관리 정보 등을 포함
- 문맥은 CPU 레지스터의 값, 프로세스 상태, 메모리 관리 정보 등을 포함
문맥교환
- 이전의 프로세스의 상태를 보관하고 새로운 프로세스의 보관된 상태를 복구하는 작업
← CPU 코어를 다른 프로세스로 교환하기 위해 - 교환 속도는 기계마다 다르다.
- 메모리의 속도, 반드시 복사되어야 하는 레지스터의 수, 특수 명령어의 존재 등에 좌우됨
- 전형적인 속도는 수 마이크로초까지 분포되어 있음
- 문맥교환 발생 시 과정
- 커널은 과거 프로세스의 문맥을 PCB에 저장
- 실행이 스케줄 된 새로운 프로세스의 저장된 문맥을 복구
- 문맥 교환 시간은 순수한 오버헤드
- 문맥 교환 진행될 동안 시스템은 아무런 유용한 일을 하지 못함
- 문맥 교환 시간은 하드웨어의 지원에 크게 좌우됨
- 운영체제가 복잡할수록, 문맥 교환 시 해야 할 작업의 양이 더 많아짐
- 이전의 프로세스의 상태를 보관하고 새로운 프로세스의 보관된 상태를 복구하는 작업