📚 第一章 网络基础知识
📄 一句话概括

批处理的做法是「攒一批作业、一口气跑完」,中间没人能插进来。 它的短板不是慢,是「不响应」——提交完只能干等整批结束。

📝 本节和前面几节的关系

1.1 讲完了网络能干什么,1.2 开始讲它是怎么一步步变成现在这样的。 批处理是这七个阶段里第一个,也是最反直觉的一个——它连「交互」这个概念都没有。

一、那个年代的机器长什么样

1950 年代的计算机没有终端、没有键盘屏幕,输入靠打孔的卡片或纸带,输出靠打印机。 所以「一个人守着机器敲命令」这件事在当时根本不成立——机器太贵,贵到必须一刻不停地跑。

环节 做法 耗时占比
准备 程序员在卡片上打孔 人的时间,不算机器时间
装入 整叠卡片读进磁带 几分钟
运行 连续跑完所有作业 机器时间的主体
输出 结果打到打印纸 几分钟

第一行那个「不算机器时间」是关键:批处理的设计目标就是「让机器别闲着」, 人的等待被彻底排除在优化目标之外。 这就是为什么它后来必然被淘汰——机器越来越便宜、人越来越贵,优化目标反过来了。

二、周转时间怎么算

衡量批处理好坏的核心指标叫「周转时间」:从提交到出结果,一共等了多久。

指标 定义 批处理下的表现
周转时间 完成时刻 − 提交时刻 等于排队时间加运行时间
平均周转 所有作业周转的平均 取决于作业顺序
响应时间 提交到第一次出反馈 等于周转时间

第三行那个「等于」最能说明问题:批处理里根本没有「响应」这个概念, 第一次反馈就是最后结果。 所以作业顺序影响巨大:短的排后面,平均周转时间会被拉得很长。 这就是后来「短作业优先」调度算法的由来。

三、为什么这条路走不下去

三个矛盾同时压过来:

矛盾 表现 后果
机器贵 vs 人少 一人一机不划算 只能攒批
调试难 一个错要等整批跑完 改一行等一天
无法交互 没有实时反馈 不适配新用途

第二行那个「改一行等一天」是当年的真实痛点:卡片打错一个孔,整叠要重打、重排、重跑。 所以一旦硬件便宜到能「一人一机」, 批处理立刻被分时系统取代——不是因为批处理效率低,是因为它不把人当回事。 这个教训在后面反复出现:技术路线的胜负,往往取决于它把谁的成本算进去了。

四、动手 Demo:批处理为什么会被淘汰

拿 5 个作业算一笔账:作业按提交顺序一个接一个跑,看每个作业的周转时间, 以及「最短的那个等了多久」。 这个 Demo 里最短的作业 D 只算 40 毫秒,却排在第四个。

jobs = [('A', 120), ('B', 80), ('C', 200), ('D', 40), ('E', 60)]

clock = 0
total = 0
for name, dur in jobs:
    start = clock
    clock += dur
    total += clock          # 周转时间 = 完成时刻(提交时刻都是 0)
    print('%-2s 运行%4d  开始%4d  完成%4d  周转%4d'
          % (name, dur, start, clock, clock))
print('平均周转 %.1f' % (total / len(jobs)))

实跑输出:

--------------------------------------------------------------------
批处理为什么会被淘汰
--------------------------------------------------------------------
**批处理的做法是「攒一批作业、一口气跑完」**,**中间没人能插进来。**下面拿 5 个作业算一笔账。

  作业     运行时长     开始时刻     完成时刻     周转时间
  ---------------------------------------------------------
  A        120          0            120          120
  B        80           120          200          200
  C        200          200          400          400
  D        40           400          440          440
  E        60           440          500          500

**平均周转时间 332.0 毫秒**,
**而且作业 D 只算 40 毫秒,却等了 400 毫秒才开始。**

**批处理的问题不是慢,是「不响应」**:**提交完就得等整批跑完,人拿不到中途的反馈。**
**所以下一步必然走向分时——把 CPU 切成小片轮流给,让每个人都能很快看到反应。**

平均周转 332 毫秒这个数,换个顺序会完全不同。 如果把 D 提到第一个: 5 个作业的完成时刻变成 40/160/240/440/500,平均 276 毫秒——少了 56 毫秒,作业一个没变。 所以「调度算法」不是学术游戏:同样的工作量,顺序不同,用户体验差一截。 这也是操作系统课里「短作业优先」永远排在前面的原因。

30 秒实验

  1. 把 jobs 按运行时长从小到大排序再跑一次,看平均周转时间变成多少。
  2. 把作业数加到 20 个、时长随机,比较「原顺序」与「短作业优先」的平均周转差多少倍。
  3. 给每个作业加一个「提交时刻」(错开到达),再看周转时间的定义要不要改。

常见误区

  1. 以为批处理效率低。 它的机器利用率其实很高,因为机器一刻不停。它低的是「人的效率」。
  2. 以为批处理就是「脚本批量执行」。 两回事:批处理是没有人机交互的作业流, 今天的 shell 脚本随时可以看输出、随时可以打断。
  3. 以为周转时间越短越好就一定对。 还要看公平性,短作业全排前面, 长作业可能永远轮不到(饥饿)。
自测三问(点开对答案) 1. 批处理最大的问题是什么? —— **不是慢,是不响应**。提交后拿不到任何中途反馈,出错也要等整批跑完才知道。 **第一次反馈就是最后结果。** 2. 同样的 5 个作业,换个顺序平均周转时间会不会变? —— **会,而且变得不少**。本例按原顺序是 332 毫秒,把最短的 D 提前到 276 毫秒。 **总工作量一样,体验不同。** 3. 为什么说「技术的胜负取决于它把谁的成本算进去了」? —— 批处理优化的是**机器时间**,把人的等待排除在外; 等硬件便宜了、人变贵了,**优化目标一换,批处理立刻失势**。

下一节就是取代它的那一个:把 CPU 切成小片轮流给,让每个人都能很快看到反应。

相关笔记