从linux和ucos的比较中来看进程这个概念
這種問題就要和ucos結合起來嘛。
?
程序和進程:
程序:存放在磁盤上的一些列代碼和數據的可執行映像,是一個靜止的實體。
進程:是一個執行中的程序,它是動態的實體。
?
linux進程的四要素:
1.?有一段程序供其執行。這段程序不一定是某個進程所專有,可以與其他進程共用。
2.?有進程專用的內核空間堆棧。
3.?在內核中有一個task_struct數據結構,即通常所說的“進程控制塊”。有了這個數據結構,進程才能成為內核調度的一個基本單位接受內核的調度。
4.?有獨立的用戶空間。
?
注:下圖是根據用戶控件去區分進程,用戶線程,內核線程。
?
?
進程狀態:
Ucos:??
一個ucos進程有標準的三個狀態:
?
Linux:
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雙向鏈表的前后鏈接的指針,指向事件控制塊的指針,指向郵箱的指針,指向事件標志節點的指針,就緒態標志,延時剩余節拍記錄,任務狀態字,任務優先級等等。
?
Linux:
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)
轉載于:https://www.cnblogs.com/dchipnau/p/4993319.html
總結
以上是生活随笔為你收集整理的从linux和ucos的比较中来看进程这个概念的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: mybatis generator ec
 - 下一篇: mysql的主从复制原理