CPU是海王?聊聊 主/子執行緒 和 同/非同步 的關係

冰以東發表於2022-03-19

最近表弟一直在找實習,經常會問我一些問題,有些問題在沒有經歷過真實工作時是真的不好理解的,所以我開了這個【表弟專欄】,專門為找工作的表弟解決一些疑惑。

這篇文章從計算機發展的角度出發,描述為什麼計算機需要劃分 "主/子執行緒" 和 "同/非同步",希望這個故事你能喜歡。

開天闢地,計算機"老計"誕生

話說幾十年前,老計(初代CPU)誕生了,老計誕生初期幫人們解決了諸多繁瑣的計算工作,他可以無休無止地按照人們給的指令進行運算。

就像圖中一樣,人們產生著各種問題,然後把問題丟入到一個佇列中去,老計按照人們丟入的指令按順序進行計算。

但就像現在網際網路越來越卷一樣,老計工作幾年之後,發現要做的事情實在是太多了,有些計算要算完要搞到幾十年後了,這可咋辦呢?

這時人們認為老計該退休了,換了大計出場,大計的優點是相當卷,計算速度是老計的N倍,大大提升了計算的速度。

現實問題,大計海王進化(主/子執行緒)

大計有一天在誠誠懇懇工作時,被主管拉到了辦公室,開始批評大計:

"大計啊,我知道你工作起來很努力,但你有點死板了啊,所有人給你分配的工作你都是按順序操作,導致使用者說我們的產品就像在擠牙膏,一點點擠出來。你能再加快工作速度嗎?不能只靠加班來完成工作啊!"

大計一臉mmp像,心想:“我特麼要做什麼,不還是你給到的指令啊”,但大計有著當代網際網路人共同的目標("保住這份工"),所以大計也只能說:

"好的主管,這事我想想辦法,明天給你個答覆。"

大計這天工作到凌晨3點,下班後和匯流排一起去喝酒,說起了白天被主管叼這件事,匯流排說:

"這事好辦啊,我平時給你傳的各種指令,優先順序不高的你讓它不要走同一條路徑傳輸呀,我們像渣男一樣搞個高併發!給每個指令都送去溫暖,釣住她們,讓她們以為你是專一的男人,實際上你在同時和多人交往。"

大計一聽直呼妙計妙計,匯流排不愧是和各個部門打交道的社交花,把泡妞能力用到工作上直接無縫銜接。

之前大計只有一條指令流水線時,他是按走流程,指令1處理完了,才處理指令2,是一個對指令專一的男子。

大計當即畫出了這樣的指令圖:

大計現在能"同時"處理 3條指令:M_0、A_0和B_0,說是"同時",實際上只是大計在這三條指令裡頻繁切換,M_0完成40%,就去招呼下A_0,A_0處理完80%後,然後再去招呼下B_0指令。

也就是說雖然工作時長是一定的,但給主管一種同時在處理3個指令的錯覺。就靠著這套海王策略,大計終於完成了刁鑽主管的需求。

不急的話,這事可以等等再做(同/非同步)

隨著大計海王能力的擴充套件,現在最高時可以"同時"和幾百個指令妹子約會,已經是不可被替代的重要角色,現在主管每天看到大計都得磕個頭,大計的話語權也越來越大,甚至開始反過來給主管提需求了:

"主管啊,你可要知道我主執行緒是負責和使用者互動的重要執行緒啊,你每天在主執行緒丟那麼指令,非常影響使用者的體驗了啊"

"你有些渲染UI的邏輯太頻繁了,導致我做了很多無用的渲染,而且渲染邏輯也分重要程度啊,不重要的指令你等我空閒了再處理啊"

主管連連點頭,說好的好的:"我們下次新增指令時,會告訴你這個指令是否需要立刻實施,如果不那麼重要可以等你空閒下來再處理。"

於是乎,同步、非同步 的概念誕生了:

之前大計在處理 主執行緒 裡的指令時,因為同一個執行緒指令是沒有優先順序的概念的,所以 執行緒裡的指令還是按順序處理的:M_0 -> M_1 -> M_2 -> M_3 -> M_4

但有了 非同步 的概念後,假設這裡的 指令M_1 不那麼重要,那麼大計在處理時是可以把 M_1 放到後面處理的:M_0 -> M_2 -> M_3 -> M_4 -> M_1

小結

本篇【表弟專欄】給大家聊了 主/子執行緒 誕生的必要性,描述了CPU海王本質,以及和同/非同步的區別和關聯。關於 主/子執行緒 和 同/非同步 的問題,大家可以在評論區一起討論。最後如果大家喜歡這個專題,可以關注我的公眾號:冰以東,會持續更新【表弟專欄】,希望能幫忙大家找到更好的工作。

相關文章