Linux進(jìn)程概念

馮諾依曼體系結(jié)構(gòu)
生活中大部分的計算機,服務(wù)器都遵守馮諾依曼體系。

目前所認(rèn)識的計算機,都是有一個個的硬件組件組成 輸入單元:包括鍵盤, 鼠標(biāo),掃描儀, 寫板等 中央處理器(CPU):含有運算器和控制器等 輸出單元:顯示器,打印機等 馮諾依曼體系結(jié)構(gòu): 這里的存儲器指的是內(nèi)存 不考慮緩存情況,這里的CPU能且只能對內(nèi)存進(jìn)行讀寫,不能訪問外設(shè)(輸入或輸出設(shè)備) 外設(shè)(輸入或輸出設(shè)備)要輸入或者輸出數(shù)據(jù),也只能寫入內(nèi)存或者從內(nèi)存中讀取。 所有設(shè)備都只能直接和內(nèi)存打交道。
注:
輸入設(shè)備:鍵盤、網(wǎng)卡、磁盤、話筒…… CPU:運算器和控制器 輸出設(shè)備:顯示器、網(wǎng)卡、磁盤、音響…… 輸出設(shè)備和輸入設(shè)備統(tǒng)稱為外設(shè) 存儲器:CPU和所有外設(shè)的緩存 馮諾依曼規(guī)定了硬件層面上的數(shù)據(jù)流向 可執(zhí)行程序運行時必須先加載到內(nèi)存(馮諾依曼規(guī)定) 在數(shù)據(jù)層面:CPU并不和外設(shè)打交道,外設(shè)只和內(nèi)存打交道 QQ中傳遞文件:輸入:磁盤、輸出:網(wǎng)卡 、輸入:網(wǎng)卡、輸出:磁盤 QQ中聊天:輸入:鍵盤、輸出:網(wǎng)卡 、輸入:網(wǎng)卡、輸出:顯示器
操作系統(tǒng)(Operator System)
任何計算機系統(tǒng)都包含一個基本的程序集合,稱為操作系統(tǒng)(OS)。
操作系統(tǒng)包括:
內(nèi)核(進(jìn)程管理,內(nèi)存管理,文件管理,驅(qū)動管理) 其他程序(例如函數(shù)庫,shell程序等等)
操作系統(tǒng)是進(jìn)行軟硬件資源管理的軟件
操作系統(tǒng):
可以減少用戶使用計算機的成本 對下管理好所有的軟硬件,對上給用戶提供一個穩(wěn)定高效的運行環(huán)境(軟件:進(jìn)程管理、文件管理、驅(qū)動管理…… 硬件:磁盤、網(wǎng)卡、顯卡、內(nèi)存……) 在整個計算機軟硬件架構(gòu)中,操作系統(tǒng)的定位是:一款純正的“搞管理”的軟件

