달력

2

« 2025/2 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
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)
{
if(!TASK_INTERACITVE(task) || ! EXPIRED_STARVING(rq))
   enqueue_task(task, rq->expired);
else
   enqueue_task(task, rq->active); 


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
:
Posted by НooпeУ


Code Start Code End