12월 22일-스케쥴링과 프로세서의 상태

Yullgiii·2023년 12월 22일
0
post-thumbnail

단기, 중기, 장기 스케줄러에 대한 설명

Long-Term Scheduler

장기 스케줄러 (Long-Term Scheduler)은 시스템에 어떤 프로세스를 허용할지 결정한다. 이를 '잡 스케줄러(Job Scheduler)'라고도 부르며, 프로세스의 수를 조절하여 시스템의 성능을 균형잡히게 유지하는 것을 목표로 한다. 프로세스가 생성되어 시스템에 진입할 때 실행되며, 해당 프로세스를 준비 상태(ready)로 전환한다.

Medium-Term Scheduler

중기 스케줄러 (Medium-Term Scheduler)는 시스템의 성능을 위해 메모리에 있는 프로세스의 수를 조절한다. 이 스케줄러의 목표는 시스템의 메모리 사용량을 최적화하고, 과부하를 방지하는 것이다. 이 스케줄러는 프로세스를 메모리(ready)와 스왑 영역(swap) 사이에서 이동시키며, 이를 '스와핑(Swapping)'이라고 부른다.

Short-Term Scheduler

단기 스케줄러 (Short-Term Scheduler)은 CPU에 실행될 프로세스를 결정한다. 이를 'CPU 스케줄러'라고도 부르며, 효율적인 CPU 사용과 응답 시간 최소화를 목표로 한다. 이 스케줄러는 준비 상태의 프로세스 중 하나를 선택하여 실행 상태로 전환한다.
대부분의 현대 운영 체제들은 단기 스케줄러를 사용한다. 중기 스케줄러는 가상 메모리가 있는 시스템에서 주로 사용된다. 장기 스케줄러는 배치 처리 시스템이나 특정 운영 체제에서 사용되지만, 대화형 시스템에서는 그 사용이 제한적이다.

프로세스 상태 분류

  • 새로운(New): 프로세스 생성 중.
  • 준비(Ready): CPU 할당을 기다리며 메모리에 존재.
  • 실행(Running): CPU에서 명령어를 실행 중.
  • 대기(Waiting): 특정 이벤트(예: I/O 완료)를 기다리며 중지.
  • 종료(Terminated): 실행을 완료하고 시스템에서 제거.

Preemptive/Non-Preemptive 스케줄링에서의 상태

Preemptive 스케줄링에서는 실행 중인 프로세스가 강제로 중단되어 준비 상태로 돌아갈 수 있다. 이는 다른 프로세스에게 CPU를 할당하기 위한 것이다. 반면, Non-Preemptive 스케줄링에서는 한 번 CPU를 할당받으면 해당 프로세스가 종료되거나 대기 상태로 전환될 때까지 CPU를 유지한다.

메모리 부족 시 프로세스의 상태 변화

메모리가 부족할 때, 운영 체제는 일반적으로 '스와핑' 또는 '페이징' 기법을 사용하여 메모리를 관리한다. 이 경우, 일부 프로세스가 메모리에서 스왑 영역으로 이동되어 대기 상태로 전환될 수 있다. 이러한 조치는 메모리를 확보하여 시스템의 안정성과 성능을 유지하기 위한 것이다.

각 예시와 예시 코드

장기

장기 스케줄러의 예시로는 배치 처리 시스템에서 여러 작업이 동시에 시스템에 제출될 때, 이러한 작업들 중 어떤 것을 시스템의 자원에 허용할지 결정하는 것이다. 예를 들어, 메모리 요구량, CPU 사용 시간, 입출력 요구량 등을 고려하여 작업을 선택한다. 장기 스케줄러는 시스템의 성능을 균형잡히게 유지하기 위해 한 번에 너무 많은 작업이 메모리에 로드되지 않도록 한다.

public class LongTermScheduler {
    public void schedule(List<Process> processes) {
        // 프로세스 목록에서 시스템 리소스와 요구 사항을 기반으로 프로세스를 선택한다.
    }
}

중기

중기 스케줄러의 예시로는 여러 응용 프로그램이 동시에 실행되고 있으며, 시스템의 메모리가 부족해지고 있을 때, 메모리 사용을 최적화하기 위해 일부 프로세스를 메모리에서 스왑 영역으로 이동시키는 것이다. 사용 빈도가 낮은 프로세스를 스왑 영역으로 옮기고, 자주 사용되는 프로세스는 메모리에 유지한다. 이를 통해 메모리를 효율적으로 관리한다.

public class MediumTermScheduler {
    public void swap(Process process) {
        // 메모리 사용을 최적화하기 위해 프로세스를 스왑 영역으로 이동시킨다.
    }
}

단기

단기 스케줄러의 예시로는 컴퓨터에서 여러 프로그램이 동시에 실행되고 있을 때, 현재 준비 상태에 있는 프로세스 중 어떤 프로세스를 다음으로 실행할지 결정하는 것이다. CPU 스케줄러는 프로세스의 우선순위, 실행 시간, 응답 시간 등을 고려하여 선택한다. 예를 들어, 사용자와 상호작용하는 프로그램에 더 높은 우선순위를 부여하여 빠른 응답 시간을 보장할 수 있다.

public class ShortTermScheduler {
    public Process pickNextProcess(List<Process> readyQueue) {
        // 준비 상태에 있는 프로세스 중 하나를 선택하여 실행 상태로 전환한다.
    }
}

Preemptive

Preemptive 스케줄링의 예시로는 사용자가 텍스트 편집기를 사용하고 있는 동안 이메일 클라이언트가 새 메일을 확인할 때, 이메일 클라이언트 프로세스가 CPU를 선점하여 텍스트 편집기 프로세스는 잠시 중단되는 것이다.

public class PreemptiveScheduler {
    public void preempt(Process currentProcess, Process newProcess) {
        // 현재 프로세스를 중단하고 새 프로세스에 CPU를 할당한다.
    }
}

Non-Preemptive

Non-Preemptive 스케줄링의 예시로는 파일 다운로드 프로세스가 시작되면, 다운로드가 완료되거나 대기 상태로 전환될 때까지 다른 프로세스는 CPU를 할당받지 못하는 것이다.

public class NonPreemptiveScheduler {
    public void execute(Process process) {
        // 프로세스가 완료되거나 대기 상태로 전환될 때까지 실행한다.
    }
}

메모리

메모리가 부족할 때의 프로세스 상태 변화 예시로는 컴퓨터에서 여러 프로그램이 실행되면서 메모리가 부족해질 때, 운영 체제는 메모리가 부족해지면 일부 프로세스를 잠시 중단하고 스왑 영역으로 이동시키는 것이다. 예를 들어, 사용자가 현재 사용하지 않는 브라우저 탭이나 백그라운드에서 실행되는 응용 프로그램을 스왑 영역으로 옮길 수 있다. 이러한 조치를 통해 필요한 프로세스에 메모리를 할당하여 시스템의 안정성과 성능을 유지한다.

public class MemoryManager {
    public void swapOut(Process process) {
        // 메모리가 부족할 때 프로세스를 스왑 영역으로 이동시킨다.
    }
}
profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글