阻塞模式下对空管道 read 的行为是什么,何时返回 0?
阻塞模式下对空管道 read 的行为是什么,何时返回 0? 本文先给出可直接复述的结论,再用最小代码说明管道 read 阻塞 EOF 写端关闭的工作方式、判断依据、项目边界和常见误区。
操作系统面试题第 1 页,显示第 1–50 题,共找到 135 道完整解析,可继续按分类、标签与关键词缩小范围。
按稳定语义路径排序
阻塞模式下对空管道 read 的行为是什么,何时返回 0? 本文先给出可直接复述的结论,再用最小代码说明管道 read 阻塞 EOF 写端关闭的工作方式、判断依据、项目边界和常见误区。
多线程程序里 close 一个描述符后立刻被重用会导致什么竞态? 本文先给出可直接复述的结论,再用最小代码说明close fd 复用 竞态 多线程的工作方式、判断依据、项目边界和常见误区。
copy_file_range 相比 read+write 循环拷贝文件快在哪里,有何限制? 本文先给出可直接复述的结论,再用最小代码说明copy_file_range 服务端拷贝 reflink的工作方式、判断依据、项目边界和常见误区。
dup 与 dup2 复制文件描述符后,新旧描述符共享哪些状态? 本文先给出可直接复述的结论,再用最小代码说明dup dup2 共享文件偏移 open file description的工作方式、判断依据、项目边界和常见误区。
系统调用被信号打断返回 EINTR,哪些调用能自动重启哪些不能? 本文先给出可直接复述的结论,再用最小代码说明EINTR 慢系统调用 SA_RESTART 自动重启的工作方式、判断依据、项目边界和常见误区。
epoll 的水平触发与边缘触发在编程要求上的关键差别是什么? 本文先给出可直接复述的结论,再用最小代码说明epoll ET LT 区别 边缘触发 EAGAIN的工作方式、判断依据、项目边界和常见误区。
为什么加入 epoll 的监听 socket 通常要设为非阻塞并循环 accept? 本文先给出可直接复述的结论,再用最小代码说明epoll accept 非阻塞 循环 accept ET的工作方式、判断依据、项目边界和常见误区。
多个线程同时 epoll_wait 同一个 epoll 实例为什么会产生惊群,如何处理? 本文先给出可直接复述的结论,再用最小代码说明epoll 惊群 多线程 EPOLLEXCLUSIVE的工作方式、判断依据、项目边界和常见误区。
eventfd 和 timerfd 为什么经常出现在 epoll 程序里,它们解决了什么? 本文先给出可直接复述的结论,再用最小代码说明eventfd timerfd epoll 线程唤醒 定时的工作方式、判断依据、项目边界和常见误区。
posix_fadvise 的 SEQUENTIAL 与 DONTNEED 提示分别如何改变内核预读与缓存行为? 本文先给出可直接复述的结论,再用最小代码说明posix_fadvise 预读 丢弃缓存 顺序扫描的工作方式、判断依据、项目边界和常见误区。
用 fallocate 预分配文件空间相比写零填充有什么优势? 本文先给出可直接复述的结论,再用最小代码说明fallocate 预分配 避免碎片 数据库的工作方式、判断依据、项目边界和常见误区。
线上进程文件描述符持续上涨,如何定位是哪里泄漏的? 本文先给出可直接复述的结论,再用最小代码说明文件描述符泄漏 排查 /proc/pid/fd lsof的工作方式、判断依据、项目边界和常见误区。
进程能打开多少个文件描述符受什么限制,调优时应改哪个值? 本文先给出可直接复述的结论,再用最小代码说明ulimit nofile rlimit 文件描述符上限的工作方式、判断依据、项目边界和常见误区。
Linux 中文件描述符在进程内核结构里是如何管理的? 本文先给出可直接复述的结论,再用最小代码说明Linux 文件描述符表 files_struct的工作方式、判断依据、项目边界和常见误区。
为什么 printf 未换行就 fork 会让子进程重复输出同一段内容? 本文先给出可直接复述的结论,再用最小代码说明fork printf 重复输出 用户态缓冲区的工作方式、判断依据、项目边界和常见误区。
数据库类程序该用 fsync 还是 fdatasync,为什么 fsync 是性能杀手? 本文先给出可直接复述的结论,再用最小代码说明fsync fdatasync 区别 性能 持久化的工作方式、判断依据、项目边界和常见误区。
硬链接与符号链接在 inode 层面的本质区别是什么,为什么硬链接不能跨文件系统? 本文先给出可直接复述的结论,再用最小代码说明硬链接 软链接 inode 区别 跨文件系统的工作方式、判断依据、项目边界和常见误区。
ext 文件系统的 inode 中保存了哪些元数据,又不保存什么? 本文先给出可直接复述的结论,再用最小代码说明inode 元数据 不含文件名的工作方式、判断依据、项目边界和常见误区。
io_uring 相比 epoll + 线程池做磁盘异步 I/O 解决了什么核心问题? 本文先给出可直接复述的结论,再用最小代码说明io_uring 共享环形队列 系统调用次数 异步IO的工作方式、判断依据、项目边界和常见误区。
用 lseek 跳过一段再写会形成稀疏文件,它如何影响磁盘占用与读取结果? 本文先给出可直接复述的结论,再用最小代码说明lseek 稀疏文件 空洞 磁盘占用的工作方式、判断依据、项目边界和常见误区。
同一文件描述符上混用 fwrite 和 write 为什么可能乱序? 本文先给出可直接复述的结论,再用最小代码说明混用 stdio 与系统调用 缓冲 乱序的工作方式、判断依据、项目边界和常见误区。
访问 mmap 区域时收到 SIGBUS 通常是什么文件操作导致的? 本文先给出可直接复述的结论,再用最小代码说明mmap SIGBUS truncate 文件截断的工作方式、判断依据、项目边界和常见误区。
mmap 与 read/write 读写文件的性能与语义差异体现在哪里? 本文先给出可直接复述的结论,再用最小代码说明mmap 与 read 区别 零拷贝 缺页的工作方式、判断依据、项目边界和常见误区。
msync 与 madvise 在 mmap 文件使用中分别解决什么问题? 本文先给出可直接复述的结论,再用最小代码说明msync madvise mmap 脏页回写 预读的工作方式、判断依据、项目边界和常见误区。
对普通磁盘文件设置 O_NONBLOCK 为什么基本无效? 本文先给出可直接复述的结论,再用最小代码说明O_NONBLOCK 普通文件 无效 磁盘 IO 阻塞的工作方式、判断依据、项目边界和常见误区。
非阻塞 fd 上 read 返回 EAGAIN 后正确的事件循环写法是什么? 本文先给出可直接复述的结论,再用最小代码说明O_NONBLOCK EAGAIN 非阻塞 循环读取的工作方式、判断依据、项目边界和常见误区。
为什么新建文件描述符推荐加 O_CLOEXEC,它解决了哪类问题? 本文先给出可直接复述的结论,再用最小代码说明O_CLOEXEC exec 文件描述符泄漏的工作方式、判断依据、项目边界和常见误区。
使用 O_DIRECT 绕过页缓存时对缓冲区和偏移有什么约束,适合什么场景? 本文先给出可直接复述的结论,再用最小代码说明O_DIRECT 对齐 绕过页缓存 应用场景的工作方式、判断依据、项目边界和常见误区。
Linux 页缓存如何让普通 read/write 变快,又带来什么内存统计上的误解? 本文先给出可直接复述的结论,再用最小代码说明page cache 页缓存 buff/cache free 内存的工作方式、判断依据、项目边界和常见误区。
poll 相比 select 改进了什么,又保留了什么共同缺陷? 本文先给出可直接复述的结论,再用最小代码说明poll select 区别 共同缺陷 O(n)的工作方式、判断依据、项目边界和常见误区。
向管道并发写入时,多大以内的写能保证原子性? 本文先给出可直接复述的结论,再用最小代码说明PIPE_BUF 管道写原子性的工作方式、判断依据、项目边界和常见误区。
为什么「写临时文件 + fsync + rename」是安全的文件更新模式,还缺哪一步? 本文先给出可直接复述的结论,再用最小代码说明rename 原子替换 崩溃一致性 fsync 目录的工作方式、判断依据、项目边界和常见误区。
select 在高并发下的三个主要瓶颈是什么? 本文先给出可直接复述的结论,再用最小代码说明select FD_SETSIZE 1024 遍历 性能瓶颈的工作方式、判断依据、项目边界和常见误区。
inotify 监控大量目录时会遇到什么实际限制,如何应对? 本文先给出可直接复述的结论,再用最小代码说明inotify 监控目录 watch 上限 max_user_watches的工作方式、判断依据、项目边界和常见误区。
sendfile 如何减少静态文件服务的 CPU 开销,它省掉了哪次拷贝? 本文先给出可直接复述的结论,再用最小代码说明sendfile 零拷贝 静态文件服务的工作方式、判断依据、项目边界和常见误区。
为什么启用 TLS 后 sendfile 零拷贝通常失效,内核有什么补救机制? 本文先给出可直接复述的结论,再用最小代码说明sendfile TLS kTLS 零拷贝 失效的工作方式、判断依据、项目边界和常见误区。
Shell 重定向和守护进程关闭 0/1/2 的实现依赖 dup2 的什么性质? 本文先给出可直接复述的结论,再用最小代码说明dup2 标准输出重定向 实现原理的工作方式、判断依据、项目边界和常见误区。
read/write 返回值小于请求长度一定是错误吗,正确处理姿势是什么? 本文先给出可直接复述的结论,再用最小代码说明read write 短读 短写 部分读写的工作方式、判断依据、项目边界和常见误区。
为什么高并发服务用 epoll 而不是信号驱动 I/O(O_ASYNC/SIGIO)? 本文先给出可直接复述的结论,再用最小代码说明信号驱动IO SIGIO epoll 对比的工作方式、判断依据、项目边界和常见误区。
splice 和 tee 借助管道缓冲实现了怎样的零拷贝转发? 本文先给出可直接复述的结论,再用最小代码说明splice tee 管道 零拷贝 转发的工作方式、判断依据、项目边界和常见误区。
Linux 文件的 atime、mtime、ctime 分别因什么操作改变? 本文先给出可直接复述的结论,再用最小代码说明atime mtime ctime 区别 修改时间的工作方式、判断依据、项目边界和常见误区。
C 标准库的 stdout 在终端和重定向到文件时缓冲策略为何不同? 本文先给出可直接复述的结论,再用最小代码说明stdio 行缓冲 全缓冲 stdout 重定向的工作方式、判断依据、项目边界和常见误区。
sync_file_range 为什么适合写前日志(WAL)这类需要细粒度回写的场景? 本文先给出可直接复述的结论,再用最小代码说明sync_file_range 异步回写 WAL 细粒度的工作方式、判断依据、项目边界和常见误区。
删除一个仍被进程打开的文件,磁盘空间何时真正释放? 本文先给出可直接复述的结论,再用最小代码说明unlink 打开文件 磁盘空间 inode 引用计数的工作方式、判断依据、项目边界和常见误区。
write 返回成功后,数据到达磁盘的顺序和时机由什么决定? 本文先给出可直接复述的结论,再用最小代码说明write 写回 dirty page 回写 落盘时机的工作方式、判断依据、项目边界和常见误区。
进程写文件偶尔卡顿数秒,为什么可能是内核写回限流而非磁盘坏了? 本文先给出可直接复述的结论,再用最小代码说明写回限流 dirty_ratio 写卡顿 诊断的工作方式、判断依据、项目边界和常见误区。
伙伴系统如何管理物理页框,它如何缓解外部碎片? 本文先给出可直接复述的结论,再用最小代码说明伙伴系统 buddy allocator 物理页的工作方式、判断依据、项目边界和常见误区。
为什么按行遍历二维数组比按列遍历快,缓存局部性如何影响程序性能? 本文先给出可直接复述的结论,再用最小代码说明缓存局部性 行优先 遍历 性能的工作方式、判断依据、项目边界和常见误区。
cgroup 内存限额达到上限时容器内进程会发生什么? 本文先给出可直接复述的结论,再用最小代码说明cgroup 内存限制 memory.max OOM 容器的工作方式、判断依据、项目边界和常见误区。
为什么容器里读 /proc/meminfo 看到的不是自己的限额,应该读什么? 本文先给出可直接复述的结论,再用最小代码说明容器内存监控 memory.current 与 /proc/meminfo 不一致的工作方式、判断依据、项目边界和常见误区。