추가 읽기

추가 읽기

내가 읽고있다start_kernel함수는 의 끝에서 호출됩니다 /init/main.c. 마지막으로 호출되는 함수 start_kernel는 이고 rest_init의 끝에서 호출됩니다.rest_initcpu_idle

start_kernel루틴의 마지막 함수라고 불리는 이유는 무엇 이며 어떤 역할을 합니까?

답변1

첫 번째 질문에 답하려면,

cpu_idle효과 는 무엇입니까 ?

일반적으로 말하면(질문의 맥락에 관계없이) CPU가 유휴 상태라는 것은 현재 커널에 CPU가 수행할 수 있는 작업이 없으므로 CPU가 커널에서 더 많은 작업을 기다리며 유휴 상태임을 의미합니다.

커널은 일정에 따라 CPU에 작업을 전달하는 관리자로 생각할 수 있습니다. CPU에 사용 가능한 작업이 없으면 CPU는 유휴 상태로 들어가 인터럽트를 기다립니다. CPU 인터럽트에 대해 더 자세히 읽을 수 있습니다.여기.

질문의 맥락과 관련하여 정확한 구현을 읽을 수 있습니다.cpu_idle하다:

cpu_idle(void)
{
    set_thread_flag(TIF_POLLING_NRFLAG);

    while (1) {
        /* FIXME -- EV6 and LCA45 know how to power down
           the CPU.  */

        while (!need_resched())
            cpu_relax();
        schedule();
    }
}

결국 cpu_idleCPU를 유휴 상태로 진입시키는 것입니다. 이는 while필요할 때 프로세스 스케줄링을 처리하는 루프를 사용하여 수행됩니다. 그렇지 않으면 CPU가 유휴 상태로 유지됩니다 cpu_relax.

start_kernel왜 루틴의 마지막 함수라고 불리는 걸까요 ?

이 함수가 루틴의 마지막 명령어로 실행되는 이유 start_kernel는 CPU가 코어를 시작하는 데 필요한 모든 작업을 이미 수행했기 때문입니다. 더 이상 명령어가 실행되지 않으므로 CPU는 유휴 상태가 되어 다음 작업이나 인터럽트를 기다리게 됩니다. . 이를 나타내려면 CPU가 커널 초기화에 더 이상 필요하지 않으므로 유휴 상태에 있어야 합니다.

답변2

CPU는 항상 실행되어야 합니다.무엇. 할 일이 없으면 무한 루프에 빠지게 되며 인터럽트(예: 시스템 하트비트 인터럽트)에 의해 중단됩니다.

이전 다중 프로세스/다중 스레드 운영 체제에서는 스케줄러(실행 가능한 스레드의 대기열을 실행하기 위해 다음 스레드를 선택하고 전환하는 하위 수준 스케줄러)가 실행할 준비가 된 스레드가 없다는 것을 발견하면 이 상태 링처럼 무한대로 들어가세요.

이는 많은 당사자들을 괴롭히는 문제입니다프로세서그러나 운영 체제에서는 스케줄러가 남긴 스레드의 컨텍스트에서 무한 루프가 실행되기 때문입니다. 이로 인해 동일한 스레드가 두 프로세서에서 동시에 "실행"되어 많은 문제가 발생할 수 있습니다.

따라서 더 새로운(즉, 비교적 새로운, 아이디어가 수십 년 전에 나온 것이기 때문에) 디자인은 시스템의 모든 프로세서에 대해 다음이 있다는 것입니다.유휴 스레드. 이 스레드는 무한 루프만 수행하며언제나실행 가능. 에프언제나스케줄러는 스레드를 선택할 수 있으며 프로세서가 실행될 실행 가능한 스레드가 없는 상황은 절대 없습니다.

실제 Unix의 이전 버전에서는 시스템 초기화가 완료되면 초기화 코드가 이를 프로세스 #0으로 설명하는 데이터 구조를 설정했습니다. 그 역할 때문에 "교환 프로세스"라는 전통적인 이름을 가지고 있습니다. 그것은 이루어져야 한다무엇초기화가 완료된 후 메인 RAM과 DASD 스왑 영역 사이의 프로세스 세그먼트를 스왑하는 코드를 실행하는 것뿐입니다.

스와핑에 대한 아이디어는 1970년대 후반 수요 페이징 디자인의 등장과 함께 사라졌습니다. 프로세스 #0이 첫 번째가 됩니다.유휴 프로세스이후시스템 프로세스모두 포함유휴 스레드.

이것은 Linux에서도 일어나는 일입니다.

물론, 이 시점에서 전력 관리는 25년 넘게 고려되었으며, 무조건적인 분기 명령이 자체적으로 분기되는 전통적인 무한 루프는 불필요한 바쁜 작업과 전력 소비를 많이 초래합니다. 최신(역시 상대적인 용어) 유휴 스레드는 실행 프로세서에 대기를 지시하는 특수 프로세서 명령을 호출하여 전력을 절약하기 위해 클럭 속도를 줄여 하드웨어 인터럽트를 수신할 수 있습니다. (수년 동안 x86 명령어 아키텍처에서는 hlt"하이퍼스레드" 프로세서의 실행 코어에서 리소스를 pause완전히 해제하는 것에서 rep nop인터럽트를 포함하지 않는 프로세서 간 숄더 오프로딩으로 전환하여 유휴 스레드를 영구 스레드로 효과적으로 전환했습니다. 대기 스핀 잠금입니다.)

추가 읽기

관련 정보