《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 解決方案 > 通過輕型線程提高多核設(shè)備中的Linux實時性能

通過輕型線程提高多核設(shè)備中的Linux實時性能

2012-07-12
作者:Michael Christofferson

簡介

    上個世紀(jì),,研發(fā)人員投入了大量精力提高 Linux 實時性能和行為,最著名的是 PREEMPT_RT Linux 實時擴(kuò)展,。最近,,研發(fā)人員致力于研究適用于多核設(shè)備的 Linux 用戶空間解決方案,該解決方案允許從用戶空間中直接訪問基礎(chǔ)硬件,從而可避免因?qū)?Linux 內(nèi)核引入用戶空間應(yīng)用而帶來的額外系統(tǒng)開銷,。這些用戶空間擴(kuò)展(有多個)已首先由電信/網(wǎng)絡(luò)高性能 IP 數(shù)據(jù)包處理系統(tǒng)進(jìn)行驅(qū)動,以實現(xiàn)所謂的“裸金屬”實施,,其中,,多核設(shè)備中的 Linux 用戶空間應(yīng)用可以模擬“無操作系統(tǒng)”解決方案的執(zhí)行過程,,即在每個內(nèi)核上進(jìn)行簡單“運行到完成”、輪詢循環(huán),,以便進(jìn)行數(shù)據(jù)包處理,。在從根本上實現(xiàn)該目標(biāo)的同時,該解決方案仍可用于非常特殊的用例,。還有其他需要提高性能的用例無法通過以上解決方案完全解決嗎,?如果有的話,請列舉出來,,是否可應(yīng)用更完善的 Linux 實時改進(jìn),?答案是肯定的,采用 Linux 用戶空間輕型線程 (light-weight threading, LWT) 即可,。我們來研究一下實時 Linux,,以及輕型線程如何能成為適用于某些應(yīng)用的解決方案。研究的重點受電信,、網(wǎng)絡(luò)或常用通信應(yīng)用的影響,,Enea 側(cè)重于這些應(yīng)用中采用的技術(shù)。但總體上來說,,對輕型線程的重點應(yīng)用會使多方受益,。

實時 Linux 及其解決的問題
    在過去的 10 年中,Linux 已在實時性能和行為方面取得了顯著的進(jìn)步,,滿足了大量應(yīng)用的需求,。具體歸納如下:

PREEMPT_RT

   PREEMPT_RT 也許是 Linux 實時擴(kuò)展取得的最顯著的成就,PREEMPT_RT 數(shù)據(jù)包解決了多核設(shè)備 Linux 中存在的特別棘手的問題,,即“中斷延遲”問題,。將事件/數(shù)據(jù)傳送到真實用戶空間應(yīng)用之前,處理Linux內(nèi)核中的中斷占用的系統(tǒng)開銷非常高 - 該系統(tǒng)開銷往往會延遲其他中斷,,從而增大發(fā)生中斷時測得的中斷信息接收方進(jìn)行處理的總體延遲,。同樣,Linux 內(nèi)核中還有許多所謂的“重要部分”,,可在其中通過自旋鎖禁用中斷,。標(biāo)準(zhǔn)Linux 內(nèi)核的總體中斷延遲與許多實時應(yīng)用的最重要的中斷延遲要求不符,特別是無線接入網(wǎng)(移動)和移動核心基礎(chǔ)設(shè)施,,這兩者要求最差情況下的中斷延遲應(yīng)在 20-30 微秒范圍內(nèi),。這一點也適用于許多其他市場應(yīng)用。在快速“nutshell”PREEMPT_RT 中,,這一問題是通過以下方式解決的:

將全部設(shè)備驅(qū)動器中斷句柄傳遞到可調(diào)度線程中,,這樣可最大程度地減少 Linux 內(nèi)核對中斷的處理工作,因此,,無需等待前一中斷處理完成便可處理新中斷,。之后,,中斷處理會變?yōu)槭軆?yōu)先級驅(qū)動,根據(jù)用戶需求,,會先完成優(yōu)先級最高的中斷處理,。

   將 Linux 內(nèi)核中的所有死空間自旋鎖傳遞到互斥量中,從而允許其他內(nèi)核線程代替內(nèi)核空間自旋鎖運行,。

   基本上,,PREEMPT_RT 已根據(jù)非常高性能的實時標(biāo)準(zhǔn)將總體中斷延遲成功縮短,這樣對大量 Linux 應(yīng)用都非常有幫助,。要了解具體應(yīng)用,?請繼續(xù)往下讀。

