• 程序
是指一個具有獨立功能的程式在某個資料集上的一次動态運作過程,它是系統進行資源配置設定和排程的最小單元。
• 一個程序能夠擁有多個線程。每一個線程必須有一個父程序。
• 程序特性:并發、動态、互動、獨立和異步。
程序的生命周期
程序的五種狀态
• 執行(TASK_RUNNING)
程序正在被CPU運作,或已經準備就緒随時可由排程程式運作
• 僵屍(TASK_ZOMBIE)
當程序已停止執行,但其父程序還沒有調用wait()詢問其狀态時,則稱該程序處于僵死狀态。
• 停止(TASK_STOPPED)
當程序收到信号SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU時就會進入暫停狀态。可向其發送SIGCONT信号讓程序轉換到可執行狀态。
• 睡眠狀态
假設程序在核心态運作時須要等待系統的某個資源,此時該程序就會調用sleep_on()或interruptible_sleep_on()自願地放棄CPU的使用權。而讓排程程式去運作其它程序。這時稱其處于睡眠等待狀态。
– 可中斷(TASK_INTERRUPTIBLE)
程序在該狀态下。系統不會排程該程序運作。
當系統産生一個中斷。
或者釋放了程序正在等待的資源,
或者程序收到一個信号。
都能夠喚醒程序轉換到就緒狀态(就可以執行狀态)。
– 不可中斷(TASK_UNINTERRUPTIBLE)
除了不會由于收到信号而被喚醒。該狀态與可中斷睡眠狀态類似。但處于該狀态的程序僅僅有被使用wake_up()函數明白喚醒時才幹轉換到可執行的就緒狀态。該狀态通常在程序須要不受幹擾地等待或者所等待事件會非常快發生時使用。
程序上下文
• 每一個程序都有各自互不幹涉的程序位址空間。該位址空間是大小為 4GB的線性虛拟空間,使用者所看到和接觸到的都是該虛拟位址,無法看到實際的實體記憶體位址。利用這樣的虛拟位址不但能起到保護作業系統的效果(使用者不能直接訪問實體位址),并且,更重要的是。使用者程式能夠使用比實際實體記憶體更大的位址空間。
• 4GB的程序位址空間會被分成兩個部分:使用者空間與核心空間。
• 使用者位址空間是從0到3GB(0xC0000000),
• 核心位址空間占領3GB到4GB。
• 使用者程序通常情況下僅僅能訪問使用者空間的虛拟位址,不能訪問核心空間的虛拟位址。
• 僅僅實使用者程序使用系統調用(代表使用者程序在核心态運作)時能夠訪問到核心空間。
• 每當程序切換時,使用者空間就跟着變化;
• 而核心空間由核心負責映射,它不會跟着程序改變。是固定的。
• 核心空間位址有自己相應的頁表,使用者程序各自有不同的頁表。
• 每一個程序的使用者空間都是全然獨立、互不相幹的。
• BSS段:在採用段式記憶體管理的架構中。BSS段(bss segment)一般是指用來存放程式中未初始化的全局變量的一塊記憶體區域。
BSS是英文Block Started by Symbol的簡稱。BSS段屬于靜态記憶體配置設定。
• 資料段:在採用段式記憶體管理的架構中,資料段(data segment)一般是指用來存放程式中已初始化的全局變量的一塊記憶體區域。
資料段屬于靜态記憶體配置設定。
• BSS段:在採用段式記憶體管理的架構中,BSS段(bss segment)一般是指用來存放程式中未初始化的全局變量的一塊記憶體區域。BSS是英文Block Started by Symbol的簡稱。
BSS段屬于靜态記憶體配置設定。
• 資料段:在採用段式記憶體管理的架構中。資料段(data segment)一般是指用來存放程式中已初始化的全局變量的一塊記憶體區域。資料段屬于靜态記憶體配置設定。
• 代碼段:在採用段式記憶體管理的架構中,代碼段(code segment / text segment)一般是指用來存放程式執行代碼的一塊記憶體區域。這部分區域的大小在程式執行前就已經确定,而且記憶體區域通常屬于僅僅讀, 某些架構也同意代碼段為可寫。即同意自改動程式。
在代碼段中,也有可能包括一些僅僅讀的常數變量,比如字元串常量等。
• 棧(stack)在計算機科學中,是一種特殊的連結清單形式的資料結構,它的特殊之處在于僅僅能同意在連結清單的一端(稱為棧頂。英文為top)進行加入和删除操作。另外堆棧資料結構的實作也能夠通過數組來完畢。棧Stack是存放程式中局部變量的記憶體區。另外棧stack用來儲存函數調用的現場。棧stack由系統自己主動配置設定。使用者不須要關心其配置設定和釋放。
• 堆是指Heap,程式執行時供程式猿來支配的一段記憶體。 用于程序執行時動态配置設定記憶體。堆的大小不固定。可依據程式執行動态變化。
由程式中的new/delete等控制。
fork方法
• fork()函數用于從已存在的一個程序中建立一個新的程序,新程序稱為子程序,而原程序稱為父程序。
• 使用fork()函數得到的子程序是父程序的一個複制品,它從父程序處繼承了整個程序的位址空間,包含程序上下文、代碼段、程序堆棧、記憶體資訊、打開的檔案描寫叙述符、信号控制設定、程序優先級、程序組号、目前工作檔案夾、根檔案夾、資源限制和控制終端等,而子程序所獨有的僅僅有它的程序号、資源使用和計時器等。
• 區分父子程序:由于子程序差點兒是父程序的全然複制,是以父子程序會執行同一個程式。這就須要用一種方式來區分它們,并使它們照此執行。在父程序中的傳回值是子程序的程序号,而在子程序中傳回0。
是以,能夠通過傳回值來判定該程序是父程序還是子程序。
• 開銷:使用fork()函數的代價是非常大的,它複制了父程序中的代碼段、資料段和堆棧段裡的大部分内容,使得fork()函數的系統開銷比較大,并且運作速度頁不是非常快。
exec方法
• exec 函數族提供了在一個程序中啟動還有一個程式運作的方法。
• 它能夠依據指定的檔案名稱或檔案夾名找到可運作檔案,并用它來代替原調用程序的資料段、代碼段和堆棧段,在運作完之後,原調用程序的内容除了程序号外,其它所有被新的程序替換了。
• 可運作檔案既能夠是二進制檔案。也能夠是Linux下不論什麼可運作的腳本檔案。
• 什麼時候使用exec
• 當程序覺得自己不能再為系統和使用者做出不論什麼貢獻時,就能夠調用 exec 函數族中的随意一個函數讓自己重生
• 假設一個程序想運作還有一個程式。那麼它就能夠調用 fork() 函數建立一個程序。然後調用exec 函數族中的随意一個函數。這樣看起來就像通過運作應用程式而産生了一個新程序
• 查找方式:表1中的前4個函數的查找方式都是完整的檔案檔案夾路徑,而最後兩個函數(也就是以p 結尾的兩個函數)能夠僅僅給出檔案名稱,系統就會自己主動依照環境變量“$PATH” 所指定的路徑進行查找。
• 參數傳遞方式:exec函數族的參數傳遞有兩種:一種是逐個列舉的方式。而還有一種則是将全部參數總體構造指針數組傳遞。
在這裡是以函數名的第5位字母來區分的,字母為"l"(list)的表示逐個列舉參數的方式。其文法為constchar *arg;字母為“v”(vector)的表示将全部參數總體構造指針數組傳遞,其文法為char *const argv[]。這裡的參數實際上就是使用者在使用這個可運作檔案時所需的全部指令選項字元串(包含該可運作程式指令本身)。
要注意的是,這些參數必須以NULL結束。
• 環境變量: exec函數族能夠預設系統的環境變量,也能夠傳入指定的環境變量。這裡以“e”(environment)結尾的兩個函數execle()和execve()就能夠在envp[]中指定目前程序所使用的環境變量。
exit方法
• 終止程序使用exit()和_exit()函數。當程序執行到exit()或_exit()函數時。程序會無條件的停止剩下的全部操作,清除各種資料結構。并終止本程序的執行。
• _exit()函數的作用是:直接使程序停止執行,清除其使用的記憶體空間,并清除其在核心中的各種資料結構;而exit()函數則在這些基礎上做了一些包裝,在執行退出之前加了若幹道工序。
• exit()函數和_exit()函數的最大差别就在于exit()函數在終止目前程序之前要檢查該程序打開過哪些檔案,把檔案緩沖區中的内容寫回檔案,也就是圖1中的“清理I/O緩沖”一項。
• 在Linux的标準函數庫中,有一種被稱作“緩沖I/O(buffered I/O)”的操作,其特征就是相應每個打開的檔案。在記憶體中都有一片緩沖區。
• 每次讀檔案時,會連續讀出若幹條記錄,這樣在下次讀檔案時就能夠直接從記憶體的緩沖區中讀取;相同,每次寫檔案時,也不過寫入記憶體中的緩沖區,等滿足了一定的條件(如達到一定數量或遇到特定字元等。最典型的就是咱們的vim中使用的:w指令),再将緩沖區中的内容一次性寫入檔案。
• 這樣的技術大大添加了檔案讀寫的速度,但也給咱們的程式設計帶來了一些麻煩。比方有些資料你覺得已經被寫入到檔案裡,實際上由于沒有滿足特定的條件,它們還僅僅是被儲存在緩沖區内,這時用_exit()函數直接将程序關閉掉,緩沖區中的資料就會丢失。
是以,若想保證資料的完整性,最好使用exit()函數。
•
cmd指令行相關程序指令
• ps -檢視系統中程序的狀态
• USER表示啟動程序使用者
• PID表示程序标志号
• %CPU表示執行該程序占用CPU的時間與該程序總的執行時間的比例
• %MEM表示該程序占用記憶體和總記憶體的比例
• VSZ表示占用的虛拟記憶體大小,機關KB
• RSS為程序占用的實體記憶體值,機關KB
• TTY表示該程序建立時所相應的終端,假設顯示“?”表示不占用終端
• START為程序開始時間
• TIME為運作的時間
• COMMAND是相應的指令名
• STAT是程序的執行狀态
• D。 不可中斷的睡眠
• R。 就緒(在可執行隊列中)
• S, 睡眠
• T, 被跟蹤或停止
• Z。 終止(僵死)的程序
• W,沒有足夠的記憶體分頁可配置設定
• < ,高優先級的程序
• N,低優先級的程序
• L,有記憶體分頁配置設定并鎖在記憶體體内(實時系統或I/O)
• + ,前台程序
• s 。一個資訊頭
• l ,多線程
• 參數介紹:
-A:顯示系統中全部程序的資訊。
-e:顯示全部程序的資訊。
-f:用ASCII字元顯示樹狀結構,表達程式間的互相關系
-l:以長格式顯示程序資訊。
-r:僅僅顯示正在執行的程序。
-u:顯示面向使用者的格式(包含username、CPU及記憶體使用情況等資訊)。
-x:顯示全部非控制終端上的程序資訊。
-p:顯示由程序ID指定的程序的資訊。
-t:顯示指定終端上的程序的資訊。
-H: 顯示樹狀結構。表示程式間的互相關系
• top -顯示系統目前的程序狀況
• 第一行表示的項目依次為目前時間、系統啟動時間、目前系統登入使用者數目、平均負載。
• 第二行顯示的是全部啟動的、眼下執行的、挂起(Sleeping)的和僵屍(Zombie)程序。
• 第三行顯示的是眼下CPU的使用情況,包含系統占用的比例、使用者使用比例、閑置(Idle)比例。
• 第四行顯示實體記憶體的使用情況,包含總的能夠使用的記憶體、已用記憶體、空暇記憶體、緩沖區占用的記憶體。
• 第五行顯示交換分區的使用情況,包含總的交換分區、使用的、空暇的和用于快速緩存的交換分區。
• PID(Process ID):程序标志号。是非零正整數
• USER:程序全部者的username
• PR:程序的優先級别
• NI:程序的優先級别數值
• VIRT:程序占用的虛拟記憶體值
• RES:程序占用的實體記憶體值
• SHR:程序使用的共享記憶體值
• STAT:程序的狀态。當中S表示休眠,R表示正在執行,Z表示僵死狀态,N表示該程序優先值是負數
• %CPU:該程序占用的CPU使用率
• %MEM:該程序占用的實體記憶體和總記憶體的百分比
• TIME:該程序啟動後占用的總的CPU時間
• COMMAND:程序啟動的啟動指令名稱
• 參數介紹
• d:指定更新的間隔,以秒計算。
• q:沒有不論什麼延遲的更新。
假設使用者有超級使用者,則top指令将會以最高的優先序運作。
• c:顯示程序完整的路徑與名稱。
• S:累積模式,會将已完畢或消失的子程序的CPU時間累積起來。
• s:安全模式。
• i:不顯示不論什麼閑置(Idle)或僵屍(Zombie)程序。
• n:顯示更新的次數,完畢後将會退出top。