🔌 第六章 请求到达Web服务器,响应返回浏览器
📄 一句话概括

一台服务器要同时陪成百上千个客户端——靠多任务:fork 子进程(内存独立)、多线程(共享内存)或 inetd(总机转接、按需启动)。

📝 本节和前面几节的关系

6.1.1 说了服务器在等待;本篇看它怎么同时陪很多客人。

一、为什么要多任务

等待是常态,但客人随时可能来—— 服务器程序必须做到多人同时服务,不能排队一个一个来。

二、三种形态

fork 子进程:每个客人复制一个程序副本,内存独立、隔离好; 多线程:一个进程里分多条执行线,共享内存、更轻量; inetd:总机程序先接客,确认端口有活再启动真正的服务程序。

三、动手 Demo:一台服务器怎么陪多个客人

服务器程序的多任务形态:

for a, b, c in [('fork 子进程','每个客人复制一个副本','内存独立,隔离好'),
             ('多线程','一个进程里分多条线','共享内存,更轻量'),
             ('inetd','总机先接,有活再叫人','不常驻,按需启动')]:
    print('%-12s %-16s %s' % (a, b, c))

实跑输出:

--------------------------------------------------------------------
一台服务器怎么陪多个客人
--------------------------------------------------------------------
  服务器程序的多任务形态:

  形态            做法                     特点
  ----------------------------------------------------------
  fork 子进程     每个客人复制一个副本     内存独立,隔离好
  多线程          一个进程里分多条线       共享内存,更轻量
  inetd           总机先接,有活再叫人     不常驻,按需启动
  ----------------------------------------------------------

  共同目标:**同时陪好成百上千个客户端**。

⭐ 2026 现状:Nginx 等用事件驱动(异步)把并发做到极致——但【同时陪多个客人】的目标没变。

30 秒实验

  1. 说说多进程与多线程各自的优缺点。
  2. 查查 inetd 现在还管哪些小服务。
  3. 想想事件驱动为什么比每客一线程省。

常见误区

  1. 以为服务器一次只服务一个——多任务是基本盘。
  2. 以为 inetd 已彻底消失——轻量场景仍在用。
自测三问(点开对答案) 1. 多任务要解决什么? —— 同时服务多个客户端。 2. fork 与线程的关键差异? —— 内存独立 vs 共享内存。 3. inetd 的角色? —— 总机:有连接才启动真服务。

相关笔记