Linux程序知識總結

2021-10-09 10:46:53 字數 4067 閱讀 2717

程序狀態

程序優先順序

並行 & 併發

虛擬位址

fork函式

程序等待

程序等待的方法

程序程式替換

課本概念:程式的乙個執行例項,正在執行的程式等。

核心觀點:擔當分配系統資源(cpu時間,記憶體)的實體 。

程序資訊被放在乙個叫做程序控制塊的資料結構中,可以理解為程序屬性的集合。

課本上稱之為pcb(process control block), linux作業系統下的pcb是: task_struct 結構體。

task_struct是linux核心的一種資料結構,它會被裝載到ram(記憶體)裡並且包含著程序的資訊 。

1.標示符: 描述本程序的唯一標示符,用來區別其他程序。

2.狀態: 任務狀態,退出**,退出訊號等。

3.優先順序: 相對於其他程序的優先順序。

4.程式計數器: 程式中即將被執行的下一條指令的位址。

5.記憶體指標: 包括程式**和程序相關資料的指標,還有和其他程序共享的記憶體塊的指標

6.上下文資料: 程序執行時處理器的暫存器中的資料[休學例子,要加圖cpu,暫存器]。

7.i/o狀態資訊: 包括顯示的i/o請求,分配給程序的i/o裝置和被程序使用的檔案列表。

8.記賬資訊: 可能包括處理器時間總和,使用的時鐘數總和,時間限制,記賬號等。

9.其他資訊

可以在核心源**裡找到它。所有執行在系統裡的程序都以task_struct鍊錶的形式存在核心裡 .

r執行狀態(running) : 並不意味著程序一定在執行中,它表明程序要麼是在執行中要麼在執行佇列裡。

s睡眠狀態(sleeping): 意味著程序在等待事件完成(這裡的睡眠有時候也叫做可中斷睡眠(interruptible sleep))

d磁碟休眠狀態(disk sleep)有時候也叫不可中斷睡眠狀態(uninterruptible sleep),在這個狀態的程序通常會等待io的結束。

t停止狀態(stopped): 可以通過傳送 sigstop 訊號給程序來停止(t)程序。這個被暫停的程序可以通過傳送 sigcont 訊號讓程序繼續執行。

x死亡狀態(dead):這個狀態只是乙個返回狀態,你不會在任務列表裡看到這個狀態

z殭屍狀態(zombie )。當程序退出並且父程序(使用wait()系統呼叫)沒有讀取到子程序退出的返回**時就會產生僵死(屍)程序,殭屍程序會以終止狀態保持在程序表中,並且會一直在等待父程序讀取退出狀態**。所以,只要子程序退出,父程序還在執行,但父程序沒有讀取子程序狀態,子程序進入z狀態 。

程序的退出狀態必須被維持下去,因為他要告訴關心它的程序(父程序),你交給我的任務,我辦的怎麼樣了。可父程序如果一直不讀取,那子程序就一直處於z狀態?是的!

維護退出狀態本身就是要用資料維護,也屬於程序基本資訊,所以儲存在task_struct(pcb)中,換句話說, z狀態一直不退出, pcb一直都要維護?是的!

那乙個父程序建立了很多子程序,就是不**,是不是就會造成記憶體資源的浪費?是的!因為資料結構物件本身就要占用記憶體。

父程序先退出,子程序就稱之為「孤兒程序」

孤兒程序被1號init程序領養,當然要有init程序**嘍。

cpu資源分配的先後順序,就是指程序的優先權(priority)

uid : 代表執行者的身份

pid : 代表這個程序的代號

ppid :代表這個程序是由哪個程序發展衍生而來的,亦即父程序的代號

pri :代表這個程序可被執行的優先順序,其值越小越早被執行

ni :代表這個程序的nice值

pri也還是比較好理解的,即程序的優先順序,或者通俗點說就是程式被cpu執行的先後順序,此值越小

程序的優先級別越高

那ni呢?就是我們所要說的nice值了,其表示程序可被執行的優先順序的修正數值

pri值越小越快被執行,那麼加入nice值後,將會使得pri變為: pri(new)=pri(old)+nice

這樣,當nice值為負值的時候,那麼該程式將會優先順序值將變小,即其優先順序會變高,則其越快被執行

所以,調整程序優先順序,在linux下,就是調整程序nice值

nice其取值範圍是-20至19,一共40個級別

進入top後按「r」–>輸入程序pid–>輸入nice值

