操作系統(tǒng)

目錄
? ? 1 概述
? ? 2 系統(tǒng)調(diào)用
? ??3 進(jìn)程
? ? 4 內(nèi)存管理
? ? 5 文件系統(tǒng)
? ? 6 I/O

1 概述

1.1 操作系統(tǒng)概念

? ? 程序員不會(huì)直接和硬件打交道,故在硬件的基礎(chǔ)之上,計(jì)算機(jī)安裝了一層軟件,這層軟件能夠通過(guò)響應(yīng)用戶輸入的指令達(dá)到控制硬件的效果,從而滿足用戶需求,這種軟件稱之為操作系統(tǒng) Operating System(OS)。

? ? 常見(jiàn)的操作系統(tǒng)有Windows、Linux、FreeBSD或OS X,這種帶有圖形界面的操作系統(tǒng)統(tǒng)稱為圖形用戶界面(Graphical User Interface, GUI);而基于文本、命令行的通常稱為Shell。兩者統(tǒng)稱為用戶接口程序。

1.2 系統(tǒng)中進(jìn)程的分類

圖 1-1 計(jì)算機(jī)進(jìn)程結(jié)構(gòu)

(1)內(nèi)核態(tài):軟件中最基礎(chǔ)的部分是操作系統(tǒng),運(yùn)行在內(nèi)核態(tài)。

(2)用戶態(tài):運(yùn)行用戶接口程序,可以直接讀取用戶程序的數(shù)據(jù)。

? ? 為了獲取操作系統(tǒng)的服務(wù),用戶程序必須使用系統(tǒng)調(diào)用(System Call),系統(tǒng)調(diào)用會(huì)轉(zhuǎn)換為內(nèi)核態(tài)并且調(diào)用操作系統(tǒng)。

1.3 內(nèi)核

(1)內(nèi)核(Kernel)是操作系統(tǒng)的核心部分。它負(fù)責(zé)系統(tǒng)的內(nèi)存管理,硬件設(shè)備管理,文件系統(tǒng)管理以及應(yīng)用程序管理。

(2)對(duì)比CPU

· CPU(Central Processing Unit)中央處理器
? ? · 組成:控制器+運(yùn)算器
? ? · 根本任務(wù):執(zhí)行命令

· Kernel內(nèi)核
? ? · 連接應(yīng)用程序和硬件的橋梁
? ? · 決定者操作系統(tǒng)的性能和穩(wěn)定性

1.4 計(jì)算機(jī)硬件

(1)計(jì)算機(jī)組件

圖 1-2 計(jì)算機(jī)硬件組件

(2)存儲(chǔ)器

? ? ? ? 存儲(chǔ)器系統(tǒng)采用一種分層次的結(jié)構(gòu)。頂層的存儲(chǔ)器速度最快,但容量小,成本高。層級(jí)機(jī)構(gòu)越向下,其訪問(wèn)效率越低,容量越大,造價(jià)越便宜。

圖 1-3 計(jì)算機(jī)存儲(chǔ)層次結(jié)構(gòu)

· 主存通常是RAM,是內(nèi)存系統(tǒng)的主力軍。

· 還有一些ROM(不可重復(fù)寫(xiě))用于啟動(dòng)計(jì)算機(jī)的引導(dǎo)加載模塊(bootstrap)。

· 需要注意,固態(tài)硬盤(SSD)不是磁盤,固態(tài)硬盤并沒(méi)有可以移動(dòng)的部分,外形也不像唱片,并且數(shù)據(jù)是存儲(chǔ)在存儲(chǔ)器(閃存,一種可重復(fù)擦寫(xiě)的存儲(chǔ)器,速度介于RAM和磁盤之間)中,與磁盤唯一的相似之處就是它也存儲(chǔ)了大量即使在電源關(guān)閉也不會(huì)丟失的數(shù)據(jù)。

· 一些地址的轉(zhuǎn)換和管理,由CPU中的存儲(chǔ)器管理單元MMU部件完成

· 從一個(gè)程序切換到另一個(gè)程序的機(jī)制稱為上下文切換。

(3)計(jì)算機(jī)啟動(dòng)過(guò)程