用戶空間 Linux 調(diào)整

   如上文所述,,近年來,,研發(fā)人員對 Linux 用戶空間應(yīng)用投入了大量精力。目的是避免用戶空間應(yīng)用(Linux 用戶對其附加價值投入了大量精力)占用 Linux 內(nèi)核本身的系統(tǒng)開銷來處理某些特定的設(shè)備/中斷交互,。Linux 采用的模型可極大程度地防止用戶空間應(yīng)用受到內(nèi)核的影響,,在該模型中,所有用戶空間操作(包括線程)始終會映射到 Linux 內(nèi)核,,以便處理其 I/O 請求,。這樣便使 Linux 具有強(qiáng)大的行為和特性。但是,,對于數(shù)據(jù)處理性能非常高的應(yīng)用來說,,即使采用 PREEMPT_RT,Linux 也會有短時故障,,這是因為,總是需要進(jìn)行 Linux 內(nèi)核上下文切換才能直接訪問硬件,。用戶空間 Linux 實施允許應(yīng)用在不涉及 Linux 內(nèi)核的情況下直接訪問硬件和中斷,,并可極大程度地提高性能。但這種性能提升只能在 I/O 密度極高的環(huán)境中實現(xiàn),。大部分 Linux 用戶空間調(diào)整都側(cè)重于單線程應(yīng)用(如高性能數(shù)據(jù)包處理),,其中,Linux 下只有一個線程用于模擬多核設(shè)備中的“無操作系統(tǒng)”性能,。

多線程問題
   實時 Linux 解決方案調(diào)查中缺少的是認(rèn)真檢查多線程在實時嵌入式應(yīng)用中的有效性,。實際上,早在 20 世紀(jì) 80 年代 Linux 出現(xiàn)之前,,人們就提出了需要采用嵌入式實時操作系統(tǒng) (RTOS) 來實現(xiàn)低延遲,、高吞吐量、極具實時特點的應(yīng)用,。操作系統(tǒng)的結(jié)構(gòu)發(fā)生了變化,,但對這方面的需求卻沒有改變,。此類 RTOS 解決方案所具有的各種性能、行為和特性是過去十多年中 Linux 一直嘗試達(dá)到的,。這并不意味著傾向于恢復(fù)使用 RTOS,,而是要達(dá)到 RTOS 所具有的功能。就便攜性,、應(yīng)用的廣闊生態(tài)系統(tǒng)以及設(shè)備支持和常規(guī)支持來講,,Linux 在實時嵌入式解決方案中的總體價值是任何 RTOS 都無法比擬的。存在兩個實際問題:

多線程為何重要,?

如果多線程很重要,,那么我們應(yīng)如何將 RTOS 多線程性能、行為和特性添加到 Linux 中,,以便取得更大的成功,?關(guān)鍵問題是了解 Linux 多線程實施與 RTOS,然后考慮可以進(jìn)行哪些改進(jìn),。

   30 多年前,,當(dāng)計算機(jī)解決方案軟件設(shè)計人員碰到單線程解決方案無法解決的復(fù)雜問題時,便已提出了對多線程實時性方面的需求,。所需解決方案要求單個應(yīng)用具有多個任務(wù),,也許一些是計算任務(wù),一些是受 I/O 驅(qū)動的任務(wù),,但是,,就任務(wù)的總體執(zhí)行而言,所有任務(wù)均密切相關(guān),。但多個任務(wù)密切相關(guān)意味著這些任務(wù)應(yīng)共享一部分 CPU 時間才能達(dá)到 CPU 的有效總體利用率,。在很多此類應(yīng)用中,必須禁止執(zhí)行某些操作,、等待某些 I/O 事件或另一應(yīng)用發(fā)出的其他通信,。因此出現(xiàn)了簡單的可執(zhí)行程序,這些可執(zhí)行程序可以處理多個線程,,同時可禁用線程,,并可在各線程之間進(jìn)行低延遲通信。

    并非所有實時應(yīng)用都需要支持重要的多線程處理功能,。本文并未對相關(guān)應(yīng)用進(jìn)行分類,。但很顯然,需要使用多線程處理功能的應(yīng)用是那些需要在協(xié)議中設(shè)定“等待狀態(tài)”的任何類型的復(fù)雜協(xié)議,,即等待允許應(yīng)用繼續(xù)進(jìn)行的響應(yīng)或事件,。之后,應(yīng)用應(yīng)放棄對 CPU 的控制權(quán),允許運行其他類似的線程,,來代替該響應(yīng)或事件,。

   也許上述教程對于許多人來說很簡單。請注意,,很多移動基礎(chǔ)設(shè)施和核心網(wǎng)絡(luò)設(shè)備供應(yīng)商得出的結(jié)論是,,雖然 Linux 是當(dāng)前或未來系統(tǒng)的首選,但目前構(gòu)建的 Linux 還不足以滿足業(yè)界的全部要求,。原因是什么,?

