1. 程式人生 > >CPU明明8個核,網絡卡為啥拼命折騰一號核?

CPU明明8個核,網絡卡為啥拼命折騰一號核?

## 中斷機制 我是CPU一號車間的阿Q,我又來了! 我們日常的工作就是不斷執行程式碼指令,不過這看似簡單的工作背後其實也並不輕鬆。 咱不能悶著頭啥也不管一個勁的只管執行程式碼,還得和連線在主機板上的其他單位打交道。經常保持聯絡的有鍵盤、滑鼠、磁碟,哦對,還有網絡卡,這傢伙最近把我惹到了,待會再說這事兒。 ![](https://imgkr.cn-bj.ufileos.com/25111190-4b85-4c10-9b50-023ae3404907.png) 原以為記憶體那傢伙已經夠慢的了,沒想到跟上面這幾位通個信比他更慢,咱CPU工廠的時間一刻值千金,不能幹等著,耽誤工夫。後來廠裡一合計,想了個叫`中斷`的辦法。 在我們車間裝了個大燈,這些單位想聯絡我們辦事兒,就先給我們發一箇中斷訊號,大燈就會自動亮起。我們平時工作執行程式碼指令的時候,每執行一條指令就會瞅一眼看看大燈有沒有亮起來。一旦發現燈亮了,就把手頭的工作先放一邊,去處理一下。 ![](https://imgkr.cn-bj.ufileos.com/8867e98c-819b-4ced-bc80-844cb086325e.png) 我們記性很差的,等會處理了完了還得回來接著原來的活繼續幹,為了等會回來還能接的起來,走之前得把當前執行的這個執行緒的各個暫存器的值,執行到哪裡了等等這些資訊都儲存在這個執行緒的棧裡去。 不過有時候我們在執行非常重要的事情的時候,就不想被他們打斷。於是我們又在車間裡那個`eflags暫存器`中設定了一個標記,如果是1我們才允許被打斷,如果是0那就算天王老子找我們也不管了。 ![](https://imgkr.cn-bj.ufileos.com/261ab3d3-777d-4442-8d67-55b711dd943f.png) 哦不對,還有一種不可以遮蔽的中斷`NMI`,走得是綠色通道。不過我可不期望有這種事情發生,因為一般都沒有好事,不是電源斷電就是溫度過高,或者匯流排出了錯誤等這之類嚴重的事情。 ## 8259A PIC 還有一個問題,找我們辦事兒的單位有很多,我們得要區分開來,到底是誰來訊息了,而且要是他們一起來找,按什麼樣優先順序順序處理,也是一件頭疼的事情。 為此,廠裡單獨組建了一個全資的子公司來負責這事兒,他就是`可程式設計中斷控制器PIC`,外號8259A,其他單位想聯絡我們都得通過這個PIC,我們只需要和PIC進行對接就可以了。 ![](https://imgkr.cn-bj.ufileos.com/e9880eb7-570b-4e53-8d34-b2557b3ec91d.png) 我們給辦事單位都分配了一個編號,叫做`中斷向量`。我們還準備了一個表格叫`中斷描述符表IDT`,表格裡記錄了很多資訊,其中就有處理這個中斷號對應的函式地址。我們找PIC拿到編號後就執行處理函式就OK了。 ![](https://imgkr.cn-bj.ufileos.com/5f1efb6b-918f-47ba-9996-04c581e575af.png) 這個表格有點大,足足有256項,咱CPU車間空間有限,放不下,就把它放在記憶體那傢伙那裡了,為了能快速找到這個表,專門添置了一個叫`idtr`的暫存器指向這個表格。 其實除了中斷,我們在執行指令的時候如果遇到了`異常`情況,也會去這個表裡執行異常處理函式,最常見的比如遇到了除數是0,記憶體地址錯誤等等情況。 這種情況下,我們必須主動放下手裡的活,去處理異常,所以我們也說`異常`是同步的,而中斷不知道什麼時候發生,所以是非同步的。 ## APIC 8259A乾的挺不錯的,不過後來咱們廠擴大規模,從單核CPU變成了多核,他就有點應付不過來了。 終於有一天,廠裡召開會議,把8259A給撤了,成立了一個新的全資子公司叫`高階可程式設計中斷控制器APIC`,名字就多了個高階兩個字,乾的活還是一樣的。 不過你還別說,這兩個字還真不是吹噓,比8259A不知道高到哪裡去了。 這個APIC的新公司一上臺,就成立了兩個部門,一個叫`I/O APIC`,負責接待那些要找我們辦事兒的單位,一個叫`Local APIC`,以外包的形式入駐到我CPU的各個車間工作,因為就挨著我們辦公,所以取名叫Local。 ![](https://imgkr.cn-bj.ufileos.com/97d27a3d-4082-43fc-a83a-b542579e62ae.png) `I/O APIC`收到中斷訊號以後,根據自己的策略就分發到對應的`Local APIC`,咱們八個車間就可以專心處理了,為我們省了不少事兒。 不僅如此,通過這個外包團隊,我們八個車間還能向彼此發起中斷請求,我們把這個叫做處理器間中斷`Inter-Processor Interrupt`,簡稱**IPI**。 ## 中斷親和性 每當網路中有資料包到來,網絡卡那傢伙就傳送一箇中斷訊息過來,告訴我們去處理。 不過最近不知道怎麼回事,網路資料量激增。咱們廠裡明明有8個車間,他非得一個勁的只給我們發訊息,搞得我們手頭的工作老是被打斷,忙得不可開交。 終於,我忍不住了,去找網絡卡那傢伙理論了一番。不過他告訴我,這也不能怪他,分發給誰處理,那是APIC在負責。 想想也是,回頭我就去了APIC那裡,要求他們分攤一點給別的車間處理。 APIC表示這他們做不了主,得讓廠裡來決定。 沒過幾天,廠裡開了個會,參會的有各車間代表、APIC負責人,還請了作業系統那邊的相關代表過來。 ![](https://imgkr.cn-bj.ufileos.com/4a3e9a62-6774-4663-9043-c302c652cad7.png) 會上,大家為了此事爭執不休。 二號車間虎子:“阿Q,誰叫你們一號車間是`Bootstrap Processor`,你們就多辛苦一點嘛” 三號車間代表:“你這話說的不合適,大家是一個Team,要互相幫助!要不這樣,既然有這麼多單位要聯絡我們,咱就分下工,比如一號車間負責網絡卡,二號負責磁碟,我們三號負責鍵盤,以此類推” 五號車間代表:“你想的倒是挺美哦,鍵盤一天能發多少中斷,網絡卡一天要發多少中斷,你淨挑輕鬆的幹。這樣吧,咱就用隨機分發進行負載均衡你們覺得怎麼樣?” 八號車間代表:“隨機個啥啊,多麻煩,依我看吶咱8個車間就輪流來唄” ![](https://imgkr.cn-bj.ufileos.com/978c8fa7-7b8c-47fa-8dc9-d15898c5c9fb.png) 這時,領導問作業系統代表有沒有什麼建議。 這代表站起身來,推了推眼鏡說到:“幾位有沒有聽過執行緒的`CPU親和性`?” 大家都搖了搖頭,問到:“這是個什麼意思?” “就是有些執行緒想繫結在你們之中的某一個核上面執行,不希望一會兒在這個核執行,一會兒在那個核執行” 我接過他的話:“好像是有這麼回事兒,之前有遇到過,有個執行緒一直被分配到我們一號車間,不過我們對這個不用關心吧,執行誰不是幹活啊,對我們都一個樣” 代表搖了搖頭,“唉,這可不一樣!你們每個核的一二級快取都是自己在管理,要是換到別的核,這快取多半就沒用了,又得重新來建立,這換來換去的豈不是瞎耽誤功夫嘛!對於一般的執行緒他們倒是不關心,但是有些執行緒執行大量的記憶體訪問和運算處理,又對效能要求很高的話,那就很在意這個問題了” 我們幾個都恍然大悟,紛紛點頭。 ![](https://imgkr.cn-bj.ufileos.com/54c25311-bd2f-4074-8805-7980130eb675.png) 虎子起身問到:“那你們是如何實現這個親和性的呢?這跟我們今天的會議又有什麼關係呢?” 代表繼續回答說到:“我先回答你的第一個問題。執行緒排程是我們作業系統完成的工作,我們提供了API介面,執行緒通過呼叫這些介面表明自己的親和性意願,我們在排程的時候就能按照他們的意願把執行緒分配給你們來執行。” 代表喝了一口水接著說到:“我再回答你的第二個問題。既然執行緒可以有親和性,那中斷也可以按照這個思路來分發啊!APIC預設有一套分發策略,但是也提供親和性的設定,可以指定誰哪些核來處理,這樣不用把規矩定死,靈活可變,豈不更好?” 剛說完,會議室門口突然出現一年輕少年,揮手將作業系統代表喚了出去。 ![](https://imgkr.cn-bj.ufileos.com/f7065562-3ded-4208-9f4a-4c3e5e51208c.png) 接下來,我們詳細討論了這種方案的可行性,最後大家一致決定,就照這麼辦,我們一起提出了一個叫`中斷親和性`的東西,作業系統那邊提供一個可配置的入口**smp_affinity**,可以通過設定各處理器核的掩碼來決定中斷交由誰來處理,APIC回去負責落地支援。 有了這套方案,再遇到網路高峰期,咱們一號車間的壓力就有辦法緩解了。 我們剛剛達成一致,作業系統代表返回會議室,神色凝重的說到:“不好意思各位,作業系統那邊有點事情需要趕回去處理一下,先走一步了” **未完待續······** ## 彩蛋 > 隨著網絡卡的一聲中斷,一個新的資料包來到了這片土地。 > > 帝國網路部新來的年輕人顯然沒有意識到危險的到來······ > > *預知後事如何,請關注後續精彩······* ## 往期TOP5文章 [真慘!連各大程式語言都擺起地攤了!](https://mp.weixin.qq.com/s/_nTIFPwbqieIvrbpXkB5CQ) [因為一個跨域請求,我差點丟了飯碗](https://mp.weixin.qq.com/s/K15IVpe57STOf0SxyLEg9A) [完了!CPU一味求快出事兒了!](https://mp.weixin.qq.com/s/NVIgNj4c7ixkJWsemOt--g) [雜湊表哪家強?幾大程式語言吵起來了!](https://mp.weixin.qq.com/s/erSqe-nItuQPxW4MT3LEVg) [一個HTTP資料包的奇幻之旅](https://mp.weixin.qq.com/s/axPUi-8kHtFQTwgRtyZtGQ) ![](https://static01.imgkr.com/temp/13a382bb14c84e308fa873c923207471.png)