为什么用户空间比内核慢?

为什么用户空间比内核慢?

我听说基于 FUSE 的文件系统非常慢,因为它们是在用户空间程序中实现的。用户空间比内核慢是怎么回事?

答案1

无论是在内核中还是在用户态,代码都以相同的速度执行,但是有些事情内核代码可以直接执行,而用户态代码必须跳过一些步骤。特别是,内核代码可以直接映射应用程序内存,因此它可以直接在应用程序内存和硬件复制的内部缓冲区之间复制文件内容。用户代码必须通过管道或套接字进行额外的复制,或者进行更复杂的内存共享操作。

此外,每个文件操作都必须通过内核——进程与任何事物交互的唯一方法是通过系统调用。如果文件操作完全在内核内部执行,则只需执行一次用户/内核转换和一次内核/用户转换,速度相当快。如果文件操作由另一个进程执行,则必须在进程之间进行上下文切换,这需要在内存管理单元

对于大多数硬件访问时间来说,速度性能仍然可以忽略不计,但是当硬件不是瓶颈时,可以观察到它,特别是当主处理器正在执行其他操作时,许多硬件操作可以异步执行,而上下文切换和数据复制进程之间保持 CPU 繁忙。

答案2

非常简化:

您的应用程序想要读取文件

应用程序询问内核,内核访问文件系统(在内核空间中)检查权限,向应用程序处理文件描述符。

对于用户空间文件系统,您有更多相对较慢的内核到用户空间的切换:

应用程序请求内核打开文件,内核调用用户空间文件系统,用户空间fs调用内核进行磁盘访问,用户空间fs将数据发送到内核,内核将数据交给用户空间应用程序。

对于用户空间文件系统,您有更多的上下文切换。

相关内容