内核态抢占

Kernel mode preemption

我了解新的 linux 内核允许内核 space 线程被抢占。 有人可以简要解释一下在内核模式下执行时抢占是如何工作的吗? 因此,当进行系统调用时,软件中断会将线程切换到内核模式并运行必要的线程。 现在,假设它的时间片已到 - 另一个用户线程正在运行,它也想在内核 space 中执行。 (或者它可能是 h/w 中断)。 当它被中断时,内核如何保持它为 T1 修改的任何结构的完整性?

Linux 内核保护其数据结构的方式与在多线程环境中运行的任何东西相同。

它可能会使用一些 sort of lock 来保护必须以原子方式访问的数据结构。通常,这些包括自旋锁、互斥锁和信号量。

还有一些函数 disable preemption 但这通常不会显式使用,因为锁定代码会隐式处理这个问题。

Can someone briefly explain how pre-empting works when executing in kernel mode?

它的工作原理与任何其他上下文切换一样。当可抢占代码中发生中断时,CPU 跳转到相应的中断处理程序并在堆栈上留下一些信息(通常是中断任务的 RIP/CS/EFLAGS/RSP/SS 寄存器)以便能够 return 到后面的抢占任务。

So, when a system call is made, a software interrupt will switch the thread into kernel mode and it will run whats necessary. Now, lets say its time slice is up - and another user thread runs and it also wants to execute in kernel space. (Or it could be a h/w interrupt). How does the kernel maintain the integrity of any structures that it was modifying for T1 when it got interrupted?

让我们调用第一个(被抢占的)任务 T1 和新任务 T2。如果 T1 正在访问某些数据结构,则 T1 必须首先获取锁。所有可能被多个线程同时访问的内核数据结构都受到锁的保护(几乎)。如果 T2 试图访问相同的数据结构,那么它将无法获得锁,因为 T1 仍然拥有它,结果 T2 将阻塞并将 CPU 返回给另一个任务。一段时间后,T1 将再次开始执行,释放它的锁,再次休眠,切换回 T2,T2 获取锁,做它的事情,释放锁等。

如果多个线程尝试并发访问相同的受保护数据,通常只有第一个线程可以访问,所有其他线程都必须等待。