文件描述符:一个整数如何连接进程与内核的四十年演进

“Too many open files” 凌晨三点,生产环境的服务器突然告警。Nginx无法接受新连接,应用日志里满是EMFILE错误。运维检查后发现,某个Java进程打开了超过一百万个文件描述符——虽然系统配置允许这样做,但进程的资源限制仍然是默认的1024。 ...

19 min · 9278 words

虚拟文件系统:为什么这个抽象层统治了Linux文件访问三十年

一个看似简单的问题 当你在Linux终端输入cp /home/user/file.txt /mnt/usb/backup/时,系统在做什么?源文件位于ext4格式的SSD上,目标目录在FAT32格式的U盘里。这两种文件系统的数据结构完全不同——ext4使用extent树管理块分配,FAT32依靠链式的FAT表。然而,cp命令对这种差异一无所知。 ...

20 min · 9804 words

系统调用的完整旅程:一行代码如何跨越用户态和内核态的鸿沟

一行代码的千里之行 当你写下 write(1, "Hello, World!\n", 14) 这行代码时,你实际上正在发起一场跨越两个世界的旅行。这行代码将穿越CPU的特权级边界,从你熟悉的用户空间进入神秘的内核空间,完成一次完整的系统调用。 ...

15 min · 7243 words
Blog Cover

中断处理为何必须拆成两半:从顶半部到底半部的二十年架构博弈

1983年,当Linus Torvalds还在芬兰赫尔辛基大学读书时,Unix系统的中断处理已经发展了二十多年。那时的中断处理程序必须完成所有工作:响应硬件、读取数据、通知进程。这种设计在单处理器、低频率设备时代还算可行,但随着网络速度从10Mbps攀升到100Mbps,再到今天的400Gbps,中断处理的时间预算被压缩到了微秒级。 ...

11 min · 5440 words

容器技术的内核根基:从namespace到cgroups的二十年演进

1982年3月,Bill Joy在BSD开发过程中添加了chroot系统调用,约一年半后随4.2BSD正式发布。这个简单的功能让进程看到一个被重新定义的根文件系统,被认为是现代容器技术的起点。但chroot只是文件系统的隔离,进程仍然共享同一个内核视图,看到相同的进程列表、网络配置和主机名。 ...

14 min · 6753 words

磁盘调度器的三十年迷途:从电梯算法到"无调度"的技术突围

2004年,Linux内核开发者面临一个棘手的问题:传统的电梯调度算法在特定工作负载下会导致请求饥饿——某些I/O请求可能永远等不到服务。这个问题的根源在于,当磁盘忙于服务某一方向的请求时,反方向的请求可能被无限期忽略。Jens Axboe设计的Deadline调度器正是为了解决这个问题,它给每个请求设定一个"死线",保证请求不会无限期等待。 ...

12 min · 5556 words

共享内存比管道快100倍,但你的系统可能用错了:Linux进程间通信的性能真相与选择困境

一个承载每秒百万级请求的消息队列系统,工程师在技术选型时毫不犹豫地选择了共享内存——因为大家都知道共享内存是最快的IPC机制。三个月后,生产环境出现诡异的数据竞争问题,调试了两周才发现是同步原语使用不当。最终不得不重构,改用消息队列,性能下降了30%,但系统终于稳定了。 ...

17 min · 8238 words