3

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

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

4

2 回答 2

6

简而言之,它是一个将控制权交还给内核的中断。由于任何原因都可能出现中断。大多数情况下,内核由于定时器中断而获得控制权,或者按键中断可能会唤醒内核。中断通知与外围系统的 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?

它取决于许多因素:正在使用的调度程序、系统负载、进程优先级等。最流行的CFS并不真正依赖于抢占时间片的概念!CFS 选择的下一个合适的进程将获得 CPU 时间。

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

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

在 SMP 上,CPU 特定的活动(例如监视当前运行进程的执行时间)由本地 APIC 计时器引发的中断完成。本地 APIC 定时器仅向其处理器发送中断。

但是,默认时间片定义在include/linux/sched/rt.h

这个

于 2013-05-17T04:51:04.520 回答
1

可能发生的事情很少——

   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任务调度器)

于 2013-05-17T05:53:27.897 回答