9장. 스케줄링 알고리즘과 우선순위

유니야·2023년 1월 10일

✏️ 프로세스의 스케줄링

💻 일반 OS와 Real-Time OS의 차이점

  • 이 내용을 스케줄링 과정에서 언급하는 이유
    스케줄러가 어떻게 스케줄링하느냐에 따라 일반 OS가 되기도, Real Time OS가 되기도 한다.

  • Real Time OS

    • 어떤 상황이더라도, 얼마나 많은 프로그램이 동작 중이더라도 바로 응답한다. 즉 응답성이 좋다.
    • 아무리 성능이 좋은 컴퓨터이더라도 여러 프로그램을 동시에 켜둔 상태에서 다른 프로그램을 또 실행하면 응답성이 느릴 수 밖에 없다. 이게 일반 OS의 특성.
  • 응답성 != 작업 속도
    일반 OS와 리얼 타임 OS을 동시에 실행 시, 시작은 리얼타임 OS가 빠르다. 즉, 응답성이 좋다는 건 시작 속도가 빠르다는 것과 같다.
    그러나 시작 속도가 빠르다고 해서 먼저 작업이 끝나는 것은 아니다. 작업 실행 속도는 OS가 아닌 CPU에 의존적이다.

시작 속도가 빠르다는 건 CPU 성능과 관련이 없고, 이는 타임 슬라이스에 영향을 받는다.

  • Time Slice(타임 슬라이스)

    • 각 프로세스의 우선 순위가 동일하다면 번갈아가면서 실행되어야 한다. 해당 기준은 타임 슬라이스를 기준으로 정해짐.
    • 컴퓨터는 내부적으로 클럭을 발생시키는데, 클럭을 기준으로 타임 슬라이스를 정한다. ex) 3 클럭 = 1 타임 슬라이스
    • 이 경우 타임 슬라이스를 기준으로, 3초에 한 번씩 시스템의 실행 주기가 바뀌는 것.
    • 일반 OS의 경우 타임 슬라이스가 길기 때문에 응답성이 낮고, 리얼 타임 OS의 경우 타임 슬라이스가 짧기 때문에 응답성이 높다.
  • 선점형 OS

    • A 프로세스의 우선 순위가 2, B 프로세스의 우선 순위가 3으로 높은 상황. A 프로세스를 실행 중에 B 프로세스가 생성됐다면 스케줄러는 A를 할당된 타임 슬라이스를 다 사용한 뒤 바로 밀어낸다.
    • 스케줄러가 프로세스의 실행에 직접적으로 관여한다.
  • 비선점형 OS

    • A 프로세스가 실행 중에 우선순위가 높은 B 프로세스가 생성됐다고 해서 바로 선점권을 넘겨주지 않는다. A 프로세스가 명시적으로 선점권을 넘겨주겠다고 해야 B가 실행될 수 있다.
    • 프로그래머가 프로세스의 실행을 결정짓는 것이기 때문에 다루기 까다로움.
    • CPU를 할당받은 프로세스가 자신의 실행을 포기하지 않는 한 다른 프로세스가 실행될 수 없기 때문에 선점형 OS에 비해 스케줄러가 하는 일이 적다.

💻 스케줄링 알고리즘

  • 동일 우선순위
    • 라운드 로빈 기반
    • 우선순위가 동일한 프로세스에 대해서는 평등을 주장.
    • 우선 순위가 동일할 경우 정해진 시간 간격만큼만 실행을 하고 우선순위가 동일한 다른 프로세스에게 CPU의 할당을 넘기는 방식.
  • 높은 우선순위
    • 우선 순위 기반
    • 각각 프로세스마다 우선순위를 부여해 우선순위가 높은 프로세스를 먼저 실행시키는 방식.

      위 이미지에서 우선순위 7이 가장 높은 상황. 따라서 해당 순위 프로세스에 특권이 부여되어 실행되는데, 해당 순위 내 프로세스 사이에서는 라운드 로빈 알고리즘이 적용됨. 다른 순위의 프로세스는 Blocking상태로 실행되지 않는다.
      그러나 위 이론과 달리 우선순위가 낮은 프로세스도 가끔 실행이 된다. 왜일까?
      I/O 연산의 경우 CPU를 점유하지 않는다. 따라서 우선순위 7의 프로세스가 모두 I/O 연산을 수행 중일 경우 낮은 순위의 프로세스가 잠시 실행 권한을 얻게 된다.
      실행 시간이 10초라고 가정했을 때, CPU가 해당 프로세스를 위해서 동작하는 시간은 5초도 되지 않을 것. 대부분의 시간은 I/O 연산에 쓰인다.
      ex) 요청을 보내고 받아오는 일, 데이터 입력.

💻 스케줄링 진행 시점

  1. 매 타임 슬라이스(Time Slice)마다
  • 타임 슬라이스 사이에서도 컨텍스트 스위칭이 발생할 수 있는지?
    • 타임 슬라이스는 그렇게 길지 않음. 그리고 스케줄러도 하나의 프로세스이기 때문에 스케줄러가 동작하면 다른 프로세스가 동작하지 못 한다. 스케줄러가 자주 동작하면 정작 실행해야 하는 다른 프로세스를 실행하지 못 하기 때문에 성능 저하가 일어난다.
    • 타임 슬라이스를 좁게 잡으면 좋지만, 성능에 문제가 될 수 있기 때문에 성능 저하가 되지 않는 한 넓게 두는 것이 좋다.
    • 그러나 타임 슬라이스를 넓게 두면 프로세스 실행이 느릴 수 있는데, 아래 2, 3번 상황에 놓일 경우 스케줄러가 동작하도록 예외 처리를 한다면 타임 슬라이스 사이에서도 컨텍스트 스위칭이 발생한다고 할 수 있다.
    • 반면 타임 슬라이스가 좁지만 2, 3번 상황에 스케줄러를 깨워주지 않아도 짧은 타임 슬라이스 간격마다 처리가 가능하다면 답은 No.
    • 즉 운영체제의 디자인에 따라 답은 다르다.
  1. 프로세스가 생성 및 소멸될 때마다
    프로세스가 생성되면 해당 프로세스를 Wait상태에 둘지, Running상태에 둘지 관찰해야 함.
    소멸될 때는 해당 프로세스의 정보를 스케줄러에서 제외해줘야 하는데, 만약 실행 중인 프로세스였다면 다른 프로세스를 Running 상태로 둬야 하기 때문에 스케줄링이 동작해야 한다.
  2. 현재 실행 중인 프로세스가 블로킹 상태에 놓일 때마다
    I/O 연산을 하면 프로세스는 블로킹 상태에 놓인다. 이 때 스케줄러는 Blocked 상태였던 다른 프로세스를 세팅하고 Running 상태로 만드는 역할을 함.

결국 스케줄러도 프로세스이기 때문에, OS 사용자가 불편함을 못 느끼는 한도에서 스케줄러를 최소한으로 깨워야 한다.

✏️ Windows 프로세스 우선순위

  • 프로세스의 우선순위 계층
    해당 우선 순위는 스레드 관점에서 봐야 정확히 이해할 수 있다.

0개의 댓글