硬件 算法
調用、調用接口、庫調用編程
線性內存地址空間、物理內存地址空間、線性地址、物理地址安全
交換內存:缺頁異常網絡
進程內存結構數據結構
常駐內存集、虛擬內存集異步
進程、進程元數據、結構體、任務結構體、鏈表socket
進程類型、狀態(read,runing,sleep,stopped,zombie)工具
可中斷睡眠、不可中斷睡眠性能
建立子進程的過程 spa
進程優先級、進程調度、進程隊列
過時隊列:搶佔式多任務、系統調用IO
IO模型、系統調用IO等待過程
進程間通訊:IPC
硬件
編程接口:
syscall(系統調用)
libcall(庫調用)
硬件
庫調用: 用戶空間發生(獨立的模塊或系統調用的二次封裝)
系統調用:內核空間發生,特權指令
**若是非內核將要運行特權指令,會發起軟中斷,CPU會通知內核,除非內核有漏洞,特權指令必定是由內核執行。
調用:載入事先編寫好的功能模塊
模塊:由別人提供,調用此模塊完成功能
調用接口:獲得模塊的途徑
例如:想要賣一雙鞋(功能),到鞋店去買(提供功能的位置),鞋店的大門(調用接口)。
內核的功能
驅動硬件、用戶及權限管理、網絡管理、程序包管理、文件系統管理、進程管理、安全管理
網絡管理: ip,ifcfg,nmcli配置ip,route,dns。配置文件配置ip,dns,route,圖形工具配置
文件系統管理: 塊組、bitmap,GDT,Supper Block,VFS,同步IO、異步IO,寫時複製,快照,中斷信號,同步、通知機制、擴展槽、適配器、控制器
程序包管理:rpm , yum , dnf (yum比rpm多了查詢搜索、事務歷史功能),Ip比ifconfig多了(清空,查詢過濾)
進程管理:
1)進程建立
2)進程調度
CPU使用和不使用的區別
一、都是以相同頻率工做
二、消耗電同樣
不使用,白白浪費性能
使用,CPU佔據60-80%都有價值。
1、線性內存地址空間、物理內存地址空間、線性地址、物理地址
線性內存地址: 進程使用的地址
1.一、進程只能經過線性地址追蹤數據
1)將地址映射關係保存於內核內存的task struct表中,由內核虛擬出進程內存爲整個內存大小 2)由cpu的MMU(Memory Manager Unit)單元完成映射
1.二、交換內存:虛擬內存,中進程內存忽然增大,可能物理內存不夠用。基於LRU算法找出最近最少使用的內存數據,就將物理內存中的數據放入同內存有相同格式的磁盤中,之後使用時,用相同的方法,將數據交換到磁盤中,將交換分區要使用的數據加載至物理內存中。
當數據從磁盤中調回時,可能物理內存的地址發生變化。引發 「缺頁異常」:虛擬內存中的數據地址映射的物理內存的地址沒有數據
1)、大異常、小異常
2)、要從磁盤中讀數據:a)數據在交換分區中。b)重讀數據
可參考:http://note.youdao.com/noteshare?id=d78c57366914f603526605a22d893346&sub=10966AB8F4504EAB8E295E00E3095682
1.三、進程內存結構
1.4
常駐內存集:不能交換出去的數據:指令全部空間"匿名頁"
虛擬內存集:能夠交換出去的數據:數據全部空間
進程:運行中的程序
有生命週期:建立、運行、銷燬
1.五、進程元數據
位置:內核內存中,當進程切換或發起系統調用時,均會操做則表
進程元數據結構
task struct 任務結構體
thead_info 線程信息
flags 標識
run_list 運行列表
mm 內存結構
real_parent 真父
parent 養父
tty 在哪一個終端啓動
files 打開的文件
signal 本身持有的信號
物理地址和線性地址映射關係
結構體:保存進程元數據的結構
tast_struct : 進程元數據放至結構體中,稱爲任務結構體。一個進程也稱爲一個任務
1.六、鏈表:
一、任務結構體的組織結構
二、每一個結構體的結束處指向下一個有相同結構的結構體的起始處
1.七、鏈表類型
循環鏈表:最後 一個結構體的結束處指向第一個結構體的起始處
雙向鏈表:結構體的結束處指向下一個結構的起始處,而且此起始處又能指向上一個結構體的開始處
雙向循環鏈表:both above
2、進程類型
密集型
CPU密集型:優先級低,運行進程少時,也可獲取大量CPU資源; 非交互式
IO密集型:優先級高,消耗CPU資源少,在須要CPU時,儘可能知足。 交互式
前、後臺
前臺進程:在終端(控制器、虛擬、模擬)啓動。 在終端也能啓動後臺進程(服務進程)或將前臺進程送到後臺,以守護模式運行;
守護進程(後臺進程):在系統引導過程當中啓動的進程,跟終端無關的進程。
進程建立:程序分配cpu資源及內存資源,即爲一個進程
剛開機時,進程放在cpu上運行,等內核掌控一切,建立內核空間
內核建立第一個進程(用戶空間創建)/sbin/init
init進程:
1、代替內核完成用戶空間中操做 2、不能代替內核完成 系統調用的執行
進程建立子進程:
1、子進程也能建立子進程 2、子進程和父進程共用一段內存空間,內存空間只讀 3、當子進程須要修改內存空間中的數據時,基於寫時複製完成
進程銷燬:父進程替子進程收屍,若是父進程先於子進程掛。則爲子進程找一個養父,才能收屍。
進程的狀態:
ready: 在進程隊列中等待運行
runing: 在cpu上運行
sleeping: 睡眠
stopped: 在內存中,有task struct但不會調度至cpu上運行,除非手動啓動
zombie: 沒有父進程清理屍體
睡眠
可中斷睡眠:interruptable
運行隊列:等待被調度至CPU上運行
過時隊列:CPU時間消耗完畢
不可中斷睡眠 : uninterruptable
過時隊列:系統調用等待IO過程
進程運行中的進程須要完成特定功能
1)系統調用: 特權指令的封裝(程序操做硬件時,發起系統調用) 2)子進程完成:父進程調用程序,運行程序建立一個子進程完成功能。
進程優先級、進程調度、進程隊列
進程優先級:0-139, 0-99:實時優先級,不可調。 100-139(-20,19)靜態優先級:普通用戶只能調高,root用戶沒有限制
進程調度:kernel按cpu劃分時間片,依據優先級從運行隊列挑選出優先級最高的隊列,下次調度至cpu上運行
只掃描運行隊列,找到優先級最高的隊列,即爲下次調度至cpu上執行的進程
a)、進程隊列:一個優先級對應2個隊列:等待被調度至cpu上運行的的隊列、過時隊列
一、提高進程調度能力
二、一共有280個隊列
b) 、過時隊列:運行隊列運行完畢,過時隊列和運行隊列會互換位置
Linux 多任務模式:搶佔式多任務
進程運行時,有幾個時間點能夠被其餘高於當前進程的進程所搶佔。被搶佔的進程,調度至過時隊列,等待下一個循環
系統調用等待IO過程:
發起系統調用的進程,等待系統調用IO時,也會被調度至過時隊列中,等待下一個循環
系統調用內核完成IO操做
第一階段:kernel將磁盤中的數據加載至內存中
第二階段:將Kernel內存中的數據複製到進程內存中(進程IO過程)
IPC: Inter Process Communication
同一主機: 信號、share memory 、 semenphor
信號 signal(masage queue) 共享內存, share memory 找一段內存空間扔數據,另外一個進程從內存中讀數據 旗語 semnphor 管道: pipe
不一樣主機: rpc,socket
rpc ---remote processcure call 本機發起調用,在另外一個主機執行
socket---ip: port 通訊基於TCP,通訊前創建TCP鏈接,兩者間,創建虛擬鏈路
3、IO模型
同步、異步
阻塞、非阻塞
左側進程在內核完成特權指令時的的狀態。
右側內核執行特權指令的階段
同步IO
阻塞:進程掛起,第二階段看着內核將數據複製到進程內存中(掛起)
非阻塞:進程不掛起,反覆查看內核是否已經完成第一階段,第二階段看着內核將數據複製到進程內存中
異步IO