我最近了解到 Linux 内核线程在进程上下文中运行。
为什么它们在进程上下文中运行?
为什么它们不简单地在传统的“线程”中运行?(如果这甚至有道理问)
不,问是没有意义的:)(见这里)
进程上下文仅意味着线程是普通线程,例如您在进程中获得的线程。中断上下文只是意味着线程是由中断启动的。
警告:以下是高度简化的,并不完全准确:
中断是导致 CPU 停止正在执行的操作并执行称为中断处理程序的特殊代码的低级别事件(对中断处理程序进行上下文更改)。中断是由硬件引起的,例如网卡发出数据包已经到达并需要读取的信号,或者由软件事件引起,例如虚拟内存使用中断请求内核从磁盘物理内存加载页面等。
在现代 CPU 中,中断和线程非常复杂,它们具有优先级、特权级别、可以单独屏蔽等。
为什么它被称为进程上下文而不是线程上下文?我认为这是出于历史原因。
传统上,Unix 以及 Linux 的扩展,不支持仅线程进程。
CPU并不真正了解进程和线程,从CPU的角度来看它们都是执行上下文,线程和进程之间的区别在于操作系统如何安排虚拟内存和其他与操作系统相关的属性(用户上下文,权限等)的不同执行上下文。
内核线程可以被称为执行中的上下文,它不拥有用户空间对应物(与 Linux 中用户空间进程映射到内核空间进程的其他线程/进程不同)。这些通常用作守护进程,例如。kswapd - 用于驱逐虚拟内存页面的交换进程。该进程不存在用户空间。
其次,因为它们具有与自身相关的明确上下文,可以切换(比如寄存器的状态保存在自己的堆栈中),所以内核线程是可调度的。而且,任何可调度的东西都可以被视为“流程上下文”。
另一方面,中断是不可调度的。它们发生并执行产生自己的上下文的中断处理程序。