從linux和ucos的比較中來看程序這個概念

2022-08-14 22:12:12 字數 3628 閱讀 2943

這種問題就要和ucos

結合起來嘛。

程式和程序:

程式:存放在磁碟上的一些列

**和資料的可執行映像

,是乙個

靜止的實體。

程序:是乙個

執行中的程式

,它是動態

的實體。

linux程序的四要素

:1. 

有一段程式供其執行

。這段程式不一定是某個程序所專有,可以與其他程序共用。

2. 有程序專用的

核心空間堆疊

。3. 

在核心中

有乙個task_struct

資料結構,即通常所說的「程序控制塊」。有了這個資料結構,程序才能成為核心排程的乙個基本單位接受核心的排程。

4. 有

獨立的使用者空間。

注:下圖是根據使用者控制項去區分程序,使用者執行緒,核心執行緒。

程序狀態:

ucos:  

乙個ucos

程序有標準的三個狀態:

linux的狀態在基本的狀態上又增加了幾個:

1. task_running:程序正在被

cpu執行,或者已經準備就緒,隨時可以執行。

當乙個程序剛被建立時,就處於task_running狀態。

2. task_interruptible:處於等待中的程序,待等待條件為真時被喚醒,也可被訊號或者中斷喚醒。

3. task_uninterruptible:處於等待中的程序,待資源有效時被喚醒,但

不可以由其他程序通過訊號或中斷喚醒

。4. 

task_killable:

linux2.6.25

新引入的程序睡眠狀態,原理類似於

task_uninterruptible

,但是可以被致命訊號(sigkill

)喚醒。

5. task_traced:正處於被除錯狀態的程序。

6. task_dead:程序退出時(呼叫

do_exit

),所處的狀態。

任務控制塊:

ucos:

通過os_tcb

來控制任務狀態。比較重要的資料結構有:

指向任務堆疊棧頂的指標

,os_tcb雙向鍊錶的前後鏈結的指標

,指向事件控制塊的指標

,指向郵箱的指標

,指向事件標誌節點的指標

,就緒態標誌

,延時剩餘節拍記錄

,任務狀態字

,任務優先順序

等等。l

inux:

linux的程序,執行緒都使用

task_struct

來表示,他包含了大量程序

/執行緒的資訊,其中比較重要的有:

pid_t pid;  

//程序號

long state;  //程序狀態

int prio;     //程序優先順序  

而在ucosii

裡,優先順序就是程序的

id了,最多有

64個任務,最多有

64個優先順序,每兩個任務的優先順序都不相同。

排程策略:

ucos:

ucos不支援時間片輪番排程法,應用程式中各任務優先順序不能相同。

linux:

先說一下普通

程序優先順序

和實時程序優先順序

:程序提供了兩種優先順序,一種是普通的程序優先順序,第二個是實時優先順序。前者適用sched_normal

排程策略,後者可選

sched_fifo

或sched_rr

排程策略。

任何時候,實時程序的優先順序都高於普通程序

,實時程序只會被更高階的實時程序搶占,同級實時程序之間是按照fifo

(一次機會做完)或者

rr(多次輪轉)規則排程的。

linux幾種常見的排程策略:

vsched_normal(sched_other):

普通的分時程序

vsched_fifo :

先入先出的實時程序

vsched_rr

:時間片輪轉的實時程序

vsched_batch:

批處理程序

vsched_idle: 

只在系統空閒時才能夠被排程執行的程序

排程時機:

ucos:

1. 中斷返回。

2. 申請不到資源主動掛起。

3. 釋放乙個資源,比如訊號量。

4. 主動時延。

注意:超時而繼續的程序不會再次任務排程了,因為超時之後會進入就緒態,當它轉換為執行態的時候就已經證明它是優先順序最高而得到排程的了。

ucos的任務排程可能會陷入優先順序反轉,高優先順序任務的優先順序會被拉低到占用資源的優先順序,解決方式為提公升占用資源任務的優先順序,如果核心自動改變任務的優先順序就叫優先順序繼承,

ucos

沒有優先順序繼承的功能。

linux:

linux的搶占分為

使用者搶占

和核心搶占

。使用者搶占發生在:

1. 從

系統呼叫

返回使用者空間。

2. 從

中斷處理程式

返回使用者空間。

核心搶占發生在:

1. 中斷處理程式完成,

返回核心空間

之前。2. 

黨內和**再一次具有可搶占性的時候,如解鎖及

使能軟中斷

等。下列時機不允許發生搶占:

1. 核心正在

執行中斷處理

。2. 

核心正在進行中斷上線文的bottom half

(中斷的底半部)處理,硬體終端返回前會執行軟中斷,此時仍然

處於中斷上下文中

。3. 

程序正持有

spinlock

自旋鎖、

writelock/readlock

讀寫鎖等,當持有這些鎖時,不應該被搶占,否則由於

搶占將可能導致其他程序長期得不到鎖,而讓系統處於死鎖狀態

。4. 

核心正在

執行排程程式

scheduler

。搶占的原因就是為了進行新的排程,沒有理由將排程程式搶占掉再執行排程程式。

排程步驟:

ucos:

1. 儲存當前暫存器。

2. 在當前任務控制塊中儲存當前任務的堆疊指標。

3. 尋找到最高優先順序的任務。

4. 從新任務的堆疊恢復處理器所有暫存器的值。

linux:

schedule

函式工作流程如下:

1). 

清理當前執行中的程序

;2). 

選擇下乙個要執行的程序;

3). 

設定新程序的執行環境;

4). 

程序上下文切換

。來自為知筆記(wiz)

uCOS和uClinux的比較

摘自 uc os和uclinux作業系統,是當前得到廣泛應用的兩種免費且公開原始碼的嵌入式作業系統。uc os適合小型控制系統,具有執行效率高 占用空間小 實時效能優良和可擴充套件性強等特點,最小核心可編譯至2kb。uclinux則是繼承標準linux的優良特性,針對嵌入式處理器的特點設計的一種作業...

Linux和Windows中換行的比較

參考自這裡!對於內容看起來一樣的兩個c檔案,乙個是linux下的檔案,乙個是windows下的檔案。在nodepad 中可以從狀態列中看出檔案的是linux下的還是windows下的。如下面兩個圖 他們看起來檔案的內容是一樣的,將它們轉成二進位制檔案後,則可以看出不同 在windows下 r n代表...

ucos中的全域性變數

在uc os ii的 中,應用了一種讓人耳目一新的全域性變數定義方法。在 uc os ii 中,作者給出了解釋,但是這裡還是忍不住要討論一番。我們知道,全域性變數的使用有兩個問題 按照平時的定義,如果安排得不好,總是會出問題,extern起來沒完。而在uc os ii採用了一種比較聰明的做法。uc ...