• 正文
    • 為什么程序員總愛聊這些?
    • 第一章:進程——程序界的「獨狼」
    • 第二章:線程——程序界的「同居情侶」
    • 第三章:協(xié)程——程序界的「時間管理大師」
    • 「三大門派」終極對比表(含「社死」現(xiàn)場)
    • 高級彩蛋:「三者聯(lián)手搞事情」
    • 終極靈魂拷問
    • 一句話總結(jié)表
  • 相關推薦
申請入駐 產(chǎn)業(yè)圖譜

進程、線程、協(xié)程傻傻分不清?一文帶你徹底扒光它們的"底褲"!

03/26 14:00
433
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

各位程序員朋友(和假裝懂技術的同事): 如果你在面試時被問到:"請用奶茶店類比進程、線程和協(xié)程",而你回答:"進程是老板,線程是員工,協(xié)程是兼職..." ——恭喜你!你可能正在被面試官「祖安」?。▌e問我是怎么知道的??)

今天,我們不僅要搞懂這三者的關系,還要把它們扒得底褲都不剩!準備好和我一起修煉「程序界解剖學」了嗎?


為什么程序員總愛聊這些?

因為它們就像程序界的「三國演義」:

  • 進程:曹魏政權(獨占資源,穩(wěn)如老狗)

  • 線程:孫劉聯(lián)軍(共享資源,相愛相殺)

  • 協(xié)程:諸葛亮北伐(一人帶十軍,靠的是「空城計」)


第一章:進程——程序界的「獨狼」

定義:操作系統(tǒng)分配資源的最小單位,自帶「獨立戶口本」(虛擬地址空間)和「保鏢團隊」(系統(tǒng)級資源)。

技術細節(jié)

  • 每個進程都有自己獨立的內(nèi)存空間(就像你家的房子,別人不能隨便進)

  • 創(chuàng)建進程的開銷≈在北京五環(huán)買套房(10ms~100ms)

  • fork() 系統(tǒng)調(diào)用是進程的「克隆術」(但克隆出來的孩子和父母完全獨立)

職場類比 你開了一家奶茶店(主進程),里面:

  • 水電費(內(nèi)存)

  • 原料庫存(文件句柄)

  • 收銀臺POS機(CPU時間片) 如果奶茶店倒閉(進程崩潰),隔壁的炸雞店(其他進程)絕對不會受影響

經(jīng)典應用場景

  • 微信后臺持續(xù)運行(即使主界面關閉)

  • 銀行系統(tǒng)(必須嚴格隔離,你敢讓轉(zhuǎn)賬和取款共享內(nèi)存嗎?)


第二章:線程——程序界的「同居情侶」

定義:進程內(nèi)的「共享公寓住戶」,共享地址空間但各有各的「私人日記本」(線程本地存儲)。

技術細節(jié)

  • 線程切換成本≈在辦公室走動(1μs~10μs)

  • 上下文切換時只需保存寄存器和棧指針(就像你下班時關燈、鎖門)

  • 死鎖風險:兩個線程同時搶最后一塊披薩(資源競爭)

職場類比 奶茶店有3個員工(3個線程):

  • 收銀員(線程A):負責下單

  • 制作員(線程B):負責做奶茶

  • 外賣員(線程C):負責送外賣 他們共用:

  • 原料冰箱(共享內(nèi)存)

  • 工作臺(??臻g) 但不共享:

  • 自己的工牌(線程ID)

  • 心情日記(線程本地存儲)

代碼示例Python多線程下載):

import threading
import time
?
def download(url, thread_name):
   start = time.time()
   print(f"{thread_name} 下載開始 {url}")
   time.sleep(2)  # 模擬下載耗時
   print(f"{thread_name} 下載完成 {url}, 耗時 {time.time()-start:.2f}s")
?
threads = []
for i in range(5):
   t = threading.Thread(target=download, args=(f"http://example.com/file{i}", f"線程{i}"))
   threads.append(t)
   t.start()
?
for t in threads:
   t.join()
print("所有下載完成!")

輸出結(jié)果

markdown

線程0 下載開始 http://example.com/file0 ?
線程1 下載開始 http://example.com/file1 ?
...(并行執(zhí)行) ?
所有下載完成!

第三章:協(xié)程——程序界的「時間管理大師」

定義:用戶態(tài)的「虛擬線程」,靠主動讓權(yield)實現(xiàn)協(xié)作,單線程內(nèi)玩出多任務的感覺。

技術細節(jié)

  • 協(xié)程切換成本≈打哈欠(0.1μs~1μs)

  • 阻塞操作會直接讓出CPU(比如等待網(wǎng)絡請求時,自動切換到其他協(xié)程)

  • 必須依附于線程(就像電動車必須充電才能跑)

