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

中斷機制

我是CPU一號車間的阿Q,我又來了!編程

咱們平常的工做就是不斷執行代碼指令,不過這看似簡單的工做背後其實也並不輕鬆。api

咱不能悶着頭啥也無論一個勁的只管執行代碼,還得和鏈接在主板上的其餘單位打交道。常常保持聯繫的有鍵盤、鼠標、磁盤,哦對,還有網卡,這傢伙最近把我惹到了,待會再說這事兒。跨域

原覺得內存那傢伙已經夠慢的了,沒想到跟上面這幾位通個信比他更慢,咱CPU工廠的時間一刻值千金,不能幹等着,耽誤工夫。後來廠裏一合計,想了個叫中斷的辦法。緩存

在咱們車間裝了個大燈,這些單位想聯繫咱們辦事兒,就先給咱們發一箇中斷信號,大燈就會自動亮起。咱們平時工做執行代碼指令的時候,每執行一條指令就會瞅一眼看看大燈有沒有亮起來。一旦發現燈亮了,就把手頭的工做先放一邊,去處理一下。網絡

咱們記性不好的,等會處理了完了還得回來接着原來的活繼續幹,爲了等會回來還能接的起來,走以前得把當前執行的這個線程的各個寄存器的值,執行到哪裏了等等這些信息都保存在這個線程的棧裏去。負載均衡

不過有時候咱們在執行很是重要的事情的時候,就不想被他們打斷。因而咱們又在車間裏那個eflags寄存器中設置了一個標記,若是是1咱們才容許被打斷,若是是0那就算天王老子找咱們也無論了。異步

哦不對,還有一種不能夠屏蔽的中斷NMI,走得是綠色通道。不過我可不指望有這種事情發生,由於通常都沒有好事,不是電源斷電就是溫度太高,或者總線出了錯誤等這之類嚴重的事情。編程語言

8259A PIC

還有一個問題,找咱們辦事兒的單位有不少,咱們得要區分開來,究竟是誰來消息了,並且要是他們一塊兒來找,按什麼樣優先級順序處理,也是一件頭疼的事情。函數

爲此,廠裏單獨組建了一個全資的子公司來負責這事兒,他就是可編程中斷控制器PIC,外號8259A,其餘單位想聯繫咱們都得經過這個PIC,咱們只須要和PIC進行對接就能夠了。性能

咱們給辦事單位都分配了一個編號,叫作中斷向量。咱們還準備了一個表格叫中斷描述符表IDT,表格裏記錄了不少信息,其中就有處理這個中斷號對應的函數地址。咱們找PIC拿到編號後就執行處理函數就OK了。

這個表格有點大,足足有256項,咱CPU車間空間有限,放不下,就把它放在內存那傢伙那裏了,爲了能快速找到這個表,專門添置了一個叫idtr的寄存器指向這個表格。

其實除了中斷,咱們在執行指令的時候若是遇到了異常狀況,也會去這個表裏執行異常處理函數,最多見的好比遇到了除數是0,內存地址錯誤等等狀況。

這種狀況下,咱們必須主動放下手裏的活,去處理異常,因此咱們也說異常是同步的,而中斷不知道何時發生,因此是異步的。

APIC

8259A乾的挺不錯的,不事後來我們廠擴大規模,從單核CPU變成了多核,他就有點應付不過來了。

終於有一天,廠裏召開會議,把8259A給撤了,成立了一個新的全資子公司叫高級可編程中斷控制器APIC,名字就多了個高級兩個字,乾的活仍是同樣的。

不過你還別說,這兩個字還真不是吹噓,比8259A不知道高到哪裏去了。

這個APIC的新公司一上臺,就成立了兩個部門,一個叫I/O APIC,負責接待那些要找咱們辦事兒的單位,一個叫Local APIC,之外包的形式入駐到我CPU的各個車間工做,由於就挨着咱們辦公,因此取名叫Local。

I/O APIC收到中斷信號之後,根據本身的策略就分發到對應的Local APIC,我們八個車間就能夠專心處理了,爲咱們省了很多事兒。

不只如此,經過這個外包團隊,咱們八個車間還能向彼此發起中斷請求,咱們把這個叫作處理器間中斷Inter-Processor Interrupt,簡稱IPI

中斷親和性

每當網絡中有數據包到來,網卡那傢伙就發送一箇中斷消息過來,告訴咱們去處理。

