SCHED_BATCH 설명은 혼란스럽습니다. 실제로 어떤 역할을 합니까?

SCHED_BATCH 설명은 혼란스럽습니다. 실제로 어떤 역할을 합니까?

chrtLinux에는 명령줄을 사용하여 프로세스에 설정할 수 있는 여러 가지 예약 옵션이 있습니다 . 이 중 어느 것이... 어느 것인지 알 수 없는 것 같습니다 SCHED_BATCH. 실제로 그 설명은 여러 출처에서 모순됩니다. 하지만 그 전에, 다양한 설명이 이를 참조하므로 모든 계획 옵션에 대해 제가 얻은 사실을 요약하겠습니다 SCHED_BATCH.

SCHED_FIFO기본적으로 SCHED_RR모든 실시간 스케줄링 전략은 약간의 차이가 있지만 여기에서는 대부분 문제가 없으며 항상 다른 프로세스보다 먼저 실행됩니다.

SCHED_OTHERnice각 프로세스의 값에 따라 우선순위를 지정하는 기본 정책입니다 .

SCHED_DEADLINESCHED_FIFO- 아직 완전히 이해하지 못했습니다. 실행 타이머가 설정되어 있지만 실제로는 더 가까운 것 같고 SCHED_FIFO해당 타이머에 도달하면 실제로 /task를 선점할 수도 있습니다.SCHED_RR

SCHED_IDLE- 기본적으로 "CPU가 유휴 상태일 때만 예약"합니다. 여기서는 문제가 없습니다.

이제 SCHED_BATCH나는 이것이 꽤 논란의 여지가 있다고 생각합니다. 한편으로는원래 구현 노트SCHED_IDLE2002년 현재는 사용자 코드 및 커널 코드 와 본질적으로 동일하다고 합니다 SCHED_OTHER(프로세스가 예약되지 않아 커널 리소스 잠금이 발생하는 것을 방지하기 위해). 내부에남자 기사본질적으로 동일하다고는 하지만 SCHED_OTHERCPU 바인딩으로 간주되므로 약간의 페널티가 있습니다.

이제 이 두 가지 SCHED_BATCH설명은 서로 일치하지 않습니다. 어느 것이 진실인가요? SCHED_BATCH어딘가에 다시 구현되었나요 ? 아니면 누군가가 SCHED_BATCHMAN 기사를 작성할 때 오해를 했을 수도 있나요? 어떤 설명이 맞나요?

업데이트: 추가 연구:

좀 더 파고들어서 이걸 발견했어요커널 스케줄러 문서, 또는 채굴을 통해예약 소스SCHED_BATCH와 동일한 코드로 처리되는 것으로 보입니다 SCHED_OTHER.

나는 또한 테스트를했다. 좋은 19개를 사용하더라도 로드가 높기 때문에 실제로 다른 프로세스를 제한하는 프로세스가 하나 있지만 기본 SCHED_OTHER설정이 있습니다. 설정했는데 SCHED_IDLE다른 프로세스의 조절 문제가 사라졌습니다... 그런 다음 SCHED_BATCH동일한 프로세스(동일한 19개 설정으로)를 시도하기로 결정했습니다. 놀랍게도 SCHED_BATCH다른 프로세스에도 제한이 없습니다 SCHED_IDLE!

그러나 위에 링크한 문서에 따르면 SCHED_IDLE및 와 동일한 코드로 처리할 수 있지만 우선순위가 매우 낮은 것으로 보입니다. 어떤 상황에서 사용되는지는 아직 잘 모르겠습니다.SCHED_OTHERSCHED_BATCH만성 피로 증후군(이것이 SCHED_OTHER주요 구현입니다.) 이 경우에는 다음을 사용합니다.커널/sched/idle.c구현하다.

나는 아직 결정적인 대답을 갖고 있지 않으며, 테스트와 문서도 여전히 나에게 큰 의미가 없습니다. 테스트 결과 SCHED_BATCH실제와 동일한 방식으로 작동하는 것으로 나타났지만 SCHED_IDLE모든 문서에는 SCHED_OTHER실제와 동일하게 작동해야 한다고 명시되어 있습니다!

