Sunday面试指南

用户态和内核态有什么区别?系统调用一定会切换进程吗?

下面是一段教学用的模拟面试。

🧑‍💻 面试官:用户态和内核态怎么理解?

🙋‍♂️ 我:用户态运行应用,内核态运行操作系统,系统调用会切到内核态。

🧑‍💻 面试官:那调用一次 read,是不是先把当前进程停掉,再换成“内核进程”?

🙋‍♂️ 我:不是,进入内核态不一定换进程。

🧑‍💻 面试官:read 很快返回,和它等待磁盘期间让别的线程运行,有什么区别?函数调用又是不是都要进入内核?

要把两种变化分开:「执行权限变了」和「CPU 换了执行任务」。它们可能一起发生,但不是同一件事。

面试速答(60 秒版)

用户态和内核态主要区分 CPU 执行权限。应用通常在用户态运行,不能随意执行特权操作或访问受保护资源;内核在更高权限下管理内存、设备和任务等。

应用通过系统调用请求内核服务时,会经受控入口进入内核,完成操作后可以返回原来的用户态执行。这是模式切换,不一定发生任务上下文切换,也不是自动创建一个内核进程。

如果调用需要等待,或者调度器决定让其他任务运行,才可能进一步切换执行任务。因此,分析开销要分清用户/内核边界、实际系统调用次数与调度行为,不能把每个普通函数调用都当成进程切换。

执行权限模式变化与任务身份区分

知识点详解:一次读取文件,中间到底换了什么?

为什么应用不能直接操纵所有资源?

假设每个应用都可以直接改任意内存、操作设备,或者随意修改其他进程的状态。一个程序的错误,就可能把整个系统或别人的数据一起破坏。

操作系统因此建立权限边界。CPU 的执行模式和内存保护等机制配合,让普通应用只能在允许的范围内工作;需要受保护的能力时,通过规定入口请求内核。

咱们可以先把这两个名字分开看:

  • 用户态:普通应用以受限制的权限执行,不能随意访问内核内存或直接操纵受保护的资源。
  • 内核态:内核以较高权限执行代码,检查请求并处理文件、设备、调度等受保护的工作。

所以,它们描述的是当前执行权限,不是“用户写的代码”和“系统安装的程序”两种身份。系统提供的普通工具,也可以大部分时间在用户态运行。

不同处理器架构的细节不完全一样,本题先讲操作系统层面的共同判断,不把某个架构的特权级编号当成所有机器的统一规则。

read 把请求交给谁?

假设应用已经打开一个文件,现在请求读取一段内容。

应用通常通过库函数入口发起请求,相应包装把参数交给内核的系统调用入口。内核检查文件描述符、访问条件、缓冲区等,再完成读取或安排等待。Linux 系统调用介绍说明了库包装与内核入口的关系。

这时 CPU 开始执行内核代码,权限模式改变了,但当前请求仍然和原来的任务有关。不是把工作自动交给一份新建的“内核进程”,然后原进程什么都不管。

完成后,内核按约定返回结果或错误,应用继续处理读到的数据。内核当然还有自己的线程等机制,但不能用它们替代每一次系统调用的基本路径。

两条读取路径,区别在哪里?

第一种情况,所需数据已经能很快获得。内核处理后返回,仍然回到原来的任务执行。这期间发生了用户态到内核态再返回的变化,却不必为了这次操作换成另一个任务。

第二种情况,需要等待某个条件,例如相关 I/O 还未完成。当前任务不能立刻继续,就可能进入等待。调度器把 CPU 交给另一个可运行任务,等条件满足后,原任务才有机会恢复。

第二条路径除了模式变化,还涉及任务调度。不能把第一条和第二条都简化成同一个“系统调用必然进程切换”。

同样,任务切换也不一定是换进程。内核调度的是相应执行任务,两个线程可能属于同一进程。地址空间是否变化,又会影响具体开销。

读取快速返回与等待调度的两条执行路径

为什么模式切换与上下文切换都可能有成本?

经过用户/内核边界,需要完成受控进入、状态保存恢复、参数与权限处理等工作。内核还要实际执行应用请求的服务。

换任务则可能额外涉及调度、寄存器上下文和缓存状态等。是否更换地址空间、处理器与内核如何实现,也会影响成本,不能一概说每次都清空所有缓存或 TLB。

因此,“一次系统调用大概耗时多少”没有脱离平台、调用类型和负载的统一常数。读取一个已缓存的小对象,和等待设备完成工作,耗时结构完全不同。

工程上如果大量细碎调用占了明显比例,可以考虑批量处理、减少不必要边界往返等方式。但必须先测量;一个调用次数多的接口,也可能主要慢在网络等待而不是入口成本。

普通函数调用为什么不算系统调用?

假设应用计算两个数字相加,或者在已经准备好的数组里查找数据,这些操作通常在用户态完成,不需要每次向内核申请。

即使函数来自标准库,也不代表它每次都触发系统调用。库可以先处理用户空间缓冲,也可能使用 vDSO 等机制,减少某些实际内核入口往返。Linux vDSO 手册说明了这种边界。

所以,分析实际系统调用应看运行证据,而不是数源码里写了多少个函数名。Linux 上可在合适测试环境使用 strace 观察调用,但跟踪也有开销,不能把被跟踪时的耗时直接当成无干扰基准。

普通函数、库包装与实际系统调用入口的不同

系统态 CPU 高,又意味着什么?

它说明统计时间里有较多 CPU 工作记在内核侧,不直接证明发生了多少次进程切换。

需要继续看系统调用、网络处理、调度和其他内核工作。上下文切换统计也是另一份指标,要与时间和负载一起解释。

本题讲的是权限边界与执行路径;进程、线程、协程以及 I/O 多路复用,可以在对应旧题中继续展开,不要把这些层次揉成一句“都是切换”。

面试官继续追问

用户态程序完全不能接触硬件相关功能吗?

可以通过被允许的接口与映射等机制使用相关能力,但不能因此获得任意特权操作权限。关键是访问受什么约束,不是“能用设备就一定在内核态”。

系统调用返回前,一定一直占着 CPU 吗?

不一定。阻塞等待时,当前任务可能不运行,CPU 可以交给其他任务。调用的总耗时与实际消耗 CPU 时间要分开。

中断也是普通函数调用吗?

不是。它有自己的进入与处理机制,可能打断当前执行。系统调用、异常和中断都是理解内核入口的线索,但触发方式和上下文不能混成一个规则。

面试速记卡

  • 用户态/内核态:区分执行权限,不是两种进程名称。
  • 系统调用:经受控入口请求内核服务,之后可回到原任务。
  • 模式切换:权限模式改变;任务切换:调度到另一个执行任务。
  • 等待:阻塞调用可能让出 CPU,但不代表每次系统调用必然换进程。
  • 排查:函数次数、系统调用、系统态 CPU 与上下文切换分别取证。

公司面试真题

真题根据求职者公开面经整理,题意经过概括,非逐字原话或公司官方题库;本文为 Sunday 的独立解析。

浏览公司面试真题 →
简历汪永久免费在线制作简历,模板直接套用、导出无水印,永久免费、下载免费,不需要付费解锁任何功能。去写简历