不過最近不知道怎麼回事,網絡數據量激增。我們廠裏明明有8個車間,他非得一個勁的只給咱們發消息,搞得咱們手頭的工做總是被打斷,忙得不可開交。

終於,我忍不住了,去找網卡那傢伙理論了一番。不過他告訴我,這也不能怪他,分發給誰處理,那是APIC在負責。

想一想也是,回頭我就去了APIC那裏,要求他們分攤一點給別的車間處理。

APIC表示這他們作不了主,得讓廠裏來決定。

沒過幾天,廠裏開了個會,參會的有各車間表明、APIC負責人,還請了操做系統那邊的相關表明過來。

會上,你們爲了此事爭執不休。

二號車間虎子:「阿Q,誰叫大家一號車間是Bootstrap Processor,大家就多辛苦一點嘛」

三號車間表明:「你這話說的不合適,你們是一個Team,要互相幫助!要不這樣,既然有這麼多單位要聯繫咱們,咱就分下工,好比一號車間負責網卡,二號負責磁盤,咱們三號負責鍵盤,以此類推」

五號車間表明:「你想的卻是挺美哦,鍵盤一天能發多少中斷,網卡一天要發多少中斷,你淨挑輕鬆的幹。這樣吧,咱就用隨機分發進行負載均衡大家以爲怎麼樣?」

八號車間表明:「隨機個啥啊,多麻煩,依我看吶咱8個車間就輪流來唄」

這時,領導問操做系統表明有沒有什麼建議。

這表明站起身來,推了推眼鏡說到:「幾位有沒有聽過線程的CPU親和性?」

你們都搖了搖頭,問到:「這是個什麼意思?」

「就是有些線程想綁定在大家之中的某一個核上面執行,不但願一下子在這個核執行,一下子在那個核執行」

我接過他的話:「好像是有這麼回事兒,以前有遇到過,有個線程一直被分配到咱們一號車間,不過咱們對這個不用關心吧,執行誰不是幹活啊,對咱們都一個樣」

表明搖了搖頭,「唉,這可不同!大家每一個核的一二級緩存都是本身在管理,要是換到別的核,這緩存多半就沒用了,又得從新來創建,這換來換去的豈不是瞎耽誤功夫嘛!對於通常的線程他們卻是不關心,可是有些線程執行大量的內存訪問和運算處理,又對性能要求很高的話,那就很在乎這個問題了」

咱們幾個都恍然大悟,紛紛點頭。

虎子起身問到:「那大家是如何實現這個親和性的呢?這跟咱們今天的會議又有什麼關係呢?」

表明繼續回答說到:「我先回答你的第一個問題。線程調度是咱們操做系統完成的工做,咱們提供了API接口,線程經過調用這些接口代表本身的親和性意願,咱們在調度的時候就能按照他們的意願把線程分配給大家來執行。」

表明喝了一口水接着說到:「我再回答你的第二個問題。既然線程能夠有親和性,那中斷也能夠按照這個思路來分發啊!APIC默認有一套分發策略,可是也提供親和性的設置,能夠指定誰哪些核來處理,這樣不用把規矩定死,靈活可變,豈不更好?」

剛說完,會議室門口忽然出現一年輕少年,揮手將操做系統表明喚了出去。

接下來,咱們詳細討論了這種方案的可行性,最後你們一致決定,就照這麼辦,咱們一塊兒提出了一個叫中斷親和性的東西,操做系統那邊提供一個可配置的入口smp_affinity,能夠經過設置各處理器核的掩碼來決定中斷交由誰來處理,APIC回去負責落地支持。

有了這套方案,再遇到網絡高峯期,我們一號車間的壓力就有辦法緩解了。

咱們剛剛達成一致,操做系統表明返回會議室,神色凝重的說到:「很差意思各位,操做系統那邊有點事情須要趕回去處理一下,先走一步了」

未完待續······

彩蛋

隨着網卡的一聲中斷,一個新的數據包來到了這片土地。

帝國網絡部新來的年輕人顯然沒有意識到危險的到來······

預知後事如何,請關注後續精彩······

往期TOP5文章

真慘!連各大編程語言都擺起地攤了!

由於一個跨域請求,我差點丟了飯碗

完了!CPU一味求快出事兒了!

哈希表哪家強?幾大編程語言吵起來了!

一個HTTP數據包的奇幻之旅

相關文章
相關標籤/搜索