注:
硬件部分遵守馮諾依曼體系 OS不信任任何用戶,任何對系統(tǒng)硬件或者軟件訪問,都必須通過OS的手 計算機體系是一個層狀結(jié)構(gòu),任何訪問硬件或者軟件的行為,都必須通過OS接口,貫穿OS進(jìn)行訪問 庫函數(shù):語言或者第三方庫(第一方:系統(tǒng)的、第二方:自己的,其余是第三方的)給我們提供的接口 系統(tǒng)調(diào)用:OS提供的接口
總結(jié):計算機管理硬件: 描述起來,用struct結(jié)構(gòu)體 組織起來,用鏈表或其他高效的數(shù)據(jù)結(jié)構(gòu) 操作系統(tǒng)是進(jìn)行軟硬件資源管理的軟件(其中管理的本質(zhì)是先描述在組織(是對數(shù)據(jù)的管理)) 管理分為三種:管理者、執(zhí)行者、被管理者(eg管理者為OS、執(zhí)行者為驅(qū)動程序、被管理者為底層硬件)
補:
系統(tǒng)調(diào)用:
系統(tǒng)調(diào)用把應(yīng)用程序的請求傳輸給系統(tǒng)內(nèi)核執(zhí)行 系統(tǒng)調(diào)用函數(shù)的執(zhí)行過程應(yīng)該是由用戶態(tài)變?yōu)閮?nèi)核態(tài)(又稱系統(tǒng)態(tài)) 利用系統(tǒng)調(diào)用能夠得到操作系統(tǒng)提供的多種服務(wù) 是操作系統(tǒng)提供給編程人員的接口 系統(tǒng)調(diào)用給用戶屏蔽了設(shè)備訪問的細(xì)節(jié) 系統(tǒng)調(diào)用保護(hù)了一些只能在內(nèi)核模式執(zhí)行的操作指令 read是系統(tǒng)調(diào)用不是庫函數(shù)
進(jìn)程
描述進(jìn)程-PCB
基本概念
課本概念:程序的一個執(zhí)行實例,正在執(zhí)行的程序等
內(nèi)核觀點:擔(dān)當(dāng)分配系統(tǒng)資源(CPU時間,內(nèi)存)的實體。
描述進(jìn)程-PCB
進(jìn)程信息被放在一個叫做進(jìn)程控制塊的數(shù)據(jù)結(jié)構(gòu)中,可以理解為進(jìn)程屬性的集合。稱之為PCB(process control block),Linux操作系統(tǒng)下的PCB是: task_struct 。task_struct是PCB的一種 在Linux中描述進(jìn)程的結(jié)構(gòu)體叫做task_struct。 task_struct是Linux內(nèi)核的一種數(shù)據(jù)結(jié)構(gòu),它會被裝載到RAM(內(nèi)存)里并且包含著進(jìn)程的信息
task_ struct內(nèi)容分類
標(biāo)示符: 描述本進(jìn)程的唯一標(biāo)示符,用來區(qū)別其他進(jìn)程。 狀態(tài): 任務(wù)狀態(tài),退出代碼,退出信號等。 優(yōu)先級: 相對于其他進(jìn)程的優(yōu)先級。 程序計數(shù)器: 程序中即將被執(zhí)行的下一條指令的地址。 內(nèi)存指針: 包括程序代碼和進(jìn)程相關(guān)數(shù)據(jù)的指針,還有和其他進(jìn)程共享的內(nèi)存塊的指針 上下文數(shù)據(jù): 進(jìn)程執(zhí)行時處理器的寄存器中的數(shù)據(jù) I/O狀態(tài)信息: 包括顯示的I/O請求,分配給進(jìn)程的I/O設(shè)備和被進(jìn)程使用的文件列表。 記賬信息: 可能包括處理器時間總和,使用的時鐘數(shù)總和,時間限制,記賬號等。 其他信息
注:
在編程語言中:順序語句、判斷語句、循環(huán)語句 CPU中有一種寄存器叫pc指針(也稱EIP),它是用來記錄正在執(zhí)行指令的下一條指令的地址 CPU核心工作流程: 取指令 分析指令 執(zhí)行指令 CPU中運行的代碼都是進(jìn)程的代碼 當(dāng)一個進(jìn)程在運行中,因為某些原因,需要被暫時停止執(zhí)行,讓出CPU,需要進(jìn)程保存(保存的目的是為了恢復(fù))自己的所有的臨時數(shù)據(jù)(最重要的是進(jìn)程的上下文數(shù)據(jù)) 在每個CPU中都有一個運行隊列,其中運行隊列中的進(jìn)程都是處在運行狀態(tài)的(CPU是選擇性的調(diào)度)
總結(jié):
OS可以一次跑起多個程序,并且OS要管理起來這些運行起來的程序,OS要對進(jìn)程進(jìn)行管理 進(jìn)程控制塊(PCB):struct task_struct 結(jié)構(gòu)體 OS對進(jìn)程的管理轉(zhuǎn)化成為了對進(jìn)程信息的管理,先描述再組織,對進(jìn)程的管理轉(zhuǎn)化為對雙鏈表的增刪查改 進(jìn)程=你的程序+內(nèi)核申請的數(shù)據(jù)結(jié)構(gòu)(PCB) 優(yōu)先級的本質(zhì)是在資源(CPU、網(wǎng)卡、顯卡、磁盤……)有限的前提下,確立誰先訪問資源,誰后訪問的問題
補:
進(jìn)程放在CPU上之后,不是一直在運行直到進(jìn)程運行結(jié)束,每個進(jìn)程都有一個運行時間單位——時間片 一般進(jìn)程讓出CPU:一種是來了一個優(yōu)先級更高的進(jìn)程(OS必須支持搶占);另一種是時間片到了 單CPU,單核:跑起來多個進(jìn)程,通過進(jìn)程快速切換的方式,在一段時間內(nèi),讓所有的進(jìn)程代碼都得到推進(jìn)——并發(fā) 多CPU,多核:任何時刻,允許多個進(jìn)程同時執(zhí)行——并行 進(jìn)程在CPU上運行時,會有很多寄存器上的臨時數(shù)據(jù)——上下文數(shù)據(jù) 系統(tǒng)感知進(jìn)程的唯一實體是PBC(進(jìn)程控制塊)
查看進(jìn)程



