程序员不得不学的操作系统知识(三)
存儲(chǔ)器管理
存儲(chǔ)器層次結(jié)構(gòu)
存儲(chǔ)層次至少具有三級(jí):最高層為CPU寄存器,中間為主存,最底層是輔存。
程序的裝入和鏈接
程序裝入方式:
-
絕對裝入方式:絕對裝入程序按照裝入模塊的地址,將程序和數(shù)據(jù)裝入內(nèi)存。
-
可重定位方式:在采用可重定位裝入程序?qū)⒀b入模塊裝入內(nèi)存后,會(huì)使裝入模塊中的所有邏輯地址與實(shí)際裝入內(nèi)存的物理地址不同。
-
動(dòng)態(tài)運(yùn)行時(shí)裝入方式:裝入內(nèi)存后的所有地址都仍然是相對地址,而將相對地址轉(zhuǎn)換為絕對地址是在程序真正執(zhí)行的時(shí)候。
程序鏈接方式:
內(nèi)存管理
內(nèi)存分配方式
單一連續(xù)分配:將內(nèi)存分為系統(tǒng)區(qū)、用戶區(qū),將系統(tǒng)區(qū)的內(nèi)存交給操作系統(tǒng)使用,而用戶區(qū)內(nèi)存分配給用戶使用。
固定分區(qū)分配:內(nèi)存空間被劃分為若干個(gè)固定大小的區(qū)域,每個(gè)分區(qū)提供給某個(gè)進(jìn)程使用。
動(dòng)態(tài)分區(qū)分配:根據(jù)進(jìn)程實(shí)際需要,結(jié)合數(shù)據(jù)結(jié)構(gòu)動(dòng)態(tài)分配內(nèi)存。
- 位圖:由位圖標(biāo)記相關(guān)分區(qū)是否被使用
- 空閑鏈表:由雙向鏈表將空閑區(qū)域作為節(jié)點(diǎn)相連
相關(guān)分配算法
內(nèi)存回收過程
-
回收區(qū)和一塊空閑區(qū)相鄰,且回收區(qū)在空閑區(qū)下邊:將回收區(qū)包含進(jìn)空閑區(qū)
-
回收區(qū)和一塊空閑區(qū)相鄰,且空閑區(qū)在回收區(qū)下邊:將回收區(qū)和空閑區(qū)合并,新的空閑區(qū)采用回收區(qū)的地址
-
回收區(qū)在兩塊空閑區(qū)中間:將三個(gè)區(qū)域合并,新的空閑區(qū)使用頂部的空閑區(qū)地址
-
單獨(dú)的回收區(qū):轉(zhuǎn)為空閑區(qū)插入空閑區(qū)鏈表
內(nèi)存存儲(chǔ)管理
頁式存儲(chǔ)管理:將進(jìn)程邏輯空間等分為若干個(gè)頁面,物理內(nèi)存空間分為若干個(gè)物理塊,以頁面為單位將進(jìn)程裝入物理塊。由頁表記錄進(jìn)程邏輯空間與物理空間的映射
- 缺點(diǎn):由于頁面大小的原因,會(huì)導(dǎo)致碎片多,單一的頁式存儲(chǔ)也會(huì)導(dǎo)致頁表占用內(nèi)存空間大。
- 優(yōu)點(diǎn):符合計(jì)算機(jī)的存儲(chǔ)管理要求
- 解決方案:采用多級(jí)頁表,防止一次頁表的頁表項(xiàng)過大
段式存儲(chǔ)管理:將進(jìn)程邏輯空間劃分為若干段(非等分),由段表記錄邏輯空間到物理空間的映射。
- 優(yōu)點(diǎn):適合用戶需求,滿足程序的共享
段頁式存儲(chǔ)管理:結(jié)合了提高內(nèi)存利用率的分頁管理、滿足用戶需求的分段,將進(jìn)程先分為段,再分為頁。
頁面置換算法
當(dāng)發(fā)生缺頁異常的時(shí)候,需要相關(guān)的頁面置換算法。
最優(yōu)頁面置換算法:將不再需要或者很久以后才需要的頁面置換出去,這是一種理想的置換算法。
先進(jìn)先出頁面置換算法:由操作系統(tǒng)維護(hù)一個(gè)所有在當(dāng)前內(nèi)存中的頁面的鏈表,缺頁時(shí)移除頭部的頁,并且把新的頁添加到表尾。
最近最少使用頁面置換算法:在缺頁中斷時(shí),置換未使用時(shí)間最長的頁面。
虛擬地址空間
將物理內(nèi)存地址暴露給進(jìn)程的缺點(diǎn):
- 用戶程序可以尋址內(nèi)存中的字節(jié),容易破壞操作系統(tǒng)
- 多個(gè)用戶程序容易發(fā)生沖突,并發(fā)困難
虛擬地址空間:創(chuàng)建了一種抽象內(nèi)存供程序使用。地址空間是進(jìn)程可以用來尋址內(nèi)存的地址集。每個(gè)進(jìn)程都有它自己的地址空間,獨(dú)立于其他進(jìn)程的地址空間。
在沒有虛擬內(nèi)存的計(jì)算機(jī)上,系統(tǒng)直接將虛擬地址送到內(nèi)存中線上,讀寫操作都使用同樣地址的物理內(nèi)存。在使用虛擬地址空間技術(shù)時(shí),虛擬地址不會(huì)直接發(fā)送到內(nèi)存總線上。相反,會(huì)使用 MMU內(nèi)存管理單元把虛擬地址映射為物理內(nèi)存地址。
基址寄存器和變址寄存器:采用了虛擬地址空間后,要實(shí)際定位到程序的物理內(nèi)存地址,采用動(dòng)態(tài)重定位方法,使用CPU中的基址寄存器、變址寄存器來對地址空間轉(zhuǎn)換為物理內(nèi)存地址。
- 基址寄存器:存儲(chǔ)數(shù)據(jù)內(nèi)存的起始位置
- 變址寄存器:存儲(chǔ)應(yīng)用程序的長度。
虛擬地址空間由固定大小的單元組成,這種固定大小的單元稱為 頁(pages)。而相對的,物理內(nèi)存中也有固定大小的物理單元,稱為 頁框(page frames)。
映射關(guān)系由頁表進(jìn)行管理,如果MMU 注意到該頁面沒有被映射,于是 CPU 會(huì)陷入(trap)到操作系統(tǒng)中。這個(gè)陷入稱為 缺頁中斷(page fault) 或者是 缺頁錯(cuò)誤。操作系統(tǒng)會(huì)選擇一個(gè)很少使用的頁并把它的內(nèi)容寫入磁盤。
針對虛擬地址到物理地址映射速度優(yōu)化主要有:TLB(轉(zhuǎn)換檢測緩沖區(qū))位于MMU里面。
TLB
TLB是一個(gè)內(nèi)存管理單元用于改進(jìn)虛擬地址到物理地址轉(zhuǎn)換速度的緩存。
TLB是位于內(nèi)存中的頁表的cache,如果沒有TLB,則每次取數(shù)據(jù)都需要兩次訪問內(nèi)存,即查頁表獲得物理地址和取數(shù)據(jù).
虛擬內(nèi)存
交換技術(shù):針對于內(nèi)存不足以程序運(yùn)行的情況,有兩種方式,第一種是交換,將進(jìn)程放入內(nèi)存中執(zhí)行后,再把它放回磁盤。故空閑進(jìn)程會(huì)存放在磁盤中。第二種是虛擬內(nèi)存。
虛擬存儲(chǔ)器,是指具有請求調(diào)入功能和置換功能,能從邏輯上對內(nèi)存容量加以擴(kuò)充的一種存儲(chǔ)器系統(tǒng)。
具有多次性、對換性和虛擬性三大主要特征。
-
多次性:多次性是指一個(gè)作業(yè)被分成多次調(diào)入內(nèi)存運(yùn)行
-
對換性:對換性是指允許在作業(yè)的運(yùn)行過程中進(jìn)行換進(jìn)、換出
-
虛擬性:虛擬性是指能夠從邏輯上擴(kuò)充內(nèi)存容量
虛擬內(nèi)存主要由虛擬存儲(chǔ)器實(shí)現(xiàn),具體內(nèi)存管理也大體一樣,分為:請求分頁、請求分段、請求段頁式,
相關(guān)置換算法:
-
先進(jìn)先出算法(FIFO)
-
最不經(jīng)常使用算法(LFU)
-
最近最少使用算法(LRU)
文件系統(tǒng)
文件系統(tǒng)存儲(chǔ)在磁盤中。大部分的磁盤能夠劃分出一到多個(gè)分區(qū),叫做磁盤分區(qū)。每個(gè)分區(qū)都有獨(dú)立的文件系統(tǒng),每塊分區(qū)的文件系統(tǒng)可以不同。磁盤的 0 號(hào)分區(qū)稱為 主引導(dǎo)記錄(MBR),用來引導(dǎo)(boot) 計(jì)算機(jī)。在 MBR 的結(jié)尾是分區(qū)表(partition table)。
當(dāng)計(jì)算機(jī)開始引 boot 時(shí),BIOS 讀入并執(zhí)行 MBR。
引導(dǎo)塊
MBR 做的第一件事就是確定活動(dòng)分區(qū), 讀入引導(dǎo)塊(boot block) 并執(zhí)行。引導(dǎo)塊中的程序?qū)⒓虞d分區(qū)中的操作系統(tǒng)。為了一致性,每個(gè)分區(qū)都會(huì)從引導(dǎo)塊開始,即使引導(dǎo)塊不包含操作系統(tǒng)。引導(dǎo)塊占據(jù)文件系統(tǒng)的前 4096 個(gè)字節(jié),從磁盤上的字節(jié)偏移量 0 開始。引導(dǎo)塊可用于啟動(dòng)操作系統(tǒng)。
超級(jí)塊
超級(jí)塊 的大小為 4096 字節(jié),從磁盤上的字節(jié)偏移 4096 開始。超級(jí)塊包含文件系統(tǒng)的所有關(guān)鍵參數(shù)
- 文件系統(tǒng)的大小
- 文件系統(tǒng)中的數(shù)據(jù)塊數(shù)
- 指示文件系統(tǒng)狀態(tài)的標(biāo)志
- 分配組大小
在計(jì)算機(jī)啟動(dòng)或者文件系統(tǒng)首次使用時(shí),超級(jí)塊會(huì)被讀入內(nèi)存。
空閑空間塊
用位圖或者鏈表管理空閑塊。
inode
索引節(jié)點(diǎn)。它是一個(gè)數(shù)組的結(jié)構(gòu),每個(gè)文件有一個(gè) inode,inode 非常重要,它說明了文件的方方面面。
- 模式/權(quán)限(保護(hù))
- 所有者 ID
- 組 ID
- 文件大小
- 文件的硬鏈接數(shù)
- 上次訪問時(shí)間
- 最后修改時(shí)間
- inode 上次修改時(shí)間
文件分為兩部分,索引節(jié)點(diǎn)和塊。一旦創(chuàng)建后,每種類型的塊數(shù)是固定的。
文件的實(shí)現(xiàn)
連續(xù)分配:按照連續(xù)數(shù)據(jù)塊進(jìn)行分配。
- 優(yōu)點(diǎn):實(shí)現(xiàn)簡單、高性能
- 缺點(diǎn):碎片問題
鏈表分配:按照鏈表方式分配數(shù)據(jù)塊,節(jié)點(diǎn)的是磁盤指針
- 優(yōu)點(diǎn):充分利用數(shù)據(jù)塊
- 缺點(diǎn):不支持隨機(jī)訪問,IO代價(jià)大
inode:給每個(gè)文件賦予一個(gè)稱為 inode(索引節(jié)點(diǎn)) 的數(shù)據(jù)結(jié)構(gòu),每個(gè)文件都與一個(gè) inode 進(jìn)行關(guān)聯(lián),inode 由整數(shù)進(jìn)行標(biāo)識(shí)。只有在文件打開時(shí),其 inode 才會(huì)在內(nèi)存中。
* 文件的字節(jié)數(shù)* 文件擁有者的User ID* 文件的Group ID* 文件的讀、寫、執(zhí)行權(quán)限* 文件的時(shí)間戳,共有三個(gè):ctime指inode上一次變動(dòng)的時(shí)間,mtime指文件內(nèi)容上一次變動(dòng)的時(shí)間,atime指文件上一次打開的時(shí)間。* 鏈接數(shù),即有多少文件名指向這個(gè)inode* 文件數(shù)據(jù)block的位置目錄的實(shí)現(xiàn)
目錄項(xiàng)提供了查找文件磁盤塊所需要的信息。目錄系統(tǒng)的主要功能就是 將文件的 ASCII 碼的名稱映射到定位數(shù)據(jù)所需的信息上。
對于采用 inode 的系統(tǒng),每個(gè)目錄項(xiàng),由兩部分組成:所包含文件的文件名,以及該文件名對應(yīng)的inode號(hào)碼。
共享文件
硬鏈接:多個(gè)文件名指向同一個(gè)inode號(hào)碼。【inode鏈接數(shù)會(huì)發(fā)生變化】
ln 源文件 目標(biāo)文件軟鏈接:文件A和文件B的inode號(hào)碼雖然不一樣,但是文件A的內(nèi)容是文件B的路徑。
ln -s 源文文件或目錄 目標(biāo)文件或目錄磁盤調(diào)度算法:
- 先來先服務(wù):磁盤臂按照FIFO原則移動(dòng)
- 最短路徑優(yōu)先:磁盤臂按照最短路徑優(yōu)先原則移動(dòng)
- 電梯算法:磁盤臂向一端移動(dòng)后回來
提升性能
- 高速緩存:塊高速緩存、緩沖區(qū)高速緩存
- 塊提前讀:提前預(yù)讀下一個(gè)塊【針對順序讀取的文件】
- 減少磁盤臂運(yùn)動(dòng):把有可能順序訪問的塊放在一起,當(dāng)然最好是在同一個(gè)柱面上,從而減少磁盤臂的移動(dòng)次數(shù)
IO
I/O 分為兩種:物理I/O 和 邏輯I/O(Logical I/O)。
物理 I/O 通常是從磁盤等存儲(chǔ)設(shè)備實(shí)際獲取數(shù)據(jù)。邏輯 I/O 是對存儲(chǔ)器(塊,緩沖區(qū))獲取數(shù)據(jù)。
大部分物理IO(physical I/O) 是異步的。CPU 傳輸完成后會(huì)轉(zhuǎn)而做其他事情,等到中斷發(fā)生后,CPU 才會(huì)回到傳輸這件事情上來。
| 概念 | 塊頭序列開始 | 它分別在字符前面和后面使用開始位和停止位。 |
| 傳輸方式 | 以塊或幀的形式發(fā)送數(shù)據(jù) | 發(fā)送字節(jié)或者字符 |
| 同步方式 | 同步時(shí)鐘 | 無 |
| 傳輸速率 | 同步傳輸比較快 | 異步傳輸比較慢 |
| 時(shí)間間隔 | 同步傳輸通常是恒定時(shí)間 | 異步傳輸時(shí)間隨機(jī) |
| 開銷 | 同步開銷比較昂貴 | 異步傳輸開銷比較小 |
| 是否存在間隙 | 不存在 | 存在 |
| 實(shí)現(xiàn) | 硬件和軟件 | 只有硬件 |
| 示例 | 聊天室,視頻會(huì)議,電話對話等。 | 信件,電子郵件,論壇 |
緩沖
通常情況下,從一個(gè)設(shè)備發(fā)出的數(shù)據(jù)不會(huì)直接到達(dá)最后的設(shè)備。其間會(huì)經(jīng)過一系列的校驗(yàn)、檢查、緩沖等操作才能到達(dá)。優(yōu)點(diǎn):先到達(dá)緩沖區(qū),從而消除緩沖區(qū)填滿速率和緩沖區(qū)過載。
共享和獨(dú)占
有些 I/O 設(shè)備能夠被許多用戶共同使用,但是某些設(shè)備必須具有獨(dú)占性,即只允許單個(gè)用戶使用完成后才能讓其他用戶使用。
此時(shí)采用**SPOOLing技術(shù)(假脫機(jī)技術(shù))**將物理設(shè)備虛擬為多個(gè)邏輯設(shè)備,在隊(duì)列中調(diào)用設(shè)備,從而實(shí)現(xiàn)共享。
一共有三種控制 I/O 設(shè)備的方法
- 使用程序控制 I/O
- 使用中斷驅(qū)動(dòng) I/O
- 使用 DMA 驅(qū)動(dòng) I/O
使用程序控制 I/O
使用程序控制 I/O 又被稱為 可編程I/O,它是指由 CPU 在驅(qū)動(dòng)程序軟件控制下啟動(dòng)的數(shù)據(jù)傳輸,來訪問設(shè)備上的寄存器或者其他存儲(chǔ)器。CPU 會(huì)發(fā)出命令,然后等待 I/O 操作的完成。由于 CPU 的速度比 I/O 模塊的速度快很多,因此可編程 I/O 的問題在于,CPU 必須等待很長時(shí)間才能等到處理結(jié)果。CPU 在等待時(shí)會(huì)采用輪詢(polling)或者 忙等(busy waiting) 的方式,結(jié)果,整個(gè)系統(tǒng)的性能被嚴(yán)重拉低。
使用中斷驅(qū)動(dòng) I/O
在 CPU 等待 I/O 設(shè)備的同時(shí),能夠做其他事情,等到 I/O 設(shè)備完成后,它就會(huì)產(chǎn)生一個(gè)中斷,這個(gè)中斷會(huì)停止當(dāng)前進(jìn)程并保存當(dāng)前的狀態(tài)。
使用DMA的 I/O
DMA即直接內(nèi)存訪問,它意味著 CPU 授予 I/O 模塊權(quán)限在不涉及 CPU 的情況下讀取或?qū)懭雰?nèi)存。即 IO 過程不需要 CPU 的參與。由于 DMA 設(shè)備可以直接在內(nèi)存之間傳輸數(shù)據(jù),而不是使用 CPU 作為中介,因此可以緩解總線上的擁塞。DMA 通過允許 CPU 執(zhí)行任務(wù),同時(shí) DMA 系統(tǒng)通過系統(tǒng)和內(nèi)存總線傳輸數(shù)據(jù)來提高系統(tǒng)并發(fā)性。
中斷處理程序
中斷處理程序步驟:
設(shè)備驅(qū)動(dòng)程序
操作系統(tǒng)通常會(huì)將驅(qū)動(dòng)程序歸為 字符設(shè)備 和 塊設(shè)備
提供 I/O 設(shè)備到設(shè)備控制器轉(zhuǎn)換的過程的代碼稱為 設(shè)備驅(qū)動(dòng)程序(Device driver)
設(shè)備驅(qū)動(dòng)程序接受到讀寫請求后,會(huì)檢查當(dāng)前設(shè)備是否在使用,如果設(shè)備在使用,請求被排入隊(duì)列中,等待后續(xù)的處理。如果此時(shí)設(shè)備是空閑的,驅(qū)動(dòng)程序會(huì)檢查硬件以了解請求是否能夠被處理。在傳輸開始前,會(huì)啟動(dòng)設(shè)備。等待設(shè)備就緒完成,再進(jìn)行實(shí)際的控制。控制設(shè)備就是對設(shè)備發(fā)出指令。
設(shè)備控制器的主要主責(zé)是控制一個(gè)或多個(gè) I/O 設(shè)備,以實(shí)現(xiàn) I/O 設(shè)備和計(jì)算機(jī)之間的數(shù)據(jù)交換。
設(shè)備控制器接收從 CPU 發(fā)送過來的指令,繼而達(dá)到控制硬件的目的。
了解更多知識(shí)干貨,🙋?♂?關(guān)注公眾號(hào):學(xué)編程的文若
總結(jié)
以上是生活随笔為你收集整理的程序员不得不学的操作系统知识(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python怎样算入门_python初学
- 下一篇: ANDROID 11 文件系统挂载