C/C++ 面试复习笔记(5)
1.用户态和内核态切换的开销来自哪里?如何减少这种开销?
主要开销:
上下文保存与恢复:需保存/恢复寄存器、堆栈等状态(约数百CPU周期)。
CPU 模式切换:从用户态到内核态的权限检查及模式切换。
缓存失效:TLB(页表缓存)和CPU数据缓存可能因内核代码执行而失效。
内核代码执行:内核处理系统调用的逻辑耗时(如文件I/O、网络协议栈)。
优化方法:
批量处理:合并多次系统调用为单次(如readv/writev矢量I/O)。
零拷贝技术:减少数据在内核与用户态间的拷贝(如sendfile())。
用户态驱动:绕过内核直接操作硬件(如DPDK网络包处理)。
异步I/O:使用epoll或io_uring减少阻塞等待。
2.硬链接(Hard Link)和软链接(Symbolic Link)的区别是什么?
3.如何查找系统中所有大于100MB的日志文件(.log)并删除?
find / -type f -name "*.log" -size +100M -exec rm {} \;
解释:
/ :从根目录开始搜索
-type f :仅搜索文件
-size +100M :大小超过 100MB
-exec rm {} \; :对匹配文件执行 rm命令
4.i节点(Inode)中存储了哪些关键信息?为什么i节点不包含文件名?
i 节点存储的关键信息:
文件类型(普通文件、目录、符号链接等)。
文件权限(读、写、执行权限)。
文件所有者(UID)和所属组(GID)。
文件大小(字节数)。
时间戳(创建时间、最后访问时间、最后修改时间)。
指向数据块的指针(直接指针、间接指针等)。
硬链接计数(引用该i节点的目录项数量)。
不包含文件名:文件名存储在目录项(Dentry)中,而非i节点。
这种设计允许多个文件名 (硬链接)指向同一个i节点,实现文件共享。
5.文件表项(File Table Entry)和 V 节点(Vnode)分别存储什么信息?它们的核心区别是什么?
6.什么是文件空洞(File Hole)?它的主要特征是什么?文件空洞在哪些实际场景中被广泛应用?举例说明。
定义: 文件空洞是文件中未被显式写入数据的区域,逻辑上存在(文件大小包含这部分),但物理上不占用磁盘空间。
特征:
逻辑大小 > 物理大小:通过ls -l显示的文件大小大于du命令显示的磁盘占用。
读取时返回零:访问空洞区域时,系统返回零值字节(但实际未存储)。
节省磁盘空间:文件系统仅分配实际写入数据的块,跳过空洞。
实际场景:
虚拟机磁盘映像: 虚拟机(如QEMU的qcow2格式)使用空洞表示未分配空间,避免占用宿主机实际存储。
数据库预分配文件: 数据库(如MySQL)预分配大文件用于存储数据,初期仅使用部分空间,其余为空洞。
日志文件滚动: 应用预先创建大日志文件,逐步写入数据,避免频繁扩容操作。
科学计算数据存储: 存储稀疏矩阵或大量默认值的数据集时,通过空洞节省空间。