程序與程式
1.程式:存放在磁碟上的一系列**和資料的可執行映像,是乙個靜止的實體。
2.程序:是乙個執行中的程式,它是乙個動態的實體。
程序四要素
1.有一段程式供其執行。這段程式不一定是某個程序所專有,可以與其他程序共用。
2.有程序專用的核心空間堆疊。
3.在核心中有乙個task_struct資料結構,也就是通常所說的程序控制塊(pcb)。有了這個資料結構,程序才能成為核心排程的乙個基本單位,接受核心的排程。
4.有獨立的使用者空間。
如果有獨立的使用者空間,那麼是程序;如果沒獨立的使用者空間,有共享的使用者空間,那麼是使用者線性;如果沒有獨立的使用者空間和共享的使用者空間,那麼是核心執行緒。
linux程序狀態
1.task_running
程序正在被cpu執行,或者已經準備就緒,隨時可以執行。當乙個程序剛被建立時,就處於task_running狀態。
2.task_interruptible
處於等待中的程序,等待的條件為真時被喚醒,也可以被訊號(signal)或中斷喚醒。
3.task_uninterruptible
處於等待中的程序,等待資源有效時被喚醒,但不可以由其他程序通過訊號(signal)或中斷喚醒。
4.task_killable
linux2.6.25新引入的程序睡眠狀態,原理與task_uninterruptible類似,但是可以被致命訊號(sigkill)喚醒。
5.task_traced
正在被除錯狀態的程序。
6.task_dead
程序退出時(呼叫do_exit),所處的狀態。
linux程序描述
在linux核心**中,程序、執行緒都是使用task_struct(sched.h)結構來表示的,它包含了大量描述程序/執行緒的資訊,其中比較重要的有程序號(pid_t pid)、程序狀態(long state)、程序優先順序(int prio)。
排程策略:
1.sched_normal(sched_other):普通的分時程序
2.sched_fifo:先進先出的實時程序
3.sched_rr:時間片輪轉的實時程序
4.sched_batch:批處理程序
5.sched_idle:只在系統空閒時才能夠被排程執行的程序
排程時機
1.主動式排程
在核心中呼叫schedule()。當程序需要等待資源等原因而暫時停止執行時,會把自己的狀態置於掛起(睡眠),並主動請求排程,讓出cpu。
示例:current->state = task_interruptible;
schedule();
2.被動式排程
被動式排程又名搶占式排程。分為使用者態搶占(linux2.4以上)和核心態搶占(linux2.6以上)。
使用者態搶占
使用者搶占發生在:
從系統呼叫返回使用者空間。
從中斷處理程式返回使用者空間。
核心即將返回使用者空間的時候,如果need_resched標誌被設定,會導致schedule()被呼叫,即發生使用者搶占。
當某個程序耗盡它的時間片時,會設定need_resched標誌
當乙個優先順序更高的程序進入可執行狀態的時候,也會設定need_resched標誌。
核心態搶占
1.使用者態搶占的缺陷
程序/執行緒一旦執行到核心態,就可以一直執行,直到它主動放棄或時間片耗盡為止。這樣會導致一些非常緊急的程序或執行緒將長時間得不到執行,降低整個系統的實時性。
2.改進方式
允許系統在核心態也支援搶占,更高優先順序的程序/執行緒可以搶占正在核心態執行的低優先順序的程序/執行緒。
3.核心搶占可能發生的時機
當中斷處理程式完成,返回核心空間前。
當核心**再一次具有可搶占性的時候,如解鎖及使能軟中斷等。
4.不允許核心搶占的時機
核心正在執行中斷程式。
核心正在進行中斷上下文的bottom half(中斷的底半部)處理。硬體中斷返回前會被執行軟中斷,此時仍然處於中斷上下文中。
程序正持有spinlock自旋鎖、writelock/readlock讀寫鎖等,當持有這些鎖時,不應被搶占,否則由於搶占可能導致其他程序長期得不到解鎖,而讓系統處於死鎖狀態。
核心正在執行排程程式scheduler。搶占的原因就是為了進行新的排程,沒有理由將排程程式搶占掉再執行排程程式。
搶占計數
為了保證linux核心在以上情況下不會被搶占,搶占式核心使用了乙個變數preempt_count,稱為核心搶占計數。這一變數被設定在程序的thread_info結構中。每當核心要進入以上幾種狀態時,變數preempt_count就加1,指示核心不允許搶占。每當核心從以上幾種狀態退出時,變數preempt_count就減1,同時進行可搶占的判斷與排程。
排程步驟
schedule函式工作流程
1.清理當前執行中的程序。
2.選擇下乙個要執行的程序。
3.設定新程序的執行環境。
4.程序上下文切換。
國嵌攻略 111 硬體訪問技術
硬體訪問實質 驅動程式控制裝置,主要是通過訪問裝置內的暫存器來達到控制目的的,因此我們討論如何訪問硬體,就成了如何訪問這些暫存器。訪問流程 1.位址對映 在linux系統中,無論是核心程式還是應用程式,都只能使用虛擬位址,而晶元手冊中給出的硬體暫存器位址或ram位址都是實體地址,無法直接使用。因此我...
國嵌攻略 099 Linux核心配置與編譯
為什麼要配置核心 基於硬體和軟體的需求選出需要的功能,去掉不要的功能。核心配置的方法 make config 基於文字互動的配置。make menuconfig 基於圖形選單的配置。make menuconfig配置方法 1.選單項的分類 processor type and features 處理...
國嵌攻略 161 USB匯流排介紹
usb發展史 usb universal serial bus 通用序列匯流排,是一種外部匯流排標準。用於規範電腦與外部裝置的連線和通訊。usb是在1994年底由英特爾 康柏 ibm microsoft等多家公司聯合提出的。自1996年堆出後,已經成功替代了串列埠和並口。成為當今個人電腦和大量智慧型...