linux下的程序控制

2021-09-05 15:07:59 字數 3586 閱讀 5979

1.程序概念

馮諾依曼體系結構:現代計算機的硬體體系結構

五大硬體單元:輸入裝置:鍵盤;輸出裝置:顯示器;儲存裝置:記憶體;運算器和控制器:cpu;

硬體結構決定軟體行為:資料都是圍繞記憶體流動的

輸入裝置獲取資料儲存到記憶體中,cpu處理資料,是從記憶體中獲取資料,運算完畢放入記憶體,輸出裝置從記憶體獲取資料;所有 的裝置都是圍繞記憶體工作的

2.作業系統

作業系統 = 核心 + 外部應用;就是乙個軟體

作業系統的功能:讓計算機用起來更加爽快

作業系統的定位:一款搞管理的軟體,對下管理軟硬體資源,對上提供良好的執行條件

作業系統如何管理軟硬體資源?

庫函式和系統呼叫介面的關係:庫函式封裝了系統呼叫介面,上下級的呼叫關係

3.程序:執行中的程式---

程式:儲存在硬碟中的可執行程式檔案

作業系統如何管理程序?先描述後組織

站在作業系統角度:程序就是作業系統對程序的描述     windows下pcb程序控制塊  liunx下task_struct結構體

站在使用者角度:程序就是執行中程式

task_strcut結構體內容:標示符(pid),程序狀態,優先順序,記憶體指標,

上下文資料

,程式計數器

,io狀態資訊,記賬資訊

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

程序狀態:任務程序,退出**,退出訊號等。

優先順序:相當於其他程序的優先順序。

上下文資料:程序執行時處理器和暫存器的資料

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

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

程序的切換排程:cpu的分時技術---時間片

4.程序檢視:ls /proc/;檢視程序資訊:ps -ef;ps aux資訊更加全面;!ps 執行剛才執行ps;top;getpid獲取程序的pid;

5.程序建立:fork()作業系統提供的建立程序的介面,fork通過複製父程序建立乙個新的子程序,複製:複製的是父程序的pcb,意味著子程序跟父程序**和資料指向的是同一塊記憶體區域(資料**執行的完全一樣),並且子程序拷貝了程式計數器,上下文資料所以當前的子程序是從子程序建立成功的下乙個指令開始進行的;父子程序**共享,資料各自開闢空間,私有乙份(採用寫使拷貝技術)

返回值:在父程序中,返回子程序pid>0;在子程序中返回0;通過對返回值對父子程序**分流(父程序中返回子程序的pid,子程序中返回0)

注意:父子程序是根據時間輪轉進行執行

6.程序狀態:阻塞、執行、就緒

liunx下的程序狀態:執行 r(task_runing)、可中斷睡眠(s 可隨時被喚醒)、不可中斷睡眠(d 使用特殊手段喚醒)、停止 t、殭屍 z;終止乙個程序kill pid;kill -9 pid強制終止

殭屍程序(z):處於殭屍狀態的程序

危害:資源洩露

產生:子程序先於父程序退出,作業系統通知父程序,但是父程序沒有管,然而作業系統不敢擅自釋放子程序資源,一旦釋放就沒地方儲存退出原因,因此子程序就成了殭屍程序

如何處理:退出父程序

預防:程序等待

孤兒程序:父程序先於子程序退出,子程序將稱為孤兒程序,孤兒程序的父程序將變為1號init程序,並且孤兒程序退出,不會產生殭屍程序。

守護程序/精靈程序:特殊的孤兒程序

7.程序優先順序:數字

功能:決定cpu資源的優先分配權;

檢視優先順序:ps -l(pri  ni) liunx下預設pni為80

優先順序無法直接修改,但可以通過設定ni的值進行對優先順序作出設定 pri = pri + ni

設定優先順序:執行前設定:nice -n 數字 程序(數字表示追加到pni的級別數);nice取值範圍:-20~19

執行時設定:renice,指定設定:renice -n 數字 -p pid

8.環境變數:用於設定系統執行環境引數的變數

檢視:env     set      echo $變數名 

宣告環境變數:export(變數名=1000)

刪除環境變數:unset $變數名

作用:讓程式執行更加高效,因為環境變數具有全域性特性

如何在**中獲取換將變數:1.char *getenv(const char *name)   2.main的第三個引數 3.全域性變數char **environ

程式位址空間實際上是乙個程序的虛擬位址空間,目的是為了告訴程序,每個程序都有乙個完整的連續空間,但是真正乙個程序使用的記憶體經過頁表對映之後可能只是用很少的一部分物理記憶體

分頁式記憶體管理:提高記憶體利用率,記憶體訪問控制(課本:liunx核心設計與實現)

寫時拷貝計術:提高建立子程序效率

10.程序排程:cpu排程程序,實際上排程的是pcb

大o(1)排程演算法:用空間換取時間,用位圖的方法標記是否有程序的佇列,需要有兩個佇列,用兩個指標分別標記正在活動的佇列和過期的佇列,將活動中執行過得程序放在過期的佇列中,活動中的程序執行完成後,將兩個指標交換位址,重新開始程序排程。

11.程序控制:程序建立、程序終止、程序等待、程式替換

vfork的子程序先執行,並且是子程序退出後或子程序程式替換執行另一段程式之後,父程序才開始執行

程序終止:

終止場景:1.正常終止,結果符合預期;2.正常終止,結果不符合預期;3.異常終止

終止方式:1.main中return;2.exit()庫函式   _exit()系統呼叫函式

_exit()   系統呼叫     直接釋放資源退出程序

exit()     庫函式         做了一系列收尾操作後才釋放資源

程序等待:等待子程序的退出

為什麼要等待子程序的退出:避免產生殭屍程序。因為子程序什麼時候退出,父程序不知道,因此只能建立子程序等待子程序退出

wait():等待任意乙個子程序的退出;返回值:退出的子程序的pid

waitpid():返回值:>0:退出子程序pid, ==0:沒有子程序退出, <0:出錯

阻塞:為了完成操作發起的呼叫,但是當前如果不具備完成條件,則一直等待,直到完成操作

非阻塞:為了完成操作發起呼叫,但是如果不具備完成條件,則立即報錯返回

程式替換:替換程序所執行的程式

新的程式有自己執行的資料,意味著虛擬位址空間中不僅**段對映位置改變了,並且資料段也需要重新初始化,對映到新程式段的位置

exec函式族:execl             execlp           execle

execv            execvp          execve

l和v區別:命令列引數傳遞不同,l-引數平鋪,最後以null結尾;v-字串指標陣列

l  lp   le區別:l-需要傳遞可執行程式檔案全路徑名,lp-只需傳遞檔名,le-傳遞全路徑,並且可以自定義子程序環境變數(v  vp  ve  同理)

Linux下程序控制實驗

1 fork 建立子程序 include include include include include include include 程序建立 void main void else if child 0 子程序 while child wait status 1 errno eintr 子程序...

linux 程序控制

什麼是程序 每乙個程序在系統中都有唯一的id標示它,此id為程序標示符 程序標示符的型別 pit t,其實是乙個無符號整形 乙個程序標示符對應唯一的乙個程序,多個程序標示符可以對應同乙個程式 程序和程式的區別 程式 可執行的二進位制 檔案,這種檔案載入到記憶體中執行就得到了乙個程序 程序 同乙個程式...

Linux程序控制

linux程序控制 獲取pid include include pid t getpdi void 獲取本程序id pdi t getppid vodi 獲取父程序id,及獲取建立子程序的程序id 程序建立 include pid t fork void 建立子程序 呼叫一次返回兩次值 1.父程序中...