· BIOS開(kāi)啟?;据斎胼敵鱿到y(tǒng)(Basic Input Output System, BIOS),有底層IO軟件,包括讀鍵盤、寫(xiě)屏幕、磁盤IO以及其他過(guò)程,被保存在閃存中,非易失性。它會(huì)檢測(cè)所安裝的RAM的數(shù)量,鍵盤和其他基礎(chǔ)設(shè)備是否已安裝并且正常響應(yīng)。

· BIOS掃描PCIe和PCI總線并找出連在上面的所有設(shè)備。

· BIOS通過(guò)嘗試存儲(chǔ)在CMOS存儲(chǔ)器中的設(shè)備清單嘗試啟動(dòng)設(shè)備。用戶可以在系統(tǒng)啟動(dòng)后進(jìn)入BIOS配置程序,對(duì)設(shè)備清單進(jìn)行修改。

· 判斷是否能夠從外部CD-ROM和USB驅(qū)動(dòng)程序啟動(dòng),如果沒(méi)有外部驅(qū)動(dòng),則從硬盤啟動(dòng)。

· 將boots設(shè)備中的第一個(gè)扇區(qū)讀入內(nèi)存并執(zhí)行。該扇區(qū)包含一個(gè)程序,程序通常在引導(dǎo)扇區(qū)末尾檢查分區(qū)表以確定哪個(gè)分區(qū)處于活動(dòng)狀態(tài)。

· 從分區(qū)讀入第二個(gè)啟動(dòng)加載程序,該加載器從活動(dòng)分區(qū)中讀取操作系統(tǒng)并啟動(dòng)它。

· 操作系統(tǒng)詢問(wèn)BIOS獲取配置信息。對(duì)每個(gè)設(shè)備來(lái)說(shuō),會(huì)檢查是否有設(shè)備驅(qū)動(dòng)程序。如果沒(méi)有,則會(huì)向用戶詢問(wèn)是否需要插入CD-ROM驅(qū)動(dòng)或者從Internet上下載。

· 有了設(shè)備驅(qū)動(dòng)程序,操作系統(tǒng)把它們加載到內(nèi)核中,然后初始化表,創(chuàng)建所需的后臺(tái)進(jìn)程,并啟動(dòng)登錄程序或GUI

1.5 操作系統(tǒng)擴(kuò)展

? ? 除了在計(jì)算機(jī)初啟動(dòng)時(shí)所裝載的核心操作系統(tǒng)外,許多操作系統(tǒng)還支持額外的擴(kuò)展。比如IO設(shè)備驅(qū)動(dòng)和文件系統(tǒng),這些部件可以按需裝載。

? ? 在UNIX中叫做共享庫(kù)(shared library);Windows中叫動(dòng)態(tài)鏈接庫(kù)(Dynamic Link Library? )DLL,擴(kuò)展名為.dll,在C:\Windows\system32目錄下存在1000多個(gè)DLL文件。

2 系統(tǒng)調(diào)用

2.1 概念

? ? 運(yùn)行用戶程序時(shí),凡是與內(nèi)核態(tài)級(jí)別的資源有關(guān)的操作(若文件管理、進(jìn)程控制、內(nèi)存管理等),都必須通過(guò)系統(tǒng)調(diào)用方式向操作系統(tǒng)提出服務(wù)請(qǐng)求,并由操作系統(tǒng)代為完成。

? ? 只有通過(guò)系統(tǒng)調(diào)用才能進(jìn)入內(nèi)核態(tài)。

2.2 示例

count = read(fd,buffer,nbytes);

圖 2-1 系統(tǒng)調(diào)用示例

2.3 分類

????可移植操作系統(tǒng)接口(POSIX)常用系統(tǒng)調(diào)用(UNIX)如下。 pid是系統(tǒng)進(jìn)程id,fd是文件描述符,n是字節(jié)數(shù),position是在文件中的偏移量,seconds是流逝時(shí)間。

2.3.1 進(jìn)程管理

圖 2-2 進(jìn)程管理系統(tǒng)調(diào)用

2.3.2 文件管理

圖 2-3 文件管理系統(tǒng)調(diào)用

2.3.3 目錄和文件系統(tǒng)管理

圖 2-4 文件管理系統(tǒng)調(diào)用

2.3.4 其他

圖 2-5 其他系統(tǒng)調(diào)用

2.4 Windows系統(tǒng)調(diào)用

