操作系统 | 磁盘存储器的管理

操作系统の磁盘存储器管理全解:让"最慢的家伙"跑得快一点

你有没有想过,为什么你的电脑有时候会"卡"一下?尤其是打开一个大文件或者启动一个大型游戏的时候,明明CPU在GHz级别狂跑,却还是要等上好几秒?答案很简单------CPU在等磁盘。在计算机的所有部件中,磁盘是那个"拖后腿的",速度比内存慢几百万倍。怎么让这个"最慢的家伙"尽量跑得快一点,就是磁盘存储器管理要解决的核心问题。

这篇文章,我们把操作系统中关于磁盘管理的知识从头到尾扒个干净------从磁盘长啥样、读写一次要多久、到怎么调度请求、怎么分配空间、怎么格式化、怎么提速、怎么搞RAID,一个都不落。坐稳了,发车。

本文目录

  1. 磁盘存储器概述:存储界的"阶级划分"

  2. 磁盘的物理结构与访问时间:一次读写到底要多久?

  3. 磁盘调度算法:排队也得讲策略

  4. 外存分配方式:文件在磁盘上怎么摆?

  5. 磁盘空间管理:谁占着地,谁空着?

  6. 磁盘格式化:新硬盘到手,怎么从"白板"变"可用"?

  7. 磁盘高速缓存:用内存帮磁盘"打辅助"

  8. 提高磁盘I/O速度的方法:各种加速骚操作

  9. RAID:多块盘组队,又快又稳


一、磁盘存储器概述:存储界的"阶级划分"

1.1 存储层次

计算机的存储不是扁平的,它是一个清晰的金字塔结构 。从上到下依次为:寄存器高速缓存(Cache)主存(内存/RAM)磁盘(HDD/SSD)磁带/光盘

存储层次结构:速度、容量与价格的权衡

越往上,速度越快、容量越小、价格越贵。寄存器在CPU内部,访问速度是皮秒级;Cache也是芯片级的,纳秒级;主存(内存条)也是纳秒级但比Cache慢几倍;磁盘是毫秒级------比内存慢了几百万倍。磁带和光盘更慢,但胜在容量极大、价格极低,主要用来做归档和备份。

磁盘属于辅助存储器(外存)------CPU不能直接访问外存中的数据,必须先把数据读到内存里,CPU才能处理。所以磁盘和内存之间的数据搬运效率,直接决定了整个系统的"体感速度"。

1.2 磁盘的分类

硬盘驱动器(HDD) ------传统的机械硬盘,也叫温切斯特磁盘(Winchester Disk)。内部有盘片在旋转、磁头在寻道,是纯机械结构。优点是容量大、价格低;缺点是速度慢(毫秒级)、怕震动。

固态硬盘(SSD) ------基于闪存(Flash Memory),没有机械部件。随机访问速度远快于HDD(微秒级),抗震性好。缺点是写入有寿命限制(闪存有擦写次数上限,一般几千到几万次),价格较高但在持续下降。

磁带 ------顺序存取设备,不能随机访问。容量极大(单盘可达数十TB),价格极低。主要用于企业级归档和冷数据备份。你不会在日常使用中直接接触磁带,但很多大公司的数据中心里堆满了磁带柜。

光盘 ------包括CD(700MB)、DVD(4.7~17GB)、蓝光(25~100GB)。有只读型(ROM)、一次写入型(R)和可重写型(RW)三种。现在用得越来越少了,但在软件分发和影音领域还有一席之地。

1.3 磁盘设备的特点

磁盘(不管是HDD还是SSD)有几个共同特点:

它是块设备------以块(扇区)为单位进行读写,不是像键盘那样一个字符一个字符地传。

可随机访问------可以直接跳到任意块,不需要从头开始。

它是共享设备------多个进程可以交替使用同一块磁盘。

最关键的是,它速度远慢于主存------毫秒 vs 纳秒,差了六个数量级。


二、磁盘的物理结构与访问时间:一次读写到底要多久?

2.1 磁盘的物理结构

磁盘的物理结构:盘面、磁道、柱面与扇区

传统机械硬盘(HDD)的物理结构可以用几个关键词来概括:

盘面(Platter) ------磁盘由多个盘片叠在一起,每个盘片有上下两个面,每个面都能存数据。每个盘面配有一个磁头(Head) ,负责读写数据。所有磁头安装在一个共同的臂上,同时移动------也就是说,所有磁头永远在同一个柱面上。