並行: 多個程序在多個cpu下分別,同時進行執行,這稱之為並行

併發: 多個程序在乙個cpu下採用程序切換的方式,在一段時間之內,讓多個程序都得以推進,稱之為併發

我們在c/c++裡面看到的位址全部都是虛擬位址,實體地址使用者一概看不到,由os統一管理,os負責將虛擬位址轉成實體地址。

#include pid_t fork(void);

返回值:子程序返回0,父程序返回子程序id,出錯返回-1

程序呼叫fork,當控制轉移到核心中的fork**後,核心做 :

1.分配新的記憶體塊和核心資料結構給子程序

2.將父程序部分資料結構內容拷貝至子程序

3.新增子程序到系統程序列表當中

4.fork返回,開始排程器排程

當乙個程序呼叫fork之後,就有兩個二進位制**相同的程序。而且它們都執行到相同的地方。但每個程序都將可以開始它們自己的旅程。

注意,fork之後,誰先執行完全由排程器決定。

通常,父子**共享,父子再不寫入時,資料也是共享的,當任意一方試圖寫入,便以寫時拷貝的方式各自乙份副本。

1.系統中有太多的程序

2.實際使用者的程序數超過了限制

子程序退出,父程序如果不管不顧,就可能造成『殭屍程序』的問題,進而造成記憶體洩漏。

另外,程序一旦變成殭屍狀態,那就刀槍不入,「殺人不眨眼」的kill -9 也無能為力,因為誰也沒有辦法殺死乙個已經死去的程序。

最後,父程序派給子程序的任務完成的如何,我們需要知道。如,子程序執行完成,結果對還是不對,或者是否正常退出。

父程序通過程序等待的方式,**子程序資源,獲取子程序退出資訊 。

wait方法 :

#include#includepid_t wait(int*status);

返回值:

成功返回被等待程序pid,失敗返回-1。

引數:輸出型引數,獲取子程序退出狀態,不關心則可以設定成為null

waitpid方法 :

pid_ t waitpid(pid_t pid, int *status, int options);

返回值:

當正常返回的時候waitpid返**集到的子程序的程序id;

如果設定了選項wnohang,而呼叫中waitpid發現沒有已退出的子程序可收集,則返 回0;

如果呼叫**錯,則返回-1,這時errno會被設定成相應的值以指示錯誤所在;

引數:pid:

pid=-1,等待任乙個子程序。與wait等效。

pid>0.等待其程序id與pid相等的子程序。

status:

wifexited(status): 若為正常終止子程序返回的狀態,則為真。(檢視程序是否是 正常退出)

wexitstatus(status): 若wifexited非零,提取子程序退出碼。(檢視程序的退出碼)

options:

wnohang: 若pid指定的子程序沒有結束,則waitpid()函式返回0,不予以等待。若正常結束,則返回該子程序的id。

如果子程序已經退出,呼叫wait/waitpid時,wait/waitpid會立即返回,並且釋放資源,獲得子程序退

出資訊。

如果在任意時刻呼叫wait/waitpid,子程序存在且正常執行,則程序可能阻塞。

如果不存在該子程序,則立即出錯返回。

用fork建立子程序後執行的是和父程序相同的程式(但有可能執行不同的**分支),子程序往往要呼叫一種exec函式以執行另乙個程式。當程序呼叫一種exec函式時,該程序的使用者空間**和資料完全被新程式替換,從新程式的啟動例程開始執行。呼叫exec並不建立新程序,所以呼叫exec前後該程序的id並未改變 .

多程序知識簡單總結

import multiprocessing as mul p import time egg1 1 def write egg2,q global egg1 print write全域性變數彩蛋 s egg1 print write彩蛋 s egg2 egg1 1 print write全域性變數...

linux知識總結

linux知識總結3.更改檔案許可權設定的方式 命令名稱 chmod 執行許可權 所有使用者 功能描述 改變檔案或目錄許可權 語法 第一種方法 chmod 檔案或目錄 備註 u 所有者 g 所屬組 o 其他人 a 所有人 為使用者增加許可權 為使用者減少許可權 為使用者賦予許可權 r 讀許可權 w ...

Linux 知識總結

第 01 章 linux 基礎 第 02 章 linux 檔案和目錄管理 第 03 章 linux 磁碟和檔案系統管理 第 04 章 linux 壓縮與打包 第 05 章 linux vim編輯器 第 06 章 linux bash shell 第 07 章 linux 正規表示式 第 08 章 l...