하나의 CPU 코어는 실제로 한 시점에 하나의 프로세스만 처리할 수 있다. 그러나, 현대의 운영 체제들은 프로세스 스케줄러를 사용하여 여러 프로세스가 CPU를 공유할 수 있도록 한다. 프로세스 스케줄러는 운영 체제의 일부로, 실행할 프로세스를 결정하고, CPU 시간을 어떻게 분배할지 관리한다. 이를 통해, 사용자와 시스템은 동시에 여러 프로그램이나 작업을 실행하는 것처럼 느낄 수 있다.
프로세스 선택(Dispatching): 실행할 준비가 된 프로세스 목록(Ready Queue)에서 다음에 실행될 프로세스를 선택한다.
문맥 교환(Context Switching): CPU가 현재 실행 중인 프로세스에서 다른 프로세스로 전환할 때, 현재 프로세스의 상태를 저장하고 새 프로세스의 상태를 불러오는 과정이다.
멀티태스킹(Multitasking): 여러 프로세스를 빠르게 전환하며 실행함으로써, 동시에 여러 작업을 처리하는 것처럼 만든다. 이는 사용자에게 동시성(Concurrency)을 제공한다.
프로세스 스케줄러는 다양한 스케줄링 알고리즘을 사용할 수 있으며, 각 알고리즘은 특정 목표나 시스템의 요구 사항에 맞춰 설계된다.
First-Come, First-Served (FCFS): 가장 간단한 형태의 스케줄링으로, 먼저 도착한 프로세스를 먼저 처리한다.
Round-Robin (RR): 모든 프로세스에게 동일한 시간 할당량(Time Quantum)을 주고, 이 시간을 초과하면 다음 프로세스로 전환한다. 이는 타임 슬라이스라고도 불린다.
Priority Scheduling: 각 프로세스에 우선순위를 부여하고, 가장 높은 우선순위를 가진 프로세스를 먼저 실행한다.
Shortest Job First (SJF): 실행 시간이 가장 짧은 프로세스를 먼저 실행한다. 이는 평균 대기 시간을 최소화하는 데 도움이 된다.
현대의 컴퓨터 시스템에서는 하나 이상의 CPU 코어를 가지고 있으며, 각 코어는 동시에 별개의 프로세스를 처리할 수 있다. 멀티코어나 멀티프로세서 시스템에서는 스케줄러가 더 복잡한 로직을 사용하여, 여러 코어에 걸쳐 프로세스를 효율적으로 분배하고 관리한다.
실행 대기 → 실행: 스케줄러에 의해 프로세스가 CPU를 할당받으면 실행 대기 상태에서 실행 상태로 전환된다.
실행 → 슬립: 프로세스가 파일 읽기 요청과 같은 입출력 작업을 요청하면, 작업이 완료될 때까지 실행 상태에서 슬립 상태로 전환된다.
슬립 → 실행 대기: 입출력 작업이 완료되면, 프로세스는 다시 실행 대기 상태로 전환되어 CPU 할당을 기다린다.
실행 → 좀비: 프로세스가 작업을 완료하고 종료할 때, 모든 자원을 해제하고 종료 상태 정보만 남겨둔 채 좀비 상태로 전환된다. 이후 부모 프로세스가 종료 상태를 회수하면 시스템에서 완전히 제거된다.
스루풋 (Throughput)
스루풋은 단위 시간당 시스템이 처리할 수 있는 작업의 양을 나타낸다다. 예를 들어, 초당 처리할 수 있는 요청의 수, 시간당 데이터베이스 트랜잭션의 수 등으로 측정된다. 스루풋이 높다는 것은 시스템이 더 많은 작업을 빠르게 처리할 수 있다는 것을 의미하며, 일반적으로 높은 성능을 나타낸다. 스케줄러가 효율적으로 작동할수록, 시스템의 스루풋은 증가하게 된다.
레이턴시 (Latency)
레이턴시는 작업이나 요청이 시작되고 완료될 때까지 걸리는 시간을 나타낸다. 이는 시스템이 요청을 받아서 처리하고 응답하기까지의 지연 시간으로 측정된다. 레이턴시가 낮을수록 사용자나 시스템에게 더 빠른 반응 속도를 제공한다는 것을 의미하며, 일반적으로 사용자 경험에 긍정적인 영향을 미친다.
스루풋과 레이턴시의 관계
스루풋과 레이턴시는 서로 독립적인 지표이지만, 시스템의 성능을 평가할 때 함께 고려되어야 한다. 높은 스루풋을 달성하면서도 낮은 레이턴시를 유지하는 것이 이상적이지만, 실제로는 두 지표 사이에 트레이드오프가 존재할 수 있다.
오랜만에 스케줄링 봐서 재미있었어요!