天天看點

Linux之程序管理基礎概念

調用、調用接口、庫調用

線性記憶體位址空間、實體記憶體位址空間、線性位址、實體位址

交換記憶體:缺頁異常

程序記憶體結構

常駐記憶體集、虛拟記憶體集

程序、程序中繼資料、結構體、任務結構體、連結清單

程序類型、狀态(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,如需轉載請自行聯系原作者

繼續閱讀