什麼是程序?
程序是為了提高cpu的執行效率,減少因為程式等待帶來的cpu空轉以及其他計算機硬體資源浪費而提出的。
描述程序-pcb
程序資訊被放在乙個叫做程序控制塊的資料結構中,可以理解為程序屬性的集合。
課本上稱之為pcb(process control block),linux作業系統下pcb是task_struct
。
task_ struct內容分類
標示符: 描述本程序的唯一標示符,用來區別其他程序。
狀態: 任務狀態,退出**,退出訊號等。
優先順序: 相對於其他程序的優先順序。
程式計數器: 程式中即將被執行的下一條指令的位址。
記憶體指標: 包括程式**和程序相關資料的指標,還有和其他程序共享的記憶體塊的指標
上下文資料: 程序執行時處理器的暫存器中的資料[休學例子,要加圖cpu,暫存器]。
i/o狀態資訊: 包括顯示的i/o請求,分配給程序的i/o裝置和被程序使用的檔案列表。
記賬資訊: 可能包括處理器時間總和,使用的時鐘數總和,時間限制,記賬號等。
其他資訊
檢視程序
程序資訊可通過/proc
系統資料夾檢視
通過系統呼叫獲取程序識別符號
程序id(pid)
父程序id(ppid)
建立程序執行 man fork 認識fork(man手冊檢視)
fork有兩個返回值
父子程序**共享,資料各自開闢空間,私有乙份(採用寫時拷貝)
#include
#include
#include
intmain()
結果如下:
fork建立後常進行分流,ret = 0為子程序,ret>0為父程序
#include
#include
#include
intmain()
else
if(ret ==0)
else
sleep(1
);return0;
}
r執行狀態(running): 並不意味著程序一定在執行中,它表明程序要麼是在執行中要麼在執行佇列
裡。s睡眠狀態(sleeping): 意味著程序在等待事件完成(這裡的睡眠有時候也叫做可中斷睡眠
(interruptible sleep))。
d磁碟休眠狀態(disk sleep)有時候也叫不可中斷睡眠狀態(uninterruptible sleep),在這個狀態的
程序通常會等待io的結束。
t停止狀態(stopped): 可以通過傳送 sigstop 訊號給程序來停止(t)程序。這個被暫停的程序可
以通過傳送 sigcont 訊號讓程序繼續執行。
x死亡狀態(dead):這個狀態只是乙個返回狀態,你不會在任務列表裡看到這個狀態。
程序狀態檢視ps aux / ps axj 命令
z(zombie)-殭屍程序
僵死狀態(zombies)是乙個比較特殊的狀態。當程序退出並且父程序(使用wait()系統呼叫,後面講)
沒有讀取到子程序退出的返回**時就會產生僵死(屍)程序。
所以,只要子程序退出,父程序還在執行,但父程序沒有讀取子程序狀態,子程序z狀態
殭屍程序危害
程序的退出狀態必須被維持下去,因為他要告訴關心它的程序(父程序),你交給我的任務,我辦的怎
麼樣了。可父程序如果一直不讀取,那子程序就一直處於z狀態?是的!
維護退出狀態本身就是要用資料維護,也屬於程序基本資訊,所以儲存在task_struct(pcb)中,換句話
說,z狀態一直不退出,pcb一直都要維護?是的!
那乙個父程序建立了很多子程序,就是不**,是不是就會造成記憶體資源的浪費?是的!因為資料結構
物件本身就要占用記憶體,想想c中定義乙個結構體變數(物件),是要在記憶體的某個位置進行開闢空
間!
「走進計算機深處」 Linux 執行緒(一)
競爭條件 多個執行流競爭執行 函式的可重入和不可重入 函式的重入 多個執行流同時進入乙個函式執行 可重入 函式重入不會造成資料二義,或者邏輯混亂 不可重入 函式重入可能造成資料二義,或者邏輯混亂 關鍵點 是否對全域性資料進行非原子安全操作 原子操作指不可被打斷 sigghld訊號 子程序退出後作業系...
「走進計算機深處」 Linux 執行緒(三)
前言 執行緒 二 主要學習了執行緒安全管理,同步與互斥的作用,明白了互斥鎖和等待佇列的使用場景和方法,這篇部落格主要闡述其發生場景,生產者與消費者模型。模型如下 模型優點 1.支援忙閒不均 2.支援併發 3.解耦合 讓兩個模組產生更小的關聯性 模型關係分析 生產者與生產者應該具備互斥關係 消費者與消...
大話儲存 1 走進計算機IO世界
組成計算機的三大件 cpu,記憶體和io。匯流排就是一條或者多條物理上的導線,每個部件都接到這些導線上,同一時刻只能有乙個部件在接收或者傳送。仲裁匯流排 所有部件按照另一條匯流排,也就是仲裁匯流排或者中斷匯流排上給出的訊號來判斷這個時刻匯流排可以由哪個部件來使用。產生仲裁匯流排或者中斷電位的可以是c...