2016-07-01 2 views
1

내 상자에서 다음 값 :sched_wakeup_granularity_ns, sched_min_granularity_ns 및 SCHED_RR

그것은 1 초에 의미
sysctl -A | grep "sched" | grep -v "domain" 

kernel.sched_autogroup_enabled = 0 
kernel.sched_cfs_bandwidth_slice_us = 5000 
kernel.sched_child_runs_first = 0 
kernel.sched_latency_ns = 18000000 
kernel.sched_migration_cost_ns = 5000000 
kernel.sched_min_granularity_ns = 10000000 
kernel.sched_nr_migrate = 32 
kernel.sched_rr_timeslice_ms = 100 
kernel.sched_rt_period_us = 1000000 
kernel.sched_rt_runtime_us = 950000 
kernel.sched_shares_window_ns = 10000000 
kernel.sched_time_avg_ms = 1000 
kernel.sched_tunable_scaling = 1 
kernel.sched_wakeup_granularity_ns = 3000000 

, 0.95 초는 SCHED_FIFO 또는 SCHED_RR입니다, 는 0.05 SCHED_OTHER 예약, 내가 궁금하면
입니다 sched_wakeup_granularity_ns, 나는 그것을 인터넷 검색 및 설명을 얻을 수있다 :

Ability of tasks being woken to preempt the current task. 
The smaller the value, the easier it is for the task to force the preemption 

내가 sched_wakeup_granularity_ns에만 효과 SCHED_OTHER 작업,,745 생각을SCHED_FIFO 및 SCHED_RR은 절전 모드가 아니어야하므로 "wakeup"할 필요가 없습니다. 맞습니까? CPU 시간의 95 %를 가지고 SCHED_RR 작업을 할 수 있지만, 내가 알고 싶은

Minimum preemption granularity for processor-bound tasks. 
Tasks are guaranteed to run for this minimum time before they are preempted 

, 그러나 sched_min_granularity_ns 값 = 10000000, 그것 때문에 0.01 초, :

및 sched_min_granularity_ns에 대한

의 설명입니다 즉, 모든 SCHED_OTHER가 차단 대기 소켓 또는 절전 모드에 의해 차단되지 않는 한 선점되기 전에 실행되는 0.01 초 타임 슬라이스를 얻는다는 의미입니다. 예를 들어 코어 1에 3 개의 작업이 있으면 SCHED_RR로 2 개의 작업이, SCHED_OTHER에 3 번째 작업이 있음을 의미합니다. 세 번째 작업은 소켓 recv를 차단하지 않고 무제한 루프를 실행하고 yield없이 수행하므로 세 번째 작업은 CPU를 가져와 실행하고, 그것은 0.01 초 을 실행 한 후 컨텍스트 스위치를 끕니다. 다음 작업이 SCHED_RR의 우선 순위이기도합니다. sched_min_granularity_ns 사용에 대한 권리가 있습니까?

편집 :

http://lists.pdxlinux.org/pipermail/plug/2006-February/045495.html

이 설명은 :

No SCHED_OTHER process may be preempted by another SCHED_OTHER process. 
However a SCHED_RR or SCHED_FIFO process will preempt SCHED_OTHER 
process before their time slice is done. So a SCHED_RR process 
should wake up from a sleep with fairly good accuracy. 

는 SCHED_RR 작업도 타임 슬라이스를 차단하지 않고 루프 동안 끝없는을 선점 수 있다는 것을 의미하지입니까?!

답변

1

더 높은 스케줄링 클래스 "우선 순위"가있는 작업은 시간 초과와 관계없이 우선 순위가 낮은 스케줄링 클래스로 모든 작업을 선점합니다. 공정 마감, RT, 대기, 중지 :

void check_preempt_curr(struct rq *rq, struct task_struct *p, int flags) 
{ 
    const struct sched_class *class; 

    if (p->sched_class == rq->curr->sched_class) { 
     rq->curr->sched_class->check_preempt_curr(rq, p, flags); 
    } else { 
     for_each_class(class) { 
      if (class == rq->curr->sched_class) 
       break; 
      if (class == p->sched_class) { 
       resched_curr(rq); 
       break; 
      } 
     } 
    } 

    /* 
    * A queue event has occurred, and we're going to schedule. In 
    * this case, we can save a useless back to back clock update. 
    */ 
    if (task_on_rq_queued(rq->curr) && test_tsk_need_resched(rq->curr)) 
     rq_clock_skip_update(rq, true); 
} 

for_each_class이 순서로 클래스를 반환합니다 커널/별 일정/core.c에서 아래의 코드 조각에서 살펴 보자. 선점 작업과 동일한 스케줄링 클래스로 작업을 선점하려고하면 루프가 중지됩니다.

질문에 대한 대답은 '예'입니다. 'rt'작업은 '공정한'작업을 선점합니다.