? ? Windows中,函數(shù)庫(kù)的調(diào)用和實(shí)際的系統(tǒng)調(diào)用幾乎是不對(duì)應(yīng)的。微軟定義了一系列過(guò)程,稱為Win32應(yīng)用編程接口(Application Programming Interface),即Win32 API。

圖 2-6 Win32 API

3 進(jìn)程

3.1 進(jìn)程概念

(1)進(jìn)程的本質(zhì)就是操作系統(tǒng)執(zhí)行的一個(gè)程序。

(2)地址空間:進(jìn)程在其中可以進(jìn)行讀寫(xiě)操作和記錄相關(guān)的資源級(jí),包括程序計(jì)數(shù)器、堆棧指針、打開(kāi)文件的清單等

(3)操作系統(tǒng)中存在一個(gè)進(jìn)程表,是數(shù)組或者鏈表結(jié)構(gòu),當(dāng)前存在的每個(gè)進(jìn)程都要占據(jù)其中的一項(xiàng)。故一個(gè)掛起的進(jìn)程包括:進(jìn)程的地址空間和對(duì)應(yīng)的進(jìn)程表項(xiàng)。

圖 3-1 進(jìn)程表表項(xiàng)示例

3.2 對(duì)比線程

(1)線程是進(jìn)程的更小運(yùn)行單位,一個(gè)進(jìn)程可以有多個(gè)線程

(2)進(jìn)程基本上獨(dú)立,但線程會(huì)相互影響

(3)線程開(kāi)銷小,但不利于資源的管理和保護(hù),但進(jìn)程相反。

3.3 進(jìn)程生命周期

圖 3-2 進(jìn)程生命周期


(1)創(chuàng)建狀態(tài)(new)

? ? · 進(jìn)程正在被創(chuàng)建,尚未到就緒狀態(tài)。

? ? · 創(chuàng)建進(jìn)程的方式:
? ? ? ? · 系統(tǒng)初始化
? ? ? ? · 正在運(yùn)行的程序執(zhí)行了創(chuàng)建進(jìn)程的系統(tǒng)調(diào)用(fork)
? ? ? ? · 用戶請(qǐng)求創(chuàng)建一個(gè)新進(jìn)程
? ? ? ? · 初始化一個(gè)批處理工作

(2)就緒狀態(tài)(ready)

? ? 獲得了除CPU時(shí)間片外的一切資源

(3)運(yùn)行(running)

? ? 進(jìn)程在處理器中運(yùn)行

(4)阻塞(waiting)

? ? 進(jìn)程正在等待某一事件而暫停運(yùn)行,如等待某資源為可用或等待IO操作完成。即使處理器空閑,進(jìn)程也不能運(yùn)行。

(5)終止(terminated)

? ? ·進(jìn)程從系統(tǒng)中消失。

? ? · 常見(jiàn)終止情況:
? ? ? ? · 正常退出(自愿)
? ? ? ? · 錯(cuò)誤退出(自愿)
? ? ? ? · 嚴(yán)重錯(cuò)誤(非自愿)
? ? ? ? · 被其他進(jìn)程殺死(非自愿)

3.4 進(jìn)程通信方式

(1)管道/匿名管道(Pipes)?:

? ? · 用于具有親緣關(guān)系的父子進(jìn)程間或者兄弟進(jìn)程之間的通信。

? ? · 半雙工通信:數(shù)據(jù)只能單向流動(dòng)

? ? · 數(shù)據(jù)從管道一端寫(xiě)入,從另一端寫(xiě)出

(2)有名管道(Names Pipes)?:?

? ? · 有名管道嚴(yán)格遵循**先進(jìn)先出(first in first out)**。

? ? · 名字存在內(nèi)存中,內(nèi)容以磁盤文件方式存儲(chǔ)。

? ? · 有名管道以磁盤文件的方式存在,可以實(shí)現(xiàn)本機(jī)任意兩個(gè)進(jìn)程通信。

(3)信號(hào)(Signal)?:

? ? · 信號(hào)是一種比較復(fù)雜的通信方式,用于通知接收進(jìn)程某個(gè)事件已經(jīng)發(fā)生。

? ? · 信號(hào)可以在任何時(shí)候發(fā)給某一進(jìn)程,無(wú)需知道該進(jìn)程的狀態(tài)

? ? · 進(jìn)程未處于執(zhí)行狀態(tài),則信號(hào)由內(nèi)核保存,知道進(jìn)程回復(fù)

