리눅스 스케쥴링 관련하여 궁금한게 있어 질문드립니다.
리눅스에서 디폴트 스케쥴링 정책은 그냥 라운드로빈 방식(SCHED_OTHER)으로 알고 있습니다.
그리고 그 방식위에서 우선순위를 높이거나 줄이려면 nice 값을 낮추거나 높이면 되는걸로 알고 있습니다.
그런데 제가 쓰레드를 여러개 만들어서 돌릴때 각각의 쓰레드의 스케쥴링 정책을 예를 들어 pthread_setschedparam 함수를 사용하여 SCHED_FIFO에 우선순위를 49로 주었다 치면 htop으로 해당 프로세스 확인시 PRI 는 -50으로 나오고 NI는 0으로 나옵니다.
제가 헷갈리는 것은 다른 여러 프로세스들은 디폴트스케쥴링인 SCHED_OTHER로 동작하는데 특정 프로세스와 쓰레드들만 SCHED_FIFIO로 하는게 가능한것인지.....그렇다면 리눅스커널스케쥴러는 다른 프로세스나 스레드는 RR로 돌리면서 SCHED_FIFO로 세팅한 프로세스와 스레드는 최우선적으로 cpu할당하는것인지 문의드립니다.
.
프로세스 및 스레드 컨텍스트(운영체제 책의 PCB) struct task_struct 들은 각각 CPU 마다 per cpu 변수로 할당되어있는 struct rq 자료구조(운영체제 책의 대기 큐)에 큐잉되고, struct rq 구조체를 보면 여러 종류 큐가 있는 것을 확인할 수 있습니다.
https://elixir.bootlin.com/linux/v6.2-rc7/source/kernel/sched/sched.h#L990
참고로, 커널 덤프를 확인할 때, 크래시 유틸리티에서 runq 커맨드로 해당 큐들의 내용물을 확인할 수 있습니다.
realtime thread 는 RT 큐에 할당되어 처리합니다. https://elixir.bootlin.com/linux/v6.2-rc7/source/kernel/sched/sched.h#L663
말씀하신 유저에서 사용한 시스템 콜은 정책 인자를 넣어줄 수 있습니다.
- https://man7.org/linux/man-pages/man7/sched.7.html
- https://man7.org/linux/man-pages/man3/pthread_setschedparam.3.html
/nptl/pthread_setschedparam.c 어떻게 설정하는지 GLIBC 유저 구현을 볼까요?
- https://elixir.bootlin.com/glibc/glibc-2.37.9000/source/nptl/pthread_setschedparam.c#L27
커널에서 해당 시스템 콜 구현을 볼까요?
https://elixir.bootlin.com/linux/latest/source/kernel/sched/core.c#L7892
동영상 재생이 좋은 예시일 것 같습니다.