Linux 커널은 프로세스를 예약하기 위해 가중치 값을 어떻게 사용합니까?

Linux 커널은 프로세스를 예약하기 위해 가중치 값을 어떻게 사용합니까?

"Linux Kernel Development"를 읽고 있는데 프로세스의 가중치 값을 이해하지 못합니다. Linux 커널에서 각 프로세스는 nice 값을 가지며, nice 값은 가중치에 매핑됩니다.

  • 무게는 "프로세서 시간의 비율"이라고 생각합니다. 이는 프로세스에 할당된 실행 시간이 해당 가중치 / (모든 프로세스의 총 가중치) * (프로세서 시간)임을 의미합니다. 위 수식의 결과가 10%이지만 프로세스의 실제 실행 시간이 10% 미만인 경우 우선 순위가 부여됩니다. 옳은?
  • cfs가 어떻게 확인하는지 혼란스러워요. cfs는 프로세스의 런타임을 주기적으로 확인(예: 1ms) 및 업데이트하고 실제 런타임/프로세스에 할당된 런타임의 비율을 선택한 최소값과 비교하여 실행합니까? 그런데 사용된 기능 중 일부를 나열해 주실 수 있나요?

답변1

set_load_weightLinux 커널 소스 코드에서 기능을 확인하세요. 여기서는 스케줄링 개체(작업/작업 그룹)의 실제 부하를 계산합니다. 이 루틴은 다양한 위치(예: 포크 또는 사용자 공간에서 새로운 좋은 값을 설정할 때 등)에서 호출됩니다.

if (update_load && p->sched_class == &fair_sched_class) {
    reweight_task(p, prio);
} else {
    load->weight = scale_load(sched_prio_to_weight[prio]);
    load->inv_weight = sched_prio_to_wmult[prio];
}

sched_prio_to_weight우선순위에 따른 가중치를 포함합니다.

작업 가중치 정보를 보유하는 구조는 입니다 struct load_weight. 이 구조는 cfs에서 엔터티의 로드를 얻고 vruntime작업의 Runtime() 루틴을 업데이트하는 데 사용됩니다 update_curr. cfs는 실행할 다음 작업을 선택합니다 pick_next_task. 아래는 코드 조각입니다.

for_each_class(class) {
        p = class->pick_next_task(rq, prev, rf);
        if (p) {
            if (unlikely(p == RETRY_TASK))
                goto again;
            return p;
        }
    }

여기에서는 각 예약 클래스를 살펴보고 실행할 작업을 확인합니다.

관련 정보