<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Linux系統下超線(xiàn)程感知的調度算法研究

Linux系統下超線(xiàn)程感知的調度算法研究

作者: 時(shí)間:2009-11-03 來(lái)源:網(wǎng)絡(luò ) 收藏

  隨著(zhù)計算機應用的日益普及,用戶(hù)對計算機的處理能力的需求成指數級增長(cháng)。為了滿(mǎn)足用戶(hù)的需求,處理器生產(chǎn)廠(chǎng)商采用了諸如超流水、分支預測、超標量、亂序執行及緩存等技術(shù)以提高處理器的性能。但是這些技術(shù)的采用增加了微處理器的復雜性,帶來(lái)了諸如材料、功耗、光刻、電磁兼容性等一系列問(wèn)題。因此處理器設計人員開(kāi)始尋找新的途徑來(lái)提高處理器的性能。Intel公司于2002年底推出了技術(shù),通過(guò)共享處理器的執行資源,提高CPU的利用率,讓處理單元獲得更高的吞吐量。

  1 技術(shù)背景

  傳統的處理器內部存在著(zhù)多種并行操作方式。①指令級并行ILP(Instruction Level Paramllelism):同時(shí)執行幾條指令,單CPU就能完成。但是,傳統的單CPU處理器只能同時(shí)執行一個(gè)線(xiàn)程,很難保證CPU資源得到100%的利用,性能提高只能通過(guò)提升時(shí)鐘頻率和改進(jìn)架構來(lái)實(shí)現。②線(xiàn)程級并行TLP(Thread Level Paramllesim):可以同時(shí)執行多個(gè)線(xiàn)程,但是需要多處理器系統的支持,通過(guò)增加CPU的數量來(lái)提高性能。

  微處理器將同時(shí)多線(xiàn)程技術(shù)SMT(Simultaneous Multi-Threading)引入Intel體系結構,支持超線(xiàn)程技術(shù)的操作系統將一個(gè)物理處理器視為兩個(gè)邏輯處理器,并且為每個(gè)邏輯處理器分配一個(gè)線(xiàn)程運行。物理處理器在兩個(gè)邏輯處理器之間分配高速緩存、執行單元、總線(xiàn)等執行資源,讓暫時(shí)閑置的運算單元去執行其他線(xiàn)程代碼,從而最大限度地提升CPU資源的利用率。

  Intel 超線(xiàn)程技術(shù)通過(guò)復制、劃分、共享Intel的Netburst微架構的資源讓一個(gè)物理CPU中具有兩個(gè)邏輯CPU。(1)復制的資源:每個(gè)邏輯CPU都維持一套完整的體系結構狀態(tài),包括通用寄存器、控制寄存器、高級可編程寄存器(APIC)以及一些機器狀態(tài)寄存器,體系結構狀態(tài)對程序或線(xiàn)程流進(jìn)行跟蹤。從軟件的角度,一旦體系結構狀態(tài)被復制,就可以將一個(gè)物理CPU視為兩個(gè)邏輯CPU。(2)劃分的資源:包括重定序(re-order)緩沖、Load/Store緩沖、隊列等。劃分的資源在多任務(wù)模式時(shí)分給兩個(gè)邏輯CPU使用,在單任務(wù)模式時(shí)合并起來(lái)給一個(gè)邏輯CPU使用。(3)共享的資源:包括cache及執行單元等,邏輯CPU共享物理CPU的執行單元進(jìn)行加、減、取數等操作。

  在線(xiàn)程調度時(shí),體系結構狀態(tài)對程序或線(xiàn)程流進(jìn)行跟蹤,各項工作(包括加、乘、加載等)由執行資源(處理器上的單元)負責完成。每個(gè)邏輯處理器可以單獨對中斷作出響應。第一個(gè)邏輯處理器跟蹤一個(gè)線(xiàn)程時(shí),第二個(gè)邏輯處理器可以同時(shí)跟蹤另一個(gè)線(xiàn)程。例如,當一個(gè)邏輯處理器在執行浮點(diǎn)運算時(shí),另一個(gè)邏輯處理器可以執行加法運算和加載操作。擁有超線(xiàn)程技術(shù)的CPU可以同時(shí)執行處理兩個(gè)線(xiàn)程,它可以將來(lái)自?xún)蓚€(gè)線(xiàn)程的指令同時(shí)發(fā)送到處理器內核執行。處理器內核采用亂序指令調度并發(fā)執行兩個(gè)線(xiàn)程,以確保其執行單元在各時(shí)鐘周期均處于運行狀態(tài)。

  圖1和圖2分別為傳統的雙處理器系統和支持超線(xiàn)程的雙處理器系統。傳統的雙處理器系統中,每個(gè)處理器有一套獨立的體系結構狀態(tài)和處理器執行資源,每個(gè)處理器上只能同時(shí)執行一個(gè)線(xiàn)程。支持超線(xiàn)程的雙處理器系統中,每個(gè)處理器有兩套獨立體系結構狀態(tài),可以獨立地響應中斷。

