출처: https://devraphy.tistory.com/151 [개발자를 향하여:티스토리], https://latter2005.tistory.com/43, https://probe29.tistory.com/43,
(출처는 위 링크! 형광펜은 개인적으로 공부하면서 체크한 부분입니다)




스케줄러(Scheduler)와 시스템 콜(System call)



⭐ 스케줄링(scheduling)

: 다중 프로그래밍을 가능하게 하는 운영 체제의 동작 기법
프로세스들에게 CPU 등의 자원 배정을 적절히 함으로써 시스템의 성능을 개선하는 기법

스케줄러(Scheduler)는 이런 스케줄링(scheduling)을 수행하는 시스템을 지칭한다



스케줄러의 종류는 방식에 따라 조금씩 다른데, 그 중에서도 선점형 스케줄러와 비선점형 스케줄러와 우선 순위 기반 스케줄러에 대해서 알아보자.




선점형 스케줄러(Preemptive Scheduling)

하나의 프로세스가 다른 프로세스 대신에 CPU(프로세서)를 차지할 수 있음
현재 CPU를 사용중인 프로세스를 멈추고 다른 프로세스에 CPU를 할당할 수 있다.

ex) 시분할 시스템



비선점형 스케줄러(Non-preemptive scheduling)

하나의 프로세스가 끝나지 않으면 다른 프로세스는 CPU를 사용할 수 없음
현재 CPU를 사용중인 프로세스가 자발적으로 block(wait)상태로 전환되거나 실행이 끝나는 상태(terminated)가 아닌 경우, CPU를 다른 프로세스에 할당할 수 없다.

ex) 배치 처리 시스템



⭐ 스케줄러 정책에 따른 알고리즘 조합


📌 FIFO(FCFS) / SJF / Priority-based

: 어떤 프로세스를 먼저 실행시킬지에 대한 알고리즘으로 비선점형 스케줄링 방식에 가깝다.


📌 RoundRobin

: 시분할 시스템을 위한 기본 알고리즘으로 선점형 스케줄링 방식이다.

  • 스케줄러 정책에는 선점형, 비선점형 스케줄러가 있다. 그리고 스케줄링 알고리즘에는 여러가지가 존재한다.

  • 전체적인 스케줄링은 비선점형으로 하지만, 각 프로세스의 상태를 담는 queue는 시분할 방식인 RoundRobin으로 설정하는 등 다양한 조합방식이 존재한다.

  • 이해하고 넘어가야 할 부분은 스케줄링 정책과 알고리즘을 종류에 따라 구분하지말고, 필요한 기능과 목적에 따라 유연하게 조합할 수 있다는 것을 인지해야 한다.





⭐ Priority-Based(우선 순위 기반) 스케쥴러 종류


📌 정적 우선 순위 스케쥴러

: 프로세스마다 우선 순위를 미리 지정한다.

📌 동적 우선 순위 스케쥴러

: 스케쥴러가 상황에 따라 우선 순위를 동적으로 변경한다.




(+)

⭐ 우선순위와 관련된 시스템 콜

출처 : https://probe29.tistory.com/43


📌 nice()

우선 순위를 변경하는 시스템 콜
프로세스 중 root가 소유한 프로세스만 우선 순위를 높일 수 있다. root로 실행해야만 가능하다.
다른 프로세스는 우선 순위를 낮출 수만 있다.
스케쥴링 방식에 따라 우선 순위가 적용될 수 도 있고 안될 수 도 있다.

nice() 함수 사용의 예는 다음과 같다.

#include <unistd.h>
int nice (int inc);       // inc 값에 우선순위 값을 넣어주면 해당 우선순위를 우선 실행하도록 되어있다.

📌 getpriority(), setpriority()

프로세스의 우선 순위 값을 얻어내거나, 프로세스 리소스에 대해 우선 순위 값을 매겨주는 시스템 콜이다.

사용 예는 다음과 같다.

#include <sys/resource.h>
int getpriority(int which, id_t who);
      //현재 시스템콜을 실행하고 있는 프로세스의 우선 순위 값을 얻어내는 시스템 콜
      
int setpriority(int which, id_t who, int value);
      //현재 프로세스 또는 프로세스 관련된 리소스에 대해서 우선 순위 값을 매겨주는 시스템 콜
profile
⛅🛩️ 먼 길을 돌아서 온 프론트엔드 개발자 ✈️⛅

0개의 댓글