磁道(Track) ------盘面上划了一圈一圈的同心圆,每一圈就是一个磁道。外圈的磁道比内圈长,在现代磁盘中,外圈磁道可能有更多的扇区。

柱面(Cylinder) ------所有盘面上相同位置的磁道组成一个柱面。柱面数 = 每面的磁道数。寻道的时候,磁头一起移动到一个柱面,然后选择对应的磁头来读写。

扇区(Sector) ------每个磁道被分成若干段,每段就是一个扇区。扇区是磁盘最小的读写单位。传统扇区大小是512字节,现代磁盘采用高级格式化(Advanced Format),扇区大小为4KB。

要定位磁盘上的某一块数据,需要三个坐标:柱面号 + 磁头号 + 扇区号 ,这叫CHS寻址 (Cylinder-Head-Sector)。现代磁盘更多使用LBA(逻辑块寻址)------把所有扇区编成连续的线性地址(0, 1, 2, 3...),由磁盘控制器内部负责LBA到CHS的转换。

2.2 磁盘访问时间

磁盘访问时间的三个组成部分

读写一个磁盘块,需要的时间由三部分组成:

寻道时间(Seek Time) ------磁头从当前磁道移动到目标磁道的时间。这是最耗时的部分,因为涉及机械运动(磁头物理移动)。寻道时间 = 启动时间 + 移动时间 + 减速时间。典型硬盘的平均寻道时间在5~10毫秒。

旋转延迟(Rotational Latency) ------磁头到达目标磁道了,但目标扇区可能还没转到磁头下面。需要等盘片转一转。平均旋转延迟 = 1/(2 × 转速)。7200转/分的硬盘,转一圈约8.33毫秒,平均旋转延迟约4.17毫秒。15000转的企业级硬盘,平均旋转延迟约2毫秒。

传输时间(Transfer Time) ------扇区转到磁头下面后,实际读写数据的时间。通常很短,在微秒级别。

总访问时间 T = 寻道时间 + 旋转延迟 + 传输时间 。由于寻道时间占比最大,所以磁盘调度算法的核心目标就是减少寻道时间------让磁头尽量少跑、跑短路。

2.3 磁盘的I/O请求

进程发出的磁盘I/O请求通常包含以下信息:进程标识 (谁发的)、操作类型 (读还是写)、数据在内存中的起始地址 (数据搬到内存哪/从内存哪搬来)、数据在磁盘上的起始位置 (柱面号、磁头号、扇区号)、传输的数据量(要读写多少个扇区)。

多个I/O请求会排队等待服务,形成一个请求队列。磁盘调度算法就是决定"先服务队列中的哪个请求"的策略。


三、磁盘调度算法:排队也得讲策略

磁盘调度算法对比:不同策略的磁头移动轨迹

假设有多个读写请求在排队,先服务哪个?不同的策略就是不同的调度算法。调度的目标有三个:减少平均寻道时间提高I/O吞吐量保证公平性(避免饥饿)

3.1 FCFS(先来先服务)

最简单的策略:谁先来谁先被服务。优点是完全公平 ,不会有饥饿问题。缺点是完全不考虑磁头当前位置,磁头可能在磁盘上来回乱跑,寻道距离很长。平均寻道时间是所有算法中最长的。就像餐厅叫号完全按顺序来,不管你坐在哪个位置,服务员得满场跑。

3.2 SSTF(最短寻道时间优先)

每次选离当前磁头位置最近的请求。效率比FCFS高很多------磁头尽量就近服务,减少了大量不必要的移动。

但有一个致命缺陷:可能导致饥饿。远处的请求可能一直等不到,因为总有更近的新请求插队。这就像一个贪心算法------每一步都选当前最优,但不保证全局最优。

3.3 SCAN(扫描算法/电梯算法)

磁头像电梯一样工作:单方向一路扫过去 ,沿途服务所有请求,扫到磁盘一端后反向继续扫。就像电梯从1楼上到顶楼,再从顶楼下到1楼。

优点:无饥饿 ------每个请求最多等一个完整的来回(电梯总会扫到你那一层)。缺点是两端服务密度不均匀------靠近端点的请求等待时间更长,因为磁头要到端点才掉头。另外,磁头刚扫过的方向上,新来的请求要等整个回程才能被服务。

