2011. 10. 13. 13:34
우선순위와 타임슬라이스계산 OS이야기2011. 10. 13. 13:34
프로세스는 nice값이라는 초기 우선순위를 가지고 있다. (-20 <= nice <= 19)
task_struct -> static_prio에 저장되어 있다. 이 값은 정적 우선순위라고 불리는데, 왜냐하면 사용자가 값을 지정하면 값을 지정한 후로는 변경되지 않기 때문이다.
스케줄러는 prio멤버에 저장되는 동적 우선순위를 사용하여 정책을 결정하는데, 이 동적 우선순의는 정적 우선순위와 태스크의 인터랙티브한 정도의 함수로 구현
인터랙티브가 심하다 - > 대기상태에 많이 빠진다.(IO작업등)
인터랙티브가 덜하다 - > CPU 작업이 많다.
effective_prio()함수는 태스크의 동적 우선순위를 결정한다.
이 함수는 태스크의 nice값으로 출발하여 태스크의 인터랙티브한 정도에 따라 -5에서 +5 사이의 보너스 혹은 페널티 점수를 받게된다. 매우 인터랙티브하면 +5 (페널티를 가짐), 덜 인터랙티브하면 -5(보너스를 가짐)
어떤 태스크가 IO 혹은 프로세서 중심인가를 알기위해서 휴리스틱을 사용한다.
가장 정확한 기준은 얼마나 오랫동안 태스크가 대기하는가다.
이 휴리스틱을 구현하기 위해, 리눅스는 각 프로세스가 실행시간 대비 휴면시간이 얼마나 도니는가에 대한 정보를 유지한다.
이것은 task-struct의 sleep_avg에 저장되며, 대기시간이 길어지면 증가, CPU작업이 많이 일어나면 감소
struct task_struct *task;
struct runqueue rq;
task = current;
rq = this_rq();
if(!--task->time_slice)
{
task_struct -> static_prio에 저장되어 있다. 이 값은 정적 우선순위라고 불리는데, 왜냐하면 사용자가 값을 지정하면 값을 지정한 후로는 변경되지 않기 때문이다.
스케줄러는 prio멤버에 저장되는 동적 우선순위를 사용하여 정책을 결정하는데, 이 동적 우선순의는 정적 우선순위와 태스크의 인터랙티브한 정도의 함수로 구현
인터랙티브가 심하다 - > 대기상태에 많이 빠진다.(IO작업등)
인터랙티브가 덜하다 - > CPU 작업이 많다.
effective_prio()함수는 태스크의 동적 우선순위를 결정한다.
이 함수는 태스크의 nice값으로 출발하여 태스크의 인터랙티브한 정도에 따라 -5에서 +5 사이의 보너스 혹은 페널티 점수를 받게된다. 매우 인터랙티브하면 +5 (페널티를 가짐), 덜 인터랙티브하면 -5(보너스를 가짐)
어떤 태스크가 IO 혹은 프로세서 중심인가를 알기위해서 휴리스틱을 사용한다.
가장 정확한 기준은 얼마나 오랫동안 태스크가 대기하는가다.
이 휴리스틱을 구현하기 위해, 리눅스는 각 프로세스가 실행시간 대비 휴면시간이 얼마나 도니는가에 대한 정보를 유지한다.
이것은 task-struct의 sleep_avg에 저장되며, 대기시간이 길어지면 증가, CPU작업이 많이 일어나면 감소
struct task_struct *task;
struct runqueue rq;
task = current;
rq = this_rq();
if(!--task->time_slice)
{
if(!TASK_INTERACITVE(task) || ! EXPIRED_STARVING(rq))
enqueue_task(task, rq->expired);
else
enqueue_task(task, rq->active);
else
enqueue_task(task, rq->active);
}
EXPIRED_STARVING 매크로 함수는 두 배열이 상대적으로 긴 시간동안 스위칭 되지 않았는가를 검사한다.
EXPIRED_STARVING 매크로 함수는 두 배열이 상대적으로 긴 시간동안 스위칭 되지 않았는가를 검사한다.
'OS이야기' 카테고리의 다른 글
load_balance() (0) | 2011.10.13 |
---|---|
Sleep And Block (0) | 2011.10.13 |
schedule() (0) | 2011.10.13 |
타임슬라이스 재계산 (0) | 2011.10.13 |
프로세스 종료 (0) | 2011.10.11 |