通過系統(tǒng)調(diào)用創(chuàng)建進(jìn)程-fork
語法:

1. 創(chuàng)建子進(jìn)程

理解fork:
從程序員角度: 父子共享用戶代碼(是只讀的不可修改并且不可寫入),而用戶數(shù)據(jù)各自私有一份(目的是不讓進(jìn)程間相互干擾)(數(shù)據(jù)用的是寫時拷貝) 在操作系統(tǒng)中,所有進(jìn)程具有獨立性的 進(jìn)程具有獨立性是操作系統(tǒng)所表現(xiàn)出來的,OS通過父子進(jìn)程的用戶數(shù)據(jù)各自私有一份,從而不讓進(jìn)程互相干擾來實現(xiàn)的 從內(nèi)核角度: 進(jìn)程=我的程序+內(nèi)核數(shù)據(jù)結(jié)構(gòu)(PCB task_struct) 創(chuàng)建子進(jìn)程,通常以父進(jìn)程為模板其中子進(jìn)程默認(rèn)使用的是父進(jìn)程的代碼和數(shù)據(jù)(寫時拷貝)
2. fork有兩個返回值

注:
fork有兩個返回值的原因是在創(chuàng)建子進(jìn)程成功之后,子進(jìn)程和父進(jìn)程共享代碼 fork:子進(jìn)程的返回值是0,父進(jìn)程返回值是子進(jìn)程的pid,因為子進(jìn)程只有一個父進(jìn)程,而父進(jìn)程有多個子進(jìn)程,需要對每個子進(jìn)程進(jìn)行標(biāo)識(pid),并且記住他們 fork中父進(jìn)程的返回值是不會記錄到用戶數(shù)據(jù)當(dāng)中的,這些只是給用戶看的,便于記錄子進(jìn)程(pid)
總結(jié):
運行 man fork 認(rèn)識fork fork有兩個返回值 父子進(jìn)程代碼共享,數(shù)據(jù)各自開辟空間,私有一份(采用寫時拷貝) fork 之后通常要用 if 進(jìn)行分流
進(jìn)程狀態(tài)
Linux下的內(nèi)核源代碼