3.4 C-SCAN(循环扫描)

磁头只在一个方向上 服务请求(比如从左到右),到达一端后直接跳回起点(回程不服务任何请求),然后重新开始。

好处是等待时间更均匀------每个请求最多等一个完整的单向扫描周期。坏处是回跳那一段浪费了时间(空跑)。适合请求分布比较均匀的场景。

3.5 LOOK算法

SCAN的改良版。磁头不需要扫到磁盘最末端 ------如果在当前方向上已经没有更多请求了,就立即反向。减少了不必要的空跑。就像电梯不会非要到顶楼才掉头,如果最高只到15楼有人按了按钮,到了15楼就掉头往下。

3.6 C-LOOK算法

C-SCAN的LOOK版。单方向扫描,当前方向没有请求了就跳回最远端的请求位置继续。等待时间均匀且减少了空跑。

3.7 N步SCAN

把请求队列按时间分为N段子队列 ,每个子队列内部用SCAN算法。正在服务的子队列中新加入的请求放到下一个子队列里 。这样做的目的是防止磁臂粘着------某个进程不断发请求霸占磁头,导致其他进程饿死。

3.8 FSCAN(两队列扫描)

N步SCAN的简化版(N=全部当前请求)。维护两个队列:当前服务队列和新请求队列。当前队列服务期间,新来的请求都进入新请求队列。当前队列服务完后,两个队列交换。效果与N步SCAN类似。

3.9 算法对比总结

算法 公平性 平均寻道 饥饿 特点
FCFS 最公平 最长 简单但效率最低
SSTF 不公平 较短 可能 贪心策略,可能饥饿
SCAN 较公平 中等 电梯算法,两端不均
C-SCAN 较公平 中等 等待更均匀
LOOK 较公平 较短 SCAN的优化版
C-LOOK 较公平 较短 C-SCAN的优化版
N步SCAN 公平 中等 防磁臂粘着
FSCAN 公平 中等 N步SCAN简化版

四、外存分配方式:文件在磁盘上怎么摆?

外存分配方式对比:连续、链接与索引

文件的各个数据块在磁盘上怎么存放?不同的方式有不同的优缺点。

4.1 连续分配

文件的各个部分占据连续的物理块 。目录项中只需要记录起始块号 + 块数,就能定位文件的所有数据。

优点是顺序访问速度极快 (磁头不用跑来跑去),也支持直接访问 (第N块 = 起始块号 + N,直接算)。缺点是产生外部碎片 (删除文件后留下的空隙可能太小,放不下新的大文件),而且文件不易动态增长(后面的位置可能已经被其他文件占了)。需要提前知道文件大小,或者预分配过多空间造成浪费。

4.2 链接分配

文件不需要占据连续的物理块,而是通过指针链接在一起。

隐式链接 ------每个物理块的末尾存一个指向下一个块的指针。目录项只记录起始块号。优点是无外部碎片,文件容易扩展。缺点是只适合顺序访问 (想找第100块?得从第1块跟着指针一步步走),而且可靠性差------中间某个块的指针坏了,链子就断了。

显式链接(FAT) ------把链接指针从数据块中抽出来,集中存放在内存里的一张文件分配表(FAT) 中。想找下一个块?查FAT表就行。这样既支持直接访问,又提高了检索速度。缺点是FAT表本身要占内存,磁盘越大表越大。FAT16/FAT32/exFAT都用这种方式。

4.3 索引分配

为每个文件建一张索引表 ,记录文件各部分对应的物理块号。目录项记录索引表的地址。想找第N块?查索引表直接跳到对应物理块。优点是支持直接访问,无外部碎片。缺点是索引表本身也占空间。

大文件的处理方案:链接索引 ------多个索引块用指针链接起来。多级索引 ------一级索引指向数据块,二级索引指向一级索引块,三级索引指向二级索引块。混合索引(Unix inode方式) ------inode中直接存放一部分数据块号(如10个直接地址),然后有一次间接、二次间接、三次间接。小文件走直接地址,大文件走间接地址,灵活高效。

4.4 分配方式对比

分配方式 顺序访问 直接访问 外部碎片 文件扩展 额外开销
连续分配 支持 困难
隐式链接 不支持 容易 指针空间
显式链接(FAT) 支持 容易 FAT表占内存
索引分配 支持 容易 索引表空间

