【发布时间】:2015-05-13 07:08:18
【问题描述】:
现在我知道应该避免开发进入内核空间的应用程序——它难以调试、复杂等...... 考虑到这一点,将应用程序从用户空间移动到内核有什么好处?毕竟,如果没有积极的一面,它就永远不会完成......有什么?
【问题讨论】:
标签: kernel
现在我知道应该避免开发进入内核空间的应用程序——它难以调试、复杂等...... 考虑到这一点,将应用程序从用户空间移动到内核有什么好处?毕竟,如果没有积极的一面,它就永远不会完成......有什么?
【问题讨论】:
标签: kernel
一些可能的优势:
系统调用可能会更快(即延迟更低),因为 CPU 不必从应用程序模式切换进入内核模式。 (这不一定正确,因为 CPU 可能比简单的“用户空间”和“内核空间”做出更好的区分。例如,Intel x86 CPU 有一个包含 4 个不同权限级别的环模型。)1 )
您可以通过内存和 I/O 端口直接访问系统硬件。
如果您需要在不被打扰的情况下做某事,您也许可以禁止任务切换
您也许能够绕过操作系统强制执行的安全机制(例如读取/修改其他进程的内存)。 (如果恶意软件作为内核模式设备驱动程序安装,它可能会利用这一点。)
(当然,正如您所知,存在许多缺点和安全风险。应用程序空间和内核空间之间的区别是有充分理由的。)
1) 参见例如文章Making system calls from kernel space from Linux mag:
例如,高性能 Web 服务器可能希望驻留在内核中以提高吞吐量并降低延迟。但是,也存在安全权衡 [...]
【讨论】:
您的程序中的一个小错误可能会在整个内存中乱涂乱画,并破坏整个系统及其所有进程和功能。如果运气好,系统会崩溃。
【讨论】:
搜索选项时我想到的一些原因,即内核模式与用户模式:
1) 当需要专用处理并且我们想使用操作系统中内置的实用程序时。例如:如果我们要设计一个 IO 服务器。这里的延迟是 1-5 毫秒。由于内核-用户模式的权衡,人们不能等待上下文切换。但是如果必须依赖内核提供的 TCP IP 框架。它必须在内核模式下实现,紧密结合网络/TCP/IP 框架和您预期的传输框架。
2) 当您想完全拥有调度框架时。虽然使用各种系统调用和 pthread 框架可以直观地实现这一点。 但是,如果您的产品/线程完全拥有处理器,那么您可能希望从中恢复死锁或活锁的情况。在这种情况下,您需要一个框架来考虑每个线程所花费的时间。这不能从用户 lan 完成,因此需要内核调度程序/调度子系统的支持。
3) 当您想要对内存进行过载访问时,同样是在资源专用于特定操作的环境中。为虚拟线程覆盖物理内存/内核内存是有意义的。
4) 当您想要虚拟化磁盘访问以增加冗余或提高读/写性能时。
除了核心根本原因之外,可能还有更多原因:
1) 每当您想减少层数以提高性能时,您都可以使用内核。由于内核添加了用于公平共享资源(cpu、ram、网络、磁盘)的虚拟化框架。
2) 每当您想使用难以移植到用户局域网(Tcp/ip 或 shceduler)的内核基础架构时。
【讨论】: