스케줄러는 시간 중단 후에 항상 호출됩니까?

스케줄러는 시간 중단 후에 항상 호출됩니까?

타이머 인터럽트가 발생하면 ISR이 호출되어 인터럽트를 서비스합니다.

모든 타이머 인터럽트가 스케줄러 호출로 끝나고 다음 프로세스가 계속 실행되어야 한다고 가정할 수 있습니까?

모든 인터럽트가 스케줄러 호출로 끝나야 한다고 일반화할 수 있습니까?

답변1

타이머 ISR은 직접 호출되지 않습니다 schedule(). 결국 update_process_times()스케줄러 프로세스에 대한 회계 정보가 최신 상태가 되도록 호출됩니다 .

스케줄러는 결국 사용자 공간으로 돌아올 때 호출됩니다. 커널이 선점형인 경우 타이머 인터럽트에서 커널 공간으로 돌아올 때도 호출됩니다.

예를 들어 프로세스 A가 장치 생성 인터럽트와 타이머 인터럽트에 의해 중단되는 시스템 호출을 실행한다고 가정합니다.

   프로세스 A 사용자 공간 → 프로세스 A 커널 공간 → 장치 ISR → 타이머 ISR
                    시스템 호출 장치 IRQ 타이머 IRQ

타이머 ISR이 끝나면 다른 ISR로 돌아가고, 다시 커널 공간으로 돌아가고, 커널 공간은 사용자 공간으로 돌아갑니다. 선점형 커널은 돌아올 때마다 프로세스를 다시 예약해야 하는지 확인합니다. 비선점형 커널은 사용자 공간으로 돌아올 때만 이 검사를 수행합니다.

ARM 세계에서 코드 경로는 대략 다음과 같습니다.

  • 사용자 공간에서 수신된 IRQ는 통화를 종료 __irq_usr하고, SVC 모드에서 수신된 IRQ는 통화를 종료합니다 __irq_svc. IRQ는 다른 프로세서 모드에서 수신되어서는 안 됩니다.
  • 에서 __irq_svcIRQ를 처리한 후,커널이 선점형인 경우선점은 비활성화되지 않으며 일정 을 변경해야 하며 커널은 호출로 점프 svc_preempt합니다 . 그렇지 않으면 일정 변경이 발생하지 않습니다.preempt_schedule_irqschedule
  • 결국 CPU는 IRQ 처리기( __irq_usrret_to_user_from_irq) 또는 시스템 호출( vector_swi→ )을 통해 ret_fast_syscall사용자 공간으로 돌아갑니다 . 여기서 커널은 수행할 작업이 있는지 확인하고 일정을 schedule다시 조정해야 하는지 호출합니다.

관련 정보