从处理器的angular度来看进程调度

我知道调度是由内核完成的。 让我们假设Linux中的进程(P1)正在处理器上执行。 由于当前进程并不知道时间片的内容,内核当前没有在处理器上执行,内核如何安排下一个进程执行?

是否有某种中断告诉处理器切换到执行内核或任何其他机制的目的?

Solutions Collecting From Web of "从处理器的angular度来看进程调度"

简而言之,这是一个中断,将控制权交还给内核。 中断可能由于任何原因而出现。 由于定时器中断,内核得到控制的大部分时间,或按键中断可能会唤醒内核。 用外围系统通知IO完成的中断或几乎任何改变系统状态的中断都可能唤醒内核。

更多关于中断:

中断分为上半部分和下半部分。 下半部分是为了延迟中断上下文的工作。

上半部分:中断被禁用,因此应该是超快的,通常尽快放弃CPU

1) stores interrupt state flag and disables the interrupts(reset some pin on the processor), 2) communicates with the hardware, stores state information, delegates remaining responsibility to bottom-half, 3) restores the interrupt state flag and enables the interrupt((set some pin on the processor). 

下半部分:处理延期工作(上半部分的委托工作)在启用中断的情况下运行,因此可能需要一段时间才能完成。

两种机制被用来实现下半部分处理。

 1) Tasklets 2) Work queues 

 If timer is the interrupt to switch back to kernel, is the interrupt a hardware interrupt??? 

在我们讨论的上下文中,感兴趣的定时器中断是硬件定时器中断,

在内核内部,字定时器中断可能意味着(架构相关的)硬件定时器中断或软件定时器中断。

阅读此简要概述。

更多关于计时器

记住“定时器”是一个高级的话题,难以理解。

是硬件中断的中断? 如果是硬件中断,定时器的频率是多少?

阅读第10章定时器和时间管理

 if the interval of the timer is shorter than time slice, will kernel give the CPU back the same process, which was running early? 

这取决于许多因素,如使用sheduler,加载系统,处理优先级,类似的事情。 最受欢迎的CFS并不是真正依靠时间片抢占的概念! 由CFS挑选的下一个合适的过程将获得CPU时间。

定时器滴答,时间片和上下文切换之间的关系并不那么直接。

每个进程都有自己的(动态计算的)时间片。 内核跟踪进程使用的时间片。

在SMP上,监视当前正在运行的进程的执行时间等CPU特定的活动是由本地APIC定时器产生的中断来完成的。 本地APIC定时器仅向其处理器发送中断。

但是,缺省时间片在include / linux / sched / rt.h中定义

阅读这个 。

很少有事情会发生 –

  a. The current process (p1) can finish up its timeslice and then the scheduler will check is there is any other process that could be run. If there's no other process, the scheduler will put itself in the idle state. The scheduler will assign p1 to the CPU if p1 is a CPU hoggy task or p1 didn't leave the CPU voluntarily. b. Another possibility is - a high priority task has jumped in. On every scheduler tick, the scheduler will check if there's any process which needs the CPU badly and is likely to preempt the current task. 

换句话说,一个进程可以以两种方式离开CPU:自动或非自愿。 在第一种情况下,进程将自己休眠,因此释放CPU(情况a )。 在另一种情况下,一个进程已被优先级更高的任务抢占。

(注意:这个答案基于当前Linux内核的CFS任务调度程序)