傳統的雙處理器系統和支持超線(xiàn)程的雙處理器系統

  2 超線(xiàn)程感知調度優(yōu)化

  從2.4.17版開(kāi)始支持超線(xiàn)程技術(shù),傳統的 O(1)調度器不能區分物理CPU和邏輯CPU,因此不能充分利用超線(xiàn)程處理器的特性。Ingo Monlar編寫(xiě)了“HT-aware scheduler patch”,針對超線(xiàn)程技術(shù)對O(1)調度器進(jìn)行了優(yōu)化:優(yōu)先安排線(xiàn)程在空閑的物理CPU的邏輯CPU上運行,避免資源競爭帶來(lái)的性能下降;在線(xiàn)程調度時(shí)考慮了在兩個(gè)邏輯CPU之間進(jìn)行線(xiàn)程遷移的開(kāi)銷(xiāo)遠遠小于物理CPU之間的遷移開(kāi)銷(xiāo)以及邏輯CPU共享cache等資源的特性。這些優(yōu)化的相關(guān)算法被Linux的后期版本所吸收,具體如下:

  (1)共享運行隊列

  在對稱(chēng)多處理SMP(Symmetrical Multi-Processing)環(huán)境中,O(1)調度器為每個(gè)CPU分配了一個(gè)運行隊列,避免了多CPU共用一個(gè)運行隊列帶來(lái)的資源競爭。Linux會(huì )將超線(xiàn)程CPU中的兩個(gè)邏輯CPU視為SMP的兩個(gè)獨立CPU,各維持一個(gè)運行隊列。但是這兩個(gè)邏輯CPU共享cache等資源,沒(méi)有體現超線(xiàn)程CPU的特性。因此引入了共享運行隊列的概念。HT-aware scheduler patch在運行隊列struct runqueue結構中增加了nr_cpu和cpu兩個(gè)屬性,nr_cpu記錄物理CPU中的邏輯CPU數目,CPU則指向同屬CPU(同一個(gè)物理CPU上的另一個(gè)邏輯CPU)的運行隊列,如圖3所示。

