① linux環境下的進程調度演算法有哪些
第一部分: 實時調度演算法介紹
對於什麼是實時系統,POSIX 1003.b作了這樣的定義:指系統能夠在限定的響應時間內提供所需水平的服務。而一個由Donald Gillies提出的更加為大家接受的定義是:一個實時系統是指計算的正確性不僅取決於程序的邏輯正確性,也取決於結果產生的時間,如果系統的時間約束條件得不到滿足,將會發生系統出錯。
實時系統根據其對於實時性要求的不同,可以分為軟實時和硬實時兩種類型。硬實時系統指系統要有確保的最壞情況下的服務時間,即對於事件的響應時間的截止期限是無論如何都必須得到滿足。比如航天中的宇宙飛船的控制等就是現實中這樣的系統。其他的所有有實時特性的系統都可以稱之為軟實時系統。如果明確地來說,軟實時系統就是那些從統計的角度來說,一個任務(在下面的論述中,我們將對任務和進程不作區分)能夠得到有確保的處理時間,到達系統的事件也能夠在截止期限到來之前得到處理,但違反截止期限並不會帶來致命的錯誤,像實時多媒體系統就是一種軟實時系統。
一個計算機系統為了提供對於實時性的支持,它的操作系統必須對於CPU和其他資源進行有效的調度和管理。在多任務實時系統中,資源的調度和管理更加復雜。本文下面將先從分類的角度對各種實時任務調度演算法進行討論,然後研究普通的 Linux操作系統的進程調度以及各種實時Linux系統為了支持實時特性對普通Linux系統所做的改進。最後分析了將Linux操作系統應用於實時領域中時所出現的一些問題,並總結了各種實時Linux是如何解決這些問題的。
1. 實時CPU調度演算法分類
各種實時操作系統的實時調度演算法可以分為如下三種類別[Wang99][Gopalan01]:基於優先順序的調度演算法(Priority-driven scheling-PD)、基於CPU使用比例的共享式的調度演算法(Share-driven scheling-SD)、以及基於時間的進程調度演算法(Time-driven scheling-TD),下面對這三種調度演算法逐一進行介紹。
1.1. 基於優先順序的調度演算法
基於優先順序的調度演算法給每個進程分配一個優先順序,在每次進程調度時,調度器總是調度那個具有最高優先順序的任務來執行。根據不同的優先順序分配方法,基於優先順序的調度演算法可以分為如下兩種類型[Krishna01][Wang99]:
靜態優先順序調度演算法:
這種調度演算法給那些系統中得到運行的所有進程都靜態地分配一個優先順序。靜態優先順序的分配可以根據應用的屬性來進行,比如任務的周期,用戶優先順序,或者其它的預先確定的策略。RM(Rate-Monotonic)調度演算法是一種典型的靜態優先順序調度演算法,它根據任務的執行周期的長短來決定調度優先順序,那些具有小的執行周期的任務具有較高的優先順序。
動態優先順序調度演算法:
這種調度演算法根據任務的資源需求來動態地分配任務的優先順序,其目的就是在資源分配和調度時有更大的靈活性。非實時系統中就有很多這種調度演算法,比如短作業優先的調度演算法。在實時調度演算法中, EDF演算法是使用最多的一種動態優先順序調度演算法,該演算法給就緒隊列中的各個任務根據它們的截止期限(Deadline)來分配優先順序,具有最近的截止期限的任務具有最高的優先順序。
1.2. 基於比例共享調度演算法
雖然基於優先順序的調度演算法簡單而有效,但這種調度演算法提供的是一種硬實時的調度,在很多情況下並不適合使用這種調度演算法:比如象實時多媒體會議系統這樣的軟實時應用。對於這種軟實時應用,使用一種比例共享式的資源調度演算法(SD演算法)更為適合。
比例共享調度演算法指基於CPU使用比例的共享式的調度演算法,其基本思想就是按照一定的權重(比例)對一組需要調度的任務進行調度,讓它們的執行時間與它們的權重完全成正比。
我們可以通過兩種方法來實現比例共享調度演算法[Nieh01]:第一種方法是調節各個就緒進程出現在調度隊列隊首的頻率,並調度隊首的進程執行;第二種做法就是逐次調度就緒隊列中的各個進程投入運行,但根據分配的權重調節分配個每個進程的運行時間片。
比例共享調度演算法可以分為以下幾個類別:輪轉法、公平共享、公平隊列、彩票調度法(Lottery)等。
比例共享調度演算法的一個問題就是它沒有定義任何優先順序的概念;所有的任務都根據它們申請的比例共享CPU資源,當系統處於過載狀態時,所有的任務的執行都會按比例地變慢。所以為了保證系統中實時進程能夠獲得一定的CPU處理時間,一般採用一種動態調節進程權重的方法。
1.3. 基於時間的進程調度演算法
對於那些具有穩定、已知輸入的簡單系統,可以使用時間驅動(Time-driven:TD)的調度演算法,它能夠為數據處理提供很好的預測性。這種調度演算法本質上是一種設計時就確定下來的離線的靜態調度方法。在系統的設計階段,在明確系統中所有的處理情況下,對於各個任務的開始、切換、以及結束時間等就事先做出明確的安排和設計。這種調度演算法適合於那些很小的嵌入式系統、自控系統、感測器等應用環境。
這種調度演算法的優點是任務的執行有很好的可預測性,但最大的缺點是缺乏靈活性,並且會出現有任務需要被執行而CPU卻保持空閑的情況。
2. 通用Linux系統中的CPU調度
通用Linux系統支持實時和非實時兩種進程,實時進程相對於普通進程具有絕對的優先順序。對應地,實時進程採用SCHED_FIFO或者SCHED_RR調度策略,普通的進程採用SCHED_OTHER調度策略。
在調度演算法的實現上,Linux中的每個任務有四個與調度相關的參數,它們是rt_priority、policy、priority(nice)、counter。調度程序根據這四個參數進行進程調度。
在SCHED_OTHER 調度策略中,調度器總是選擇那個priority+counter值最大的進程來調度執行。從邏輯上分析,SCHED_OTHER調度策略存在著調度周期(epoch),在每一個調度周期中,一個進程的priority和counter值的大小影響了當前時刻應該調度哪一個進程來執行,其中 priority是一個固定不變的值,在進程創建時就已經確定,它代表了該進程的優先順序,也代表這該進程在每一個調度周期中能夠得到的時間片的多少; counter是一個動態變化的值,它反映了一個進程在當前的調度周期中還剩下的時間片。在每一個調度周期的開始,priority的值被賦給 counter,然後每次該進程被調度執行時,counter值都減少。當counter值為零時,該進程用完自己在本調度周期中的時間片,不再參與本調度周期的進程調度。當所有進程的時間片都用完時,一個調度周期結束,然後周而復始。另外可以看出Linux系統中的調度周期不是靜態的,它是一個動態變化的量,比如處於可運行狀態的進程的多少和它們priority值都可以影響一個epoch的長短。值得注意的一點是,在2.4以上的內核中, priority被nice所取代,但二者作用類似。
可見SCHED_OTHER調度策略本質上是一種比例共享的調度策略,它的這種設計方法能夠保證進程調度時的公平性--一個低優先順序的進程在每一個epoch中也會得到自己應得的那些CPU執行時間,另外它也提供了不同進程的優先順序區分,具有高priority值的進程能夠獲得更多的執行時間。
對於實時進程來說,它們使用的是基於實時優先順序rt_priority的優先順序調度策略,但根據不同的調度策略,同一實時優先順序的進程之間的調度方法有所不同:
SCHED_FIFO:不同的進程根據靜態優先順序進行排隊,然後在同一優先順序的隊列中,誰先准備好運行就先調度誰,並且正在運行的進程不會被終止直到以下情況發生:1.被有更高優先順序的進程所強佔CPU;2.自己因為資源請求而阻塞;3.自己主動放棄CPU(調用sched_yield);
SCHED_RR:這種調度策略跟上面的SCHED_FIFO一模一樣,除了它給每個進程分配一個時間片,時間片到了正在執行的進程就放棄執行;時間片的長度可以通過sched_rr_get_interval調用得到;
由於Linux系統本身是一個面向桌面的系統,所以將它應用於實時應用中時存在如下的一些問題:
Linux系統中的調度單位為10ms,所以它不能夠提供精確的定時;
當一個進程調用系統調用進入內核態運行時,它是不可被搶占的;
Linux內核實現中使用了大量的封中斷操作會造成中斷的丟失;
由於使用虛擬內存技術,當發生頁出錯時,需要從硬碟中讀取交換數據,但硬碟讀寫由於存儲位置的隨機性會導致隨機的讀寫時間,這在某些情況下會影響一些實時任務的截止期限;
雖然Linux進程調度也支持實時優先順序,但缺乏有效的實時任務的調度機制和調度演算法;它的網路子系統的協議處理和其它設備的中斷處理都沒有與它對應的進程的調度關聯起來,並且它們自身也沒有明確的調度機制;
3. 各種實時Linux系統
3.1. RT-Linux和RTAI
RT -Linux是新墨西哥科技大學(New Mexico Institute of Technology)的研究成果[RTLinuxWeb][Barabanov97]。它的基本思想是,為了在Linux系統中提供對於硬實時的支持,它實現了一個微內核的小的實時操作系統(我們也稱之為RT-Linux的實時子系統),而將普通Linux系統作為一個該操作系統中的一個低優先順序的任務來運行。另外普通Linux系統中的任務可以通過FIFO和實時任務進行通信。RT-Linux的框架如圖 1所示:
圖 1 RT-Linux結構
RT -Linux的關鍵技術是通過軟體來模擬硬體的中斷控制器。當Linux系統要封鎖CPU的中斷時時,RT-Linux中的實時子系統會截取到這個請求,把它記錄下來,而實際上並不真正封鎖硬體中斷,這樣就避免了由於封中斷所造成的系統在一段時間沒有響應的情況,從而提高了實時性。當有硬體中斷到來時, RT-Linux截取該中斷,並判斷是否有實時子系統中的中斷常式來處理還是傳遞給普通的Linux內核進行處理。另外,普通Linux系統中的最小定時精度由系統中的實時時鍾的頻率決定,一般Linux系統將該時鍾設置為每秒來100個時鍾中斷,所以Linux系統中一般的定時精度為 10ms,即時鍾周期是10ms,而RT-Linux通過將系統的實時時鍾設置為單次觸發狀態,可以提供十幾個微秒級的調度粒度。
RT-Linux實時子系統中的任務調度可以採用RM、EDF等優先順序驅動的演算法,也可以採用其他調度演算法。
RT -Linux對於那些在重負荷下工作的專有系統來說,確實是一個不錯的選擇,但他僅僅提供了對於CPU資源的調度;並且實時系統和普通Linux系統關系不是十分密切,這樣的話,開發人員不能充分利用Linux系統中已經實現的功能,如協議棧等。所以RT-Linux適合與工業控制等實時任務功能簡單,並且有硬實時要求的環境中,但如果要應用與多媒體處理中還需要做大量的工作。
義大利的RTAI( Real-Time Application Interface )源於RT-Linux,它在設計思想上和RT-Linux完全相同。它當初設計目的是為了解決RT-Linux難於在不同Linux版本之間難於移植的問題,為此,RTAI在 Linux 上定義了一個實時硬體抽象層,實時任務通過這個抽象層提供的介面和Linux系統進行交互,這樣在給Linux內核中增加實時支持時可以盡可能少地修改 Linux的內核源代碼。
3.2. Kurt-Linux
Kurt -Linux由Kansas大學開發,它可以提供微秒級的實時精度[KurtWeb] [Srinivasan]。不同於RT-Linux單獨實現一個實時內核的做法,Kurt -Linux是在通用Linux系統的基礎上實現的,它也是第一個可以使用普通Linux系統調用的基於Linux的實時系統。
Kurt-Linux將系統分為三種狀態:正常態、實時態和混合態,在正常態時它採用普通的Linux的調度策略,在實時態只運行實時任務,在混合態實時和非實時任務都可以執行;實時態可以用於對於實時性要求比較嚴格的情況。
為了提高Linux系統的實時特性,必須提高系統所支持的時鍾精度。但如果僅僅簡單地提高時鍾頻率,會引起調度負載的增加,從而嚴重降低系統的性能。為了解決這個矛盾, Kurt-Linux採用UTIME所使用的提高Linux系統中的時鍾精度的方法[UTIMEWeb]:它將時鍾晶元設置為單次觸發狀態(One shot mode),即每次給時鍾晶元設置一個超時時間,然後到該超時事件發生時在時鍾中斷處理程序中再次根據需要給時鍾晶元設置一個超時時間。它的基本思想是一個精確的定時意味著我們需要時鍾中斷在我們需要的一個比較精確的時間發生,但並非一定需要系統時鍾頻率達到此精度。它利用CPU的時鍾計數器TSC (Time Stamp Counter)來提供精度可達CPU主頻的時間精度。
對於實時任務的調度,Kurt-Linux採用基於時間(TD)的靜態的實時CPU調度演算法。實時任務在設計階段就需要明確地說明它們實時事件要發生的時間。這種調度演算法對於那些循環執行的任務能夠取得較好的調度效果。
Kurt -Linux相對於RT-Linux的一個優點就是可以使用Linux系統自身的系統調用,它本來被設計用於提供對硬實時的支持,但由於它在實現上只是簡單的將Linux調度器用一個簡單的時間驅動的調度器所取代,所以它的實時進程的調度很容易受到其它非實時任務的影響,從而在有的情況下會發生實時任務的截止期限不能滿足的情況,所以也被稱作嚴格實時系統(Firm Real-time)。目前基於Kurt-Linux的應用有:ARTS(ATM Reference Traffic System)、多媒體播放軟體等。另外Kurt-Linux所採用的這種方法需要頻繁地對時鍾晶元進行編程設置。
3.3. RED-Linux
RED -Linux是加州大學Irvine分校開發的實時Linux系統[REDWeb][ Wang99],它將對實時調度的支持和Linux很好地實現在同一個操作系統內核中。它同時支持三種類型的調度演算法,即:Time-Driven、 Priority-Dirven、Share-Driven。
為了提高系統的調度粒度,RED-Linux從RT-Linux那兒借鑒了軟體模擬中斷管理器的機制,並且提高了時鍾中斷頻率。當有硬體中斷到來時,RED-Linux的中斷模擬程序僅僅是簡單地將到來的中斷放到一個隊列中進行排隊,並不執行真正的中斷處理程序。
另外為了解決Linux進程在內核態不能被搶占的問題, RED-Linux在Linux內核的很多函數中插入了搶占點原語,使得進程在內核態時,也可以在一定程度上被搶占。通過這種方法提高了內核的實時特性。
RED-Linux的設計目標就是提供一個可以支持各種調度演算法的通用的調度框架,該系統給每個任務增加了如下幾項屬性,並將它們作為進程調度的依據:
Priority:作業的優先順序;
Start-Time:作業的開始時間;
Finish-Time:作業的結束時間;
Budget:作業在運行期間所要使用的資源的多少;
通過調整這些屬性的取值及調度程序按照什麼樣的優先順序來使用這些屬性值,幾乎可以實現所有的調度演算法。這樣的話,可以將三種不同的調度演算法無縫、統一地結合到了一起。
② linux調度演算法的核心思想是什麼
第一部分:實時調度演算法
什麼是實時系統,POSIX 1003.b作了這樣的定義:是指系統可以在有限響應時間內提供所需的服務級別。較可取被定義為由Donald喬利士的的:一個實時系統的程序的邏輯正確性不僅取決於計算的准確度,而且還對結果,如果系統時間的限制不能滿足將是一個系統錯誤發生。
基於實時系統的實時性要求的不同,可分為軟實時和硬實時兩種。硬實時系統是指系統必須確保,在最壞情況下的服務時間,截止日期為事件的響應時間是在任何情況下,必須滿足。如航天飛船的控制是這樣一個系統的現實。所有其他實時系統的特點,可以稱為軟實時系統。如果清除,軟實時系統是那些從統計學的角度來看,一個任務(在下面的討論中,我們將有任務和過程不作出區分),以確保系統的處理時間,可以得到事件可以處理的最後期限到來之前,違反的最後期限,並不會帶來一個致命的錯誤,如實時多媒體系統是一種軟實時系統。
一台電腦系統的CPU和其他資源進行有效的調度和管理,以提供實時操作系統的支持。的多任務的實時系統中,資源的調度和管理更復雜的。下面討論本文將從各種實時任務調度演算法的分類的角度來看,普通的Linux操作系統進程調度和各種實時Linux系統,然後研究,以支持實時特點,普通的Linux系統的改進。實時領域的一些問題,並總結了各種實時Linux的Linux操作系統,歸根到底是如何解決這些問題。
CPU的實時調度演算法的分類
多種實時操作系統的實時調度演算法可以分為以下三類Wang99] [Gopalan01]:基於優先順序調度演算法(優先順序驅動調度PD),基於在共享的CPU使用率調度演算法(分享驅動調度SD)的比例,以及基於時間的進程調度演算法(時間驅動調度TD),下面這三種調度演算法逐一介紹。
1.1
/>基於優先順序的調度演算法,基於優先順序的調度演算法,每個進程被分配一個優先順序,每次的進程調度程序,調度程序總是具有最高的調度優先順序的任務執行。根據不同的優先順序分配方法,基於優先順序的調度演算法可以分為以下兩種類型的Krishna01] [Wang99]:靜態優先順序調度演算法
該演算法得到這些系統中運行的所有進程都靜態分配一個優先順序。靜態優先順序分配的屬性的應用程序,如任務循環中的用戶優先順序,或其他預先確定的政策。 RM(速率單調)的調度演算法是一個典型的靜態優先順序的調度演算法,根據執行的任務的調度優先順序的周期的長度確定,那些具有小的執行周期的任務的優先順序較高。
動態優先順序調度演算法:
該演算法基於任務的資源需求動態地分配任務的優先順序,資源分配和調度的目的更大的靈活性。非實時系統,這種演算法有很多,如短作業優先順序調度演算法。任務的實時調度演算法,EDF演算法是使用最廣泛的動態優先順序調度演算法,該演算法根據他們的截止日期(截止日期)分配優先順序的就緒隊列中的每個任務,最近期限具有最高的優先順序。
1.2
基於優先順序調度演算法的調度演算法是簡單而有效的,但這種演算法的基礎上按比例份額是一個硬實時調度,許多的情況下,不適合使用此演算法:例如,軟實時應用,如實時多媒體會議系統。對於軟實時應用程序,共享資源調度演算法(SD演算法)的比例使用是更合適的。
比例共享調度演算法是指對CPU使用率的比例共享調度演算法,其基本思路是按照一定的權重(比率),需要一組調度安排任務,以使它們的權重成比例的執行時間。
要實現比例共享調度演算法[Nieh01]有兩種方法:第一種方法是調整的准備過程中出現的調度隊列隊第一頻率,並安排一線隊的過程中,執行第二種方法是連續調度進程就緒隊列中投產,但根據調整分配一個進程的運行時間片分配的權重。
比例共享調度演算法可以分為以下類別:循環賽,公平份額,公平排隊,的彩票調度方法,(彩票)。
比例共享調度演算法的一個問題是,它並沒有定義任何優先的概念,所有的任務都根據其應用的CPU資源的比例共享系統過載時,執行的所有任務將較慢比例。因此,為了確保該系統的實時過程中獲得一定量的CPU處理時間,一般採用的是動態權重的調整過程。
1.3。基於時間進程調度演算法的調度演算法
對於那些具有穩定,簡單的系統已知輸入,您可以使用時間驅動(驅動時間時間:TD)數據處理,它可以提供一個良好的預測。這種調度演算法本質上是一個設計定型的離線靜態調度方法。在系統的設計階段,所有處理的情況下,在明確的制度,每個任務切換的開始和結束的時間提前做出了明確的安排和設計。該演算法是適用於小型嵌入式系統,自動化控制系統,感測器和其他應用環境。
該演算法的優勢是良好的可預測性任務的執行,但最大的缺點是缺乏靈活性,而且會有一個任務需要執行,而CPU保持空閑。
一般的Linux系統CPU調度
一般的Linux系統支持實時和非實時兩種進程,實時進程與普通進程方面具有絕對的優先權。相應地,實時進程調度策略SCHED_FIFO或SCHED_RR,普通進程SCHED_OTHER調度策略。
每個任務調度演算法的實現在Linux四種調度參數,它們是rt_priority優先政策(尼斯),計數器。調度進程調度的基礎上,這四個參數。
SCHED_OTHER調度策略,調度程序總是會選擇優先順序+計數器的值進程調度的執行。從邏輯分析存在SCHED_OTHER調度策略調度處理來執行,其特徵在於,所述優先順序是一個固定的調度周期(歷元),在每個調度周期內的過程中的優先順序,計數器的值的大小的影響這一刻已經確定變數值的過程中被創建時,它代表了進程的優先順序,也代表數量的時間片,通過該方法可以得到在每個調度周期內,計數器是一個動態值,它反映了當前調度周期的過程中,剩餘的時間片。在每個調度周期的開始,分配給優先順序值計數器,那麼每一次進程被調度運行計數器的值?減少。當計數器的值是零,這個過程已經運行的時間片調度期內,不再參與調度周期進程調度。當所有的進程都用完了時間片調度期結束,然後一遍又一遍。此外,可以看出在Linux系統中的調度周期是不固定的,它的量是動態變化的,例如,在運行的進程的數目和它們的優先順序值?可以影響一個劃時代的長度。有一點值得注意的是,在2.4內核中,首要任務是不錯的替換兩個類似的作用。
按比例分擔的調度策略調度策略SCHED_OTHER可見的性質,它的這種設計方法,以確保進程調度的公平性 - 一個低優先順序進程,在每個時代也將得到他們的份額那些CPU的執行時間,此外,它也提供了不同的進程的優先順序,進程執行時間可以得到更多的具有高優先順序值。
對於實時的過程中,他們使用基於實時優先順序rt_priority的優先順序調度策略,但相同的實時優先順序的進程調度方法是根據不同的調度策略,
BR /> SCHED_FIFO:不同的進程,根據靜態優先順序排隊,然後在相同的優先順序隊列,先准備好運行的第一誰調度和運行的進程不會被終止,直到發生以下情況:1。高優先順序的進程篡奪了CPU;自己的資源請求受阻;自己主動放棄CPU(呼叫SCHED_YIELD);
SCHED_RR是這樣的:這個調度策略SCHED_FIFO與上述完全相同,除了時間片分配給每個進程,正在實施的過程中,給執行時間片,時間片的長度可以通過sched_rr_get_interval調用
由於Linux系統本身是一個桌面導向的系統,因此,它是用於在實時應用中的一些問題:/> /> Linux系統調度單位是10ms,所以它不能提供精確的定時中斷; p>當一個進程調用系統調用進入內核模式運行,它不能被搶占;
Linux內核實現大量採用了封閉中斷操作損失;
由於使用虛擬內存技術,當發生頁面錯誤時,從硬碟中讀取的數據交換的需要,但硬碟讀取和寫入的存儲位置的隨機性,將導致隨機讀取和寫入時間,這在某些情況下,會影響實時任務期限;
雖然Linux的進程調度器還支持實時優先順序,但由於缺乏有效的實時任務調度機制和調度演算法;其網路子協議處理和其它設備的中斷處理,調度伴有相應的過程和自己的有沒有明確的調度機制;
各種實時Linux系統
Home>的的
3.1 RT-Linux和RTAI
RT-Linux是新墨西哥大學的研究(新墨西哥州技術學院)[RTLinuxWeb] [Barabanov97。其基本思路是,在Linux系統上的硬實時支持,它實現了一個微內核實時操作系統(也被稱為RT-Linux的實時子系統),而普通的Linux系統作為一個低優先順序任務在操作系統中運行。在正常的Linux系統的另一個任務可以溝通,通過FIFO和實時任務。 RT-Linux的框架如圖1所示:
圖1 RT-Linux的結構
RT-Linux的關鍵技術是軟體模擬硬體中斷控制器。當Linux系統不時阻止CPU中斷,實時定量RT-Linux的子系統的請求攔截,愛不釋手,而事實上並沒有真正阻止硬體中斷,從而避免了由於中斷造成的封由系統在一段時間內沒有響應,從而在改進的實時。當傳遞給Linux內核的RT-Linux的一個硬體中斷到達截取的中斷,並確定是否有一個實時子系統中斷常式來處理或處理。此外,的最小定時的精度在正常的Linux系統是確定系統的實時時鍾的頻率,Linux的系統時鍾被設置到時鍾中斷每秒100,所以在Linux的系統定時的精度10毫秒,即時鍾周期10ms時,RT-Linux的實時時鍾設置為單觸發狀態,可以提供更多的十幾微秒調度粒度。
RT-Linux實時子系統的任務調度優先順序驅動演算法,RM,EDF等,也可用於其他調度演算法。
RT-Linux的專有系統,重型工作,的確是一個不錯的選擇,但他只提供了CPU資源的調度和實時系統和Linux系統的關系不是非常密切,因此開發人員可以充分利用已在Linux系統中,如協議棧實現的功能。 RT-Linux的工業控制等實時任務簡單和硬實時要求的環境,但大量的工作需要做,如果你想應用的多媒體處理。
義大利實時應用程序介面(RTAI)來自RT-Linux的,它是在設計和RT-Linux的思想相同。這是原來的設計中,為了解決問題,RT-Linux的不同版本的Linux之間很難很難移植,RTAI在Linux上定義的實時硬體抽象層,這個抽象層介面提供實時任務Linux系統的相互作用,這可以增加一點可以Linux內核源代碼到Linux內核的實時支持。
3.2。 KURT-Linux的
KURT-Linux的堪薩斯大學開發的,它可以提供實時微秒精度[KurtWeb] [斯里尼瓦桑]。與RT-Linux的單獨實現一個實時內核,KURT-Linux是常用的Linux系統的基礎上實現的,這也是第一個基於Linux的實時系統可以使用普通的Linux系統調用。
KURT-Linux系統分為三種狀態:正常狀態,實時狀態和混合狀態,在正常狀態下,它使用普通的Linux實時運行狀態實時調度策略任務,實時和非實時任務的混合狀態,可以執行實時狀態可以被用來為實時的要求更加嚴格。
為了提高Linux系統的實時特性,有必要提高精度的時鍾系統的支持。但是,如果只是簡單地增加時鍾頻率將導致調度負載的增加,從而嚴重降低系統的性能。為了解決這個矛盾,KURT-Linux中使用的時鍾精度的方法[UTIMEWeb]提高Linux系統UTIME,時鍾晶元設置為單次觸發狀態(單拍模式),也就是每個時鍾晶元設置超時,然後再次超時事件發生時,在時鍾中斷的處理程序所需的時鍾晶元設置一個超時。其基本思想是一個精確的時間意味著我們需要的時鍾中斷發生時,我們需要一個更精確的時間,以達到這樣的精度,但並不一定需要系統時鍾頻率。它採用了CPU時鍾計數器時間戳計數器(TSC)提供准確的CPU頻率精度的時間。
KURT-Linux的實時任務調度,使用靜態CPU的實時調度演算法,基於時間(TD)。實時任務需要實時事件發生在設計階段就必須清楚列明。該演算法可以實現更好的調度任務,對於那些誰周期。
KURT-Linux的相RT-Linux的優勢之一是,你可以使用系統調用的Linux系統,它最初是專為硬實時支持,但因為它是簡單的實現將使用一個簡單的時間驅動調度取代Linux的調度,實時進程調度的影響等非實時任務,在某些情況下會發生實時任務的截止日期是脆弱的不符合的,也被稱為嚴格的實時系統(快地實時)。基於KURT-Linux的應用程序:藝術(ATM參考交通系統),多媒體播放軟體。 KURT-Linux的另一種方法,需要頻繁的時鍾晶元編程。
3.3。 RED-Linux的
RED-Linux是加州大學爾灣,實時Linux系統的發展[REDWeb] [Wang99],它將支持實時調度和Linux實現相同的操作系統內核。它支持三種類型的調度演算法,即:時間驅動優先Dirven,分享驅動。
為了提高系統的調度粒度,RED-Linux的學習RT-Linux的軟體模擬中斷的管理機制,並增加頻率的時鍾中斷。 RED-Linux的中斷模擬程序只是簡單地中斷會在隊列中排隊一個硬體中斷到來時,並沒有進行實際的中斷處理程序。
另外,為了解決Linux的內核模式的過程中不能被中斷,RED-Linux的插入Linux內核搶占點原語的眾多功能,使這一進程在內核模式下,也在一定程度上被搶占。通過這種方法提高了內核的實時特性。
RED-Linux的設計目標是提供常規調度框架可以支持多種調度演算法,系統為每個任務增加幾個屬性,進程調度的基礎上:
優先順序:作業的優先順序;
開始時間:工作的開始時間;
完成時間:工作的結束時間; BR p>預算:資源的數量在操作過程中要使用的工作;
調整值?這些屬性和調度根據什麼優先使用的這些屬性值幾乎所有的調度演算法。在這種情況下,三種不同的調度演算法無縫地一起耦合到一個統一的。
③ linux高手,請教一個問題啊!!救命,搞了一天了
你給列印出來,再看!
在Linux系統中,TCP/IP網路是通過若干個文本文件進行配置的,也許你需要編輯這些文件來完成聯網工作,但是這些配置文件大都可以通過配置命令linuxconf(其中網路部分的配置可以通過netconf命令來實現)命令來實現。下面介紹基本的TCP/IP網路配置文件。
*/etc/conf.moles文件
該配置文件定義了各種需要在啟動時載入的模塊的參數信息。這里主要著重討論關於網卡的配置。在使用Linux做網關的情況下,Linux伺服器至少需要配置兩塊網卡。為了減少啟動時可能出現的問題,Linux內核不會自動檢測多個網卡。對於沒有將網卡的驅動編譯到內核而是作為模塊動態載入的系統若需要安裝多塊網卡,應該在「conf.moles」文件中進行相應的配置。
若設備驅動被編譯為模塊(內核的模塊):對於PCI設備,模塊將自動檢測到所有已經安裝到系統上的設備;對於ISA卡,則需要向模塊提供IO地址,以使模塊知道在何處尋找該卡,這些信息在「/etc/conf.moles」中提供。
例如,我們有兩塊ISA匯流排的3c509卡,一個IO地址是0x300,另一個是0x320。編輯「conf.moles」文件如下:
aliaseth03c509
aliaseth13c509
options3c509io=0x300,0x320
這是說明3c509的驅動程序應當分別以eth0或eth1的名稱被載入(aliaseth0,eth1),並且它們應該以參數io=0x300,0x320被裝載,來通知驅動程序到哪裡去尋找網卡,其中0x是不可缺少的。
對於PCI卡,僅僅需要alias命令來使ethN和適當的驅動模塊名關聯,PCI卡的IO地址將會被自動的檢測到。對於PCI卡,編輯「conf.moles」文件如下:
aliaseth03c905
aliaseth13c905
若驅動已經被編譯進了內核:系統啟動時的PCI檢測程序將會自動找到所有相關的網卡。ISA卡一般也能夠被自動檢測到,但是在某些情況下,ISA卡仍然需要做下面的配置工作:
在「/etc/lilo.conf」中增加配置信息,其方法是通過LILO程序將啟動參數信息傳遞給內核。對於ISA卡,編輯「lilo.conf」文件,增加如下內容:
append="ether="0,0,eth0ether="0,0,eth1"
註:先不要在「lilo.conf」中加入啟動參數,測試一下你的ISA卡,若失敗再使用啟動參數。
如果用傳遞啟動參數的方法,eth0和eth1將按照啟動時被發現的順序來設置。
*/etc/HOSTNAME文件
該文件包含了系統的主機名稱,包括完全的域名,如:deep.openarch.com。
*/etc/sysconfig/network-scripts/ifcfg-ethN文件
在RedHat中,系統網路設備的配置文件保存在「/etc/sysconfig/network-scripts」目錄下,ifcfg-eth0包含第一塊網卡的配置信息,ifcfg-eth1包含第二塊網卡的配置信息。
下面是「/etc/sysconfig/network-scripts/ifcfg-eth0」文件的示例:
DEVICE=eth0
IPADDR=208.164.186.1
NETMASK=255.255.255.0
NETWORK=208.164.186.0
BROADCAST=208.164.186.255
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
若希望手工修改網路地址或在新的介面上增加新的網路界面,可以通過修改對應的文件(ifcfg-ethN)或創建新的文件來實現。
DEVICE=name name表示物理設備的名字
IPADDR=addr addr表示賦給該卡的IP地址
NETMASK=mask mask表示網路掩碼
NETWORK=addr addr表示網路地址
BROADCAST=addr addr表示廣播地址
ONBOOT=yes/no 啟動時是否激活該卡
none:無須啟動協議
bootp:使用bootp協議
dhcp:使用dhcp協議
USERCTL=yes/no 是否允許非root用戶控制該設
*/etc/resolv.conf文
該文件是由域名解析器(resolver,一個根據主機名解析IP地址的庫)使用的配置文件,示例如下:
searchopenarch.com
nameserver208.164.186.1
nameserver208.164.186.2
「searchdomainname.com」表示當提供了一個不包括完全域名的主機名時,在該主機名後添加domainname.com的後綴;「nameserver」表示解析域名時使用該地址指定的主機為域名伺服器。其中域名伺服器是按照文件中出現的順序來查詢的。
*/etc/host.conf文件
該文件指定如何解析主機名。Linux通過解析器庫來獲得主機名對應的IP地址。下面是一個「/etc/host.conf」的示例:
orderbind,hosts
multion
ospoofon
「orderbind,hosts」指定主機名查詢順序,這里規定先使用DNS來解析域名,然後再查詢「/etc/hosts」文件(也可以相反)。
「multion」指定是否「/etc/hosts」文件中指定的主機可以有多個地址,擁有多個IP地址的主機一般稱為多穴主機。
「nospoofon」指不允許對該伺服器進行IP地址欺騙。IP欺騙是一種攻擊系統安全的手段,通過把IP地址偽裝成別的計算機,來取得其它計算機的信任。
*/etc/sysconfig/network文件
該文件用來指定伺服器上的網路配置信息,下面是一個示例:
NETWORK=yes
RORWARD_IPV4=yes
HOSTNAME=deep.openarch.com
GAREWAY=0.0.0.0
GATEWAYDEV=
NETWORK=yes/no 網路是否被配置;
FORWARD_IPV4=yes/no 是否開啟IP轉發功能
HOSTNAME=hostnamehostname表示伺服器的主機名
GAREWAY=gw-ip gw-ip表示網路網關的IP地址
GAREWAYDEV=gw-dev gw-dw表示網關的設備名,如:etho等
注意:為了和老的軟體相兼容,「/etc/HOSTNAME」文件應該用和HOSTNAME=hostname相同的主機名。
*etc/hosts文件
當機器啟動時,在可以查詢DNS以前,機器需要查詢一些主機名到IP地址的匹配。這些匹配信息存放在/etc/hosts文件中。在沒有域名伺服器情況下,系統上的所有網路程序都通過查詢該文件來解析對應於某個主機名的IP地址。
下面是一個「/etc/hosts」文件的示例:
IPAddress Hostname Alias
127.0.0.1 Localhost Gate.openarch.com
208.164.186.1 gate.openarch.comGate
………… ………… ………
最左邊一列是主機IP信息,中間一列是主機名。任何後面的列都是該主機的別名。一旦配置完機器的網路配置文件,應該重新啟動網路以使修改生效。使用下面的命令來重新啟動網路:/etc/rc.d/init.d/networkrestart
*/etc/inetd.conf文件
眾所周知,作為伺服器來說,服務埠開放越多,系統安全穩定性越難以保證。所以提供特定服務的伺服器應該盡可能開放提供服務必不可少的埠,而將與伺服器服務無關的服務關閉,比如:一台作為www和ftp伺服器的機器,應該只開放80和25埠,而將其他無關的服務如:fingerauth等服務關掉,以減少系統漏洞。
而inetd,也叫作「超級伺服器」,就是監視一些網路請求的守護進程,其根據網路請求來調用相應的服務進程來處理連接請求。inetd.conf則是inetd的配置文件。inetd.conf文件告訴inetd監聽哪些網路埠,為每個埠啟動哪個服務。在任何的網路環境中使用Linux系統,第一件要做的事就是了解一下伺服器到底要提供哪些服務。不需要的那些服務應該被禁止掉,最好卸載掉,這樣黑客就少了一些攻擊系統的機會。查看「/etc/inetd.conf」文件,了解一下inetd提供哪些服務。用加上注釋的方法(在一行的開頭加上#號),禁止任何不需要的服務,再給inetd進程發一個SIGHUP信號。
第一步:把文件的許可許可權改成600。
[root@deep]#chmod600/etc/inetd.conf
第二步:確信文件的所有者是root。
[root@deep]#stat/etc/inetd.conf
第三步:編輯「inetd.conf」文件(vi/etc/inetd.conf),禁止所有不需要的服務,如:ftp、telnet、shell、login、exec、talk、ntalk、imap、pop-2、pop-3、finger、auth,等等。如果你覺得某些服務有用,可以不禁止這些服務。但是,把這些服務禁止掉,系統受攻擊的可能性就會小很多。改變後的「inetd.conf」文件的內容如下面所示:
#Tore-readthisfileafterchanges,justdoa'killall-HUPinetd'
#
#
#echodgramudpwaitrootinternal
#
#
#
#
#
#
#
#timedgramudpwaitrootinternal
#
#Thesearestandardservices.
#
#ftpstreamtcpnowaitroot/usr/sbin/tcpdin.ftpd-l-a
#telnetstreamtcpnowaitroot/usr/sbin/tcpdin.telnetd
#
#Shell,login,exec,comsatandtalkareBSDprotocols.
#
#shellstreamtcpnowaitroot/usr/sbin/tcpdin.rshd
#loginstreamtcpnowaitroot/usr/sbin/tcpdin.rlogind
#execstreamtcpnowaitroot/usr/sbin/tcpdin.rexecd
#comsatdgramudpwaitroot/usr/sbin/tcpdin.comsat
#talkdgramudpwaitroot/usr/sbin/tcpdin.talkd
#ntalkdgramudpwaitroot/usr/sbin/tcpdin.ntalkd
#dtalkstreamtcpwaitnobody/usr/sbin/tcpdin.dtalkd
#
#Popandimapmailservicesetal
#
#pop-2streamtcpnowaitroot/usr/sbin/tcpdipop2d
#pop-3streamtcpnowaitroot/usr/sbin/tcpdipop3d
#imapstreamtcpnowaitroot/usr/sbin/tcpdimapd
#
#TheInternetUUCPservice.
#
#uucpstreamtcpnowaituucp/usr/sbin/tcpd/usr/lib/uucp/uucico-l
#
#.Mostsites
#runthisonlyonmachinesactingas"bootservers."Donotuncomment
#thisunlessyou*need*it.
#
#tftpdgramudpwaitroot/usr/sbin/tcpdin.tftpd
#bootpsdgramudpwaitroot/usr/sbin/tcpdbootpd
#
#Finger,
#valuabletopotential"systemcrackers."Manysiteschoosetodisable
#.
#
#fingerstreamtcpnowaitroot/usr/sbin/tcpdin.fingerd
#cfingerstreamtcpnowaitroot/usr/sbin/tcpdin.cfingerd
#systatstreamtcpnowaitguest/usr/sbin/tcpd/bin/ps-auwwx
netstatstreamtcpnowaitguest/usr/sbin/tcpd/bin/netstat-finet
#
#Authentication
#
#authstreamtcpnowaitnobody/usr/sbin/in.identdin.identd-l-e-o
#
#Endofinetd.conf
注意:改變了「inetd.conf」文件之後,別忘了給inetd進程發一個SIGHUP信號(killall–HUPinetd)。
[root@deep/root]#killall-HUPinetd
第四步:
為了保證「inetd.conf」文件的安全,可以用chattr命令把它設成不可改變。把文件設成不可改變的只要用下面的命令:
[root@deep]#chattr+i/etc/inetd.conf
這樣可以避免「inetd.conf」文件的任何改變(意外或是別的原因)。一個有「i」屬性的文件是不能被改動的:不能刪除或重命名,不能創建這個文件的鏈接,不能往這個文件里寫數據。只有系統管理員才能設置和清除這個屬性。如果要改變inetd.conf文件,你必須先清除這個不允許改變的標志:
[root@deep]#chattr-i/etc/inetd.conf
但是對於諸如sendmail,named,www等服務,由於它們不象finger,telnet等服務,在請求到來時由inet守護進程啟動相應的進程提供服務,而是在系統啟動時,作為守護進程運行的。而對於redhatlinux,提供了一個linuxconfig命令,可以通過它在圖形界面下互動式地設置是否在啟動時運行相關服務。也可以通過命令來設置是否啟動時啟動某個服務,如:[root@deep]#chkconfig–level35namedoff
具體命令可以參考manchkconfig的說明。
*/etc/hosts.allow文件
但是對於telnet、ftp等服務,如果將其一同關閉,那麼對於管理員需要遠程管理時,將非常不方便。Linux提供另外一種更為靈活和有效的方法來實現對服務請求用戶的限制,從而可以在保證安全性的基礎上,使可信任用戶使用各種服務。Linux提供了一個叫TCPwrapper的程序。在大多數發布版本中該程序往往是預設地被安裝。利用TCPwrapper你可以限制訪問前面提到的某些服務。而且TCPwrapper的記錄文件記錄了所有的企圖訪問你的系統的行為。通過last命令查看該程序的log,管理員可以獲知誰曾經或者企圖連接你的系統。
在/etc目錄下,有兩個文件:hosts.denyhosts.allow通過配置這兩個文件,你可以指定哪些機器可以使用這些服務,哪些不可以使用這些服務。
當服務請求到達伺服器時,TCPwrapper就按照下列順序查詢這兩個文件,直到遇到一個匹配為止:
1.當在/etc/hosts.allow裡面有一項與請求服務的主機地址項匹配,那麼就允許該主機獲取該服務
2.否則,如果在/etc/hosts.deny裡面有一項與請求服務的主機地址項匹配,就禁止該主機使用該項服務。
3.如果相應的配置文件不存在,訪問控制軟體就認為是一個空文件,所以可以通過刪除或者移走配置文件實現對清除所有設置。在文件中,空白行或者以#開頭的行被忽略,你可以通過在行前加#實現注釋功能。
配置這兩個文件是通過一種簡單的訪問控制語言來實現的,訪問控制語句的基本格式為:
程序名列表:主機名/IP地址列表。
程序名列表指定一個或者多個提供相應服務的程序的名字,名字之間用逗號或者空格分割,可以在inetd.conf文件里查看提供相應服務的程序名:如上面的文件示例中,telent所在行的最後一項就是所需的程序名:in.telnetd。
主機名/IP地址列表指定允許或者禁止使用該服務的一個或者多個主機的標識,主機名之間用逗號或空格分隔。程序名和主機地址都可以使用通配符,實現方便的指定多項服務和多個主機。
Linux提供了下面靈活的方式指定進程或者主機列表:
1.一個以"."起始的域名串,如.amms.ac.cn那麼www.amms.ac.cn就和這一項匹配
2.以"."結尾的IP串如202.37.152.那麼IP地址包括202.37.152.的主機都與這一項匹配。
3.格式為n.n.n.n/m.m.m.m表示網路/掩碼,如果請求服務的主機的IP地址與掩碼的位與的結果等於n.n.n.n那麼該主機與該項匹配。
4.ALL表示匹配所有可能性
5.EXPECT表示除去後面所定義的主機。如:list_1EXCEPTlist_2表示list_1主機列表中除去List_2所列出的主機
6.LOCAL表示匹配所有主機名中不包含"."的主機
上面的幾種方式只是Linux提供的方式中的幾種,但是對於我們的一般應用來說是足夠了。我們通過舉幾個例子來說明這個問題:
例一:我們只希望允許同一個區域網的機器使用伺服器的ftp功能,而禁止廣域網上面的ftp服務請求,本地區域網由202.39.154.、202.39.153.和202.39.152.三個網段組成。
在hosts.deny文件中,我們定義禁止所有機器請求所有服務:
ALL:ALL
在hosts.allow文件中,我們定義只允許區域網訪問ftp功能:
in.ftpd-l–a:202.39.154202.39.153.202.39.152.
這樣,當非區域網的機器請求ftp服務時,就會被拒絕。而區域網的機器可以使用ftp服務。此外,應該定期檢查/var/log目錄下的紀錄文件,發現對系統安全有威脅的登錄事件。last命令可以有效的查看系統登錄事件,發現問題所在。
最後tcpdchk是檢查TCP_WAPPERS配置的程序。它檢查TCP_WAPPERS的配置,並報告它可以發現的問題或潛在的問題。在所有的配置都完成了之後,請運行tcpdchk程序:
[root@deep]#tcpdchk
*/etc/services文件
埠號和標准服務之間的對應關系在RFC1700「AssignedNumbers」中有詳細的定義。「/etc/services」文件使得伺服器和客戶端的程序能夠把服務的名字轉成埠號,這張表在每一台主機上都存在,其文件名是「/etc/services」。只有「root」用戶才有許可權修改這個文件,而且在通常情況下這個文件是沒有必要修改的,因為這個文件中已經包含了常用的服務所對應的埠號。為了提高安全性,我們可以給這個文件加上保護以避免沒有經過授權的刪除和改變。為了保護這個文件可以用下面的命令:
[root@deep]#chattr+i/etc/services
*/etc/securetty文件
「/etc/securetty」文件允許你規定「root」用戶可以從那個TTY設備登錄。登錄程序(通常是「/bin/login」)需要讀取「/etc/securetty」文件。它的格式是:列出來的tty設備都是允許登錄的,注釋掉或是在這個文件中不存在的都是不允許root登錄的。
注釋掉(在這一行的開頭加上#號)所有你想不讓root登錄的tty設備。
編輯securetty文件(vi/etc/securetty)象下面一樣,注釋掉一些行:
tty1
#tty2
#tty3
#tty4
#tty5
#tty6
#tty7
#tty8
*使Control-Alt-Delete關機鍵無效
把「/etc/inittab」文件中的一行注釋掉可以禁止用Control-Alt-Delete關閉計算機。如果伺服器不是放在一個安全的地方,這非常重要。
編輯inittab文件(vi/etc/inittab)把這一行:
ca::ctrlaltdel:/sbin/shutdown-t3-rnow
改為:
#ca::ctrlaltdel:/sbin/shutdown-t3-rnow
用下面的命令使改變生效:
[root@deep]#/sbin/initq
*改變「/etc/rc.d/init.d/」目錄下的腳本文件的訪問許可
/etc/rc.d/init.d/下的腳本主要包含了啟動服務的腳本程序。一般用戶沒有什麼必要知道腳本文件的內容。所以應該改變這些腳本文件的許可權。
[root@deep]#chmod-R700/etc/rc.d/init.d/*
這樣只有root可以讀、寫和執行這個目錄下的腳本。
*/etc/rc.d/rc.local文件
在默認情況下,當登錄裝有Linux系統的計算機時,系統會告訴你Linux發行版的名字、版本號、內核版本和伺服器名稱。這泄露了太多的系統信息。最好只顯示一個「Login:」的提示信息。
第一步:
編輯「/ect/rc.d/rc.local」文件,在下面這些行的前面加上「#」:
--
#Thiswilloverwrite/etc/issueateveryboot.So,makeanychangesyou
#wanttomaketo/etc/.
#echo"">/etc/issue
#echo"$R">>/etc/issue
#echo"Kernel$(uname-r)on$a$(uname-m)">>/etc/issue
#
#cp-f/etc/issue/etc/issue.net
#echo>>/etc/issue --
第二步:
刪除「/etc」目錄下的「issue.net」和「issue」文件:
[root@deep]#rm-f/etc/issue
[root@deep]#rm-f/etc/issue.net
注意:「/etc/issue.net」文件是用戶從網路登錄計算機時(例如:telnet、SSH),看到的登錄提示。同樣在「」目錄下還有一個「issue」文件,是用戶從本地登錄時看到的提示。這兩個文件都是文本文件,可以根據需要改變。但是,如果想刪掉這兩個文件,必須向上面介紹的那樣把「/etc/rc.d/rc.local」腳本中的那些行注釋掉,否則每次重新啟動的時候,系統又會重新創建這兩個文件。
試試!