? ? · 信號(hào)是軟件層次上對(duì)中斷機(jī)制的一種模擬,是異步通信。

(4)消息隊(duì)列(Message Queuing)?:

? ? · 消息隊(duì)列是消息的鏈表,具有特定的格式,存放在內(nèi)存中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí)。

? ? · 管道和消息隊(duì)列的通信數(shù)據(jù)都是先進(jìn)先出的原則。

? ? · 消息隊(duì)列存放在內(nèi)核中,只有在內(nèi)核重啟(即,操作系統(tǒng)重啟)或者顯示地刪除一個(gè)消息隊(duì)列時(shí),該消息隊(duì)列才會(huì)被真正的刪除。

? ? · 消息隊(duì)列可以實(shí)現(xiàn)消息的隨機(jī)查詢,消息不一定要以先進(jìn)先出的次序讀取,也可以按消息的類型讀取.比 FIFO 更有優(yōu)勢(shì)。

(5)信號(hào)量(Semaphores)?:信號(hào)量是一個(gè)計(jì)數(shù)器,用于多進(jìn)程對(duì)共享數(shù)據(jù)的訪問(wèn),信號(hào)量的意圖在于進(jìn)程間同步。這種通信方式主要用于解決與同步相關(guān)的問(wèn)題并避免競(jìng)爭(zhēng)條件。

(6)共享內(nèi)存(Shared memory)?:

? ? · 使得多個(gè)進(jìn)程可以訪問(wèn)同一塊內(nèi)存空間,不同進(jìn)程可以及時(shí)看到對(duì)方進(jìn)程中對(duì)共享內(nèi)存中數(shù)據(jù)的更新。

? ? · 內(nèi)核中專門有一塊內(nèi)存區(qū),由需要訪問(wèn)的進(jìn)程將其映射到自己的私有空間。

(7)套接字(Sockets)?:?

? ? 此方法主要用于在客戶端和服務(wù)器之間通過(guò)網(wǎng)絡(luò)進(jìn)行通信。

3.5 進(jìn)程調(diào)度算法

????為了確定首先執(zhí)行哪個(gè)進(jìn)程以及最后執(zhí)行哪個(gè)進(jìn)程以實(shí)現(xiàn)最大 CPU 利用率,計(jì)算機(jī)科學(xué)家已經(jīng)定義了一些算法,它們是:

(1)先到先服務(wù)(FCFS)調(diào)度算法?: 從就緒隊(duì)列中選擇一個(gè)最先進(jìn)入該隊(duì)列的進(jìn)程為之分配資源,使它立即執(zhí)行并一直執(zhí)行到完成或發(fā)生某事件而被阻塞放棄占用 CPU 時(shí)再重新調(diào)度。

(2)短作業(yè)優(yōu)先(SJF)的調(diào)度算法?: 從就緒隊(duì)列中選出一個(gè)估計(jì)運(yùn)行時(shí)間最短的進(jìn)程為之分配資源,使它立即執(zhí)行并一直執(zhí)行到完成或發(fā)生某事件而被阻塞放棄占用 CPU 時(shí)再重新調(diào)度。

(3)時(shí)間片輪轉(zhuǎn)調(diào)度算法?: 時(shí)間片輪轉(zhuǎn)調(diào)度是一種最古老,最簡(jiǎn)單,最公平且使用最廣的算法,又稱 RR(Round robin)調(diào)度。每個(gè)進(jìn)程被分配一個(gè)時(shí)間段,稱作它的時(shí)間片,即該進(jìn)程允許運(yùn)行的時(shí)間。

(4)多級(jí)反饋隊(duì)列調(diào)度算法?:前面介紹的幾種進(jìn)程調(diào)度的算法都有一定的局限性。如短進(jìn)程優(yōu)先的調(diào)度算法,僅照顧了短進(jìn)程而忽略了長(zhǎng)進(jìn)程?。多級(jí)反饋隊(duì)列調(diào)度算法既能使高優(yōu)先級(jí)的作業(yè)得到響應(yīng)又能使短作業(yè)(進(jìn)程)迅速完成。,因而它是目前被公認(rèn)的一種較好的進(jìn)程調(diào)度算法,UNIX 操作系統(tǒng)采取的便是這種調(diào)度算法。

