假设我有一个多核系统,比如说 4 个核,在这个系统中我将 3 个用户进程固定到 3 个 CPU 上。
那么,内核应该驻留在哪里呢?
假设某个用户进程对内核进行系统调用,或者说 IOCTl。该 IOCTL 是否会在内核所在的第 4 个 CPU 上执行?
答案1
内核驻留在内存中,并在所有 CPU 和核心上同时执行。
ioctl(2) 或 read(2) 要么立即返回(就像您自己程序中的函数调用一样),要么阻止线程。“阻止线程”意味着内核调度程序将暂停您的线程并在该 CPU/核心上运行另一个线程。您的线程将保持阻塞状态,直到中断处理程序解除阻塞(标记为可运行)。中断处理程序以内核模式运行,通常在第一个物理 CPU 上,它在 I/O 完成后由硬件调用。被标记为可运行后,您的线程将有机会在内核调度程序下次运行时继续执行,可能是在另一个 CPU/核心上。
答案2
答案3
内核本身不驻留在任何地方,或者更确切地说是驻留在任何地方。进行系统调用的进程将在进行调用的 CPU 上继续,并将代码从内核映像复制到其缓存中。由于代码是只读的,每个 CPU 都会在其缓存中拥有它的副本。缓存行将以与系统中任何其他代码相同的方式被逐出。这意味着经常被调用的部分将经常在缓存中,而不经常被调用的部分将不会在缓存中,而是从更高的缓存行、RAM、磁盘等中引入。