任何計算機系統都包含乙個基本的程式集合,成為作業系統(os),它包括:
作業系統是管管理的軟體
使用者操作 → 使用者操作介面(shell,lib,指令等) → 作業系統 → 驅動程式 → 硬體作業系統管理硬體 系統呼叫
在開發者角度,作業系統會對外表現為乙個整體,但是會暴露自己的一部分介面供上層開發者使用,這部分由作業系統提供的介面,就叫做系統呼叫庫函式
單純使用系統呼叫對使用者的有球比較高,所以有人對部分系統呼叫進行了適度封裝,從而形成庫,使用庫,有利於更上層使用者或開發者進行二次開發
跑起來的程式就叫做程序,在核心角度來看,就是擔當分配系統資源的實體,在馮諾依曼體系來看,被載入進記憶體的程式就叫做程序pcb(process control block)
程序的資訊被放在乙個叫做程序控制塊的資料結構中,可以理解為程序屬性的集合task_structlinux的pcb叫做 task_struct
狀態:描述程序的狀態,因為程序有掛起,阻塞,執行等好幾個狀態,所以都有個識別符號來記錄程序的執行狀態。
優先順序:如果有好幾個程序正在執行,就涉及到程序被執行的先後順序的問題,這和程序優先順序這個識別符號有關。
上下文資料:程序執行時處理器的暫存器中的資料。
i/o狀態資訊:包括顯示的i/o請求,分配給程序的i/o裝置和被程序使用的檔案列表等。
記賬資訊:包括處理器的時間總和,記賬號等等
可以在核心原始碼裡找到linux的組織程序,所有執行在系統裡的程序都以task_struct鍊錶形式儲存在核心裡
os對程序的管理就是對pcb的管理
程序的資訊可以在 /proc 系統資料夾裡檢視,例如 /proc/1 代表一號程序
pid 程序的編號
pid_t getpid(void); //獲取當前程序pidpid_t fork(void)pid_t getppid(void); //獲取當前程序父程序pid(ppid)
建立子程序,有兩個返回值,給呼叫fork()的程序(父程序)返回子程序pid,給子程序返回0,子程序和父程序共享fork()之後的**,但是資料私有,採用寫時拷貝寫時拷貝
寫時拷貝(copy-on-write)是一種可以推遲甚至避免複製資料的技術。
呼叫fork(),核心此時並不是複製整個程序空間,而是讓父程序和子程序共享同乙個副本。只有在需要寫入的時候,資料才會被複製,從而使父程序、子程序擁有各自的副本。也就是說,資源的複製只有在需要寫入的時候才進行,在此之前以唯讀方式共享。這種技術使得對位址空間中的頁的複製被推遲到實際發生寫入的時候。有時共享頁根本不會被寫入,例如,fork()後立即呼叫exec(),就無需複製父程序的頁了。fork()實際開銷就是複製父程序的頁表以及給子程序建立唯一的pcb。這種優化可以避免複製大量根本就不會使用的資料
r 執行狀態
s 睡眠狀態(淺度睡眠),可以被喚醒,可以被kill
d 磁碟休眠狀態(深度睡眠),不能被喚醒,只能自己醒來,不能被kill
x 死亡狀態
z 殭屍狀態,等待父程序讀取它的推出資訊,不釋放資源,知道被讀取之後才釋放,所以系統中殭屍程序過多,會發生記憶體洩漏
孤兒程序
父程序意外退出,兒子程序沒有結束,這時子程序就會變為孤兒程序,這是如果孤兒程序退出,就會變成殭屍程序,此時不可能有進城來讀取它的退出資訊,所以它占用的資源永遠不會釋放,可是這種情況不會發生,因為系統的一號程序會將所有的孤兒程序領養kill -l //檢視系統支援的訊號列表
kill 訊號 程序 //對程序執行某種操作
程序優先順序
cpu資源分配地向後順序,就是指程序的優先權
優先權高的程序有優先執行權力,配置程序優先權對多工環境的linux很有用,可以改善系統的效能
在多核系統裡,可以把程序執行到指定的cpu上,可以改善系統整體效能
ps命令
ps -lpri和nips -la
ps aux
ps aux | grep 程序
top //任務管理器
pri:程序優先順序,越小程序優先順序越高修改nini:nice值,即程序可被執行的優先順序的修正值,即修正之後的 pri = pri + ni
nice值為整數,優先順序減小,為負數,優先順序增加,取值範圍為 -20~19
renice -p nice pid //改變程序優先順序按變數的生存週期來劃分,linux變數可分為兩類nice -n nice ./a.out //執行時指定優先順序
在top中修改程序優先順序
r -> pid -> nice
永久的:需要修改配置檔案,變數永久生效設定變數的三種方法臨時的:使用 export 命令宣告即可,變數在關閉shell時失效
.bashrc 與 .bash_profile 的區別
linux系統預設使用的shell為bash,在shell啟動的時候會讀取根據情況讀取.bash_profile和.bashrc檔案
.bashrc環境變數的檢視 使用unset刪除指定的環境變數當shell是互動式登入和非登入shell時都會讀取.bashrc檔案,如:在圖形介面中開啟新終端或使用su切換使用者時,均屬於非登入shell的情況
.bash_profile
當shell是互動式登入shell時,讀取.bash_profile檔案,如在系統啟動、遠端登入或使用su -切換使用者時
簡單的說,.bash_profile只在會話開始時被讀取一次,而.bashrc則每次開啟新的終端時,都會被讀取
set可以設定某個環境變數的值。清除環境變數的值用unset命令。如果未指定值,則該變數值將被設為null。
常用的環境變數
path 決定了shell將到哪些目錄中尋找命令或程式home 當前使用者主目錄
histsize 歷史記錄數
logname 當前使用者的登入名
hostname 指主機的名稱
shell 當前使用者shell型別
languge 語言相關的環境變數,多語言可以修改此環境變數
mail 當前使用者的郵件存放目錄
ps1 基本提示符,對於root使用者是#,對於普通使用者是$
Linux 程序概念
程序排程演算法 在早期作業系統的排程方式大多數是非剝奪的,這是由於早期的應用一般是科學計算或事務處理,不太把人機互動的響應時間指標放在首要位置。在這種情況下,正在執行的程序可一直占用cpu直到程序阻塞或終止。這種方式的排程演算法可以很簡單,且比較適用對於響應時間不關心或者關心甚少的批處理科學計算或事...
Linux 程序概念
調研程序的排程演算法.短程序優先演算法,對預計執行時間短的程序優先分派處理機。通常後來的短程序不搶先正在執行的程序。演算法優點 相比fcfs 演算法,該演算法可改善平均周轉時間和平均帶權周轉時間,縮短程序的等待時間,提高系統的吞吐量。演算法缺點 對長程序非常不利,可能長時間得不到執行,且未能依據程序...
Linux 程序概念
目錄 1.馮諾依曼體系結構 1.1 五大硬體單元 1.2 作業系統 2.程序概念 2.1 作業系統如何管理程序 2.2 作業系統如何描述程序 2.3 檢視程序 2.4 建立程序 建立pcb 2.5 程序狀態 2.6 程序優先順序 pri 3.環境變數 4.程式位址空間 5.程序排程 現代計算機的硬體...