采用 PTHREADS 的 Linux 多線程

    Pthreads 是由 IEEE 規(guī)劃的可移植操作系統(tǒng)接口 (POSIX) 創(chuàng)建的,目的是為了解決 Unix 中存在的高性能,、多線程問題,,之后被 Linux 用在最早的版本中,用于為企業(yè)實施可移植 Unix,,目前用于嵌入式應(yīng)用中,。

    創(chuàng)建 pthreads 模型是為了解決原始 Unix Fork/Join 模型創(chuàng)建 Unix“子”進(jìn)程時出現(xiàn)的問題。由于該模型涉及到創(chuàng)建(還可能涉及刪除)整個受內(nèi)存保護(hù)的環(huán)境及執(zhí)行模式,,因此Unix 進(jìn)程模型非常龐大,。需要在 Unix 下采用適用于多線程的較輕型模型,因此pthreads應(yīng)運而生,。

    Unix(也包括 Linux)模型是專為將內(nèi)核與用戶空間應(yīng)用完全分離而設(shè)計的,,其優(yōu)勢之一在于提供的保護(hù)、安全性和可靠性遠(yuǎn)勝于其他實施方案(包括過去 10 幾年間使用的 RTOS),。實質(zhì)上,,這意味著 Linux 用戶空間中的每個 pthread 都會由 Linux 內(nèi)核線程表示,因此,,全部或大部分 Linux 系統(tǒng)調(diào)用(特別是設(shè)備驅(qū)動器)均可通過用戶空間進(jìn)行訪問,。但是,由于 OEM 制造的產(chǎn)品并不具備 GPL,,因此用戶空間中實際存儲了所有嵌入式 Linux 實時應(yīng)用,。因此,在每種情況下,,使用 pthreads 都涉及到調(diào)用 Linux 內(nèi)核,從而為本可以在本地實施的應(yīng)用帶來了額外的系統(tǒng)開銷,。

     請您稍稍考慮一下,。采用上文提到的 Linux 實時擴(kuò)展怎么樣?是的,,PREEMPT_RT 可以解決 Linux 內(nèi)核中存在的許多關(guān)于響應(yīng)性的問題,,但不能真正解決多線程問題。實施用戶空間 Linux 可解決設(shè)備驅(qū)動器/中斷性能問題,但并不能真正解決多線程問題,。Linux 實時容器可解決部分問題,,但實時容器只是一種基于標(biāo)準(zhǔn) Linux 的用戶空間 Linux 可視化技術(shù),并不能真正解決根本的多線程問題,。

    輕型線程 (LWT) – 復(fù)雜 Linux 應(yīng)用的真正解決方案
之前針對 Linux 提出了多種輕型線程模型的建議,,但沒有一種模型能夠真正解決問題。原因何在,?因為大多數(shù)模型的功能都不是很強(qiáng)大,。涉及復(fù)雜多線程應(yīng)用的下一代 Linux 解決方案真正需要的是適用于用戶空間 Linux 應(yīng)用的全新 Linux 模型。下文概括介紹了這種名為Linux輕型線程 (LWT) 的解決方案,。將高性能,、低系統(tǒng)開銷、多線程調(diào)度器植入 Linux 用戶空間,,來代替單獨的 pthread,。原因何在?

Pthread 系統(tǒng)開銷

    進(jìn)程和 pthreads 是 Linux 了解的唯一調(diào)度實體,。

    LWT pthread 只是一個 Linux 編碼執(zhí)行背景,,可用于永久運行 pthread。由于用戶空間調(diào)度器始終保持控制,,因此 pthread 絕不會被掛起 – 省電模式除外,。這種情況不在本文的討論范圍。

    該用戶空間調(diào)度器的運行和操作方式與某些傳統(tǒng) RTOS 高性能,、低延遲實施完全相同,,但不會涉及到 Linux 內(nèi)核。

    實施過程利用新用戶空間 Linux 實施過程來直接訪問硬件,。同樣也不涉及 Linux 內(nèi)核,。

    上述 LWT 解決方案可在任何 Linux 實時應(yīng)用中實現(xiàn)動態(tài)性能的提升。Enea 已設(shè)計出上述 LWT 的一些原型,,事實證明,,與 Linux pthreads 在調(diào)度器系統(tǒng)開銷、特別是上下文切換和線程間消息發(fā)送/通信延遲方面的性能相比,,LWT 性能可提高 10 倍,。

    但是除了調(diào)度性能和線程間通信功能之外,LWT 解決方案還應(yīng)帶來什么,?LWT 概念除了在性能方面勝過 Linux pthreads 之外,,還有更多優(yōu)勢。解決方案穩(wěn)健性的概念如何,?與歷史悠久的 RTOS 實時解決方案一樣,,LWT 也需要具有以下額外 Linux 特性:

