資料介紹
上個世紀,研發人員投入了大量精力提高 Linux 實時性能和行為,最著名的是 PREEMPT_RT Linux 實時擴展。最近,研發人員致力于研究適用于多核設備的 Linux 用戶空間解決方案,該解決方案允許從用戶空間中直接訪問基礎硬件,從而可避免因將 Linux 內核引入用戶空間應用而帶來的額外系統開銷。這些用戶空間擴展(有多個)已首先由電信/網絡高性能 IP 數據包處理系統進行驅動,以實現所謂的“裸金屬”實施,其中,多核設備中的 Linux 用戶空間應用可以模擬“無操作系統”解決方案的執行過程,即在每個內核上進行簡單“運行到完成”、輪詢循環,以便進行數據包處理。在從根本上實現該目標的同時,該解決方案仍可用于非常特殊的用例。還有其他需要提高性能的用例無法通過以上解決方案完全解決嗎?如果有的話,請列舉出來,是否可應用更完善的 Linux 實時改進?答案是肯定的,采用 Linux 用戶空間輕型線程 (light-weight threading, LWT) 即可。我們來研究一下實時 Linux,以及輕型線程如何能成為適用于某些應用的解決方案。研究的重點受電信、網絡或常用通信應用的影響,Enea 側重于這些應用中采用的技術。但總體上來說,對輕型線程的重點應用會使多方受益。
實時Linux 及其解決的問題
在過去的 10 年中,Linux 已在實時性能和行為方面取得了顯著的進步,滿足了大量應用的需求。具體歸納如下:
PREEMPT_RT
PREEMPT_RT 也許是 Linux 實時擴展取得的最顯著的成就,PREEMPT_RT 數據包解決了多核設備 Linux 中存在的特別棘手的問題,即“中斷延遲”問題。將事件/數據傳送到真實用戶空間應用之前,處理Linux內核中的中斷占用的系統開銷非常高 - 該系統開銷往往會延遲其他中斷,從而增大發生中斷時測得的中斷信息接收方進行處理的總體延遲。同樣,Linux 內核中還有許多所謂的“重要部分”,可在其中通過自旋鎖禁用中斷。標準Linux 內核的總體中斷延遲與許多實時應用的最重要的中斷延遲要求不符,特別是無線接入網(移動)和移動核心基礎設施,這兩者要求最差情況下的中斷延遲應在 20-30 微秒范圍內。這一點也適用于許多其他市場應用。在快速“nutshell”PREEMPT_RT 中,這一問題是通過以下方式解決的:
將全部設備驅動器中斷句柄傳遞到可調度線程中,這樣可最大程度地減少 Linux 內核對中斷的處理工作,因此,無需等待前一中斷處理完成便可處理新中斷。之后,中斷處理會變為受優先級驅動,根據用戶需求,會先完成優先級最高的中斷處理。
將 Linux 內核中的所有死空間自旋鎖傳遞到互斥量中,從而允許其他內核線程代替內核空間自旋鎖運行。
基本上,PREEMPT_RT 已根據非常高性能的實時標準將總體中斷延遲成功縮短,這樣對大量 Linux 應用都非常有幫助。要了解具體應用?請繼續往下讀。
用戶空間 Linux 調整
如上文所述,近年來,研發人員對 Linux 用戶空間應用投入了大量精力。目的是避免用戶空間應用(Linux 用戶對其附加價值投入了大量精力)占用 Linux 內核本身的系統開銷來處理某些特定的設備/中斷交互。Linux 采用的模型可極大程度地防止用戶空間應用受到內核的影響,在該模型中,所有用戶空間操作(包括線程)始終會映射到 Linux 內核,以便處理其 I/O 請求。這樣便使 Linux 具有強大的行為和特性。但是,對于數據處理性能非常高的應用來說,即使采用 PREEMPT_RT,Linux 也會有短時故障,這是因為,總是需要進行 Linux 內核上下文切換才能直接訪問硬件。用戶空間 Linux 實施允許應用在不涉及 Linux 內核的情況下直接訪問硬件和中斷,并可極大程度地提高性能。但這種性能提升只能在 I/O 密度極高的環境中實現。大部分 Linux 用戶空間調整都側重于單線程應用(如高性能數據包處理),其中,Linux 下只有一個線程用于模擬多核設備中的“無操作系統”性能。
多線程問題
實時 Linux 解決方案調查中缺少的是認真檢查多線程在實時嵌入式應用中的有效性。實際上,早在 20 世紀 80 年代 Linux 出現之前,人們就提出了需要采用嵌入式實時操作系統 (RTOS) 來實現低延遲、高吞吐量、極具實時特點的應用。操作系統的結構發生了變化,但對這方面的需求卻沒有改變。此類 RTOS 解決方案所具有的各種性能、行為和特性是過去十多年中 Linux 一直嘗試達到的。這并不意味著傾向于恢復使用 RTOS,而是要達到 RTOS 所具有的功能。就便攜性、應用的廣闊生態系統以及設備支持和常規支持來講,Linux 在實時嵌入式解決方案中的總體價值是任何 RTOS 都無法比擬的。存在兩個實際問題:
多線程為何重要?
如果多線程很重要,那么我們應如何將 RTOS 多線程性能、行為和特性添加到 Linux 中,以便取得更大的成功?關鍵問題是了解 Linux 多線程實施與 RTOS,然后考慮可以進行哪些改進。
多線程為何重要?
30 多年前,當計算機解決方案軟件設計人員碰到單線程解決方案無法解決的復雜問題時,便已提出了對多線程實時性方面的需求。所需解決方案要求單個應用具有多個任務,也許一些是計算任務,一些是受 I/O 驅動的任務,但是,就任務的總體執行而言,所有任務均密切相關。但多個任務密切相關意味著這些任務應共享一部分 CPU 時間才能達到 CPU 的有效總體利用率。在很多此類應用中,必須禁止執行某些操作、等待某些 I/O 事件或另一應用發出的其他通信。因此出現了簡單的可執行程序,這些可執行程序可以處理多個線程,同時可禁用線程,并可在各線程之間進行低延遲通信。
并非所有實時應用都需要支持重要的多線程處理功能。本文并未對相關應用進行分類。但很顯然,需要使用多線程處理功能的應用是那些需要在協議中設定“等待狀態”的任何類型的復雜協議,即等待允許應用繼續進行的響應或事件。之后,應用應放棄對 CPU 的控制權,允許運行其他類似的線程,來代替該響應或事件。
也許上述教程對于許多人來說很簡單。請注意,很多移動基礎設施和核心網絡設備供應商得出的結論是,雖然 Linux 是當前或未來系統的首選,但目前構建的 Linux 還不足以滿足業界的全部要求。原因是什么?
采用 PTHREADS 的 Linux 多線程
Pthreads 是由 IEEE 規劃的可移植操作系統接口 (POSIX) 創建的,目的是為了解決 Unix 中存在的高性能、多線程問題,之后被 Linux 用在最早的版本中,用于為企業實施可移植 Unix,目前用于嵌入式應用中。
創建 pthreads 模型是為了解決原始 Unix Fork/Join 模型創建 Unix“子”進程時出現的問題。由于該模型涉及到創建(還可能涉及刪除)整個受內存保護的環境及執行模式,因此Unix 進程模型非常龐大。需要在 Unix 下采用適用于多線程的較輕型模型,因此pthreads應運而生。
但 Unix(也包括 Linux)模型是專為將內核與用戶空間應用完全分離而設計的,其優勢之一在于提供的保護、安全性和可靠性遠勝于其他實施方案(包括過去 10 幾年間使用的 RTOS)。實質上,這意味著 Linux 用戶空間中的每個 pthread 都會由 Linux 內核線程表示,因此,全部或大部分 Linux 系統調用(特別是設備驅動器)均可通過用戶空間進行訪問。但是,由于 OEM 制造的產品并不具備 GPL,因此用戶空間中實際存儲了所有嵌入式 Linux 實時應用。因此,在每種情況下,使用 pthreads 都涉及到調用 Linux 內核,從而為本可以在本地實施的應用帶來了額外的系統開銷。
但請您稍稍考慮一下。采用上文提到的 Linux 實時擴展怎么樣?是的,PREEMPT_RT 可以解決 Linux 內核中存在的許多關于響應性的問題,但不能真正解決多線程問題。實施用戶空間 Linux 可解決設備驅動器/中斷性能問題,但并不能真正解決多線程問題。Linux 實時容器可解決部分問題,但實時容器只是一種基于標準 Linux 的用戶空間 Linux 可視化技術,并不能真正解決根本的多線程問題。
輕型線程 (LWT) – 復雜 Linux 應用的真正解決方案
之前針對 Linux 提出了多種輕型線程模型的建議,但沒有一種模型能夠真正解決問題。原因何在?因為大多數模型的功能都不是很強大。涉及復雜多線程應用的下一代 Linux 解決方案真正需要的是適用于用戶空間 Linux 應用的全新 Linux 模型。下文概括介紹了這種名為Linux輕型線程 (LWT) 的解決方案。將高性能、低系統開銷、多線程調度器植入 Linux 用戶空間,來代替單獨的 pthread。原因何在?
Pthread 系統開銷
進程和 pthreads 是 Linux 了解的唯一調度實體。
LWT pthread 只是一個 Linux 編碼執行背景,可用于永久運行 pthread。由于用戶空間調度器始終保持控制,因此 pthread 絕不會被掛起 – 省電模式除外。這種情況不在本文的討論范圍。
該用戶空間調度器的運行和操作方式與某些傳統 RTOS 高性能、低延遲實施完全相同,但不會涉及到 Linux 內核。
實施過程利用新用戶空間 Linux 實施過程來直接訪問硬件。同樣也不涉及 Linux 內核。
上述 LWT 解決方案可在任何 Linux 實時應用中實現動態性能的提升。Enea 已設計出上述 LWT 的一些原型,事實證明,與 Linux pthreads 在調度器系統開銷、特別是上下文切換和線程間消息發送/通信延遲方面的性能相比,LWT 性能可提高 10 倍。
但是除了調度性能和線程間通信功能之外,LWT 解決方案還應帶來什么?LWT 概念除了在性能方面勝過 Linux pthreads 之外,還有更多優勢。解決方案穩健性的概念如何?與歷史悠久的 RTOS 實時解決方案一樣,LWT 也需要具有以下額外 Linux 特性:
決定性調度
調度系統開銷低 – 上下文切換成本低
線程間信號系統開銷低
線程創建成本低
多核設備中 Linux 輕型線程模型的結構圖
LWT 實施方案的結構圖如下。涉及整個共享內存空間的 Linux 進程可能跨多核設備的多個內核。為了達到最高效率,LWT 模型需要將 Linux 進程中的單個 pthread 鎖定至某一個內核,但并不特別要求這樣做。LWT 鎖定至 pthread 之后,便可遷移到 Linux SMP 需要的任何內核中。
實時Linux 及其解決的問題
在過去的 10 年中,Linux 已在實時性能和行為方面取得了顯著的進步,滿足了大量應用的需求。具體歸納如下:
PREEMPT_RT
PREEMPT_RT 也許是 Linux 實時擴展取得的最顯著的成就,PREEMPT_RT 數據包解決了多核設備 Linux 中存在的特別棘手的問題,即“中斷延遲”問題。將事件/數據傳送到真實用戶空間應用之前,處理Linux內核中的中斷占用的系統開銷非常高 - 該系統開銷往往會延遲其他中斷,從而增大發生中斷時測得的中斷信息接收方進行處理的總體延遲。同樣,Linux 內核中還有許多所謂的“重要部分”,可在其中通過自旋鎖禁用中斷。標準Linux 內核的總體中斷延遲與許多實時應用的最重要的中斷延遲要求不符,特別是無線接入網(移動)和移動核心基礎設施,這兩者要求最差情況下的中斷延遲應在 20-30 微秒范圍內。這一點也適用于許多其他市場應用。在快速“nutshell”PREEMPT_RT 中,這一問題是通過以下方式解決的:
將全部設備驅動器中斷句柄傳遞到可調度線程中,這樣可最大程度地減少 Linux 內核對中斷的處理工作,因此,無需等待前一中斷處理完成便可處理新中斷。之后,中斷處理會變為受優先級驅動,根據用戶需求,會先完成優先級最高的中斷處理。
將 Linux 內核中的所有死空間自旋鎖傳遞到互斥量中,從而允許其他內核線程代替內核空間自旋鎖運行。
基本上,PREEMPT_RT 已根據非常高性能的實時標準將總體中斷延遲成功縮短,這樣對大量 Linux 應用都非常有幫助。要了解具體應用?請繼續往下讀。
用戶空間 Linux 調整
如上文所述,近年來,研發人員對 Linux 用戶空間應用投入了大量精力。目的是避免用戶空間應用(Linux 用戶對其附加價值投入了大量精力)占用 Linux 內核本身的系統開銷來處理某些特定的設備/中斷交互。Linux 采用的模型可極大程度地防止用戶空間應用受到內核的影響,在該模型中,所有用戶空間操作(包括線程)始終會映射到 Linux 內核,以便處理其 I/O 請求。這樣便使 Linux 具有強大的行為和特性。但是,對于數據處理性能非常高的應用來說,即使采用 PREEMPT_RT,Linux 也會有短時故障,這是因為,總是需要進行 Linux 內核上下文切換才能直接訪問硬件。用戶空間 Linux 實施允許應用在不涉及 Linux 內核的情況下直接訪問硬件和中斷,并可極大程度地提高性能。但這種性能提升只能在 I/O 密度極高的環境中實現。大部分 Linux 用戶空間調整都側重于單線程應用(如高性能數據包處理),其中,Linux 下只有一個線程用于模擬多核設備中的“無操作系統”性能。
多線程問題
實時 Linux 解決方案調查中缺少的是認真檢查多線程在實時嵌入式應用中的有效性。實際上,早在 20 世紀 80 年代 Linux 出現之前,人們就提出了需要采用嵌入式實時操作系統 (RTOS) 來實現低延遲、高吞吐量、極具實時特點的應用。操作系統的結構發生了變化,但對這方面的需求卻沒有改變。此類 RTOS 解決方案所具有的各種性能、行為和特性是過去十多年中 Linux 一直嘗試達到的。這并不意味著傾向于恢復使用 RTOS,而是要達到 RTOS 所具有的功能。就便攜性、應用的廣闊生態系統以及設備支持和常規支持來講,Linux 在實時嵌入式解決方案中的總體價值是任何 RTOS 都無法比擬的。存在兩個實際問題:
多線程為何重要?
如果多線程很重要,那么我們應如何將 RTOS 多線程性能、行為和特性添加到 Linux 中,以便取得更大的成功?關鍵問題是了解 Linux 多線程實施與 RTOS,然后考慮可以進行哪些改進。
多線程為何重要?
30 多年前,當計算機解決方案軟件設計人員碰到單線程解決方案無法解決的復雜問題時,便已提出了對多線程實時性方面的需求。所需解決方案要求單個應用具有多個任務,也許一些是計算任務,一些是受 I/O 驅動的任務,但是,就任務的總體執行而言,所有任務均密切相關。但多個任務密切相關意味著這些任務應共享一部分 CPU 時間才能達到 CPU 的有效總體利用率。在很多此類應用中,必須禁止執行某些操作、等待某些 I/O 事件或另一應用發出的其他通信。因此出現了簡單的可執行程序,這些可執行程序可以處理多個線程,同時可禁用線程,并可在各線程之間進行低延遲通信。
并非所有實時應用都需要支持重要的多線程處理功能。本文并未對相關應用進行分類。但很顯然,需要使用多線程處理功能的應用是那些需要在協議中設定“等待狀態”的任何類型的復雜協議,即等待允許應用繼續進行的響應或事件。之后,應用應放棄對 CPU 的控制權,允許運行其他類似的線程,來代替該響應或事件。
也許上述教程對于許多人來說很簡單。請注意,很多移動基礎設施和核心網絡設備供應商得出的結論是,雖然 Linux 是當前或未來系統的首選,但目前構建的 Linux 還不足以滿足業界的全部要求。原因是什么?
采用 PTHREADS 的 Linux 多線程
Pthreads 是由 IEEE 規劃的可移植操作系統接口 (POSIX) 創建的,目的是為了解決 Unix 中存在的高性能、多線程問題,之后被 Linux 用在最早的版本中,用于為企業實施可移植 Unix,目前用于嵌入式應用中。
創建 pthreads 模型是為了解決原始 Unix Fork/Join 模型創建 Unix“子”進程時出現的問題。由于該模型涉及到創建(還可能涉及刪除)整個受內存保護的環境及執行模式,因此Unix 進程模型非常龐大。需要在 Unix 下采用適用于多線程的較輕型模型,因此pthreads應運而生。
但 Unix(也包括 Linux)模型是專為將內核與用戶空間應用完全分離而設計的,其優勢之一在于提供的保護、安全性和可靠性遠勝于其他實施方案(包括過去 10 幾年間使用的 RTOS)。實質上,這意味著 Linux 用戶空間中的每個 pthread 都會由 Linux 內核線程表示,因此,全部或大部分 Linux 系統調用(特別是設備驅動器)均可通過用戶空間進行訪問。但是,由于 OEM 制造的產品并不具備 GPL,因此用戶空間中實際存儲了所有嵌入式 Linux 實時應用。因此,在每種情況下,使用 pthreads 都涉及到調用 Linux 內核,從而為本可以在本地實施的應用帶來了額外的系統開銷。
但請您稍稍考慮一下。采用上文提到的 Linux 實時擴展怎么樣?是的,PREEMPT_RT 可以解決 Linux 內核中存在的許多關于響應性的問題,但不能真正解決多線程問題。實施用戶空間 Linux 可解決設備驅動器/中斷性能問題,但并不能真正解決多線程問題。Linux 實時容器可解決部分問題,但實時容器只是一種基于標準 Linux 的用戶空間 Linux 可視化技術,并不能真正解決根本的多線程問題。
輕型線程 (LWT) – 復雜 Linux 應用的真正解決方案
之前針對 Linux 提出了多種輕型線程模型的建議,但沒有一種模型能夠真正解決問題。原因何在?因為大多數模型的功能都不是很強大。涉及復雜多線程應用的下一代 Linux 解決方案真正需要的是適用于用戶空間 Linux 應用的全新 Linux 模型。下文概括介紹了這種名為Linux輕型線程 (LWT) 的解決方案。將高性能、低系統開銷、多線程調度器植入 Linux 用戶空間,來代替單獨的 pthread。原因何在?
Pthread 系統開銷
進程和 pthreads 是 Linux 了解的唯一調度實體。
LWT pthread 只是一個 Linux 編碼執行背景,可用于永久運行 pthread。由于用戶空間調度器始終保持控制,因此 pthread 絕不會被掛起 – 省電模式除外。這種情況不在本文的討論范圍。
該用戶空間調度器的運行和操作方式與某些傳統 RTOS 高性能、低延遲實施完全相同,但不會涉及到 Linux 內核。
實施過程利用新用戶空間 Linux 實施過程來直接訪問硬件。同樣也不涉及 Linux 內核。
上述 LWT 解決方案可在任何 Linux 實時應用中實現動態性能的提升。Enea 已設計出上述 LWT 的一些原型,事實證明,與 Linux pthreads 在調度器系統開銷、特別是上下文切換和線程間消息發送/通信延遲方面的性能相比,LWT 性能可提高 10 倍。
但是除了調度性能和線程間通信功能之外,LWT 解決方案還應帶來什么?LWT 概念除了在性能方面勝過 Linux pthreads 之外,還有更多優勢。解決方案穩健性的概念如何?與歷史悠久的 RTOS 實時解決方案一樣,LWT 也需要具有以下額外 Linux 特性:
決定性調度
調度系統開銷低 – 上下文切換成本低
線程間信號系統開銷低
線程創建成本低
多核設備中 Linux 輕型線程模型的結構圖
LWT 實施方案的結構圖如下。涉及整個共享內存空間的 Linux 進程可能跨多核設備的多個內核。為了達到最高效率,LWT 模型需要將 Linux 進程中的單個 pthread 鎖定至某一個內核,但并不特別要求這樣做。LWT 鎖定至 pthread 之后,便可遷移到 Linux SMP 需要的任何內核中。
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 嵌入式Linux實時性能優化
- HPEC應用子程序線程推測并行性實驗分析 8次下載
- 多核編程指南 3次下載
- 基于Windows 操作系統內核驅動的多核CPU 線程管理 0次下載
- 多核與多線程技術的區別 0次下載
- 多線程編程之Linux線程編程 3次下載
- 數控測井軟件中的多線程編程技術
- 基于多核多線程處理器的網絡設備設計 0次下載
- 基于多線程技術提高電量采集的實時性
- 多線程技術在電能質量實時監控系統中的應用
- 半實物仿真中的實時Linux接口技術方案
- LINUX系統下多線程與多進程性能分析
- 嵌入式Linux內核實時性研究及改進
- 改善嵌入式Linux實時性能的方法研究
- 嵌入式Linux 實時性分析與實時性改進
- 使用 PREEMPT_RT 在 Ubuntu 中構建實時 Linux 內核 1284次閱讀
- 什么是多核多線程?多核多線程如何提高程序的運行效率? 1035次閱讀
- 如何提高處理器的性能 1884次閱讀
- C語言線程池的實現方案 1363次閱讀
- 基于線程分組的亞線程機制的設計與研究分析 904次閱讀
- 虛擬機:Linux查看線程信息的步驟 3422次閱讀
- 虛擬機:linux 進程的最大線程個數 2624次閱讀
- 如何通過多線程并發設計來提高應用程序的性能 5186次閱讀
- 關于四種實時嵌入式Linux操作系統的對比分析淺析 6177次閱讀
- 以Linux 2.6為基礎的提高Linux實時性的方法探討 1526次閱讀
- 基于Linux2.6內核的實時性增強方案設計 930次閱讀
- 基于Linux上進行改進的具有實時應用能力的現代嵌入式操作系統解決方案詳解 843次閱讀
- 什么是雙核、雙芯和超線程 處理器多核速度是不是越快? 6776次閱讀
- 多線程好還是單線程好?單線程和多線程的區別 優缺點分析 8w次閱讀
- 高效輕型線程助力提高Linux實時性能 2545次閱讀
下載排行
本周
- 1電子電路原理第七版PDF電子教材免費下載
- 0.00 MB | 1489次下載 | 免費
- 2單片機典型實例介紹
- 18.19 MB | 91次下載 | 1 積分
- 3S7-200PLC編程實例詳細資料
- 1.17 MB | 27次下載 | 1 積分
- 4筆記本電腦主板的元件識別和講解說明
- 4.28 MB | 18次下載 | 4 積分
- 5開關電源原理及各功能電路詳解
- 0.38 MB | 9次下載 | 免費
- 6基于AT89C2051/4051單片機編程器的實驗
- 0.11 MB | 4次下載 | 免費
- 7基于單片機和 SG3525的程控開關電源設計
- 0.23 MB | 3次下載 | 免費
- 8基于單片機的紅外風扇遙控
- 0.23 MB | 3次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費
- 2PADS 9.0 2009最新版 -下載
- 0.00 MB | 66304次下載 | 免費
- 3protel99下載protel99軟件下載(中文版)
- 0.00 MB | 51209次下載 | 免費
- 4LabView 8.0 專業版下載 (3CD完整版)
- 0.00 MB | 51043次下載 | 免費
- 5555集成電路應用800例(新編版)
- 0.00 MB | 33562次下載 | 免費
- 6接口電路圖大全
- 未知 | 30319次下載 | 免費
- 7Multisim 10下載Multisim 10 中文版
- 0.00 MB | 28588次下載 | 免費
- 8開關電源設計實例指南
- 未知 | 21539次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935053次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537791次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233045次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191183次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183277次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138039次下載 | 免費
評論
查看更多