I/O 管理:缓冲、中断、DMA 与设备驱动
I/O 管理:缓冲、中断、DMA 与设备驱动 CPU 一秒能执行几十亿条指令,而一块磁盘读一次数据要几毫秒、一个网卡收一个包要等网络往返——在 CPU 眼里,外设慢得像在用一辈子做一件事。更麻烦的是,设备五花八门:磁盘、网卡、键盘、显卡、U...
I/O 管理:缓冲、中断、DMA 与设备驱动 CPU 一秒能执行几十亿条指令,而一块磁盘读一次数据要几毫秒、一个网卡收一个包要等网络往返——在 CPU 眼里,外设慢得像在用一辈子做一件事。更麻烦的是,设备五花八门:磁盘、网卡、键盘、显卡、U...
磁盘调度与缓存:外存访问优化 做后端的人迟早会遇到这样一个场景:监控上 CPU 利用率不高、内存也够,可接口就是慢,一翻火焰图,时间全耗在磁盘 I/O 上。你换了块更贵的 SSD,确实快了点,但高并发一上来又卡。问题的根子,往往不在&quo...
文件系统实现:inode、位图与目录项 你大概率遇到过这样一个诡异现象:服务器 df -h 显示磁盘明明还剩好几十 GB,可程序写文件却报 No space left on device。第一次碰到的人往往一脸懵——空间不是还有吗?等到敲下...
文件系统基础:文件、目录与元数据 你写一行 open("/var/log/app.log"),理所当然地以为系统会"找到那个文件"。但磁盘其实是个非常笨的设备——它只认编号的块(block):你给它一...
抖动与工作集:虚拟内存的性能问题 前面两篇我们看到,虚拟内存靠局部性让程序用上超过物理内存的空间,页面置换算法则在内存满时聪明地决定换谁出去。一切看起来都很优雅。但这份优雅有一个前提条件,而当这个前提被打破时,系统会掉进一个所有 SRE 都...
页面置换算法:OPT、FIFO、LRU 与 Clock 上一篇讲缺页处理时,我们在流程图里埋了一个关键岔路:当缺页发生、而物理内存已经装满、没有空闲页框时,操作系统必须踢掉一个已经在内存里的页,腾出位置给新页。 问题来了——踢谁? 这看起来...
虚拟内存:为什么能“看到”比物理内存更大的空间 在 64 位机器上随便写个程序,它的地址空间理论上有 16EB(百亿亿字节)那么大;就算是一台只有 16GB 内存的机器,你也可以让一个进程 malloc 出几十 GB 的空间而不立刻崩溃。更...
段页式管理:结合分页与分段的思路 前面两篇我们看到了一个尴尬的局面:分页擅长物理管理、消灭了外部碎片,却丢掉了程序的逻辑结构和段级保护;分段保住了逻辑结构和精细保护,却因为"可变长度 + 要求连续"把外部碎片又请了回来。...
分段机制:逻辑结构与内存保护 分页机制很优雅,它把地址空间切成大小相同、完全同质的页,一举消灭了外部碎片。但如果你换到程序员的视角看自己的程序,会发现它压根不是一堆毫无区别的页——它天然是有结构的:这一块是代码、那一块是全局数据、那边是运行...
分页机制:页、页表与地址转换 在讲连续分配的时候,我们已经看到一个很现实的问题:内存明明还有不少空闲,却因为这些空闲被切得七零八落,导致一个稍大一点的程序反而装不进去。这就是外部碎片。为了解决它,系统尝试过各种适应算法、也尝试过紧凑(com...