0. 시작하기전에
- 이번 포스팅에서는 프로세스 스케줄링과 관련된 시스템 콜에 대해서 배울 예정이다.
1. 우선순위 기반 스케줄러 (priority based)
- 우선순위를 기반으로 프로세스의 실행순서를 정하는 스케줄링 방식이다.
a) 리눅스는 우선순위에 크게 영향을 받지 않는다.
- 리눅스는 우선순위에 크게 영향을 받는 스케줄링 방식을 사용하지 않는다.
- 당연히, 우선순위를 확인하고 이에 따라 실행되도록 하는 시스템 콜이 존재하지만,
b) 그렇다면 왜 리눅스는 우선순위 기반의 스케줄링을 지원하는가?
- 리눅스 운영체제 자체가 우선순위에 크게 중점을 두지 않은 방식으로 스케줄링을 하도록 설계되어있다.
- 그렇다면 왜 우선순위 스케줄링의 시스템 콜을 제공할까? 이는 POSIX 규격으로 운영체제를 표준화했기 때문이다.
c) 우선순위 스케줄링의 종류
▶ 정적 우선순위(static)
- 프로세스마다 우선순위를 미리 지정하는 방식
▶ 동적 우선순위(dynamic)
- 상황에 따라 프로세스의 실행순서를 변경하는 방식
2. 우선순위 스케줄링의 시스템 콜
a) nice() - 우선순위 변경 시스템콜
- root가 소요한 프로세스의 우선순위를 높일 수 있다.
- root가 소유하지 않은 프로세스에 대해서는 우선순위를 낮추기만 할 수 있다.
- 스케줄링 방식에 따라서 우선순위가 기능할 수도, 그렇지 않을 수도 있다.
#include <unistd.h>
int nice(int inc); // 인자로 우선순의를 받는다.
b) getpriorty() & setpriorit()
#include <sys/resource.h>
int getpriority(int which, id_t who);
int setpriority(int which, id_t who, int value);
▶ getpriority()
- 어떤 프로세스의 우선순위 값을 가져온다.
▶ setprioirt()
- 어떤 프로세스의 우선순위 값을 변경한다.
▶ 인자(parameter)
- int which는 우선순위 값을 가져올 자원을 명시한다.
- int which에는 PRIO_PROCESS(프로세스), PRIO_GROUP(프로세스 그룹), PRIO_USER(사용자) 중 하나를 입력한다.
- id_t who에는 우선순위 값을 가져올 해당 프로세스의 PID가 입력된다.
- id_t who에 0을 입력하면 현재 프로세스의 PID가 입력된다.
- int value는 변경할 우선순위 값을 입력한다.
c) nice(), get/setpriority() 실습예제
#include <sys/resource.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
int which = PRIO_PROCESS; // 프로세스의 우선순위를 찾는다.
id_t pid;
int ret;
pid = getpid();
ret = getpriority(which, 0); // 현재 프로세스의 우선순위를 검색한다.
printf("PID = %d, PRIORITY = %d\n", pid, ret);
ret = nice(10); // 우선순위를 10으로 변경한다.
ret = getpriority(which, 0);
printf("PID = %d, PRIORITY = %d\n", pid, ret);
ret = setpriority(which, 0, 5); // 우선순위를 5로 변경한다.
ret = getpriority(which, 0);
printf("PID = %d, PRIORITY = %d\n", pid, ret);
return 0;
}
▶ 실행결과
- 우선순위 변경 시스템콜을 실행할 때에는 root 권한이 필요하다.
- 그러므로 반드시 sudo 키워드와 함께 사용하는 것을 권장한다.
- 만약 sudo 키워드를 사용하거나 root 사용자로 실행하지 않으면, 우선순위 값이 제대로 변경되지 않을 것이다.
'컴퓨터공학기초 개념 > 시스템 프로그래밍' 카테고리의 다른 글
27. 프로세스 - IPC 기법(shared memory) (0) | 2021.09.21 |
---|---|
26. 프로세스 - IPC 기법(pipe, message queue) (0) | 2021.09.17 |
24. 프로세스 - 프로세스 생성과 종료 총정리 (0) | 2021.09.17 |
23. 프로세스 - 프로세스 종료(exit) (0) | 2021.09.17 |
22. 프로세스 - copy on write (0) | 2021.09.16 |
댓글