決定性調(diào)度

調(diào)度系統(tǒng)開銷低 – 上下文切換成本低

線程間信號系統(tǒng)開銷低

線程創(chuàng)建成本低

多核設(shè)備中 Linux 輕型線程模型的結(jié)構(gòu)圖

LWT 實施方案的結(jié)構(gòu)圖如下,。涉及整個共享內(nèi)存空間的 Linux 進(jìn)程可能跨多核設(shè)備的多個內(nèi)核。為了達(dá)到最高效率,,LWT 模型需要將 Linux 進(jìn)程中的單個 pthread 鎖定至某一個內(nèi)核,,但并不特別要求這樣做。LWT 鎖定至 pthread 之后,,便可遷移到 Linux SMP 需要的任何內(nèi)核中,。

120628_enea_1

圖 1: 多核設(shè)備中 Linux 輕型線程模型的結(jié)構(gòu)圖

結(jié)論
高效輕型線程 (LWT) 將成為下一個 Linux 實時性能和行為問題。需要強(qiáng)調(diào)的是,,并非所有實時應(yīng)用都需要使用功能強(qiáng)大的類似 LWT 的解決方案,。但是一些實時應(yīng)用,尤其是電信/網(wǎng)絡(luò)中的應(yīng)用以及無線接入網(wǎng),、移動基礎(chǔ)設(shè)施核心/邊緣中的那些需要使用某些復(fù)雜網(wǎng)絡(luò)協(xié)議的應(yīng)用,、或任何具有類似實時需求的其他系統(tǒng)均可受益于 Linux 輕型線程 – 下一代 Linux 實時擴(kuò)展。同時,,實時嵌入式 Linux 的整個發(fā)展過程證明了 Linux 的運行效果與傳統(tǒng) RTOS 解決方案一樣優(yōu)異,。Linux 已取得了一些進(jìn)展,但是作者認(rèn)為,,最重要的電信/網(wǎng)絡(luò)應(yīng)用中使用的 Linux 尚未達(dá)到預(yù)期的要求,。但也許通過 Linux 輕型線程,我們可以更接近這一目標(biāo),??偟膩碚f,Linux 實時嵌入式行業(yè)的一個側(cè)重點是研發(fā)出可用于要求最高的實時應(yīng)用的解決方案,。下圖中描述了該目標(biāo):

120628_enea_2

圖 2: 輕型線程和 Linux 概念 - Linux 和 RTOS 最重要的概念

 

作者簡介:

專家Michael Christofferson 先生在深層嵌入式系統(tǒng)及電信網(wǎng)絡(luò)系統(tǒng)中有著超過30年的軟件開發(fā)經(jīng)驗,。他花了職業(yè)生涯中的第一個8年時間,在Raytheon公司的國防通訊部專研遠(yuǎn)程控制信號及通信情報系統(tǒng)(SIGINT/COMINT),。在隨后的8年時間里,,同樣的在GTE 電信公司,Sprint公司,,Data General Telecommunications公司及脈沖通信(Pulse Communications)專研于電信/數(shù)據(jù)通信市場,。在這些公司,他從事了類似于分組交換,、SS7交換,、SONET等技術(shù)工作,以及下一代環(huán)路載波系統(tǒng)的技術(shù)工作,。高可用性是所有電信應(yīng)用的一個要求,,在所有上述公司中任職包括了廣泛的軟件開發(fā)活動——從軟件編碼、測試及設(shè)計到系統(tǒng)架構(gòu)和專家,,然后成為部門/產(chǎn)品經(jīng)理。

在過去的14年的時間里,Christofferson先生轉(zhuǎn)而投身于主導(dǎo)行業(yè)的實時操作系統(tǒng)(RTOS),、嵌入式開發(fā)工具和中間件供應(yīng)的銷售,、市場及商業(yè)發(fā)展。他曾服務(wù)于Ready Systems,,繼而Microtec和Mentor Graphics公司,,自1998年起選擇加入Enea。目前,,他是Enea產(chǎn)品管理的總監(jiān),。

Christofferson先生于1972年獲得布拉德利大學(xué)物理學(xué)學(xué)士,并于1974年獲得密歇根大學(xué)物理學(xué)碩士,。

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點,。轉(zhuǎn)載的所有的文章,、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有,。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者,。如涉及作品內(nèi)容、版權(quán)和其它問題,,請及時通過電子郵件或電話通知我們,,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失,。聯(lián)系電話:010-82306118,;郵箱:[email protected]