Linux kernel의 CFS(Completely Fair Scheduling) 스케줄러에서 time slice 구하는 방법?
안녕하세요,
최근 linux kernel에서 프로그래밍 할 일이 있어서 커널 소스를 보고있는데, 프로세스 스케줄러가 O(1)에서 CFS로 바뀌었네요. CFS에서는 time slice가 명시적으로 없고 동적으로 계산을 해서 사용하는 듯 하네요.
프로그래밍 하면서 schedule()함수에서 time slice가 동적으로 필요한데 어떻게 구해야 할지 잘 모르겠네요.
아래와 같이 get_task_timeslice()함수로 작성을 해봤는데 맞는지 잘 모르겠네요, 혹시 아시는분 있으시면 확인 부탁드립니다.
그리고 추가로 Linux kernel관련해서 질문질답을 활발히 하는 싸이트를 아시면 좀 알려주세요.
=====================================================================
unsigned long inline
get_task_timeslice(struct task_struct* p)
{
unsigned long time_slice;
int retval;
retval = -ESRCH;
read_lock(&tasklist_lock);
if (!p)
goto out_unlock;
retval = security_task_getscheduler(p);
if (retval)
goto out_unlock;
/*
* Time slice is 0 for SCHED_FIFO tasks and for SCHED_OTHER
* tasks that are on an otherwise idle runqueue:
*/
time_slice = 0;
if (p->policy == SCHED_RR) {
time_slice = DEF_TIMESLICE;
} else if (p->policy != SCHED_FIFO) {
struct sched_entity *se = &p->se;
unsigned long flags;
struct rq *rq;
rq = task_rq_lock(p, &flags);
if (rq->cfs.load.weight)
time_slice = NS_TO_JIFFIES(sched_slice(&rq->cfs, se));
task_rq_unlock(rq, &flags);
}
read_unlock(&tasklist_lock);
return time_slice;
out_unlock:
read_unlock(&tasklist_lock);
return retval;
}
asmlinkage void __sched schedule(void)
{
......
unsigned long time_slice = get_task_timeslice(current);
....
}
=======================================================================
좋은 하루 되세요.


댓글 달기