(5)優(yōu)先級(jí)調(diào)度?: 為每個(gè)流程分配優(yōu)先級(jí),首先執(zhí)行具有最高優(yōu)先級(jí)的進(jìn)程,依此類推。具有相同優(yōu)先級(jí)的進(jìn)程以 FCFS 方式執(zhí)行。可以根據(jù)內(nèi)存要求,時(shí)間要求或任何其他資源要求來(lái)確定優(yōu)先級(jí)。

4 內(nèi)存管理

4.1 概念

????操作系統(tǒng)的內(nèi)存管理主要負(fù)責(zé)內(nèi)存的分配與回收(malloc 函數(shù):申請(qǐng)內(nèi)存,free 函數(shù):釋放內(nèi)存),另外地址轉(zhuǎn)換也就是將邏輯地址轉(zhuǎn)換成相應(yīng)的物理地址等功能也是操作系統(tǒng)內(nèi)存管理做的事情。

4.2 內(nèi)存管理方式

(1)塊式管理?: 遠(yuǎn)古時(shí)代的計(jì)算機(jī)操系統(tǒng)的內(nèi)存管理方式。將內(nèi)存分為幾個(gè)固定大小的塊,每個(gè)塊中只包含一個(gè)進(jìn)程。如果程序運(yùn)行需要內(nèi)存的話,操作系統(tǒng)就分配給它一塊,如果程序運(yùn)行只需要很小的空間的話,分配的這塊內(nèi)存很大一部分幾乎被浪費(fèi)了。這些在每個(gè)塊中未被利用的空間,我們稱之為碎片

(2)頁(yè)式管理?:把主存分為大小相等且固定的一頁(yè)一頁(yè)的形式,頁(yè)較小,相對(duì)相比于塊式管理的劃分力度更大,提高了內(nèi)存利用率,減少了碎片。頁(yè)式管理通過(guò)頁(yè)表對(duì)應(yīng)邏輯地址和物理地址

圖 4-1 頁(yè)表映射物理地址
圖 4-2 頁(yè)表格式

(3)段式管理?: 頁(yè)式管理雖然提高了內(nèi)存利用率,但是頁(yè)式管理其中的頁(yè)實(shí)際并無(wú)任何實(shí)際意義。 段式管理把主存分為一段段的,每一段的空間又要比一頁(yè)的空間小很多 。但是,最重要的是段是有實(shí)際意義的,每個(gè)段定義了一組邏輯信息,例如,有主程序段 MAIN、子程序段 X、數(shù)據(jù)段 D 及棧段 S 等。 段式管理通過(guò)段表對(duì)應(yīng)邏輯地址和物理地址。

(4)段頁(yè)式管理機(jī)制?。段頁(yè)式管理機(jī)制結(jié)合了段式管理和頁(yè)式管理的優(yōu)點(diǎn)。簡(jiǎn)單來(lái)說(shuō)段頁(yè)式管理機(jī)制就是把主存先分成若干段,每個(gè)段又分成若干頁(yè),也就是說(shuō)?段頁(yè)式管理機(jī)制?中段與段之間以及段的內(nèi)部的都是離散的。

4.3 快表和多級(jí)頁(yè)表

????在分頁(yè)內(nèi)存管理中,很重要的兩點(diǎn)是:

· 虛擬地址到物理地址的轉(zhuǎn)換要快。

· 解決虛擬地址空間大,頁(yè)表也會(huì)很大的問(wèn)題。

4.3.1 快表

(1)目的

? ? 加快虛擬地址到物理地址的轉(zhuǎn)換速度。

(2)實(shí)現(xiàn)

? ??把快表理解為一種特殊的高速緩沖存儲(chǔ)器(Cache),其中的內(nèi)容是頁(yè)表的一部分或者全部?jī)?nèi)容。作為頁(yè)表的 Cache,它的作用與頁(yè)表相似,但是提高了訪問(wèn)速率。由于采用頁(yè)表做地址轉(zhuǎn)換,讀寫(xiě)內(nèi)存數(shù)據(jù)時(shí) CPU 要訪問(wèn)兩次主存。有了快表,有時(shí)只要訪問(wèn)一次高速緩沖存儲(chǔ)器,一次主存,這樣可加速查找并提高指令執(zhí)行速度。