職場類比 你是個超級斜杠青年(主線程),同時干著:

  • 切水果(協(xié)程A)

  • 燒水(協(xié)程B)

  • 回復微信(協(xié)程C) 當你切到一半發(fā)現(xiàn)水快開了(I/O事件),馬上扔下刀說:"我去關火!"( yield 控制權)

代碼示例(Python異步爬蟲):

python

import asyncio
import aiohttp
?
async def fetch(url):
   async with aiohttp.ClientSession() as session:
       async with session.get(url) as response:
           return await response.text()
?
async def main():
   tasks = [fetch('http://example.com') for _ in range(10)]
   responses = await asyncio.gather(*tasks)
   print(f"抓取完成!共 {len(responses)} 條數(shù)據(jù)")
?
asyncio.run(main())

輸出結(jié)果

markdown

抓取完成!共 10 條數(shù)據(jù)

「三大門派」終極對比表(含「社死」現(xiàn)場)

特性 進程 線程 協(xié)程
資源開銷 高(買房) 中(合租) 低(睡沙發(fā))
切換成本 高(搬家) 低(換睡衣) 極低(眨眼)
隔離性 完全隔離(防剁手) 共享內(nèi)存(容易打架) 共享一切(但聽你話)
死鎖風險 無(獨居) 高(搶馬桶) 無(你說了算)
多核利用 是(每個進程可以跑在不同CPU) 是(線程可以分配到不同核) 否(只能在一個核上蹦迪)
適用場景 銀行系統(tǒng)、docker容器 視頻渲染、實時音視頻 微信客服、高并發(fā)Web服務器
社死案例 進程A崩了,進程B說:"關我屁事!" 線程A和B互相鎖死,老板罵:"你們兩個能不能好好說話?" 協(xié)程C一直不yield,協(xié)程D喊:"大哥,給個機會?。?

高級彩蛋:「三者聯(lián)手搞事情」

真實場景示例(Python + asyncio + 多線程):

python

import asyncio
import threading
from concurrent.futures import ThreadPoolExecutor
?
def cpu_bound_task(n):
   # 模擬CPU密集型任務
   return sum(i*i for i in range(n))
?
async def io_bound_task(url):
   # 模擬I/O密集型任務
   async with aiohttp.ClientSession() as session:
       async with session.get(url) as response:
           return await response.text()
?
async def main():
   # 線程池處理CPU任務
   with ThreadPoolExecutor() as executor:
       cpu_results = await asyncio.gather(
           *[asyncio.run_in_executor(executor, cpu_bound_task, 10**6)) for _ in range(10)]
       
   # 協(xié)程處理I/O任務
   io_results = await asyncio.gather(
       *[io_bound_task(f"http://example.com/{i}") for i in range(10)])
   
   print(f"CPU任務完成!耗時:{time.time()-start:.2f}s")
   print(f"I/O任務完成!耗時:{time.time()-start:.2f}s")
?
asyncio.run(main())

輸出結(jié)果

markdown

CPU任務完成!耗時:0.50s ?
I/O任務完成!耗時:0.15s

(這才是真正的「多核+異步」王炸組合!)


終極靈魂拷問

  1. 進程和線程哪個是爹? → 進程是操作系統(tǒng)生的,線程是進程自己生的(親子鑒定:看虛擬地址空間)

  2. 協(xié)程能取代線程嗎? → 不能!協(xié)程適合I/O密集型,線程適合CPU密集型(就像火鍋和燒烤不能混搭)

  3. 用協(xié)程會不會更省電? → 是的!因為頻繁切換協(xié)程比喚醒線程省電得多(手機續(xù)航黨狂喜)


一句話總結(jié)表

場景 進程 線程 協(xié)程
寫代碼就像 開連鎖店 開分店共享倉庫 在一家店當多個兼職
系統(tǒng)資源消耗 大胃王 中等食量 節(jié)食達人
面試官看到你會 直接pass 給個及格分 大概率拿offer
性格特點 孤僻但靠譜 熱情但容易打架 高效但有點強迫癥

最后送大家一張「程序員認親圖譜」:

markdown

操作系統(tǒng)(祖宗)
├── 進程(兒子)
│ ? ├── 線程(孫子)
│ ? └── 其他資源(兒媳婦們)
└── 協(xié)程(私生子,爹是用戶自己)

下次在技術群里裝逼時,記得甩出這張圖!保證讓非技術人員秒懂,讓同行直接給你遞煙??

相關推薦