답변1

SCHED_BATCH

~에서사람들이 준비한 것(7), 에 대한 SCHED_BATCH:

...이 정책을 사용하면 스케줄러는 항상 스레드가 CPU에 바인딩되어 있다고 가정합니다. 따라서 스케줄러는 깨우기 동작에 대해 작은 스케줄링 패널티를 적용하여 스레드가 스케줄링 결정에 약간 부정적인 영향을 미치도록 합니다.

분명히 CFS 스케줄러는 CPU 집약적인 것으로 간주되는 스레드에 "작은 페널티"를 부과합니다. Linux 소스 코드를 살펴보면 SCHED_BATCH한 위치의 스케줄러 동작에만 영향을 미친다는 것을 알 수 있습니다. 지금 바로kernel/sched/fair.c:yield_task_fair()

static void yield_task_fair(struct rq *rq)
{
    if (curr->policy != SCHED_BATCH) {
        update_rq_clock(rq);
        /*
         * Update run-time statistics of the 'current'.
         */
        update_curr(cfs_rq);
        /*
         * Tell update_rq_clock() that we've just updated,
         * so we don't do microscopic update in schedule()
         * and double the fastpath cost.
         */
        rq_clock_skip_update(rq);
    }

    set_skip_buddy(se);
}

함수 이름으로 판단하면 현재 스레드를 생성하는(그리고 다음 스레드를 선택할 수도 있는) 함수인 것 같습니다. 현재 CPU에서 실행 중인 스레드( )가 currCPU에서 제거("생성")되어 다른 스레드에서 CPU를 사용할 수 있게 됩니다. 일정 정책 curr에 따라 실행되는 경우 SCHED_BATCH일부 런타임 통계는 업데이트되지 않습니다 curr.

CFS 관점에서 볼 때 통계를 업데이트하지 않으면 스레드가 CPU를 많이 사용하게 되고 결과적으로 CFS가 스레드를 덜 선호하게 될 것으로 생각됩니다.

SCHED_BATCH 및 SCHED_IDLE

SCHED_BATCH과의 차이점에 관해서는 SCHED_IDLE: 둘은 실제로 매우 다릅니다. 먼저 SCHED_IDLE스레드는오직여유 CPU가 있으면 실행합니다. 따라서 스레드에는 진행이 보장되지 않습니다 SCHED_IDLE. 시스템이 다른 스레드에 의해 100% 활용되고 있으면 SCHED_IDLE스레드가 실행되지 않을 수 있습니다. SCHED_BATCH일반 CPU 멀티플렉싱에 참여하므로 계속되는 것이 보장되는 스레드의 경우에는 그렇지 않습니다 .

또한 Linux >= 5.4의 경우 SCHED_IDLE스레드를 실행하는 CPU는 CFS 스케줄러의 관점에서 유휴 상태로 간주됩니다. 이는 중요한 의미를 갖습니다. 스레드가 아닌 SCHED_IDLE스레드가 실행 가능해지면 스케줄러는 다음을 수행할 수 있습니다.스레드를 생성 SCHED_IDLE하고 SCHED_IDLE스레드가 아닌 스레드를 그 위에 놓습니다. 당신은 또한 볼 수 있습니다"SCHED_IDLE 수정": LWN.net(2019-11-26).

이는 SCHED_BATCH또한 다른 작업을 "조절 해제"할 수 있습니다. 아마도 SCHED_BATCH스레드가 받는 페널티가 그렇게 하는 데 충분하기 때문일 것입니다. 또한 kernel/sched/idle.c직접적으로 관련되지 않은 SCHED_IDLE이 파일에는 CPU를 유휴 모드로 전환하는 스케줄러 관련 코드만 포함되어 있습니다. SCHED_OTHER,SCHED_BATCH 그리고 SCHED_IDLE이는 모두 Linux CFS 스케줄러의 스케줄링 전략입니다( kernel/sched/fair.c).

관련 정보