R運行狀態(tài)(running): 并不意味著進(jìn)程一定在運行中,它表明進(jìn)程要么是在運行中要么在運行隊列里。
S睡眠狀態(tài)(sleeping): 意味著進(jìn)程在等待事件完成(這里的睡眠有時候也叫做可中斷睡眠
D磁盤休眠狀態(tài)(Disk sleep)有時候也叫不可中斷睡眠狀態(tài)(uninterruptible sleep),在這個狀態(tài)的進(jìn)程通常會等待IO的結(jié)束。
T停止?fàn)顟B(tài)(stopped):可以通過發(fā)送 SIGSTOP 信號給進(jìn)程來停止(T)進(jìn)程。這個被暫停的進(jìn)程可以通過發(fā)送 SIGCONT 信號讓進(jìn)程繼續(xù)運行。
X死亡狀態(tài)(dead):這個狀態(tài)只是一個返回狀態(tài),你不會在任務(wù)列表里看到這個狀態(tài)。
Z(zombie)-僵尸進(jìn)程:
僵死狀態(tài)(Zombies)是一個比較特殊的狀態(tài)。當(dāng)進(jìn)程退出并且父進(jìn)程(使用wait()系統(tǒng)調(diào)用)沒有讀取到子進(jìn)程退出的返回代碼時就會產(chǎn)生僵死(尸)進(jìn)程 僵死進(jìn)程會以終止?fàn)顟B(tài)保持在進(jìn)程表中,并且會一直在等待父進(jìn)程讀取退出狀態(tài)代碼。 只要子進(jìn)程退出,父進(jìn)程還在運行,但父進(jìn)程沒有讀取子進(jìn)程狀態(tài),子進(jìn)程進(jìn)入Z狀態(tài)
R狀態(tài)

S狀態(tài)

T狀態(tài)

Z狀態(tài)

注:
只要進(jìn)程正常結(jié)束,就是正常死亡(X狀態(tài)不太好演示) D狀態(tài)在云服務(wù)器上不容易實現(xiàn) 進(jìn)程是R狀態(tài),不一定是在CPU上運行,進(jìn)程在運行隊列中,就是R狀態(tài)(進(jìn)程已準(zhǔn)備好,等待調(diào)度) S狀態(tài)為淺度休眠(對外部事件可以做出反應(yīng)),大部分情況下都是這種狀態(tài) D狀態(tài)為深度休眠(不可以被殺掉,即便是操作系統(tǒng),只能等待D狀態(tài)進(jìn)程自動醒來,或者是關(guān)機重啟(可能被卡死)) S狀態(tài)和D狀態(tài)稱為等待狀態(tài) 進(jìn)程退出,一般不是立刻讓OS回收信息,釋放進(jìn)程的所有資源 進(jìn)程創(chuàng)建的目的是為了將自己退出時的相關(guān)信息,寫入進(jìn)程的PCB中,供OS或者父進(jìn)程來進(jìn)行讀取,讀取成功后,該進(jìn)程才算真正死亡 進(jìn)程退出時,當(dāng)OS或者父進(jìn)程來未讀取到子進(jìn)程的信息時,這是處于Z狀態(tài)
狀態(tài)與狀態(tài)+的區(qū)別
eg

補:
kill命令
kill 命令用于刪除執(zhí)行中的程序或工作
語法:kill [-s <信息名稱或編號>][程序] 或 kill [-l <信息編號>]

查看進(jìn)程狀態(tài)
第一種:

第二種:
ps aux / ps axj 命令


補:D狀態(tài)和Z狀態(tài)用kill命令是殺不掉的
僵尸進(jìn)程危害
進(jìn)程的退出狀態(tài)必須被維持下去,因為OS關(guān)心進(jìn)程是否完成了任務(wù)??筛高M(jìn)程如果一直不讀取,那子進(jìn)程就一直處于Z狀態(tài) 維護(hù)退出狀態(tài)本身就是要用數(shù)據(jù)維護(hù),也屬于進(jìn)程基本信息,所以保存在task_struct(PCB)中,換句話說,Z狀態(tài)一直不退出,PCB一直都要維護(hù) 一個父進(jìn)程創(chuàng)建了很多子進(jìn)程,就是不回收,會造成內(nèi)存資源的浪費。因為數(shù)據(jù)結(jié)構(gòu)對象本身就要占用內(nèi)存。(在C中定義一個結(jié)構(gòu)體變量(對象),是要在內(nèi)存的某個位置進(jìn)行開辟空間!)這樣就會存在內(nèi)存泄漏。
孤兒進(jìn)程
父進(jìn)程先退出,子進(jìn)程就稱之為“孤兒進(jìn)程”

