当代码在内核或用户模式下执行时意味着什么?
答案1
答案2
简短的回答是:它只是告诉您程序将时间花在哪里。
对于更长的答案,我将分两步进行解释。第一的:
1.进入内核态
您编写的每个常规代码都在“用户模式”下运行。
程序可以使用库来完成常见任务。这也是用户模式代码。
在某些时候,程序可能需要系统的核心功能。例如:
- 从磁盘访问文件内容
- 保留一部分空闲内存
- 从网络摄像头驱动程序获取视频帧
- 将图像数据发送到显卡。
- 发送网络数据包。
这种基本的(接近硬件)功能是内核的一部分。这是计算机上所有内容背后的中央程序。它管理程序运行所需的一切。
为了使用内核中的函数,程序执行路径实际上是从用户模式跳转到内核代码。内核完成它的工作,并将执行路径折叠回用户模式。
当程序在内核模式下花费大量时间时,通常意味着它正在执行大量与硬件相关的活动。例如,磁盘查找或视频流。硬件也可能出现故障;使处理速度变慢并导致程序在内核空间中花费异常多的时间。
2 区别
内核空间中的代码具有高性能。内核的其他部分可以直接调用它,并且代码可以直接访问系统的每个资源,无需任何边界检查。内核/用户模式之间的切换也是一项昂贵的操作,通过在内核代码中运行所有内容可以完全避免这种情况。
然而,在内核内部,没有太多空间进行安全检查、防止崩溃或写入错误的内存部分。这些是内核可以向其他程序提供的服务。它欺骗程序相信世界看起来不同(程序生活在虚拟的、沙盒/受限的环境中),因此进出程序的所有内容都可以被翻译和保护。
内核本身无法提供太多保护,因为它背后没有任何东西可以保护它。它是系统的核心,当它停止时,一切都结束了。您会遇到内核恐慌,或者在 Windows 上,出现著名的 BSOD。
这也是基于内核的代码的风险,也是更多性能要求较低的子系统被转移到用户空间的原因。然而,与硬件相关的基本部分通常是内核代码,不会很快改变。
答案3
区别在于当前正在执行的代码是否允许直接与各种硬件进行交互。内核模式代码可以写入设备总线、更改内存映射、切换正在运行的进程等等。用户模式可以进行计算,并且可以对内核进行系统调用以与世界其他部分进行交互。