共享運行隊列

  在Linux中通過(guò)調用sched_map_runqueue( )函數實(shí)現兩個(gè)邏輯CPU的運行隊列的合并。sched_map_runqueue( )首先會(huì )查詢(xún)系統的CPU隊列,通過(guò)phys_proc_id(記錄邏輯CPU所屬的物理CPU的ID)判斷當前CPU的同屬邏輯CPU。如果找到同屬邏輯CPU,則將當前CPU運行隊列的cpu屬性指向同屬邏輯CPU的運行隊列。

  (2)支持“被動(dòng)的”負載均衡

  用中斷驅動(dòng)的均衡操作必須針對各個(gè)物理 CPU,而不是各個(gè)邏輯 CPU。否則可能會(huì )出現兩種情況:一個(gè)物理 CPU 運行兩個(gè)任務(wù),而另一個(gè)物理 CPU 不運行任務(wù);現有的調度程序不會(huì )將這種情形認為是“失衡的”。在調度程序看來(lái),似乎是第一個(gè)物理處理器上的兩個(gè) CPU運行1-1任務(wù),而第二個(gè)物理處理器上的兩個(gè) CPU運行0-0任務(wù)。

  在2.6.0版之前,Linux只有通過(guò)load_balance( )函數才能進(jìn)行CPU之間負載均衡。當某個(gè)CPU負載過(guò)輕而另一個(gè)CPU負載較重時(shí),系統會(huì )調用load_balance( )函數從重載CPU上遷移線(xiàn)程到負載較輕的CPU上。只有系統最繁忙的CPU的負載超過(guò)當前CPU負載的 25% 時(shí)才進(jìn)行負載平衡。找到最繁忙的CPU(源CPU)之后,確定需要遷移的線(xiàn)程數為源CPU負載與本CPU負載之差的一半,然后按照從 expired 隊列到 active 隊列、從低優(yōu)先級線(xiàn)程到高優(yōu)先級線(xiàn)程的順序進(jìn)行遷移。

  在超線(xiàn)程系統中進(jìn)行負載均衡時(shí),如果也是將邏輯CPU等同于SMP環(huán)境中的單個(gè)CPU進(jìn)行調度,則可能會(huì )將線(xiàn)程遷移到同一個(gè)物理CPU的兩個(gè)邏輯CPU上,從而導致物理CPU的負載過(guò)重。

  在2.6.0版之后,Linux開(kāi)始支持NUMA(Non-Uniform Memory Access Architecture)體系結構。進(jìn)行負載均衡時(shí)除了要考慮單個(gè)CPU的負載,還要考慮NUMA下各個(gè)節點(diǎn)的負載情況。

  Linux的超線(xiàn)程調度借鑒NUMA的算法,將物理CPU當作NUMA中的一個(gè)節點(diǎn),并且將物理CPU中的邏輯CPU映射到該節點(diǎn),通過(guò)運行隊列中的node_nr_running屬性記錄當前物理CPU的負載情況。

  Linux通過(guò)balance_node( )函數進(jìn)行物理CPU之間的負載均衡。物理CPU間的負載平衡作為rebalance_tick( )函數中的一部分在 load_balance( )之前啟動(dòng),避免了出現一個(gè)物理CPU運行1-1任務(wù),而第二個(gè)物理CPU運行0-0任務(wù)的情況。balance_node( )函數首先調用 find_busiest_node( )找到系統中最繁忙的節點(diǎn),然后在該節點(diǎn)和當前CPU組成的CPU集合中進(jìn)行 load_balance( ),把最繁忙的物理CPU中的線(xiàn)程遷移到當前CPU上。之后rebalance_tick( )函數再調用load_balance(工作集為當前的物理CPU中的所有邏輯CPU)進(jìn)行邏輯CPU之間的負載均衡。

  (3)支持“主動(dòng)的”負載均衡

  當一個(gè)邏輯 CPU 變成空閑時(shí),可能造成一個(gè)物理CPU的負載失衡。例如:系統中有兩個(gè)物理CPU,一個(gè)物理CPU上運行一個(gè)任務(wù)并且剛剛結束,另一個(gè)物理CPU上正在運行兩個(gè)任務(wù),此時(shí)出現了一個(gè)物理CPU空閑而另一個(gè)物理CPU忙的現象。

  Linux中通過(guò)active_load_balance( )函數進(jìn)行主動(dòng)的負載均衡,active_load_balance( )函數用于在所有的邏輯CPU中查詢(xún)該CPU的忙閑情況。如果發(fā)現由于超線(xiàn)程引起的負載不平衡(一個(gè)物理CPU的兩個(gè)邏輯CPU都空閑,另一個(gè)物理CPU的兩個(gè)邏輯CPU都在運行兩個(gè)線(xiàn)程),則喚醒一個(gè)需要遷移的線(xiàn)程,將它從一個(gè)忙的物理CPU遷移到一個(gè)空閑的物理CPU上。

  active_load_balance( )通過(guò)調用cpu_rq( )函數得到每一個(gè)邏輯CPU上的運行隊列。如果運行隊列上的當前運行線(xiàn)程為idle線(xiàn)程,則說(shuō)明當前邏輯CPU為空閑;如果發(fā)現一個(gè)物理CPU兩個(gè)邏輯CPU都為空閑,而另一個(gè)物理CPU中的兩個(gè)邏輯CPU的運行隊列為繁忙的情況,則說(shuō)明存在超線(xiàn)程引起的負載不均衡。這時(shí)當前CPU會(huì )喚醒遷移服務(wù)線(xiàn)程(migration_thread)來(lái)完成負載均衡的線(xiàn)程遷移。

  (4)支持超線(xiàn)程感知的任務(wù)挑選

  在超線(xiàn)程處理器中,由于cache資源為兩個(gè)邏輯處理器共享,因此調度器在選取一個(gè)新任務(wù)時(shí),必須確保同組的任務(wù)盡量共享一個(gè)物理CPU,從而減少cache失效的開(kāi)銷(xiāo),提高系統的性能。而傳統的調度器只是簡(jiǎn)單地為邏輯CPU選取一個(gè)任務(wù),沒(méi)有考慮物理CPU的影響。

  Linux進(jìn)行線(xiàn)程切換時(shí)會(huì )調用schedule( )函數進(jìn)行具體的操作。如果沒(méi)有找到合適的任務(wù)schedule()函數,則會(huì )調度idle線(xiàn)程在當前CPU上運行。在超線(xiàn)程環(huán)境中Linux調度idle線(xiàn)程運行之前會(huì )查詢(xún)其同屬CPU的忙閑狀況。如果同屬CPU上有等待運行的線(xiàn)程,則會(huì )調用一次load_balance( )函數在兩個(gè)同屬CPU之間作一次負載均衡,將等待運行的線(xiàn)程遷移到當前CPU上,保證優(yōu)先運行同屬CPU上的任務(wù)。

  (5)支持超線(xiàn)程感知的CPU喚醒

  傳統的調度器只知道當前CPU,而不知道同屬的邏輯CPU。在超線(xiàn)程環(huán)境下,一個(gè)邏輯CPU正在執行任務(wù)時(shí),其上的一個(gè)線(xiàn)程被喚醒了,此時(shí),如果它的同屬邏輯CPU是空閑的,則應該在同屬邏輯CPU上運行剛剛喚醒的任務(wù)。

  Linux通過(guò)wake_up_cpu( )函數實(shí)現CPU喚醒,在try_o_wakeup、pull_task、move_task_away加入了wake_up_cpu( )函數的相應調用點(diǎn)。wake_up_cpu()首先查詢(xún)當前CPU是不是空閑的,如果當前CPU為空閑,則調用resched_cpu( )函數啟動(dòng)調度器,將喚醒的線(xiàn)程調度到當前CPU執行;否則查找其同屬邏輯CPU。如果同屬邏輯CPU是空閑的,則將喚醒的線(xiàn)程調度到同屬邏輯CPU上執行;否則比較喚醒的線(xiàn)程和當前CPU上運行的線(xiàn)程的優(yōu)先級。如果喚醒的線(xiàn)程的優(yōu)先級高,或者優(yōu)先級相等但是時(shí)間片多,則進(jìn)行線(xiàn)程切換,在當前CPU上調度執行喚醒的線(xiàn)程。如果上述條件都不滿(mǎn)足,最后比較喚醒的線(xiàn)程和當前CPU的同屬邏輯CPU上運行的線(xiàn)程的優(yōu)先級,如果喚醒的線(xiàn)程的優(yōu)先級高,或者優(yōu)先級相等但是時(shí)間片多,則在同屬邏輯CPU上調度執行喚醒的線(xiàn)程。

  3 性能測試

  Linux-2.6.0 HT-aware scheduler patch實(shí)現了上述超線(xiàn)程調度優(yōu)化。這里根據linux-2.6.0 HT-aware scheduler patch對這幾種調度優(yōu)化進(jìn)行了性能測試。

  測試硬件環(huán)境:Xeon 2.2GHz處理器(支持超線(xiàn)程)×4,2GB SDRAM內存。

  Benchmark:(1)Volanomark是一個(gè)純Java的benchmark,專(zhuān)門(mén)用于測試系統調度器和線(xiàn)程環(huán)境的綜合性能。它建立一個(gè)模擬Client/Server方式的Java聊天室,通過(guò)獲取每秒平均發(fā)送的消息數來(lái)評測宿主機綜合性能(數值越大性能越好)。Volanomark測試與Java虛擬機平臺相關(guān),本文使用Sun Java SDK 1.4.2作為測試用Java平臺,Volanomark版本2.5.0.9。(2)LMBench是一個(gè)用于評價(jià)系統綜合性能的多平臺開(kāi)源benchmark,對其進(jìn)行修改后實(shí)現了lat_thread_ctx接口,用來(lái)測試線(xiàn)程的切換開(kāi)銷(xiāo)。

  圖4表明開(kāi)啟超線(xiàn)程后Volanomark在Linux-2.6.0平臺下平均吞吐量提高了25.5%。由于Linux的O(1)內核調度器比較好地實(shí)現了SMP負載均衡算法,所以在超線(xiàn)程環(huán)境下整個(gè)系統的性能也有了比較好的提升。

