![Linux 커널은 프로세스를 예약하기 위해 가중치 값을 어떻게 사용합니까?](https://linux55.com/image/149843/Linux%20%EC%BB%A4%EB%84%90%EC%9D%80%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EB%A5%BC%20%EC%98%88%EC%95%BD%ED%95%98%EA%B8%B0%20%EC%9C%84%ED%95%B4%20%EA%B0%80%EC%A4%91%EC%B9%98%20%EA%B0%92%EC%9D%84%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EC%82%AC%EC%9A%A9%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
"Linux Kernel Development"를 읽고 있는데 프로세스의 가중치 값을 이해하지 못합니다. Linux 커널에서 각 프로세스는 nice 값을 가지며, nice 값은 가중치에 매핑됩니다.
- 무게는 "프로세서 시간의 비율"이라고 생각합니다. 이는 프로세스에 할당된 실행 시간이 해당 가중치 / (모든 프로세스의 총 가중치) * (프로세서 시간)임을 의미합니다. 위 수식의 결과가 10%이지만 프로세스의 실제 실행 시간이 10% 미만인 경우 우선 순위가 부여됩니다. 옳은?
- cfs가 어떻게 확인하는지 혼란스러워요. cfs는 프로세스의 런타임을 주기적으로 확인(예: 1ms) 및 업데이트하고 실제 런타임/프로세스에 할당된 런타임의 비율을 선택한 최소값과 비교하여 실행합니까? 그런데 사용된 기능 중 일부를 나열해 주실 수 있나요?
답변1
set_load_weight
Linux 커널 소스 코드에서 기능을 확인하세요. 여기서는 스케줄링 개체(작업/작업 그룹)의 실제 부하를 계산합니다. 이 루틴은 다양한 위치(예: 포크 또는 사용자 공간에서 새로운 좋은 값을 설정할 때 등)에서 호출됩니다.
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;
}
}
여기에서는 각 예약 클래스를 살펴보고 실행할 작업을 확인합니다.