Linux驅動入門 程序管理

2021-07-22 15:40:53 字數 3371 閱讀 3294

第二章  程序管理

2.1 程序排程

linux提供搶占式多工模式,程序在被搶占之前能夠執行的時間叫程序的時間片,linux獨一無二的公平排程程式本身並沒有採用時間片來達到公平排程。

程序分為i/o消耗型和處理器消耗型。前者指程序的大部分時間用來提交i/o請求或是等待i/o請求的;後者是指程序把事件大多數用在執行**上。linux更傾向於優先排程i/o消耗型程序。

linux採用兩種不同的優先順序範圍:第一種是nice值,越大的nice值意味著更低的優先順序;第二種是實時優先順序,其值可以配置,越高的實時優先順序數值意味著程序優先順序越高。

2.2 linux排程的實現

(1)時間記賬

(2)程序選擇

(3)排程器入口

(4)睡眠和喚醒

2.3 搶占和上下文切換

上下文切換是從乙個可執行程序切換到另乙個可執行程序。schedule函式主要完成兩個工作:其一,把虛擬記憶體從上乙個程序對映切換到新程序中;其二,從上乙個程序的處理器狀態切換到新程序的處理器狀態。

核心中need_resched標誌表明是否需要重新執行一次排程,該標誌對於核心來講是乙個資訊,它表示有其他程序應當被執行了,要盡快呼叫排程程式。

使用者搶占:核心即將返回使用者空間的時候,如果need_resched標誌被設定,會導致schedule函式被呼叫,此時會發生使用者搶占。使用者搶占一般在如下情況下發生:其一,從系統呼叫返回使用者空間時;其二,從中斷處理程式返回使用者空間時。

核心搶占:核心可以在任何時候搶占正在執行的任務。核心搶占一般在如下情況下發生:

(1)中斷處理程式正在執行,且返回使用者空間之前;

(2)核心**再一次具有可搶占性的時候;

(3)如果核心中的任務顯式地呼叫schedule函式;

(4)如果核心中的任務阻塞。

2.4 程序概念

程序是正在執行的程式**的實時結果,是處於執行期的程式以及相關的資源的總稱。執行緒是在程序中活動的物件,核心排程的物件是執行緒,而不是程序。

程序提供兩種虛擬機制——虛擬處理器和虛擬記憶體。執行緒之間可以共享記憶體,但每個都擁有各自的虛擬處理器。

程序五種狀態標誌:task_running,task_interruptible,task_un interruptible,task_traced,task_stoppped.

2.5 程序上下文

程式在使用者空間執行時,當乙個程式執行了乙個系統呼叫或者觸發了某個異常,它就陷入核心空間,稱為核心「代表程序執行」並處於程序上下文中。

2.6 程序與執行緒的建立

從現有核心執行緒中建立乙個新的核心執行緒有兩種方法:

(1)利用kthread_creat()函式建立,並用wake_up_process()喚醒;

(2)直接執行kthread_run().

核心執行緒啟動之後就一直執行直到呼叫do_exit()退出,或者核心的其他部分呼叫kthread_stop()退出。

2.7 孤兒程序

如果父程序在子程序之前退出,必須有乙個機制來保證子程序能找到乙個新父親,否則這些孤兒程序就會在退出時永遠處於僵死狀態,白白耗費記憶體。

2.8 系統呼叫

系統呼叫是使用者空間訪問核心的唯一手段,除異常和陷入外,它們是核心唯一的合法入口。

定義乙個系統呼叫:

asmlinkage  long  sys_test(void)

核心在執行系統呼叫的時候處於程序上下文,在程序上下文中,核心可以休眠,並且可以被搶占。系統呼叫返回的時候,控制權仍在system_call中,它最終負責切換到使用者空間,並讓使用者繼續執行下去。

2.9 核心設計系統呼叫

主要完成系統呼叫函式編寫,系統呼叫號,系統呼叫表的填寫。

步驟1:在「/include/linux/syscalls.h」中增加要新增的系統呼叫的宣告。

asmlinkage long sys_test(void);

步驟2:在「/arch/arm/include/asm/unistd.h」

#define  _nr_test(_nr_syscall_base+361)

步驟3:在「/kernel/sys.c」中實現系統呼叫函式。

asmlinkage long sys_test(void)

步驟4:在「/arch/arm/kernek/calls.s」中加入系統呼叫表的初始化部分

/* 361 */   call(sys_test)

步驟5:生成核心映象。應用層測試程式。

#include

#include

#include

int main()

測試結果:

pid: 859,this is test call.

after syscall:

i = 0

Linux基礎入門 Linux程序管理

程序前後臺與狀態 程式是一組指令及引數的集合,按照既定的邏輯控制計算機執行用來完成特定任務 程序則是執行著的程式,是作業系統執行的基本單位,是程式執行的過程,動態,有生命週期及執行狀態 程式和程序的區別 程式是靜態的,它只是一組指令的集合,不具有任何的執行意義。而程序是程式執行的動態過程 程序和程式...

Linux驅動入門

核心版本 2.4.22 閱讀此文的目的 學會編寫linux裝置驅動。閱讀此文的方法 閱讀以下2個檔案 hello.c,asdf.c。此文假設讀者 已經能用c語言編寫linux應用程式,理解 字元裝置檔案,塊裝置檔案,主裝置號,次裝置號 會寫簡單的shell指令碼和makefile。1.hello.c...

linux入門學習筆記(五)程序管理

在我們進入it行業之後,會聽到許多關於程序的話題,從最簡單的殺死乙個程序,終止乙個程序,到深入一些的父程序創造子程序等等。那麼什麼是程序呢?簡單來說程序就是乙個正在執行中的程式。user 執行程序的使用者 pid 程序id cpu cpu佔用率 mem 記憶體佔用率 vsz 占用虛擬記憶體 rss ...