五、磁盘空间管理:谁占着地,谁空着?

磁盘空间管理:四种方法对比

磁盘空间是有限的。文件系统需要知道哪些块是空闲的、哪些已经被占了。有四种经典的管理方法:

5.1 空闲表法

最直观的方式:用一张表记录所有空闲区的起始块号和空闲块数。比如"从第100块开始有5块空闲""从第200块开始有10块空闲"。分配时查表找合适的空闲区,回收时把归还的块登记回表,并合并相邻的空闲区。

优点是简单直观,适合连续分配。缺点是空闲区太多时表会很大------磁盘碎片化严重的话,可能有成千上万个小空闲区。

5.2 空闲链表法

把空闲块用指针链接成链表。有两种变体:空闲块链 ------每个空闲块单独链接,一个接一个。空闲盘区链------把连续的空闲区作为一个整体来链接(每个结点记录起始块号 + 块数 + 指针),减少链表长度。

优点是分配和回收方便------从链头取块就是分配,把块插回链中就是回收。缺点是链接指针本身也占空间。

5.3 位示图法(Bitmap)

用一个二进制位数组 表示每个磁盘块的状态:0=空闲,1=已分配。1000块的磁盘,位示图只需要125字节(1000 ÷ 8)。

优点非常明显:占用空间极小容易找到连续空闲块 (找连续的0就行了)、整个位图可以常驻内存。广泛用于各种现代文件系统。

5.4 成组链接法

Unix/Linux的经典方式。核心思想:空闲块分组,每组最多N块(如50块) 。每组的第一块存放下一组的块数和块号。超级块保存当前组的空闲块列表。

分配时从当前组取一块。当前组取完了,加载下一组信息到超级块。回收时把块放回当前组。当前组满了,形成新组。当前组空了,加载下一组。大多数操作只需要读写超级块,不需要遍历整个磁盘,所以很快


六、磁盘格式化:新硬盘到手,怎么从"白板"变"可用"?

磁盘格式化:从物理格式化到逻辑格式化的三个步骤

一块全新的硬盘不能直接存文件,需要经历三个步骤才能被操作系统使用:

6.1 低级格式化(物理格式化)

在磁盘上划分磁道和扇区 ,写入扇区头信息(标识磁道号和扇区号)、数据区和校验码(ECC)。同时标记坏扇区(缺陷列表),让系统知道这些位置不能用。

这一步由硬盘厂商在出厂时完成------你买到的硬盘已经低级格式化好了。用户一般不需要(也不应该)自己做低级格式化。

6.2 分区

把磁盘划分为若干逻辑分区 。每个分区可以独立管理,使用不同的文件系统。分区过程中会写入主引导记录(MBR)分区表,告诉系统"这块磁盘有几个区,每个区从哪到哪"。

传统MBR分区方式有局限(最多4个主分区,最大支持2TB磁盘)。现代系统使用**GPT(GUID分区表)**作为替代方案:支持更大磁盘(>2TB)、更多分区、分区表有备份更可靠。

6.3 高级格式化(逻辑格式化)

在分区上创建文件系统 。具体包括:写入引导块 (Boot Block,用于系统启动)、写入超级块 (Superblock,记录文件系统整体信息)、创建inode表 (索引节点表)、创建根目录 、初始化空闲空间管理结构(位图或成组链接等)。

这一步完成后,操作系统才能在这个分区上创建和管理文件。你在Windows上右键"格式化"U盘,做的就是这一步。


七、磁盘高速缓存:用内存帮磁盘"打辅助"

7.1 缓存原理

和CPU缓存的思路完全一样:用快速的内存来缓存最近访问过的磁盘数据 。因为内存比磁盘快百万倍,如果后续访问的数据在缓存中(命中),就不需要再访问磁盘了。这利用了局部性原理------时间局部性(最近访问的数据很可能再次被访问)和空间局部性(访问了某块数据后,很可能接着访问相邻的块)。

7.2 缓冲区的三种状态

缓存中的缓冲区分为三种:

自由缓冲(Free) ------还没被使用,随时可以被分配。

清洁缓冲(Clean) ------已缓存磁盘数据,且内容和磁盘一致(没被修改过)。