注:
孤兒進(jìn)程被1號systemd進(jìn)程領(lǐng)養(yǎng),當(dāng)然要有systemd進(jìn)程回收 在centos7.6中1號進(jìn)程是systemd,而在centos6.5中的1號進(jìn)程是initd
進(jìn)程優(yōu)先級
進(jìn)程的優(yōu)先級:
cpu資源分配的先后順序,就是指進(jìn)程的優(yōu)先權(quán)(priority)。 優(yōu)先權(quán)高的進(jìn)程有優(yōu)先執(zhí)行權(quán)利。配置進(jìn)程優(yōu)先權(quán)對多任務(wù)環(huán)境的linux很有用,可以改善系統(tǒng)性能。 還可以把進(jìn)程運行到指定的CPU上,這樣一來,把不重要的進(jìn)程安排到某個CPU,可以大大改善系統(tǒng)整體性能
注:
優(yōu)先級是在一定能得到某種資源,只是先后的問題 權(quán)限是決定你能還是不能得到某種資源 優(yōu)先級是得到某種資源(CPU)的先后順序,其本質(zhì)是因為資源有限(CPU)
查看系統(tǒng)進(jìn)程

UID : 代表執(zhí)行者的身份 PID : 代表這個進(jìn)程的代號 PPID :代表這個進(jìn)程是由哪個進(jìn)程發(fā)展衍生而來的,亦即父進(jìn)程的代號 PRI :代表這個進(jìn)程可被執(zhí)行的優(yōu)先級,其值越小越早被執(zhí)行 NI :代表這個進(jìn)程的nice值 TTY:運行該程序時的終端設(shè)備 CMD:命令
注:
Linux的優(yōu)先級由pri和nice值共同確定(優(yōu)先級的數(shù)值越小,優(yōu)先級越高;優(yōu)先級的數(shù)值越大,優(yōu)先級越低) nice值就是優(yōu)先級的修正數(shù)據(jù),范圍是[-20,19] 優(yōu)先級不可能一味的高,也不可能一味的低(操作系統(tǒng)的調(diào)度器要適度地考慮平衡問題,避免“饑餓問題”)
PRI and NI
PRI是進(jìn)程的優(yōu)先級,或者通俗點說就是程序被CPU執(zhí)行的先后順序,此值越小
進(jìn)程的優(yōu)先級別越高NI就是nice值了,其表示進(jìn)程可被執(zhí)行的優(yōu)先級的修正數(shù)值 PRI值越小越快被執(zhí)行,PRI(new)=PRI(old)+nice 當(dāng)nice值為負(fù)值的時候,那么該程序?qū)?yōu)先級值將變小,即其優(yōu)先級會變高,則其越快被執(zhí)行 調(diào)整進(jìn)程優(yōu)先級,在Linux下,就是調(diào)整進(jìn)程nice值 nice其取值范圍是-20至19,一共40個級別。 進(jìn)程的nice值不是進(jìn)程的優(yōu)先級,但是進(jìn)程nice值會影響到進(jìn)程的優(yōu)先級變化。 nice值是進(jìn)程優(yōu)先級的修正修正數(shù)據(jù)

