程式的建立和程式的狀態

ruo_bing發表於2018-08-24

程式

**淺層認識:**程式從硬碟上要開始執行起來,先要載入到記憶體上,然後描述起來(建立PCB),然後在執行,執行起來的程式叫程式。

**從作業系統的角度來看程式: **

作業系統就是管理者,程式就是被管理者,要管理程式需要:

1.作業系統不直接管理程式,先將程式描述起來
2.描述程式的載體是一種結構體,一個程式具有一個結構體,這個結構體叫做程式的PCB(程式控制塊)
3.然後把所有的結構體組織起來,組織起來的方式就是用指標將結構體連成一個連結串列 (或者用其他高階資料結構組織起來)


PCB–描述程式

PCB是包含程式的資訊(描述程式的資訊,有優先順序,狀態等)的一種結構體,

linux下描述程式的PCB叫 task_struct

##task_structl裡面的內容

識別符號:pid,描述本程式的唯一識別符號,用來普別其他程式
狀態:任務狀態,退出程式碼,退出資訊等
優先順序:cpu資源分配的先後順序
程式計數器:程式中即將被執行的嚇一條指令的地址。
記憶體指標:程式程式碼和程式相關資料的指標等,可以指向虛擬地址空間,通過頁表對映到物理內地址,最終在記憶體中找到這個程式所要執行的程式碼和資料。
上下文資料:程式執行時處理器中的暫存器的資料(程式正在執行時暫存器中的資料)(時間片:程式在cpu上執行的時間,分時機制:aa)
i/o狀態資訊:程式開啟的檔案資訊
記賬資訊:可能包含處理器的時間總和(執行時間)等

##檢視程式
每個程式都有自己的PID
檢視程式指令有: ls /proc/ , ps aux 等
系統呼叫獲取程式識別符號(id):

getpid()             //獲取程式pid
getppid()            //獲取父程式pid

建立程式

建立程式有兩個函式:fork 和 vfork

pid _t fork(void )

有兩個返回值:對於子程式來說,返回0;對於父程式來說,返回子程式的id,建立失敗返回-1。

建立子程式:以父程式為模板,父子程式程式碼段相同,但資料不同,fork的返回值起到分流的作用,使用者通過fork的返回值來判斷哪個是子程式,哪個是父程式。

fork之後,父子程式誰先執行,由排程器決定,父子程式分別獨立自己的,執行自己的任務

fork之後核心的做法:

  1. 分配新的記憶體塊和核心資料給子程式
  2. 將父程式的部分資料內容拷貝到子程式中
  3. 新增子程式到系統的程式的列表中
  4. fork返回,開始排程
    程式碼如下:
    這裡寫圖片描述
    列印結果:
    這裡寫圖片描述

變數地址相同,內容不同;通常,父子程式程式碼共享,父子不在寫入時,資料也是共享的,當任意一方要寫入時,就以寫實拷貝的方式來處理

vfork

pid_t vfork(void)
也是用來建立子程式的但是vfork建立的子程式和父程式共享虛擬地址,但fork建立的子程式具有獨立的虛擬空間;
vfork保證子程式先執行,在它呼叫exit後,父程式才可能被排程執行

程式碼:這裡寫圖片描述
執行結果:
這裡寫圖片描述
地址相同,變數內容相同,因為虛擬地址相同
建立程式圖:
這裡寫圖片描述
這裡寫圖片描述

fork和vfork的區別
1.fork:子程式拷貝父程式的資料段,程式碼段。
2.vfork:子程式和父程式共享程式碼段。
3.fork(),建立的父子程式的執行次序不確定,vfork()保證子程式先執行,在子程式呼叫exit()之後父程式才被呼叫。

程式狀態

統一描述:就緒,態執行態,阻塞態
linux下程式的狀態:

執行狀態  (R)       //要麼在執行這種,要麼在執行的佇列中
睡眠狀態(S)         //淺睡眠,可以被喚醒
磁碟休眠狀態(D)       //深度睡眠,不可以被喚醒,不能被中斷(不可終端睡眠狀態)
停止狀態(T)       //可以傳送訊號給程式讓其暫停,也可以傳送訊號讓它繼續執行 
跟蹤狀態(t)      //跟蹤程式的狀態
死亡狀態(X)
殭屍狀態(Z)

殭屍程式

概念:程式退出,父程式沒有讀取到子程式的返回程式碼時 就會產生殭屍程式。

殭屍程式產生原因以及危害:

1.子程式先於父程式退出(父程式沒有關心子程式的退出狀態)
2.程式退出為了儲存自己退出的原因,因此退出後資源不會被完全釋放,等待父程式來獲取退出狀態(這就是為什麼要程式等待),然後釋放子程式所有資源,所以假如父程式沒有關心子程式的退出,那麼這個時候退出子程式將成為一個殭屍程式,佔著資源不釋放,成為殭屍程式,造成資源洩漏(資源沒有完全釋放),正常程式可能無法建立。

孤兒程式

父程式先於子程式退出,這個孤兒程式將被孤兒院init程式所領養,子程式退出後由init回收釋放

程式的優先順序

cpu分配資源的先後順序,調整優先順序的命令 nice,renice,其實是調整NI的值,nice的值影響程式的而優先順序

互動式程式:優先順序應該高一點
批處理程式:優先順序可以低一點

程式與程式

程式是硬碟上的一個檔案。
程式是放在記憶體裡,還要被作業系統管理。

管理:

管理和被管理者不直接溝通
被管理的物件需要描述起來(利用資料)
為了高效,描述物件也要被組織起來

相關文章