4.3.2 多級(jí)頁(yè)表

(1)目的

? ??為了避免把全部頁(yè)表一直放在內(nèi)存中占用過(guò)多空間,特別是那些根本就不需要的頁(yè)表就不需要保留在內(nèi)存中。多級(jí)頁(yè)表屬于時(shí)間換空間的典型場(chǎng)景

(2)實(shí)現(xiàn)

? ? 頁(yè)表一定要覆蓋全部虛擬空間,使用多級(jí)可以減少第一級(jí)頁(yè)表大小。

圖 4-3 多級(jí)頁(yè)表
圖 4-4 多級(jí)頁(yè)表的虛擬地址劃分

(3)原理

? ? · 二級(jí)頁(yè)表可以不存在。很多一級(jí)頁(yè)表項(xiàng)沒(méi)有用,則不用創(chuàng)建二級(jí)頁(yè)表。

? ? · 二級(jí)頁(yè)表可以不在主存。某一時(shí)刻只有很少一部分二級(jí)頁(yè)表在使用,可以把二級(jí)頁(yè)表放在磁盤,在需要時(shí)調(diào)入到內(nèi)存。

4.4 虛擬地址空間

4.4.1 概念

? ??邏輯地址(虛擬地址)和物理地址

????我們編程一般只有可能和邏輯地址打交道,比如在 C 語(yǔ)言中,指針里面存儲(chǔ)的數(shù)值就可以理解成為內(nèi)存里的一個(gè)地址,這個(gè)地址也就是我們說(shuō)的邏輯地址,邏輯地址由操作系統(tǒng)決定。物理地址指的是真實(shí)物理內(nèi)存中地址,更具體一點(diǎn)來(lái)說(shuō)就是內(nèi)存地址寄存器中的地址。物理地址是內(nèi)存單元真正的地址。

4.4.2 CPU尋址

????現(xiàn)代處理器使用的是一種稱為?虛擬尋址(Virtual Addressing)?的尋址方式。使用虛擬尋址,CPU 需要將虛擬地址翻譯成物理地址,這樣才能訪問(wèn)到真實(shí)的物理內(nèi)存。?實(shí)際上完成虛擬地址轉(zhuǎn)換為物理地址轉(zhuǎn)換的硬件是 CPU 中含有一個(gè)被稱為?內(nèi)存管理單元(Memory Management Unit, MMU)?的硬件。

圖 4-5 CPU虛擬尋址
圖 4-6 分頁(yè)虛擬地址映射

4.4.3 目的

? ??如果直接把物理地址暴露出來(lái)的話會(huì)帶來(lái)嚴(yán)重問(wèn)題,比如可能對(duì)操作系統(tǒng)造成傷害以及給同時(shí)運(yùn)行多個(gè)程序造成困難。

4.4.4 優(yōu)勢(shì)

(1)程序可以使用一系列相鄰的虛擬地址來(lái)訪問(wèn)物理內(nèi)存中不相鄰的大內(nèi)存緩沖區(qū)。

(2)程序可以使用一系列虛擬地址來(lái)訪問(wèn)大于可用物理內(nèi)存的內(nèi)存緩沖區(qū)。當(dāng)物理內(nèi)存的供應(yīng)量變小時(shí),內(nèi)存管理器會(huì)將物理內(nèi)存頁(yè)(通常大小為 4 KB)保存到磁盤文件。數(shù)據(jù)或代碼頁(yè)會(huì)根據(jù)需要在物理內(nèi)存與磁盤之間移動(dòng)。

(3)不同進(jìn)程使用的虛擬地址彼此隔離。一個(gè)進(jìn)程中的代碼無(wú)法更改正在由另一進(jìn)程或操作系統(tǒng)使用的物理內(nèi)存。

4.5 虛擬內(nèi)存

4.5.1 概念

? ??虛擬內(nèi)存為每個(gè)進(jìn)程提供了一個(gè)一致的、私有的地址空間,它讓每個(gè)進(jìn)程產(chǎn)生了一種有一片連續(xù)完整的內(nèi)存空間的錯(cuò)覺(jué)。這樣會(huì)更加有效地管理內(nèi)存并減少出錯(cuò)。

? ??虛擬內(nèi)存的重要意義是它定義了一個(gè)連續(xù)的虛擬地址空間,并且?把內(nèi)存擴(kuò)展到硬盤空間。