注:
nice的值的范圍[-20,19],是一種可控范圍,原則上OS內(nèi)的調(diào)度器,要公平(不是平均)且較高效的調(diào)度 PRI(new)=PRI(old)+nice中的PRI(old)默認(rèn)是80,因為有一個基準(zhǔn)值,便于調(diào)整;在設(shè)計上實現(xiàn)起來比較方便 在Linux系統(tǒng)中,標(biāo)識一個用戶,并不是通過用戶名標(biāo)識的(是給用戶看的),而是通過用戶的uid(計算機比較善于處理數(shù)據(jù))
查看進(jìn)程優(yōu)先級的命令
用top命令更改已存在進(jìn)程的nice:
top 進(jìn)入top后按“r”–>輸入進(jìn)程PID–>輸入nice值
注:
用top命令更改已存在進(jìn)程的nice,如果輸入的值大于19,NI的值就是19;如果輸入的值小于-20,NI的值就是-20。 無論怎么輸入NI的值,最終PRI的值為[60,99]
補充概念
競爭性: 系統(tǒng)進(jìn)程數(shù)目眾多,而CPU資源只有少量,甚至1個,所以進(jìn)程之間是具有競爭屬性的。為了高效完成任務(wù),更合理競爭相關(guān)資源,便具有了優(yōu)先級 獨立性: 多進(jìn)程運行,需要獨享各種資源,多進(jìn)程運行期間互不干擾 并行: 多個進(jìn)程在多個CPU下分別,同時進(jìn)行運行,這稱之為并行 并發(fā): 多個進(jìn)程在一個CPU下采用進(jìn)程切換的方式,在一段時間之內(nèi),讓多個進(jìn)程都得以推進(jìn),稱之為并發(fā)
注:
進(jìn)程與資源之間,進(jìn)程永遠(yuǎn)是多數(shù)的 競爭性和獨立性是進(jìn)程運行的特殊屬性(或原則);并行和并發(fā)是計算機的調(diào)度特性
環(huán)境變量與命令行參數(shù)
Linux下的環(huán)境變量與命令行參數(shù)
進(jìn)程地址空間(靈魂四問)
進(jìn)程地址空間的分布

注:
進(jìn)程地址空間不是內(nèi)存地址空間 進(jìn)程地址空間,會在進(jìn)程的整個生命周期內(nèi)一直存在,直到進(jìn)程退出
什么是進(jìn)程地址空間
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int g_val = 0;
int main()
{
pid_t id = fork();
if(id < 0)
{
perror("fork");
return 0;
}
else if(id == 0)
{
//child,子進(jìn)程肯定先跑完,也就是子進(jìn)程先修改,完成之后,父進(jìn)程再讀取
g_val=100;
printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);
}
else
{
//parent
sleep(3);
printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);
}
sleep(1);
return 0;
}
運行結(jié)果:
child[3046]: 100 : 0x80497e8
parent[3045]: 0 : 0x80497e8
父子進(jìn)程中的g_val的地址竟然是一樣的
注:
任何的編程語言里面的地址,絕對不是物理地址,而是虛擬地址(C++/C語言中的&得到的是虛擬地址不是物理地址) 虛擬地址是操作系統(tǒng)提供的,數(shù)據(jù)和代碼一定在物理內(nèi)存上(馮諾依曼規(guī)定),因此需要將虛擬內(nèi)存轉(zhuǎn)化成物理內(nèi)存(由OS自動完成) 父子進(jìn)程代碼共享,而數(shù)據(jù)是各自私有一份的(寫時拷貝) 當(dāng)所有程序運行起來之后,該程序立即變成進(jìn)程
總結(jié):
地址空間本質(zhì)是進(jìn)程看待內(nèi)存的方式,是抽象出來的一個概念,內(nèi)核struct mm_struct,這樣的每一個進(jìn)程,都認(rèn)為自己獨占系統(tǒng)內(nèi)存資源 區(qū)域劃分本質(zhì):將線性地址空間劃分成為一個一個的area,[start,end] 虛擬地址本質(zhì):在[start,end] 之間的各個地址叫做虛擬地址
為什么要存在地址空間
第一種情況:
如果進(jìn)程直接訪問物理內(nèi)存,那么所看到的地址就是物理地址,如果進(jìn)行指針越界訪問,那么進(jìn)程間的獨立性就無法保證。
因為物理內(nèi)存一暴露,其中就有可能有惡意程序直接通過物理地址進(jìn)行內(nèi)存數(shù)據(jù)篡改,并且可以讀取里面的內(nèi)容
第二種情況:

