核代碼(11):操作系統(tǒng)的“心臟起搏器”——深度拆解 sched.c 的調(diào)度、睡眠與喚醒魔法)
免責(zé)聲明本文內(nèi)容僅限技術(shù)學(xué)習(xí)與交流使用。文中涉及的代碼、算法及數(shù)據(jù)結(jié)構(gòu)基于 1991 年的 Linux 0.11 內(nèi)核源代碼。當(dāng)前主流 Linux 內(nèi)核(如 2.6.x 及以上)的調(diào)度器(如 CFS 完全公平調(diào)度器)與 0.11 基于時(shí)間片輪轉(zhuǎn)的調(diào)度算法已完全不同,若嘗試將文中所述邏輯直接遷移至現(xiàn)代項(xiàng)目,請(qǐng)務(wù)必自行驗(yàn)證。因使用不當(dāng)造成的任何系統(tǒng)異?;驍?shù)據(jù)丟失,責(zé)任由使用者自行承擔(dān)。引子:如何讓一顆“單核”的 CPU,同時(shí)服侍數(shù)百個(gè)任務(wù)?想象一下,你是一個(gè)大飯店里唯一的一位廚師(單核 CPU)。但是,餐桌上坐著幾十位客人(進(jìn)程),他們都等著你炒菜。你不可能一次炒幾十個(gè)菜,你只有一個(gè)灶臺(tái)。你必須炒一下 A 客人的番茄炒蛋,裝盤一半,立刻換到 B 客人的清蒸魚,蒸一半,再去切 C 客人的回鍋肉,然后回頭繼續(xù)炒 A 的番茄炒蛋。每一道菜你只處理極小的一段時(shí)間,然后立刻換人。為什么要這樣?因?yàn)槿绻阋恢敝怀匆坏啦耍ū热?A 的番茄炒蛋),可能這道菜需要慢燉半小時(shí),其他客人都會(huì)餓死。所以,你必須有一套極其嚴(yán)密的“換菜譜邏輯”: