調用、調用接口、庫調用
線性記憶體位址空間、實體記憶體位址空間、線性位址、實體位址
交換記憶體:缺頁異常
程序記憶體結構
常駐記憶體集、虛拟記憶體集
程序、程序中繼資料、結構體、任務結構體、連結清單
程序類型、狀态(read,runing,sleep,stopped,zombie)
可中斷睡眠、不可中斷睡眠
建立子程序的過程
程序優先級、程序排程、程序隊列
過期隊列:搶占式多任務、系統調用IO
IO模型、系統調用IO等待過程
程序間通信:IPC
硬體
<a href="https://s3.51cto.com/wyfs02/M01/9D/D0/wKioL1mG0aCBngAZAACxmFPnkEo823.png" target="_blank"></a>
程式設計接口:
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使用和不使用的差別
1、都是以相同頻率工作
2、消耗電一樣
不使用,白白浪費性能
使用,CPU占據60-80%都有價值。
<a href="https://s4.51cto.com/wyfs02/M01/9F/5E/wKioL1mbzy_A4gtLAABUeNBoVts280.png" target="_blank"></a>
線性記憶體位址: 程序使用的位址
程序隻能通過線性位址追蹤資料
1)将位址映射關系儲存于核心記憶體的task struct表中,由核心虛拟出程序記憶體為整個記憶體大小
2)由cpu的MMU(Memory Manager Unit)單元完成映射
交換記憶體:虛拟記憶體,中程序記憶體突然增大,可能實體記憶體不夠用。基于LRU算法找出最近最少使用的記憶體資料,就将實體記憶體中的資料放入同記憶體有相同格式的磁盤中,以後使用時,用相同的方法,将資料交換到磁盤中,将交換分區要使用的資料加載至實體記憶體中。
當資料從磁盤中調回時,可能實體記憶體的位址發生變化。引起 “缺頁異常”:虛拟記憶體中的資料位址映射的實體記憶體的位址沒有資料
1、大異常、小異常
2、要從磁盤中讀資料:1)資料在交換分區中。2)重讀資料
<a href="https://s1.51cto.com/wyfs02/M01/9F/5F/wKioL1mb0vKRrlJqAAA_KWJxTzI149.png" target="_blank"></a>
<a href="https://s3.51cto.com/wyfs02/M00/9F/5F/wKioL1mb1lPC95g6AAAjYLErLIY963.png" target="_blank"></a>
常駐記憶體集:不能交換出去的資料:指令所有空間"匿名頁"
虛拟記憶體集:可以交換出去的資料:資料所有空間
程序:運作中的程式
有生命周期:建立、運作、銷毀
程序中繼資料
位置:核心記憶體中,當程序切換或發起系統調用時,均會操作則表
程序中繼資料結構
task struct 任務結構體
thead_info 線程資訊
flags 辨別
run_list 運作清單
mm 記憶體結構
real_parent 真父
parent 養父
tty 在哪個終端啟動
files 打開的檔案
signal 自己持有的信号
實體位址和線性位址映射關系
結構體:儲存程序中繼資料的結構
tast_struct : 程序中繼資料放至結構體中,稱為任務結構體。一個程序也稱為一個任務
連結清單:
1、任務結構體的組織結構
2、每個結構體的結束處指向下一個有相同結構的結構體的起始處
<a href="https://s4.51cto.com/wyfs02/M00/00/AE/wKiom1mbyuvyxgBvAAAou7KRTzo462.png" target="_blank"></a>
連結清單類型
循環連結清單:最後 一個結構體的結束處指向第一個結構體的起始處
雙向連結清單:結構體的結束處指向下一個結構的起始處,并且此起始處又能指向上一個結構體的開始處
雙向循環連結清單:both above
<a href="https://s3.51cto.com/wyfs02/M00/9F/5E/wKioL1mbyzKTbvn0AABenvLFvSY128.png-wh_500x0-wm_3-wmp_4-s_3235841209.png" target="_blank"></a>
程序類型
密集型
CPU密集型:優先級低,運作程序少時,也可擷取大量CPU資源
IO密集型:優先級高,消耗CPU資源少,在需要CPU時,盡量滿足。
前、背景
前台程序:在終端(控制器、虛拟、模拟)啟動。 在終端也能啟動背景程序(服務程序)或将前台程序送到背景。
背景程序: 随系統啟動而啟動的程序
程序建立:程式配置設定cpu資源及記憶體資源,即為一個程序
剛開機時,程序放在cpu上運作,等核心掌控一切,建立核心空間
核心建立第一個程序(使用者空間建立)/sbin/init
init程序:
1、代替核心完成使用者空間中操作
2、不能代替核心完成 系統調用的執行
程序建立子程序:
1、子程序也能建立子程序
2、子程序和父程序共用一段記憶體空間,記憶體空間隻讀
3、當子程序需要修改記憶體空間中的資料時,基于寫時複制完成
<a href="https://s2.51cto.com/wyfs02/M00/00/AE/wKiom1mbzgfhCy1NAAAvuTI2jAc568.png" target="_blank"></a>
程序銷毀:父程序替子程序收屍,如果父程序先于子程序挂。則為子程序找一個養父,才能收屍。
程序的狀态:
ready: 在程序隊列中等待運作
runing: 在cpu上運作
sleeping: 睡眠
stopped: 在記憶體中,有task struct但不會排程至cpu上運作,除非手動啟動
zombie: 沒有父程序清理屍體
睡眠
可中斷睡眠:
運作隊列:等待被排程至CPU上運作
過期隊列:CPU時間消耗完畢
不可中斷睡眠
過期隊列:系統調用等待IO過程
程序運作中的程序需要完成特定功能
1)系統調用: 特權指令的封裝(程式操作硬體時,發起系統調用)
2)子程序完成:父程序調用程式,運作程式建立一個子程序完成功能。
<a href="https://s5.51cto.com/wyfs02/M01/9F/5F/wKioL1mb22rTY_mBAAAcNUkI7cI836.png" target="_blank"></a>
程序優先級:0-139,0-99:實時優先級,不可調。 100-139(-20,19)靜态優先級:普通使用者隻能調高,root使用者沒有限制
程序排程:kernel按cpu劃分時間片,依據優先級從運作隊列挑選出優先級最高的隊列,下次排程至cpu上運作
隻掃描運作隊列,找到優先級最高的隊列,即為下次排程至cpu上執行的程序
程序隊列:一個優先級對應2個隊列:等待被排程至cpu上運作的的隊列、過期隊列
1、提升程序排程能力
2、一共有280個隊列
過期隊列:運作隊列運作完畢,過期隊列和運作隊列會互換位置
Linux 多任務模式:搶占式多任務
程序運作時,有幾個時間點可以被其他高于目前程序的程序所搶占。被搶占的程序,排程至過期隊列,等待下一個循環
系統調用等待IO過程:
<a href="https://s3.51cto.com/wyfs02/M00/9F/57/wKioL1mbuYLinxD7AABnKiVM9WU998.png" target="_blank"></a>
<a href="https://s2.51cto.com/wyfs02/M02/9F/57/wKioL1mbuayCmFmxAAAXJqxmDSM843.png" target="_blank"></a>
發起系統調用的程序,等待系統調用IO時,也會被排程至過期隊列中,等待下一個循環
系統調用核心完成IO操作
<a href="https://s4.51cto.com/wyfs02/M00/00/AD/wKiom1mbwQKxGYqsAAAjl965c2U281.png" target="_blank"></a>
第一階段:kernel将磁盤中的資料加載至記憶體中
第二階段:将Kernel記憶體中的資料複制到程序記憶體中(程序IO過程)
IO模型
同步、異步
阻塞、非阻塞
左側程序在核心完成特權指令時的的狀态。
右側核心執行特權指令的階段
同步IO
阻塞:程序挂起,第二階段看着核心将資料複制到程序記憶體中(挂起)
非阻塞:程序不挂起,反複檢視核心是否已經完成第一階段,第二階段看着核心将資料複制到程序記憶體中
<a href="https://s5.51cto.com/wyfs02/M02/9F/5D/wKioL1mbw6DSglGSAAAuW3HokW0071.png" target="_blank"></a>
<a href="https://s5.51cto.com/wyfs02/M00/00/AD/wKiom1mbw8GAf6a9AAA7Zb6hHwE145.png" target="_blank"></a>
<a href="https://s3.51cto.com/wyfs02/M00/9F/5D/wKioL1mbw8zA0PHGAAAsytKSPHI500.png" target="_blank"></a>
異步IO
<a href="https://s4.51cto.com/wyfs02/M02/9F/5D/wKioL1mbxCHiLZOyAAAraVK93pg962.png" target="_blank"></a>
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連接配接,二者間,建立虛拟鍊路
本文轉自 lccnx 51CTO部落格,原文連結:http://blog.51cto.com/sonlich/1958340,如需轉載請自行聯系原作者