2012-07-02 1 views
2

작업이 시간 조각을 먹은 후에는 빨강 - 검정 나무에 다시 삽입됩니다. 작업이 이전에 오랜 시간 동안 잠자기 상태가되어 실행 대기열의 다른 작업과 비교하여 매우 작은 vruntime이 발생하면 빨간색 - 검은 색 트리의 맨 왼쪽 노드로 반복적으로 다시 삽입됩니다. 맞습니까? 결과적으로 실행을위한 다음 작업으로 항상 선택됩니다. core.c와 fair.c에서 소스 코드를 확인 했으므로이 작업이 다른 작업에 양보해야하는 곳을 찾지 못했습니다. funciton pick_next_entity()에서는 cfs_rq-> next, cfs_rq-> last 등의 태스크를 보았지만 실행 우선 순위가 더 높을 수도 있습니다.이 태스크가 매우 작은 태스크를 막는 올바른 위치라고는 생각하지 않습니다. vruntime에서 프로세서를 너무 오랫동안 사용하지 않았습니까? 누구는 단서가 있습니까? 감사합니다,리눅스 CFS 스케줄러는 매우 작은 vruntime을 가진 작업이 프로세서를 굶는 것을 어떻게 막을 수 있습니까?

답변

3

답변을 찾았습니다. 작업이 실행 큐에서 디큐 경우 가이 호출됩니다 SE-> vruntime - = cfs_rq-> min_vruntime 작업을 다시 실행 큐의 대기열에 포함되면이 호출됩니다 SE-> vruntime + = cfs_rq-> min_vruntime 실제로 작업이 잠자기 상태 일 때 vruntime의 오프셋 만 저장되고 잠자기에 깨어 났을 때 오프셋이 다시 추가됩니다.

+0

나는 수면 후에 프로세스가 깨어 난 경우에 당신의 요점을 이해했습니다. 하지만 http://stackoverflow.com/questions/24947547/linux-cfs-scheduler에서이 질문을 설명 할 수 있습니까? 이런 식으로 cfs가 두 프로세스 p1과 p2가있는 경우 기아를 방지하는 방법은 p1이 꽤 오랜 시간 실행되어 프로세스 p2가 시작되면 vruntime이 커지므로 vruntime이 0이되면 새 작업은 p1에 대해 예약됩니다. vruntime은 적습니다. –

관련 문제