我正在对计算机等进行一些硬核研究,因此我可以开始使用自己的迷你 Hello World 操作系统。
我正在寻找内核如何工作,我想知道内核如何使当前线程返回内核(以便它可以切换到另一个),即使内核没有运行并且线程没有执行此操作的指令。
它是否使用某种在几纳秒后返回内核的 CPU 中断?
我正在对计算机等进行一些硬核研究,因此我可以开始使用自己的迷你 Hello World 操作系统。
我正在寻找内核如何工作,我想知道内核如何使当前线程返回内核(以便它可以切换到另一个),即使内核没有运行并且线程没有执行此操作的指令。
它是否使用某种在几纳秒后返回内核的 CPU 中断?
它是否使用某种在几纳秒后返回内核的 CPU 中断?
在定时器中断和(阻塞)系统调用期间,内核决定是继续执行当前活动的线程还是切换到另一个线程。计时器中断处理程序更新资源使用情况,例如消耗的系统和用户时间,用于当前运行的进程和scheduler_tick()
决定是否需要抢占进程/线程的函数。
请参阅Linux Kernel Development book的第 62 页上的“抢占和上下文切换” 。
然而,内核必须知道何时调用 schedule()。如果它仅在代码明确调用时调用 schedule(),则用户空间程序可以无限期地运行。相反,内核提供了 need_resched 标志来表示是否应该执行重新调度(参见表 4.1)。这个标志在进程应该被抢占时由 scheduler_tick() 设置,当进程具有更高优先级时由 try_to_wake_up() 设置比当前正在运行的进程被唤醒。内核检查该标志,发现它已设置,并调用 schedule() 以切换到一个新进程。该标志是给内核的消息,即应尽快调用调度程序尽可能,因为另一个进程值得运行。
它是否使用某种 CPU 中断
是的! 现代抢占式内核绝对依赖于来自硬件的中断来提供良好的 I/O 性能。键盘、鼠标、磁盘、NIC、USB 等驱动程序都是从中断输入的,并且可以使正在等待它们的线程在需要时(例如,当数据可用时)准备好/运行。
线程也可以通过进行 OS 调用来更改状态,该调用更改调用者自己的状态与另一个线程的状态。
来自硬件定时器的中断是许多中断源之一,唯一的特殊之处在于许多系统操作都有由该中断发出的超时信号。除此之外,定时器中断只会导致重新调度,在大多数情况下,不会改变任何事情。线程的就绪/运行状态。如果机器的 CPU 严重超载到就绪线程数多于内核数的地步,则定时器中断的副作用会导致 CPU 时间在就绪线程之间共享。
不要专注于定时器中断——其他驱动程序中断是绝对必要的。构建一个完全没有定时器中断的功能性抢占式多线程内核并非不可能。