脏缓冲(Dirty) ------内容被修改过,和磁盘不一致,需要找机会写回磁盘。

7.3 置换策略

缓存满了怎么办?需要淘汰一些缓冲区。

常用策略:

LRU(最近最少使用) ------淘汰最久没被访问的。

LFU(最少使用) ------淘汰访问次数最少的。

FIFO(先进先出) ------最早进入缓存的先淘汰。

Clock算法(时钟算法) ------LRU的近似实现,用一个循环链表和引用位来模拟。

7.4 写策略

写操作有三种策略:

写穿(Write-through) ------每次写缓存的同时也写磁盘。数据安全但写性能差(每次写都要等磁盘)。

写回(Write-back) ------只写缓存,标记为脏。缓冲区被置换出时才写回磁盘。性能好,但有断电丢数据的风险。

周期写盘 ------定期(比如每隔几秒)把所有脏缓冲写回磁盘。这是折中方案:兼顾性能和安全性。Linux的 sync 命令和内核的 flush 线程就是干这个的。

7.5 统一缓冲池

现代操作系统将磁盘缓存和文件系统的缓冲区统一管理 ,形成统一的缓冲池。Linux的 Page Cache 就是这种实现------所有磁盘数据(文件数据、目录数据、inode数据)都通过Page Cache来缓存和管理。


八、提高磁盘I/O速度的方法:各种加速骚操作

磁盘是系统中最慢的部件之一,操作系统绞尽脑汁想出了各种加速手段:

8.1 提前读(Read-ahead)

当系统检测到你在顺序读取 一个文件时,它会"猜到"你接下来可能要读后面的数据,于是提前把后续的数据读到缓存中。这样你真正要读的时候,数据已经在缓存里了(命中),不用等磁盘。

提前读对顺序访问 效果非常好(看视频、读大文件),但对随机访问基本没用。Linux的预读窗口大小是自适应的------连续命中时窗口越来越大,频繁不命中时窗口缩小。

8.2 延迟写(Delayed Write)

写操作不立即写磁盘,而是先写到缓存 中标记为脏,然后在适当的时候统一写回。好处是可以合并多次小写为一次大写------比如你连续修改一个文件10次,如果每次都写磁盘就要写10次;有了延迟写,可能只需要写1次。

Linux中有专门的pdflush/flush线程定期把脏页写回磁盘。但风险是断电可能丢数据 ------还没写回的脏页会丢失。所以重要的程序会用 fsync() 系统调用强制立即写盘。

8.3 优化文件物理块分布

让同一个文件的各个块尽量在磁盘上连续存放 ,减少寻道次数。ext4的区段(extent)分配就是这个思路------用"起始块号+连续块数"来表示一段连续的数据块,而不是逐块记录。

预分配------创建文件时预先分配一定的连续空间,避免后续频繁扩展导致文件块分散。

8.4 减少磁头移动

通过合理的磁盘调度算法(SCAN、C-SCAN等),将同一柱面的请求集中处理,减少不必要的寻道。在多磁盘环境下,还可以将I/O负载分散到多块磁盘上。

8.5 NCQ(原生命令队列)

这是SATA硬盘的一个硬件特性。操作系统只管往硬盘发I/O请求,硬盘内部自己会对请求重新排序,优化磁头的移动路径。相当于把调度算法从操作系统层下沉到了硬件层。操作系统只需要发出请求,硬盘自己决定执行顺序。

8.6 Linux的I/O调度器

Linux内核提供了几种I/O调度器:CFQ(完全公平队列) ------为每个进程分配独立的I/O时间片,保证公平。Deadline(截止时间调度) ------为每个请求设定截止时间,防止饥饿。NOOP(无操作/直通) ------不做任何调度,直接按FIFO顺序执行。BFQ(预算公平队列) ------CFQ的改进版,按"预算"分配I/O资源。

SSD通常使用NOOP或Deadline------因为SSD没有机械寻道,不需要像HDD那样优化磁头移动路径,调度器的开销反而可能成为瓶颈。


九、RAID:多块盘组队,又快又稳

RAID级别大比拼:速度、可靠性与成本的权衡

RAID(Redundant Array of Independent Disks,廉价冗余磁盘阵列)用多块磁盘组合成一个逻辑磁盘,目的是提高性能和/或可靠性 。两个核心概念:数据条带化(Striping) ------数据分散到多盘,并行读写提速。冗余(Redundancy) ------额外存储校验信息,某块盘坏了数据还在。