4.5.2 局部性原理(2-8原則)

4.5.2.1 概述

? ??我們的程序在執(zhí)行的時(shí)候往往呈現(xiàn)局部性規(guī)律,也就是說(shuō)在某個(gè)較短的時(shí)間段內(nèi),程序執(zhí)行局限于某一小部分,程序訪問(wèn)的存儲(chǔ)空間也局限于某個(gè)區(qū)域。

4.5.2.2 表現(xiàn)

(1)時(shí)間局部性?:如果程序中的某條指令一旦執(zhí)行,不久以后該指令可能再次執(zhí)行;如果某數(shù)據(jù)被訪問(wèn)過(guò),不久以后該數(shù)據(jù)可能再次被訪問(wèn)。產(chǎn)生時(shí)間局部性的典型原因,是由于在程序中存在著大量的循環(huán)操作。

(2)空間局部性?:一旦程序訪問(wèn)了某個(gè)存儲(chǔ)單元,在不久之后,其附近的存儲(chǔ)單元也將被訪問(wèn),即程序在一段時(shí)間內(nèi)所訪問(wèn)的地址,可能集中在一定的范圍之內(nèi),這是因?yàn)橹噶钔ǔJ琼樞虼娣拧㈨樞驁?zhí)行的,數(shù)據(jù)也一般是以向量、數(shù)組、表等形式簇聚存儲(chǔ)的。

4.5.3 虛擬存儲(chǔ)器

(1)基于局部性原理,在程序裝入時(shí),可以將程序的一部分裝入內(nèi)存,而將其他部分留在外存,就可以啟動(dòng)程序執(zhí)行。

(2)在程序執(zhí)行過(guò)程中,當(dāng)所訪問(wèn)的信息不在內(nèi)存時(shí),由操作系統(tǒng)將所需要的部分調(diào)入內(nèi)存,然后繼續(xù)執(zhí)行程序。另一方面,操作系統(tǒng)將內(nèi)存中暫時(shí)不使用的內(nèi)容換到外存上,從而騰出空間存放將要調(diào)入內(nèi)存的信息。這樣,計(jì)算機(jī)好像為用戶提供了一個(gè)比實(shí)際內(nèi)存大的多的存儲(chǔ)器——虛擬存儲(chǔ)器。

4.5.4 技術(shù)實(shí)現(xiàn)

? ??虛擬內(nèi)存的實(shí)現(xiàn)需要建立在離散分配的內(nèi)存管理方式的基礎(chǔ)上。?虛擬內(nèi)存的實(shí)現(xiàn)有以下三種方式:

(1)請(qǐng)求分頁(yè)存儲(chǔ)管理?:建立在分頁(yè)管理之上,為了支持虛擬存儲(chǔ)器功能而增加了請(qǐng)求調(diào)頁(yè)功能和頁(yè)面置換功能。請(qǐng)求分頁(yè)是目前最常用的一種實(shí)現(xiàn)虛擬存儲(chǔ)器的方法。請(qǐng)求分頁(yè)存儲(chǔ)管理系統(tǒng)中,在作業(yè)開(kāi)始運(yùn)行之前,僅裝入當(dāng)前要執(zhí)行的部分段即可運(yùn)行。假如在作業(yè)運(yùn)行的過(guò)程中發(fā)現(xiàn)要訪問(wèn)的頁(yè)面不在內(nèi)存,則由處理器通知操作系統(tǒng)按照對(duì)應(yīng)的頁(yè)面置換算法將相應(yīng)的頁(yè)面調(diào)入到主存,同時(shí)操作系統(tǒng)也可以將暫時(shí)不用的頁(yè)面置換到外存中。

(2)請(qǐng)求分段存儲(chǔ)管理?:建立在分段存儲(chǔ)管理之上,增加了請(qǐng)求調(diào)段功能、分段置換功能。請(qǐng)求分段儲(chǔ)存管理方式就如同請(qǐng)求分頁(yè)儲(chǔ)存管理方式一樣,在作業(yè)開(kāi)始運(yùn)行之前,僅裝入當(dāng)前要執(zhí)行的部分段即可運(yùn)行;在執(zhí)行過(guò)程中,可使用請(qǐng)求調(diào)入中斷動(dòng)態(tài)裝入要訪問(wèn)但又不在內(nèi)存的程序段;當(dāng)內(nèi)存空間已滿,而又需要裝入新的段時(shí),根據(jù)置換功能適當(dāng)調(diào)出某個(gè)段,以便騰出空間而裝入新的段。

