作者:Moon Hee Lee
原文: The Kernel in the Mind
执行是逻辑层面的,放置是物理层面的
在 Linux 中运行进程时,进程仿佛在中断处原样恢复执行。寄存器被恢复,栈保持有效,内存布局符合预期。中断处理程序在已知的 CPU 上下文内执行,系统调用可以无中断地完成。从正在运行的代码视角来看,环境保持一致。
在这种稳定表象之下,系统始终处于变化之中。为均衡负载、提升内存局部性或响应硬件事件,内核会将各类实体在不同 CPU 和内存节点间迁移。任务、内存页、中断处理程序的这类移动,称为迁移。迁移是系统运行中的常态,并且不会打断执行逻辑。
实现这一点的核心,是内核对执行与放置做了严格隔离。执行状态通过上下文切换保存。一个任务可能在另一颗 CPU 上运行,但在恢复执行前,它的程序计数器、栈以及虚拟内存都会完整复原。进程感知不到这种变化。
内存迁移遵循相同原理。内存页可以在 NUMA 节点间移动,或在内存整理过程中重排。内核更新页表、失效过期的 TLB 表项,维持一致的虚拟地址视图。只要映射关系不变,底层物理页可以自由移动。
中断同样可以迁移。设备中断请求(IRQ)会在多个 CPU 间重路由以分担负载。但中断处理程序仍在正确上下文内运行,使用有效的每 CPU 结构体。中断投递路径发生改变,处理程序的执行环境却保持不变。
亲和性为执行的可选位置施加约束,但不会将执行位置固定。任务的 CPU 亲和性规定了其可被调度的位置范围,调度器会遵守该边界。在该范围内,迁移可以自由发生。IRQ 亲和性、内存策略以及每 CPU 基础设施也遵循同样规则。
这套机制能够生效,依赖各个子系统间的协同与状态感知。迁移线程安全地将任务跨 CPU 迁移;内存子系统跟踪反向映射并更新引用;调度器管理运行队列与抢占机制,保证执行的一致性。各个组件保障自身正确性,因此即便系统在重新调整物理位置,逻辑模型依旧稳定。
正是这种隔离,让系统能够扩展和自适应,同时不破坏完整性。代码持续运行,感知不到底层正在发生的物理重组。内核移动需要移动的对象,保留不可改动的状态。
执行属于逻辑范畴,迁移属于物理范畴。二者的边界并非抽象概念,而是由各类机制维护;这些机制让进程、内存页或中断处理程序可以迁移,同时不破坏正在运行的逻辑。
如本文对你有些许帮助,欢迎大佬支持我一下(点赞+收藏+关注、关注公众号等),您的支持是我持续创作的竭动力
支持我的方式