Dan*_* Dv 4 linux stack process linux-kernel
在 linux 中为每个进程保留不同的内核堆栈有什么意义?
为什么不只保留一个堆栈供内核使用?
在 linux 中为每个进程保留不同的内核堆栈有什么意义?
它简化了内核空间中进程的抢占。
为什么不只保留一个堆栈供内核使用?
在没有单独堆栈的情况下实施抢占将是一场噩梦。
单独的内核堆栈并不是真正强制的。每个架构都可以自由地做任何想做的事。如果在系统调用期间没有 per-emption,那么单个内核堆栈可能是有意义的。
但是,*nix 有进程,每个进程都可以进行系统调用。但是,Linux 允许在write()等期间抢占一项任务并安排另一项任务。内核堆栈是为每个进程执行的内核工作上下文的快照。
此外,每进程内核堆栈的开销很小。需要一种thread_info或某种机制来从汇编程序中获取进程信息。这至少是一个页面分配。通过将内核模式堆栈放置在同一位置,一个简单的掩码可以thread_info从汇编程序中获取。所以,我们已经需要每个进程的变量和分配。为什么不将其用作堆栈来存储内核上下文并允许在系统调用期间进行抢占?
抢占的效率可以通过write上面提到的来证明。如果write()是磁盘或网络,则需要时间才能完成。写入磁盘或网络的 5k 到 8k 缓冲区将需要许多 CPU 周期才能完成(如果是同步的)并且用户进程将阻塞直到它完成。驱动程序中的这种传输可以通过 DMA 完成。在这里,硬件元件将完成将缓冲区传输到设备的任务。同时,当内核为每个进程保留不同的堆栈时,较低优先级的进程可以拥有 CPU 并被允许进行系统调用。这些堆栈的成本接近于零,因为内核已经需要有进程状态的簿记信息,并且两者都保存在 4k 或 8k 页面中。
| 归档时间: | 
 | 
| 查看次数: | 1738 次 | 
| 最近记录: |