(3)請(qǐng)求段頁(yè)式存儲(chǔ)管理

4.5.6 頁(yè)面置換算法

? ??缺頁(yè)中斷:如果需執(zhí)行的指令或訪問(wèn)的數(shù)據(jù)尚未在內(nèi)存(稱為缺頁(yè)或缺段),則由處理器通知操作系統(tǒng)將相應(yīng)的頁(yè)面或段調(diào)入到內(nèi)存,然后繼續(xù)執(zhí)行程序。

????當(dāng)發(fā)生缺頁(yè)中斷時(shí),如果當(dāng)前內(nèi)存中并沒(méi)有空閑的頁(yè)面,操作系統(tǒng)就必須在內(nèi)存選擇一個(gè)頁(yè)面將其移出內(nèi)存,以便為即將調(diào)入的頁(yè)面讓出空間。用來(lái)選擇淘汰哪一頁(yè)的規(guī)則叫做頁(yè)面置換算法,我們可以把頁(yè)面置換算法看成是淘汰頁(yè)面的規(guī)則。

(1)OPT 頁(yè)面置換算法(最佳頁(yè)面置換算法)?:最佳(Optimal, OPT)置換算法所選擇的被淘汰頁(yè)面將是以后永不使用的,或者是在最長(zhǎng)時(shí)間內(nèi)不再被訪問(wèn)的頁(yè)面,這樣可以保證獲得最低的缺頁(yè)率。但由于人們目前無(wú)法預(yù)知進(jìn)程在內(nèi)存下的若千頁(yè)面中哪個(gè)是未來(lái)最長(zhǎng)時(shí)間內(nèi)不再被訪問(wèn)的,因而該算法無(wú)法實(shí)現(xiàn)。一般作為衡量其他置換算法的方法。

(2)FIFO(First In First Out) 頁(yè)面置換算法(先進(jìn)先出頁(yè)面置換算法)?: 總是淘汰最先進(jìn)入內(nèi)存的頁(yè)面,即選擇在內(nèi)存中駐留時(shí)間最久的頁(yè)面進(jìn)行淘汰。

(3)LRU (Least Currently Used)頁(yè)面置換算法(最近最久未使用頁(yè)面置換算法)?:LRU算法賦予每個(gè)頁(yè)面一個(gè)訪問(wèn)字段,用來(lái)記錄一個(gè)頁(yè)面自上次被訪問(wèn)以來(lái)所經(jīng)歷的時(shí)間 T,當(dāng)須淘汰一個(gè)頁(yè)面時(shí),選擇現(xiàn)有頁(yè)面中其 T 值最大的,即最近最久未使用的頁(yè)面予以淘汰。

(4)LFU (Least Frequently Used)頁(yè)面置換算法(最少使用頁(yè)面置換算法)?: 該置換算法選擇在之前時(shí)期使用最少的頁(yè)面作為淘汰頁(yè)。

5 文件系統(tǒng)

5.1 文件命名

圖 5-1 文件命名方式

5.2 訪問(wèn)路徑

圖 5-2 不同OS訪問(wèn)路徑格式
圖 5-3 特殊符號(hào)

5.3 磁盤分區(qū)

圖 5-3 磁盤分區(qū)概念
圖 5-4 分區(qū)示意圖

6 I/O

6.1 分類

? ? IO設(shè)備分為塊設(shè)備和字符設(shè)備。

· 塊設(shè)備:固定大小塊信息。硬盤、光盤、USB等

· 字符設(shè)備:鍵盤、鼠標(biāo)等

6.2 IO設(shè)備形式

圖 6-1 IO設(shè)備形式

6.3 尋址方式

(1)內(nèi)存映射IO

(2)直接內(nèi)存訪問(wèn)

圖 6-2 DMA示意圖

? ? 不管DMA控制器的物理地址在哪,它都能獨(dú)立于CPU從而訪問(wèn)系統(tǒng)總線。

6.4 IO模型

[Linux] 操作系統(tǒng)五種IO模型_giturtle's blog-CSDN博客_操作系統(tǒng)io模型

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容