開(kāi)啟超線(xiàn)程后Volanomark在Linux-2

  圖5顯示出Linux在進(jìn)行了超線(xiàn)程調度優(yōu)化后,在支持超線(xiàn)程的平臺上所獲得的性能加速比。在Linux-2.6.0加入HT-aware scheduler patch后Volanomark的平均吞吐提高了 8.5%,分別實(shí)現主動(dòng)負載均衡、被動(dòng)的負載均衡、CPU喚醒和任務(wù)挑選的相關(guān)代碼后,吞吐量分別提高了1.8.%、2.5%、2.3%和2.1%。

Linux在進(jìn)行了超線(xiàn)程調度優(yōu)化后

  使用Lmbench創(chuàng )建10~150個(gè)線(xiàn)程,在不同的負載條件下測試線(xiàn)程的切換開(kāi)銷(xiāo)。表1的數據顯示HT-aware scheduler patch可以將線(xiàn)程的切換開(kāi)銷(xiāo)減少3%~7%。數據顯示:在輕負載情況下,系統可以獲得更多的加速比。這是因為被動(dòng)的負載均衡以及主動(dòng)的負載均衡只有在系統有CPU空閑時(shí)才能發(fā)揮比較好的作用。

  4 相關(guān)工作和展望

  采用支持超線(xiàn)程技術(shù)的Linux可以獲得較大的性能提升。但是其還要根據實(shí)際的應用進(jìn)一步研究。參考文獻[7]中提出了用“Symbiosis”概念來(lái)衡量多個(gè)線(xiàn)程在SMT環(huán)境中同時(shí)執行的有效性。參考文獻[8]中提出了線(xiàn)程敏感的,用一組硬件性能計數器計算兩個(gè)邏輯CPU上運行不同作業(yè)子集的執行信息,利用這些信息來(lái)預測不同作業(yè)子集的執行性能,并選擇具有最好預測性能的作業(yè)子集調度同一個(gè)物理CPU執行。參考文獻[9]中主要研究了適合SMT 結構并考慮作業(yè)優(yōu)先級的調度器。研究結果表明,這些調度算法能有效地提高超線(xiàn)程系統的性能。

  Intel的超線(xiàn)程技術(shù)是其企業(yè)產(chǎn)品線(xiàn)中的重要特征,并將會(huì )集成到越來(lái)越多的產(chǎn)品中,它標志著(zhù)Intel微處理器一個(gè)新的時(shí)代:從指令級并行到線(xiàn)程級并行,這樣可使微處理器運行模式與多線(xiàn)程應用的運行模式更加接近,應用程序可以充分利用線(xiàn)程級并行和指令級并行進(jìn)行優(yōu)化。隨著(zhù)超線(xiàn)程處理器的發(fā)展,可能會(huì )出現操作系統使用處理器系統中硬件性能監視器估算系統在某一時(shí)間段的某些性能指標,然后利用這些性能指標來(lái)指導線(xiàn)程的調度策略。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


關(guān)鍵詞: Linux 超線(xiàn)程 調度算法

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>