當(dāng)一個程序變?yōu)檫M(jìn)程時,需要將可執(zhí)行程序加載到內(nèi)存中;當(dāng)進(jìn)程退出時,也需要內(nèi)存知道,因此內(nèi)存管理需要知道進(jìn)程是運行還是終斷、退出 因此內(nèi)存管理模塊和進(jìn)程模塊是強耦合的 內(nèi)存管理只需知道哪些內(nèi)存區(qū)域(page)是無效的,哪些區(qū)域是有有效的,只需將內(nèi)存管理和進(jìn)程管理進(jìn)行解耦
第三種情況:
磁盤在存儲二進(jìn)制可執(zhí)行程序時,是進(jìn)行一個個區(qū)域劃分的(代碼區(qū)、全局?jǐn)?shù)據(jù)區(qū)、只讀數(shù)據(jù)區(qū))這些區(qū)域是以4KB為單位劃分的(頁幀),而物理內(nèi)存是沒有按照磁盤劃分順序劃分的(按照頁(一頁是4KB)為單位劃分的) 如果進(jìn)程想要執(zhí)行代碼,OS需要在物理內(nèi)存中毫無章法的亂找(除非OS開辟一塊連續(xù)的物理內(nèi)存(不現(xiàn)實)),這時,虛擬地址空間是幾乎是按照磁盤區(qū)域劃分的,它可以經(jīng)過頁表的映射來找到代碼的位置并順利執(zhí)行代碼
注:
兩個不同的進(jìn)程虛擬地址可以完全一樣
頁表:
頁表是完成虛擬地址到物理地址的映射 將虛擬地址到物理地址的轉(zhuǎn)化 同時也可以幫系統(tǒng)進(jìn)行合法性檢測 內(nèi)存管理模塊和進(jìn)程管理模塊是強耦合的
操作系統(tǒng):進(jìn)程管理、文件管理、內(nèi)存管理、驅(qū)動管理
可執(zhí)行程序,其本身就已經(jīng)劃分成為一個個的區(qū)域(.code、.data、.bss、.readonly……),這樣劃分便于程序鏈接,而代碼在用編譯器編譯時是將數(shù)據(jù)和代碼放在一起
頁框:頁框數(shù)=物理內(nèi)存大小/每一個分配內(nèi)存的大?。?KB),頁框以4KB位單位
頁幀:在磁盤一個個程序被劃分成4KB大小的數(shù)據(jù)
頁號:頁表項的序號
執(zhí)行順序語句的過程:當(dāng)前語句的起始地址+當(dāng)前代碼的長度(虛擬地址存放代碼是存放在連續(xù)區(qū)域的)
虛擬地址空間不存在存放地址的功能,因此需要用戶必須保存起來(避免內(nèi)存泄露)
進(jìn)程與程序的區(qū)別:
程序是靜態(tài)的,進(jìn)程是動態(tài)的,程序是存儲在某種介質(zhì)上的二進(jìn)制代碼,進(jìn)程對應(yīng)了程序的執(zhí)行過程,系統(tǒng)不需要為一個不執(zhí)行的程序創(chuàng)建進(jìn)程,一旦進(jìn)程被創(chuàng)建,就處于不斷變化的動態(tài)過程中,對應(yīng)了一個不斷變化的上下文環(huán)境。 程序是永久的,進(jìn)程是暫時存在的。程序的永久性是相對于進(jìn)程而言的,只要不去刪除它,它可以永久的存儲在介質(zhì)當(dāng)中。
總結(jié):
保護(hù)物理內(nèi)存,不受到任何進(jìn)程內(nèi)的地址直接訪問,方便進(jìn)行合法性校驗 將內(nèi)存管理和進(jìn)程管理進(jìn)行解耦 讓每個進(jìn)程,以同樣的方式來看待代碼和數(shù)據(jù)
地址空間與物理內(nèi)存之間的關(guān)系
虛擬地址和物理地址之間是通過頁表完成的映射關(guān)系
回答上面代碼(為什么地址一樣?)的問題

