程式的建立和程式的狀態
程式
**淺層認識:**程式從硬碟上要開始執行起來,先要載入到記憶體上,然後描述起來(建立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之後核心的做法:
- 分配新的記憶體塊和核心資料給子程式
- 將父程式的部分資料內容拷貝到子程式中
- 新增子程式到系統的程式的列表中
- 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的值影響程式的而優先順序
互動式程式:優先順序應該高一點
批處理程式:優先順序可以低一點
程式與程式
程式是硬碟上的一個檔案。
程式是放在記憶體裡,還要被作業系統管理。
管理:
管理和被管理者不直接溝通
被管理的物件需要描述起來(利用資料)
為了高效,描述物件也要被組織起來
相關文章
- 程式的3種狀態
- 程式的狀態與轉換
- shell程式的結束狀態
- Linux程式狀態——top,ps中看到程式狀態D,S的含義Linux
- linux 程式 狀態Linux
- Flink的狀態程式設計和容錯機制(四)程式設計
- Linux如何檢視系統和程式的執行狀態?Linux
- 物件導向程式設計和根本狀態物件程式設計
- 有狀態和無狀態的區別
- 淺談iOS中的程式的五種狀態iOS
- 動態連結串列的建立(程式碼)
- [譯] Flutter 中的原生應用程式狀態Flutter
- windows建立程式的使用者態和核心態互動----小話windows(1)Windows
- Windows 程式的建立和終止Windows
- 【架構設計】無狀態狀態機在程式碼中的實踐架構
- 程式碼的縮排和巢狀巢狀
- 建立程式選單和快捷方式的程式碼
- linux動態檢視某組程式狀態的辦法Linux
- 小程式全域性狀態管理
- Linux 程式狀態淺析Linux
- linux程式狀態詳解Linux
- Windows的程式建立和映像裝入Windows
- Linux Shell程式設計(11)——退出和退出狀態Linux程式設計
- css設定連結a的狀態的例項程式碼CSS
- Spring Bean Scope 有狀態的Bean和無狀態的BeanSpringBean
- 初識程式(一)——作業系統,程式管理,程式狀態作業系統
- 如何在程式執行時動態修改它的引數(狀態)?
- 狀態模式的理解和示例模式
- 更新TableView和CollectionView的狀態View
- 使用JDK自帶的jmap和jhat監控處於執行狀態的Java程式JDKJava
- SAP 電商雲 Spartacus UI 有狀態 的 url 和 title 屬性的賦值程式碼UI賦值
- ① EJB無狀態的bean(建立EJB的基礎教程)Bean
- 三個50歲的美國程式設計師的生活狀態程式設計師
- HTTP狀態程式碼是什麼?HTTP
- 守護程式的概念和建立實驗
- OGG的replicat程式的Time Since Chkpt一直增加,程式處於假死狀態
- Oracle資料庫的靜默狀態和掛起狀態Oracle資料庫
- 程式控制:程式的建立、終止、阻塞、喚醒和切換