进程线程的生存法则,多核时代的幽灵战争,代码世界怎么玩转百万任务.
计算机里跑的程序其实都是虚拟出来的“员工”,操作系统得给每个进程分配干活时间。就像学校老师管全班学生,CPU只能同时教一个学生,但得快速轮着提问才能假装大家都在学。当网页请求涌进来时,服务器得靠这个法子同时处理成千上万条数据。
进程其实就像公司里的独立部门,每个部门有自己的电脑和文件柜。如果你想改其他部门的数据,基本办不到。这样虽然安全但效率低,因为每个部门要独立运行。而线程就是在同一间办公室里分几个工位,大家能共享资料,协作起来快,但也容易互相撞衫出错。

创建新进程就像公司招新员工,系统调用就是HR发通知。Unix用fork复制整个进程,Windows直接开新职位。进程结束要么是干完活自己下班,要么被老板开除,有时候还会闹毛病自动崩溃。
线程比进程轻量多了,造一个线程就跟让现有员工兼职差不多。不过线程容易抢资源,比如共享的打印机坏了,整个办公室都得等。Web服务器常用多线程模式,分调度线程和工作线程,前者接活派活,后者具体执行。如果有线程卡在硬盘读数据,其他线程还能继续接新任务。

早期单线程服务器处理请求时,必须等硬盘数据读完才能继续,耽误大量时间。现在用多线程就像餐馆后厨,一个厨师切菜的同时另一个煎炒,效率直接翻倍。但写代码时必须记得加锁,否则两个线程同时改同一数据,账算错了可就麻烦了。
进程表是操作系统管所有进程的通讯录,记录每个进程的内存地址和运行状态。进程切换时,系统会先存档当前进程的进度,再换下一个执行。这种换人速度能达到每秒上万次,人眼看不出间隙。

实现线程有三种方式,用户空间实现快但容易瘫痪,内核实现安全但开销大,混合模式则取两者中间路线。比如浏览器标签页用多进程防止崩溃牵连,而游戏则用多线程同时处理画面和音效。
金融系统的交易引擎每天要处理上亿笔订单,用十万级线程同时工作保持毫秒级响应。但要是线程池配置不对,突然暴涨的请求会让整个系统卡死,像双十一抢购时服务器宕机就是没管好并发量。

从早期的单任务系统到现在的多核处理器,进程线程管理已经发展出上百种算法。操作系统始终在平衡安全与效率,既要防止单个进程拖垮系统,又要让硬件资源物尽其用。代码和CPU之间的这场战争,最终拼的是谁能把时间碎片缝合得更完美。