스케쥴링 정리

lsh950223·2020년 6월 3일
0

안녕하세요 C++ 공부하고있는 대학생입니다. 이번에는 OS에서 스케쥴링 부분에 대해 정리하고자 합니다.

다중프로그래밍 의 목적
=> CPU 이용률을 최대화 하기위해 항상 실행 중인 프로세스를 가지게 한다.

스케쥴링의 역할

하나의 프로세스는 전형적으로 입출력 요청이 완료되기를 기다려야 할 때 까지 실행되는데 (CPU와 입출력 버스트의 교차 참고) , 이렇게 되면 CPU는 아무런 일을하지 않는 상태가 됩니다. 이 때 대기시간이 낭비되어 어떤 유용한 작업도 수행하지 못하게 됩니다.
그래서 다중프로그래밍에서 이렇게 남는시간을 활용하려고 시도합니다.
어떤 프로세스가 대기해야 할 경우 운영체제는 CPU를 해당 프로세스로 부터 회수해서 다른 프로세스에 할당하게 해야합니다.
(메모리를 차지하고있기 때문)
이러한 이유로 스케쥴링은 운영체제 설계의 핵심이라고 할 수 있습니다.

CPU - 입출력 버스트 사이클

프로세스 실행은 CPU 실행입출력 대기의 사이클로 구성됩니다.
프로세스들은 CPU실행 사이클 과 입출력 대기 사이클 사이를 교대로 왔다갔다 하며, 프로세스 실행은 CPU 버스트로 시작됩니다. 그리고 나서 입출력 버스트가 발생하고 그 뒤를이어 또 다른 CPU버스트가 발생하고 그뒤로 입출력 버스트가 발생하고 계속 반복합니다.
마지막에는 실행을 종료하기 위한 시스템 요청과 함께 끝납니다.

CPU버스트 시간의 도표는 지수형 또는 초 지수형으로 곡선을 이루며, 짧은 CPU 버스터가 상대적으로 긴 CPU 버스트에 비해 적습니다.

예를 들어, 입출력 중심의 프로그램은 전형적으로 짧은 CPU 버스터를 많이 가지지만, CPU 지향 프로그램은 긴 CPU버스터를 많이 가질 수 있습니다. 그렇기 때문에 적절한 CPU 스케쥴링 알고리즘을 사용하는게 매우 중요합니다.

CPU 스케쥴러

CPU가 유휴 상태가 될 때 마다, OS는 준비 완료 큐에 있는 프로세스들 중 하나를 선택해야하는데 , 이러한 선택절차는 단기 스케쥴러에 의해 수행됩니다. 스케쥴러는 실행 준비가 되어있는 메모리 내의 프로세스들 중에서 선택하여 이들 중 하나에게 CPU를 할당합니다.
준비 완료 큐 (FIFO - 선입선출) 방식의 큐가 아니어도 된다는것에 유의해야합니다.

  • 준비 완료 큐는 FIFO 큐, 우선순위 큐, 트리, 순서없는 연결리스트로 구현 할 수 있습니다.
    --> 개념적으로 볼 때 준비 완료 큐에 있는 모든 프로세스들은 CPU에서 실행 될 기회를 기다리며 대기하고 있습니다.
    -->큐에 있는 레코드들은 일반적으로 프로세스들의 PCB(프로세스 제어 블록) 입니다.

선점 스케쥴링

CPU스케쥴링 결정 4가지

  1. 한 프로세스가 실행 상태에서 대기 상태로 전환될 때
    -ex) 입출력 요청이나 자식 프로세스가 종료되기 기다리기 위해 wait 호출
  1. 프로세스가 실행 상태에서 준비 완료 상태로 전환될 때
    -ex) 인터럽트 발생
  2. 프로세스가 대기 상태에서 준비 완료 상태로 전환될 때
    -ex) 입출력 종료시
  3. 프로세스 종료 시

이렇게 4가지로 나뉘어집니다.
1번과 4번의 경우, 스케쥴링 면에서는 선택의 여지가 없어서 실행을 위해 새로운 프로세스 ( 준비 완료 큐에 하나라도 존재 할 경우)를 반드시 선택해야합니다.

1번과 4번에서만 스케쥴링 발생 시, 이러한 스케쥴링 방법을 비선점(non-preemptive) 또는 협조적(cooperative)라 합니다.
그렇지 않으면 선점(preemptive) 라 합니다.

->비 선점 스케쥴링에서는 일단 CPU가 한 프로세스에 할당되면 프로세스가 종료하든지, 대기상태로 전환해서 CPU를 방출 할 때까지 CPU를 점유합니다.

->선점 스케쥴링은 데이터가 다수의 프로세스에 의해 공유될 때 경쟁조건을 초래 할 수 있습니다.
=>ex) 두 프로세스가 자료를 공유하는경우, 1번 프로세스가 자료를 갱신하고 있는 동안, 선점되어 2번 프로세스가 실행 가능한 상태가 될 수 있습니다. 이때 2번 프로세스가 데이터를 읽으려고 할 때, 데이터의 일관성은 이미 깨진 상태가 되므로, 경쟁조건을 초래합니다.

->선점 스케쥴링은 운영체제 커널 설계에도 영향을 줍니다.
=>ex) 시스템을 처리 할 동안, 커널은 한 프로세스에 의해 활동을 하게 됩니다. 입출력 큐와 같은 활동을 할 경우, 중요한 커널 자료변경을 포함 할 수 있습니다. 대부분 UNIX 버전을 포함하여 몇몇 운영체제들은 문맥교환을 수행하기 전에 시스템 호출이 완료되거나, 입출력 요구에 따른 봉쇄가 일어나기를 기다리는 방법을 사용합니다. 커널 자료구조가 비 일관적인 상태에 있을 동안 커널이 해당 프로세스를 선점하지 않기 때문에, 커널 구조를 단순하게 만듭니다.

디스패처

CPU의 제어를 단기 스케쥴러가 선택한 프로세스에 주는 모듈입니다.

하는 일

  1. 문맥 교환
  1. 사용자 모드로 전환
  2. 프로그램을 다시 시작하기 위해 사용자 프로그램의 적절한 이동으로 이동(jump)

디스패처는 모든 프로세스의 문맥 교환시 호출되므로, 가능한 제일 빨리 수행되어야 합니다.

**디스패치 지연 **- 디스패처가 하나의 프로세스를 정지하고 다른 프로세스의 수행을 시작하는데가지 소요되는 시간

스케쥴링 기준

  1. CPU 이용률
    =>실제 시스템에서는 40% ~ 90% 까지 범위를 가져야 함.
  1. 처리량
    => 작업량 측정의 한 방법으로 단위 시간당 완료된 프로세스의 개수 (긴 프로세스는 시간당 한 프로세스, 짧은 트랜잭션 경우 초당 10개의 프로세스 )

  2. 총 처리 시간
    => 메모리에 들어가기위해 기다리는 시간 + 준비 완료 큐에서 대기한시간 + CPU에서 실행한 시간 + 입출력 시간

  3. 대기 시간
    => 준비 완료 큐에서 대기하면서 보낸 시간의 합

  4. 응답 시간
    => 하나의 요구를 제출한 후, 첫 번째 응답이 나올때까지의 시간

다음에는 스케쥴링 알고리즘에 대해 정리 해 보겠습니다.

profile
C++ 공부하고있는 대학생입니다.

0개의 댓글