본문 바로가기

CS/운영체제

프로세스가 Ready Queue에서 선택되어서 Running 상태가 되었을때


위 과정이 어떻게 일어나게 되는지 얘기를 해보고자 합니다. Ready Queue에 저장되어있는 PCB(Process Control Block)들이 이제 단기 스케줄러(Short Term)에 의해서 선택이 됩니다. 이 단기 스케줄러는 어떤 기준을 갖고 선택을 하게 될까요?

선택 기준은 첫번째는 우선순위가 될 것입니다. 우선순위가 높은 프로세스가 먼저 선택이 될 것인데, 우선순위를 결정짓는 것은 window, Linux마다 다를 것입니다. 이건 찾아봐야겠네요. 그 다음은 스케줄링 정책에 따르게 됩니다. 여러 스케줄링이 존재하는데 아래와 같습니다.

총 두가지 형태가 있는데, 비선점 선점입니다. 비선점이라는 것은 다른 프로세스가 해당 프로세스가 동작이 완료할 때까지 뺏을 수가 없다는 뜻입니다. 제 생각에는 반대가 되어야 맞는데, 주체가 선점하고 있으니까 이건 논외로 하시고요. 그렇다면 반대로 선점이라는 것은, 다른 프로세스가 현재 실행중인 프로세스가 갖고 있는 자원을 획득할 수 있다는 것을 의미합니다. 스케줄링은 비선점과 선점으로 나뉩니다.

<비선점형 스케줄링>

프로세스가 CPU를 할당받으면 해당 프로세스의 실행이 완료될 때까지 CPU를 계속 사용합니다. 다른 프로세스가 실행을 위해 준비되어 있더라도, 현재 실행중인 프로세스가 자발적으로 CPU 사용을 중단하거나 실행 완료가 될 때까지 기다려야 합니다.

First-Come, First Served
프로세스가 Ready Queue에 도착한 순서대로 선택됩니다. 하지만, CPU를 오래동안 사용할 프로세스가 짧게 아주 짧게 사용할 프로세스의 작업을 지연시키는 대기 효과(Convoy Effect)가 발생할 수 있습니다.

Shortest Job Next
CPU를 아주아주 짧게 사용할 프로세스가 선택됩니다. 하지만, 긴 작업이 계속해서 대기해야해서 기아상태(Starvation)가 발생할 수 있습니다.

<선점형 스케줄링>

우선순위는 타임 슬라이스와 같은 기준에 따라 현재 실행 중인 프로세스의 실행을 중단하고, 다른 프로세스에게 CPU를 할당할 수 있습니다. 이 방식은 시스템의 반응성을 높이고, 공정한 자원 분배를 가능하게 합니다.

Priority Scheduling
단기 스케줄러의 선택 기준중에 우선순위가 존재합니다. 이런 우선순위가 높은 프로세스가 먼저 선택이 됩니다. 하지만, 낮은 우선순위의 프로세스가 기아상태가 될 수 있습니다. 그래서 Aging이라는 방법을 사용해 오래 기다린 작업의 우선순위를 점진적으로 높이는 방식으로 기아상태를 예방할 수 있습니다.

Round Robin
프로세스는 일정한 시간(Time Quantum) 동안 실행됩니다. 이는 위에 존재하는 기아상태를 방지하기 위한 방법입니다. 하지만, 일정한 시간을 너무 짧은 시간을 잡게 된다면? 빈번한 콘텍스트 스위칭(Context Switching)으로 인해서 CPU의 유휴시간을 줄일 수 있지만 Overhead가 증가할 수 있습니다.

그리고 공정하게 CPU시간을 받을 수 있게 보장을 해줍니다. 단기 스케줄링의 역할은 이러합니다.

스케줄링을 통해서 Ready Queue에 있는 어떤 PCB가 선택 PCB의 포인터 선택이 될 것입니다. PCB와 프로세스를 혼동해서 사용하고 있는데, 우리가 진짜 프로세스들이 어떤 자료구조에 들어가 있을까요? 프로세스는 어떤 프로그램이 실행 중인 상태인데? 그건 말이 안 되겠죠? 사실은 Ready Queue에 PCB의 형태로 현재 프로세스의 상태가 기록되어 있습니다. 그래서 이해하기 쉽게는 프로세스라고도 말하고 어느 순간에는 PCB라고도 말을 하게 되는데 자체적으로 이해해주세요.



그래서 PCB가 선택이 되는데 아무것도 Running중인 PCB가 없다면 CPU에 PCB에 작성되어있는 상태를 입력하게 되면서 프로세스가 실행이 될 것입니다. 여기서 CPU가 실행하는 것은 프로세스입니다. CPU에게 프로세스의 상태를 전달해야 하는 것은 PCB이고요.

그렇다면? 만약에 실행중인 프로세스가 존재하고, 다른 프로세스의 상태로 변화를 해야한다면 어떻게 해야 할까요?

이런 역할을 해주는것이 디스패처(Dispatcher)입니다. Ready상태에서 Running상태로 넘어갈 때 다수의 책에서 스케줄 디스패치라고 적혀있을 겁니다. 스케줄에 맞춰서 PCB를 선택하는 것은 단기 스케줄러 단기 스케줄러가 선택한 PCB를 CPU에 부착하는 것은 디스패처(Dispatcher)입니다.

