1.程序調用
2.CPU配置設定
3.程序建立
4.程序排程
5.記憶體配置設定與回收
6.程序類型
7.程序狀态
8.IO過程
9.IPC
一、Linux程序及作業管理
1.程序調用:
call:調用别人實作編寫好的功能子產品
可以基于{system call/lib調用}或者混合調用
系統調用:通常在核心發生
庫調用:有的可能是一個獨立的子產品,有的可能是對系統調用的二次封裝
程序調用意味着什麼?
CPU指令:普通指令:ring3 //任何應用程式都可以執行
特權指令:ring0//不允許程式随意調用,由核心調用,來實作硬體平台的管理
任何程式需要運作特權指令,OS把其封裝成調用,必須要向核心發起調用,由核心執行
system call在ring3,發起在ring0運作,然後調用完成後傳回ring3
該程序需要運作ring0的指令的時候:發起軟中斷,目的在于發起system call
//核心把該代碼載入cpu,把執行結果傳回給調用者,調用後繼續運作後續代碼
//程式需要暫停運作:system call之後繼續運作,這叫軟中斷
CPU指令分為:
特權指令:ring 0 //root環,記憶體尋址,記憶體控制,設定記憶體的通路權限為w/r
//普通使用者的特權指令是不允許運作特權指令的
//核心級别和OS級别代碼,才會去運作特權指令
ring1,ring2,//曆史原因,沒有使用
使用者指令:ring3
運作使用者代碼的時候:使用者模式/使用者空間
程序發起system call,需要軟中斷:核心模式/核心空間
例如mkdir /tmp/a :這就需要一次中斷,因為要對硬體進行操作
核心的作用:程序管理,fs,network functions
cpu會在使用者指令和核心指令之間來回切換:模式切換
一般:70%代碼在使用者程序,其他的核心程序最好
2.CPU如何進行資源配置設定//假如cpu隻有一個
時間片切割:time split
程序有優先級的概念:輪流使用CPU
1.假如一個程序霸占cpu不放
需要一個仲裁機制:核心(程序管理:負責程序排程)
2.儲存程序狀态
在cpu上的寄存器上,cpu上有寄存器:儲存的是目前程序的狀态
一旦切換到下一個指令後,這些值都會發生改變
程序保護與恢複:
現場資訊:由核心負責儲存,在記憶體中存放
程序資訊:程序号,占用的記憶體号,狀态,cpu時間配置設定等
切換由核心完成,
linux核心存儲的程序資訊的固定格式:task struct //task結構體
//結構體資訊,使用連結清單存儲,友善查找
//多個任務的task struct組成的連結清單:task list
process:運作中的程式的一個副本
存在生命周期
//程式是一個靜态的檔案
3.當中斷發生的時候,必須由核心接管一切
3.程序建立
每一個程序的組織結構都是一樣的
核心建立了第一個程序:init
init:上帝的使者
//init建立後,意味着使用者空間也被建立出來了
相當于總代理:
他可以建立子程序,子程序建立子程序
父子關系
程序:都由其父程序建立 //需要向核心申請
fork(),clone() //建立子程序[可以為同一段記憶體空間],隻有在子程序需要寫資料的時候,才分家CoW(寫時複制)配置設定另外一段空間
//程序=指令+資料,需要寫資料的時候,CoW複制一份,進行分家
程序終止的話:釋放空間,父程序負責
父程序建立子程序:為了讓子程序運作某一特定任務,子程序完成後,需要進行銷毀
系統調用:
read(),write(),open()
并行執行,以線程運作:很普遍//一個父程式,建立其子程序,其線程可以同時運作在其他cpu上
一個程序可以産生多個線程,并行運作//多核
優先級:劃分了固定個數://kernel 2.6之後
0-99:實時優先級 //數字越大優先級越高
100-139:靜态優先級//使用者可指定,數字越小,優先級越高
nice值:-20-+19 //100-139 ,-20:100 +19:100 //調整優先級
Linux核心為了快速實作程序的排程:把系統上代運作的程序分了140個隊列
相同優先級的拍一隊 //隻需掃描隊列的首部即可
Big O:算法複雜度
O(1),O(logn),O(n),O(n^2),O(2^n)
每一對運作隊列都有兩隊://當運作隊列完成後,和過期隊列對換身份
運作隊列:真正掃描的
過期隊列:已經被排程過的隊列
task struck中存放的資料:
state,thread_info,flags,mm,tty,....
線程,記憶體資訊,tty,fs,files,信号等
5.記憶體的配置設定與回收,建立等
記憶體分片:4K大小,單個成為page
page frame:頁框,用來存儲頁面資料
存儲page//頁框中存儲的資料成為頁資料
記憶體不能預測程序需要多少空間來使用:假設
---------------------------------|
|--------|-----------------------|//記憶體
核心占用 | 其他程序使用
把其他的記憶體:切割成固定大小的片段page,把這些片段配置設定給其他程序
記憶體占用的大小:不是固定的,後期可能會增長的
程序啟動後,核心把衆多分散的空閑的空間中找,拼湊起來配置設定給該程序
記憶體中存在大量的:page frame組成
而這些page frame:都以不連續或者部分連續的方式組成
頁對應的是線性位址的東西 而頁框對應的是實體位址 是實際的存儲區域
告訴程序是連續的:通過一個中間層,僞裝
每一個系統都認為:世界上隻存在兩個人,自己和核心
程序的線性位址空間:每一個程序都假設自己有3G(32bit)的記憶體可用
實體位址空間:真正占用的空間可能隻有很少
//他們之間是離散對應的,虛拟記憶體機制
LRU:最近最少使用算法
線性位址空間映射到記憶體空間
程序隻能通路:線性位址空間,
MMU:Memory Management Unit//記憶體管理單元:負責記憶體線性記憶體和實體記憶體之間的映射
一旦記憶體不夠使用:LRU算法,置換到swap中,輪到該程序的時候,再次換回去
//核心為每一個程序都儲存有一個task_struck:記錄了線性位址空間和實體位址空間的對應關系
有些程式的資料是必須在記憶體中的:常駐記憶體集
能夠交換出去的:虛拟記憶體集
Linux核心:搶占式多任務//程序優先級高的搶占程序優先級低的
可以把别人運作所用的CPU時間片搶過來
隻有在相應的時間點,才可以搶,不能程序剛上線,就開始搶了
6.程序類型:
守護程序:daemon,由核心在系統引導時啟動的程序
前台程序:使用者通過終端啟用的程序//和終端相關
注意:也可把在前台啟動的程序送往背景,以守護模式運作
7.程序狀态:
運作态:running
就緒态:ready
睡眠态:
可中斷睡眠:interruptable
//CPU時間片到了就可以直接運作
不可中斷睡眠:uninterruptable //例如一個程序需要等待加載一個大檔案,即使下一個cpu時間片到了,也沒有滿足運作條件
//程序等待的這個過程做什麼呢?不可能讓他占領cpu,隻能讓他把cpu讓出來,讓其他程序運作,直到該程序滿足該條件
//這就叫做一次IO過程
//IO過程:某一程序需要加載的資料,記憶體中沒有,就不得不請求核心從磁盤把資料裝入到記憶體
//程序是沒有權限,加載資料到記憶體中的,隻有向核心申請,但是核心通常隻是加載的資料,是加載到核心空間中的記憶體中的
停止态:暫停于記憶體中,但不會被排程,除非手動啟動之,stopped
僵死狀态:zombie,一個子程序被建立後,并且任務完成後,等待被父程序清理
//父程序挂了,但是子程序依然存在
8.IO過程:
1.資料首先從磁盤裝入到核心記憶體中去
2.複制一份到程序記憶體中去
程序的分類:
CPU-Bound //CPU密集型
IO-Bound //IO密集型
IPC:inter preocess communication:程序間通信
//程序是意識不到其他程序的存在的
同一主機上:
signal //常見通信方式
shm:shared memory
semerphor:
不同主機上:
rpc:remote procecure call //遠端過程調用
socket:基于套接字的通信
//一個程序監聽在一個位置上,可以接受别人發送的消息
//一端隻管向socket發資料,核心會自動把資料傳送到另一端,另一單
本文轉自MT_IT51CTO部落格,原文連結:http://blog.51cto.com/hmtk520/1977631,如需轉載請自行聯系原作者