變量內(nèi)容不一樣,所以父子進(jìn)程輸出的變量絕對不是同一個變量 但地址值是一樣的,說明,該地址絕對不是物理地址 在Linux地址下,這種地址叫做 虛擬地址 我們在用C/C++語言所看到的地址,全部都是虛擬地址!物理地址,用戶一概看不到,由OS統(tǒng)一管理,OS必須負(fù)責(zé)將 虛擬地址 轉(zhuǎn)化成 物理地址 同一個變量,地址相同,其實是虛擬地址相同(原因是fork出一個子進(jìn)程,其中子進(jìn)程會繼承大部分父進(jìn)程的信息(代碼指向同一塊空間,數(shù)據(jù)也指向同一塊空間),因此g_val的地址也被繼承了,但是當(dāng)子進(jìn)程試圖修改g_val值時,這是需要用到寫時拷貝將父進(jìn)程的數(shù)據(jù)拷貝一份給子進(jìn)程(開辟新的空間)并修改了子進(jìn)程中的g_val的值),因此內(nèi)容不同其實是被映射到了不同的物理地址!
補:
TCB:線程控制塊
MMU:內(nèi)存管理單元,一種負(fù)責(zé)處理中央處理器(CPU)的內(nèi)存訪問請求,功能包括虛擬地址到物理地址的轉(zhuǎn)換(即 虛擬內(nèi)存管理)、內(nèi)存保護(hù)、中央處理器高速緩存的控制
CACHE:高速緩存
DMA:直接內(nèi)存存取
作者:The August
https://blog.csdn.net/AI_ELF/article/details/122365391
10T 技術(shù)資源大放送!包括但不限于:Linux、虛擬化、容器、云計算、網(wǎng)絡(luò)、Python、Go 等。在開源Linux公眾號內(nèi)回復(fù)「10T」,即可免費獲取!
shell編程100例(附PDF下載)
IPv6技術(shù)白皮書(附PDF下載)
Linux主流發(fā)行版本配置IP總結(jié)(Ubuntu、CentOS、Redhat、Suse)
批量安裝Windows系統(tǒng)
無人值守批量安裝服務(wù)器
運維必備的《網(wǎng)絡(luò)端口大全》,看這一份就夠了。
收藏:服務(wù)器和存儲知識入門
什么叫SSH?原理詳解,看這一篇就夠了!
Nginx面試40問(收藏吃灰)
20 個 Linux 服務(wù)器性能調(diào)優(yōu)技巧
超詳細(xì)!一文帶你了解LVS四層負(fù)載均衡企業(yè)級實踐!
收藏 | Linux系統(tǒng)日志位置及包含的日志內(nèi)容介紹
100 道 Linux 常見面試題,建議收藏,慢慢讀~
服務(wù)器12種基本故障+排查方法
IT運維管理常用工具大全,讓你成為真正的高手
什么是QoS?
有收獲,點個在看 
shell編程100例(附PDF下載)
IPv6技術(shù)白皮書(附PDF下載)
Linux主流發(fā)行版本配置IP總結(jié)(Ubuntu、CentOS、Redhat、Suse)
批量安裝Windows系統(tǒng)
無人值守批量安裝服務(wù)器
運維必備的《網(wǎng)絡(luò)端口大全》,看這一份就夠了。
收藏:服務(wù)器和存儲知識入門
什么叫SSH?原理詳解,看這一篇就夠了!
Nginx面試40問(收藏吃灰)
20 個 Linux 服務(wù)器性能調(diào)優(yōu)技巧
超詳細(xì)!一文帶你了解LVS四層負(fù)載均衡企業(yè)級實踐!
收藏 | Linux系統(tǒng)日志位置及包含的日志內(nèi)容介紹
100 道 Linux 常見面試題,建議收藏,慢慢讀~
服務(wù)器12種基本故障+排查方法
IT運維管理常用工具大全,讓你成為真正的高手
什么是QoS?
有收獲,點個在看