<취소선 수정>

PCB는 메모리에 저장되며, CPU는 PCB에 저장된 정보를 참조하여 프로세스를 실행합니다. 디스패처는 CPU 레지스터와 프로그램 카운터에 PCB 정보를 로드하여 실행 상태로 전환합니다.

다시 돌아가서, Running중인 프로세스가 있다면? 다른 프로세스로 교환을 해야하지 않을까요?
그 과정은 Context Switcing입니다. 이것을 수행해 현재 실행 중인 프로세스의 상태를 다시 PCB에 저장을 해야겠죠? 그리고 선택된 프로세스의 상태를 다시 CPU에 로드하는 과정을 겪으면서 CPU라는 자원을 해당 프로세스에게 할당을 하게 됩니다. 그리고 프로세스의 상태가 저장된 PCB의 상태를 바탕으로 CPU에 적용이 되겠습니다.

<디스패처의 작동과정은 이렇게 정리할 수 있습니다>

1. 단기 스케줄러가 선택한 프로세스(사실상 PCB)를 받게 됩니다.
2. 현재 실행 중인 프로세스의 상태(PC, Register 등)를 저장하게 됩니다.
3. 새로 선택된 PCB를 통해서 정보를 로드하게 됩니다.
4. PCB의 상태가 변경됩니다.
5. Kernel에서 User 모드로 변경되며 새로 선택된 프로세스를 CPU에서 실행하게 됩니다.

이와 같은 과정을 겪은 후에는 Ready에서 Run 상태로 변경되어서 CPU가 Process의 상태를 받아서 동작하게 됩니다. 이 과정은 PCB(Process Control Block)을 통해 관리되며, 커널 모드에서 실행됩니다.


틀리거나 애매한 내용:

  • "CPU에 PCB를 부착한다"는 표현: "PCB를 CPU에 부착한다"는 표현은 부정확하거나 모호합니다. 정확히는, PCB는 메모리에 저장되며, CPU는 PCB에 저장된 정보를 참조하여 프로세스를 실행합니다. 디스패처는 CPU 레지스터와 프로그램 카운터에 PCB 정보를 로드하여 실행 상태로 전환합니다.
  • "PCB가 Ready Queue에 있다"는 표현: 실제로 Ready Queue에는 PCB가 아니라 PCB의 포인터가 저장됩니다. Ready Queue는 PCB 자체를 저장하기에는 메모리 관리 효율이 떨어지며, 이 방식은 대부분의 운영체제에서 일반적입니다.
  • Switching의 혼용 설명: 디스패처는 스케줄러가 선택한 프로세스를 실행 상태로 전환하는 역할을 수행합니다. Context Switching은 실행 중인 프로세스 상태를 PCB에 저장하고 새 프로세스를 실행하는 전체 과정이며, 디스패처의 일부로 포함됩니다. 이를 명확히 구분하지 않은 부분은 개선이 필요합니다.

추가로 알아봐야 할 사항:

  • 스케줄링 정책의 차이: Windows, Linux, MacOS 등 주요 운영체제의 스케줄링 우선순위와 정책의 차이를 조사하면 더 깊이 있는 분석이 가능합니다.
  • Context Switching 오버헤드: Context Switching이 발생할 때 구체적으로 어떤 오버헤드(예: 캐시 무효화, 레지스터 저장 등)가 발생하는지 공식 문서나 학술 자료를 기반으로 더 구체적으로 알아볼 필요가 있습니다.
  • Ready Queue의 구조: Ready Queue가 연결 리스트, 우선순위 큐, 또는 다단계 큐 등으로 구현되는 방식과 그것이 성능에 미치는 영향을 조사해야 합니다.

요약 (Summary)

1. 단기 스케줄러(Short-Term Scheduler)

  • 역할: Ready Queue에서 PCB(또는 PCB 포인터)를 선택하여 실행 가능한 프로세스를 결정합니다.
  • 기준:
    • 우선순위(Priority)
    • 스케줄링 알고리즘 (선점형/비선점형)
    • Aging 기법을 통한 기아상태 예방
    • Round Robin 방식에서 타임 퀀텀(Time Quantum) 크기

2. 디스패처(Dispatcher)

  • 역할: 선택된 프로세스를 CPU에 할당하고 실행 상태로 전환합니다.
  • 과정:
    1. 현재 실행 중인 프로세스의 상태(PC, 레지스터 등)를 PCB에 저장
    2. 선택된 PCB의 정보를 CPU 레지스터에 로드
    3. PCB의 상태 변경 (Ready → Running)
    4. 커널 모드 → 사용자 모드 전환 후 실행

3. Context Switching

  • 정의: 실행 중인 프로세스를 다른 프로세스로 전환하는 과정
  • 과정:
    1. 실행 중인 프로세스의 상태를 PCB에 저장
    2. 새로 선택된 프로세스의 PCB 정보를 CPU에 로드
    3. 캐시 무효화 및 메모리 컨텍스트 전환
  • 오버헤드:
    • 캐시 일관성 문제
    • 메모리 버스 대역폭 사용 증가
    • 커널 모드 전환 비용