9.1 RAID 0(条带化)

数据被切成块,交替分布到多块磁盘 上。读写可以并行进行,速度成倍提升。但没有任何冗余------任何一块盘坏了,所有数据全完。就像把一份文件撕成几页分给几个人保管,一个人丢了就全没了。至少需要2块盘。适用场景:追求极致速度,数据丢了也无所谓。

9.2 RAID 1(镜像)

每块盘都有一个完整的镜像盘,数据同时写到两块盘上。可靠性极高(一块盘坏了还有另一块),读性能可以提升(可以从两块盘同时读)。但可用容量只有50%------两块1TB的盘组RAID 1,你只能用到1TB。适用场景:数据安全要求极高。

9.3 RAID 2(位级条带 + 海明码)

数据按 分散到多盘,额外用海明码做校验。需要很多盘(数据盘+校验盘),实际中很少使用,了解即可。

9.4 RAID 3(字节级条带 + 专用校验盘)

数据按字节分散到多盘,有一块专门的盘存放奇偶校验信息。每次读写都涉及所有盘,适合大文件顺序读写。但校验盘可能成为瓶颈。

9.5 RAID 4(块级条带 + 专用校验盘)

和RAID 3类似,但以 为单位分散。校验盘成为写入瓶颈------每次写操作都要更新校验盘,而校验盘只有一块。

9.6 RAID 5(分布式奇偶校验)

和RAID 4类似,但校验信息分散存储在所有盘上,而不是集中在一块盘上。解决了RAID 4的校验盘瓶颈问题。允许一块盘故障而不丢数据。至少需要3块盘。

RAID 5是最常用的RAID级别,兼顾了性能、可靠性和成本。适合文件服务器、NAS等场景。

9.7 RAID 6(双重奇偶校验)

使用两套校验信息 ,允许两块盘同时故障。可靠性更高,但写入性能更低(每次写都要计算和更新两套校验)。至少需要4块盘。适合对可靠性要求极高的企业存储。

9.8 RAID 10(1+0)

先做镜像(RAID 1),再做条带化(RAID 0)。高性能 + 高可靠,但成本也最高------至少需要4块盘,可用容量只有50%。适用场景:高性能数据库服务器、核心业务系统。

9.9 RAID 01(0+1)

先做条带化(RAID 0),再做镜像(RAID 1)。看起来和RAID 10差不多,但可靠性不如RAID 10------条带组中任何一块盘坏,整个条带组都不可用,只剩镜像组在撑。

9.10 RAID选择建议

RAID级别 最少盘数 可用容量 容错能力 读性能 写性能 适用场景
RAID 0 2 100% 极高 极高 追求速度,数据不重要
RAID 1 2 50% 1块盘 一般 数据安全要求高
RAID 5 3 (n-1)/n 1块盘 中等 通用存储/NAS
RAID 6 4 (n-2)/n 2块盘 较低 企业存储
RAID 10 4 50% 1块/组 极高 高性能数据库
RAID 01 4 50% 1组 极高 不推荐

总结

磁盘存储器管理的核心矛盾就一句话:CPU太快了,磁盘太慢了。为了解决这个矛盾,操作系统想出了一整套方案:

调度算法让磁头尽量少跑、跑短路------FCFS公平但慢,SSTF快但可能饿死人,SCAN像电梯一样均衡,C-SCAN更均匀,LOOK系列是它们的优化版。

分配方式决定文件在磁盘上怎么摆------连续分配简单快速但有碎片,链接分配无碎片但随机访问差,索引分配综合最优。

空间管理追踪磁盘上的"空地"------空闲表法简单直观,位示图法空间最省,成组链接法效率最高。

格式化让新硬盘从"白板"变"可用"------低级格式化划磁道扇区,分区切蛋糕,高级格式化建文件系统。

缓存用内存帮磁盘"打辅助"------Page Cache让热数据不用每次都读磁盘。

各种加速手段进一步压榨性能------提前读、延迟写、优化块分布、NCQ、I/O调度器......

RAID让多块盘组队------条带化提速,镜像保安全,RAID 5是性价比之王。

一句话总结:磁盘存储器管理的全部目标,就是让"最慢的家伙"尽可能不拖慢整个系统