操作系統(tǒng)

一 操作系統(tǒng)基礎(chǔ)

1、什么是操作系統(tǒng)

操作系統(tǒng)(Operating System,簡(jiǎn)稱 OS)是配置在計(jì)算機(jī)硬件上的第一層軟件,是對(duì)硬件系統(tǒng)的首次擴(kuò)充。其主要作用是管理好這些設(shè)備,提高它們的利用率和系統(tǒng)的吞吐量,并為用戶和應(yīng)用程序提供一個(gè)簡(jiǎn)單的接口,便于用戶使用。OS是現(xiàn)代計(jì)算機(jī)系統(tǒng)中最基本和最重要的系統(tǒng)軟件,而其它的諸如編譯程序、數(shù)據(jù)庫(kù)系統(tǒng)管理系統(tǒng)等系統(tǒng)軟件,以及大量的應(yīng)用軟件,都直接依賴于操作系統(tǒng)的支持,取得它所提供的服務(wù)。

2、操作系統(tǒng)的作用

  • OS作為用戶與計(jì)算機(jī)硬件系統(tǒng)之間的接口
  • OS作為計(jì)算機(jī)系統(tǒng)資源的管理者
  • OS實(shí)現(xiàn)了對(duì)計(jì)算機(jī)資源的抽象

3、操作系統(tǒng)的內(nèi)核

操作系統(tǒng)的內(nèi)核(Kernel)是操作系統(tǒng)的核?部分,它負(fù)責(zé)系統(tǒng)的內(nèi)存管理,硬件設(shè)備的管理,?件系統(tǒng)的管理以及應(yīng)?程序的管理。 內(nèi)核是連接應(yīng)?程序和硬件的橋梁,決定著系統(tǒng)的性能和穩(wěn)定性。

4、內(nèi)核態(tài)和系統(tǒng)態(tài)

為了防止OS本身及關(guān)鍵數(shù)據(jù)(如PCB等)遭受到應(yīng)用程序有意或無(wú)意的破壞,通常將處理機(jī)的執(zhí)行狀態(tài)分成系統(tǒng)態(tài)和用戶態(tài)兩種:

  • 系統(tǒng)態(tài)(內(nèi)核態(tài)):它具有較高的特權(quán),能執(zhí)行一切指令,訪問(wèn)所有寄存器的存儲(chǔ)區(qū),傳統(tǒng)的OS都在系統(tǒng)態(tài)運(yùn)行。
  • 用戶態(tài):它是具有較低特權(quán)的執(zhí)行狀態(tài),僅能執(zhí)行規(guī)定的指令,訪問(wèn)指定的寄存器和存儲(chǔ)區(qū)。

一般情況下,應(yīng)用程序只能在用戶態(tài)運(yùn)行,不能執(zhí)行OS指令及訪問(wèn)OS區(qū)域,這樣可以防止應(yīng)用程序?qū)S的破壞。

5、什么是系統(tǒng)調(diào)用

我們運(yùn)?的程序基本都是運(yùn)?在?戶態(tài),如果我們需要調(diào)?操作系統(tǒng)提供的系統(tǒng)態(tài)級(jí)別的?功能,就需要使用系統(tǒng)調(diào)?。也就是說(shuō)在我們運(yùn)?的?戶程序中,凡是與系統(tǒng)態(tài)級(jí)別的資源有關(guān)的操作(如?件管理、進(jìn)程控制、內(nèi)存管理等),都必須通過(guò)系統(tǒng)調(diào)??式向操作系統(tǒng)提出服務(wù)請(qǐng)求,并由操作系統(tǒng)代為完成。

6、系統(tǒng)調(diào)用的類(lèi)型

  • 設(shè)備管理。完成設(shè)備的請(qǐng)求或釋放,以及設(shè)備啟動(dòng)等功能。
  • ?件管理。完成?件的讀、寫(xiě)、創(chuàng)建及刪除等功能。
  • 進(jìn)程控制。完成進(jìn)程的創(chuàng)建、撤銷(xiāo)、阻塞及喚醒等功能。
  • 進(jìn)程通信。完成進(jìn)程之間的消息傳遞或信號(hào)傳遞等功能。
  • 內(nèi)存管理。完成內(nèi)存的分配、回收以及獲取作業(yè)占?內(nèi)存區(qū)??及地址等功能。

二 進(jìn)程和線程

1、進(jìn)程和線程的概念

  • 進(jìn)程:程序執(zhí)行時(shí)的一個(gè)實(shí)例,每個(gè)進(jìn)程都有獨(dú)立的內(nèi)存地址空間,是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位。
  • 線程:進(jìn)程中的一個(gè)實(shí)體,比進(jìn)程更加輕量,是CPU 調(diào)度和分派的基本單位。

2、進(jìn)程和線程的區(qū)別

  • 本質(zhì):進(jìn)程是操作系統(tǒng)資源分配的基本單位;線程是任務(wù)調(diào)度和執(zhí)行的基本單位。
  • 內(nèi)存分配:系統(tǒng)在運(yùn)行的時(shí)候會(huì)為每個(gè)進(jìn)程分配不同的內(nèi)存空間,建立數(shù)據(jù)表來(lái)維護(hù)代碼段、堆棧段和數(shù)據(jù)段;除了 CPU 外,系統(tǒng)不會(huì)為線程分配內(nèi)存,線程所使用的資源來(lái)自其所屬進(jìn)程的資源。
  • 資源擁有:進(jìn)程之間的資源是獨(dú)立的,無(wú)法共享;同一進(jìn)程的所有線程共享本進(jìn)程的資源,如內(nèi)存,CPU,IO 等
  • 開(kāi)銷(xiāo):每個(gè)進(jìn)程都有獨(dú)立的代碼和數(shù)據(jù)空間,程序之間的切換會(huì)有較大的開(kāi)銷(xiāo);線程可以看做輕量級(jí)的進(jìn)程,同一類(lèi)線程共享代碼和數(shù)據(jù)空間,每個(gè)線程都有自己獨(dú)立的運(yùn)行程序計(jì)數(shù)器和棧,線程之間切換的開(kāi)銷(xiāo)小。
  • 通信:進(jìn)程間 以IPC(管道,信號(hào)量,共享內(nèi)存,消息隊(duì)列,文件,套接字等)方式通信 ;同一個(gè)進(jìn)程下,線程間可以共享全局變量、靜態(tài)變量等數(shù)據(jù)進(jìn)行通信,做到同步和互斥,以保證數(shù)據(jù)的一致性。
  • 調(diào)度和切換:線程上下文切換比進(jìn)程上下文切換快,代價(jià)小。
  • 執(zhí)行過(guò)程:每個(gè)進(jìn)程都有一個(gè)程序執(zhí)行的入口,順序執(zhí)行序列;線程不能夠獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由程序的多線程控制機(jī)制控制。
  • 健壯性:每個(gè)進(jìn)程之間的資源是獨(dú)立的,當(dāng)一個(gè)進(jìn)程崩潰時(shí),不會(huì)影響其他進(jìn)程;同一進(jìn)程的線程共享此線程的資源,當(dāng)一個(gè)線程發(fā)生崩潰時(shí),此進(jìn)程也會(huì)發(fā)生崩潰,穩(wěn)定性差,容易出現(xiàn)共享與資源競(jìng)爭(zhēng)產(chǎn)生的各種問(wèn)題,如死鎖等
  • 可維護(hù)性:線程的可維護(hù)性,代碼也較難調(diào)試,bug 難排查。

3、進(jìn)程有哪幾種狀態(tài)

  1. 創(chuàng)建狀態(tài)(new) :進(jìn)程正在被創(chuàng)建,尚未到就緒狀態(tài)。
  2. 就緒狀態(tài)(ready) :進(jìn)程已處于準(zhǔn)備運(yùn)?狀態(tài),即進(jìn)程獲得了除了處理器之外的?切所需資源,?旦得到處理器資源(處理器分配的時(shí)間?)即可運(yùn)?。
  3. 運(yùn)?狀態(tài)(running) :進(jìn)程正在處理器上上運(yùn)?(單核 CPU 下任意時(shí)刻只有?個(gè)進(jìn)程處于運(yùn)?狀態(tài))。
  4. 阻塞狀態(tài)(waiting) :?稱為等待狀態(tài),進(jìn)程正在等待某?事件?暫停運(yùn)?如等待某資源為可?或等待 IO 操作完成。即使處理器空閑,該進(jìn)程也不能運(yùn)?。
  5. 結(jié)束狀態(tài)(terminated) :進(jìn)程正在從系統(tǒng)中消失??赡苁沁M(jìn)程正常結(jié)束或其他原因中斷退出運(yùn)?。

4、進(jìn)程間的通信方式

  1. 管道/匿名管道(Pipes) :?于具有親緣關(guān)系的父子進(jìn)程間或者兄弟進(jìn)程之間的通信。
  2. 有名管道(Names Pipes) : 匿名管道由于沒(méi)有名字,只能?于親緣關(guān)系的進(jìn)程間通信。為了克服這個(gè)缺點(diǎn),提出了有名管道。有名管道嚴(yán)格遵循先進(jìn)先出(first in first out)。有名管道以磁盤(pán)?件的?式存在,可以實(shí)現(xiàn)本機(jī)任意兩個(gè)進(jìn)程通信。
  3. 信號(hào)(Signal) :信號(hào)是?種復(fù)雜的通信?式,?于通知接收進(jìn)程某個(gè)事件已經(jīng)發(fā)?;
  4. 消息隊(duì)列(Message Queuing) :消息隊(duì)列是消息的鏈表,具有特定的格式,存放在內(nèi)存中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí)。管道和消息隊(duì)列的通信數(shù)據(jù)都是先進(jìn)先出的原則。與管道(?名管道:只存在于內(nèi)存中的?件;命名管道:存在于實(shí)際的磁盤(pán)介質(zhì)或者?件系統(tǒng))不同的是消息隊(duì)列存放在內(nèi)核中,只有在內(nèi)核重啟(即,操作系統(tǒng)重啟)或者顯示地刪除?個(gè)消息隊(duì)列時(shí),該消息隊(duì)列才會(huì)被真正的刪除。消息隊(duì)列可以實(shí)現(xiàn)消息的隨機(jī)查詢,消息不?定要以先進(jìn)先出的次序讀取,也可以按消息的類(lèi)型讀取.? FIFO 更有優(yōu)勢(shì)。消息隊(duì)列克服了信號(hào)承載信息量少,管道只能承載?格式字節(jié)流以及緩沖區(qū)??受限等缺。
  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ù)的更新。這種?式需要依靠某種同步操作,如互斥鎖和信號(hào)量等??梢哉f(shuō)這是最有?的進(jìn)程間通信?式。
  7. 套接字(Sockets) : 此?法主要?于在客戶端和服務(wù)器之間通過(guò)?絡(luò)進(jìn)?通信。套接字是?持 TCP/IP 的?絡(luò)通信的基本操作單元,可以看做是不同主機(jī)之間的進(jìn)程進(jìn)?雙向通信的端點(diǎn),簡(jiǎn)單的說(shuō)就是通信的兩?的?種約定,?套接字中的相關(guān)函數(shù)來(lái)完成通信過(guò)程。

5、線程間的同步方式

線程同步是兩個(gè)或多個(gè)共享關(guān)鍵資源的線程的并發(fā)執(zhí)?,同步線程是為了避免關(guān)鍵資源的使?沖突。
操作系統(tǒng)?般有下?三種線程同步的?式:

  1. 互斥量(Mutex):采?互斥對(duì)象機(jī)制,只有擁有互斥對(duì)象的線程才有訪問(wèn)公共資源的權(quán)限。因?yàn)榛コ鈱?duì)象只有?個(gè),所以可以保證公共資源不會(huì)被多個(gè)線程同時(shí)訪問(wèn)。?如 Java 中的synchronized 關(guān)鍵詞和各種 Lock 都是這種機(jī)制。
  2. 信號(hào)量(Semphares) :它允許同?時(shí)刻多個(gè)線程訪問(wèn)同?資源,但是需要控制同?時(shí)刻訪問(wèn)此資源的最?線程數(shù)量。
  3. 事件(Event) :Wait/Notify:通過(guò)通知操作的?式來(lái)保持多線程同步,還可以?便的實(shí)現(xiàn)多線程優(yōu)先級(jí)的比較操作。

6、進(jìn)程調(diào)度方式

  1. 非搶占方式
    在采用這種調(diào)度方式時(shí),一旦把處理機(jī)分配給某進(jìn)程后,就一直讓它運(yùn)行下去,決不會(huì)因?yàn)闀r(shí)鐘中斷或任何其它原因去搶占當(dāng)前正在運(yùn)行進(jìn)程的處理機(jī),直至該進(jìn)程完成,或發(fā)生某事件而被阻塞時(shí),才把處理機(jī)分配給其它進(jìn)程。
  2. 搶占方式
    這種調(diào)度方式允許調(diào)度程序根據(jù)某種規(guī)則,去暫停某個(gè)正在執(zhí)行的進(jìn)程,將已分配給該進(jìn)程的處理機(jī)重新分配給另一進(jìn)程。“搶占”不是一種任意性行為,必須遵循一定的原則,主要原則有:
    • 優(yōu)先權(quán)原則:允許優(yōu)先級(jí)高的新到進(jìn)程搶占當(dāng)前進(jìn)程的處理機(jī)。
    • 短進(jìn)程優(yōu)先原則:允許新到的短進(jìn)程搶占當(dāng)前進(jìn)程的處理機(jī)。
    • 時(shí)間片原則:各進(jìn)程按時(shí)間片輪轉(zhuǎn)運(yùn)行時(shí),當(dāng)正在執(zhí)行的進(jìn)程的一個(gè)時(shí)間片用完后,便停止該進(jìn)程的執(zhí)行而重新進(jìn)行調(diào)度。

7、進(jìn)程的調(diào)度算法

進(jìn)度調(diào)度的任務(wù)主要有三:保存處理機(jī)的現(xiàn)場(chǎng)信息;按某種算法選取進(jìn)程;把處理器分配給進(jìn)程。
這里的“某種算法”就是進(jìn)程的調(diào)度算法。

  • 先到先服務(wù)(FCFS)調(diào)度算法 : 從就緒隊(duì)列中選擇?個(gè)最先進(jìn)?該隊(duì)列的進(jìn)程為之分配資源,使它?即執(zhí)?并?直執(zhí)?到完成或發(fā)?某事件?被阻塞放棄占? CPU 時(shí)再重新調(diào)度。
  • 短作業(yè)優(yōu)先(SJF)的調(diào)度算法 : 從就緒隊(duì)列中選出?個(gè)估計(jì)運(yùn)?時(shí)間最短的進(jìn)程為之分配資源,使它?即執(zhí)?并?直執(zhí)?到完成或發(fā)?某事件?被阻塞放棄占? CPU 時(shí)再重新調(diào)度。
  • 時(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í)間。
  • 多級(jí)反饋隊(duì)列調(diào)度算法 :前?介紹的?種進(jìn)程調(diào)度的算法都有?定的局限性。如短進(jìn)程優(yōu)先的調(diào)度算法,僅照顧了短進(jìn)程?忽略了?進(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)度算法。算法詳細(xì):1)設(shè)置多個(gè)就緒隊(duì)列,并為每個(gè)隊(duì)列賦予不同的優(yōu)先級(jí);2)每個(gè)隊(duì)列都采用FCFS算法;3)按隊(duì)列優(yōu)先級(jí)調(diào)度。
  • 優(yōu)先級(jí)調(diào)度 : 為每個(gè)流程分配優(yōu)先級(jí),?先執(zhí)?具有最?優(yōu)先級(jí)的進(jìn)程,依此類(lèi)推。具有相同優(yōu)先級(jí)的進(jìn)程以 FCFS ?式執(zhí)???梢愿鶕?jù)內(nèi)存要求,時(shí)間要求或任何其他資源要求來(lái)確定優(yōu)先級(jí)。

8、死鎖的定義、起因、必要條件和處理方法

  • 定義:如果一組進(jìn)程中的每一個(gè)進(jìn)程都在等待僅由該組進(jìn)程中的其它進(jìn)程才能引發(fā)的事件,那么該組進(jìn)程是死鎖的。
  • 起因:死鎖的起因,通常是源于多個(gè)進(jìn)程對(duì)資源的爭(zhēng)奪。
  • 必要條件:產(chǎn)生死鎖必須同時(shí)具備下面四個(gè)必要條件
    1. 互斥條件:一段時(shí)間內(nèi),某資源只能被一個(gè)進(jìn)程占用,如果此時(shí)還有其它進(jìn)程請(qǐng)求該資源,則請(qǐng)求進(jìn)程只能等待,直至占用該資源的進(jìn)程用畢釋放。
    2. 請(qǐng)求和保持條件:進(jìn)程已經(jīng)保持了一個(gè)資源,但又提出了新的資源請(qǐng)求,而該資源已被其它進(jìn)程占有,此時(shí)請(qǐng)求進(jìn)程被阻塞,但對(duì)自己已獲得的資源保持不放。
    3. 不可搶占條件:進(jìn)程已獲得的資源在未使用完之前不能被搶占,只能在進(jìn)程使用完時(shí)由自己釋放。
    4. 循環(huán)等待條件:在發(fā)生死鎖時(shí),必然存在一個(gè) 進(jìn)程-資源 的循環(huán)鏈,即進(jìn)程集合P_0,P_1,P_2,...,P_n中的P_0正在等待一個(gè)P_1占用的資源,P_1正在等待P_2占用的資源,......,P_n正在等待已被P_0占用的資源。
  • 處理方法:目前處理死鎖的方法可歸結(jié)為四種
    1. 預(yù)防死鎖:(待補(bǔ)充)
    2. 避免死鎖:(待補(bǔ)充)
    3. 檢測(cè)死鎖:(待補(bǔ)充)
    4. 接觸死鎖:(待補(bǔ)充)
      上述四種方法,從1到4對(duì)死鎖的防范程度逐漸減弱,對(duì)對(duì)應(yīng)的是資源利用率的提高,以及進(jìn)程因資源因素而阻塞的頻度下降(即并發(fā)程度提高)。

三 內(nèi)存管理

1、操作系統(tǒng)的內(nèi)存管理主要是做什么?

內(nèi)存管理的主要任務(wù),是為多道程序的運(yùn)行提供良好的環(huán)境,提高內(nèi)存的利用率,方便用戶使用,并能從邏輯上擴(kuò)充內(nèi)存。因此,內(nèi)存管理應(yīng)具有內(nèi)存分配和回收、內(nèi)存保護(hù)、地址映射和內(nèi)存擴(kuò)充等功能。

2、內(nèi)存管理機(jī)制

簡(jiǎn)單分為連續(xù)分配管理?式非連續(xù)分配管理?式這兩種。連續(xù)分配管理方式是指為?個(gè)?戶程序分配?個(gè)連續(xù)的內(nèi)存空間,常見(jiàn)的如 分區(qū)管理。連續(xù)分配方式會(huì)形成許多碎片,雖然可以通過(guò)“緊湊”方法將許多碎片拼接成可用的大空間,但須為之付出很大開(kāi)銷(xiāo),如果允許將一個(gè)進(jìn)程直接分散裝入許多不相鄰接的分區(qū)中,便可充分地利用內(nèi)存空間,而無(wú)須再進(jìn)行“緊湊” ?;谶@一思想而產(chǎn)生了非連續(xù)的分配管理方式,非連續(xù)分配管理?式允許?個(gè)程序使?的內(nèi)存分布在離散或者說(shuō)不相鄰的內(nèi)存中,常見(jiàn)的如頁(yè)式管理、段式管理及“段頁(yè)式管理”。

  1. 分區(qū)管理 : 遠(yuǎn)古時(shí)代的計(jì)算機(jī)操系統(tǒng)的內(nèi)存管理?式。將內(nèi)存的用戶空間分若干個(gè)分區(qū)(大小固定或動(dòng)態(tài)),每
    個(gè)分區(qū)中只包含?個(gè)進(jìn)程。如果程序運(yùn)?需要內(nèi)存的話,操作系統(tǒng)就分配給它一個(gè)分區(qū),如果程序運(yùn)?只需要很小的空間的話,分配的這塊內(nèi)存很??部分?乎被浪費(fèi)了。這些在每個(gè)塊中未被利?的空間,我們稱之為碎片。
  2. 頁(yè)式管理 :在該方式中,將用戶程序的地址空間分為若干個(gè)固定大小的區(qū)域,稱為“頁(yè)”或“頁(yè)面”。相應(yīng)地,也將內(nèi)存空間分為若干個(gè)物理塊或頁(yè)框(frame),頁(yè)和塊的大小相同。這樣可將用戶程序的任一頁(yè)放入任一物理塊中,實(shí)現(xiàn)了離線分配。系統(tǒng)為每個(gè)進(jìn)程建立了一張頁(yè)面映射表,簡(jiǎn)稱頁(yè)表,頁(yè)表的作用是實(shí)現(xiàn)從頁(yè)號(hào)到物理塊號(hào)的地址映射。
  3. 段式管理 : 這是為了滿足用戶要求而形成的一種內(nèi)存管理方式。它把用戶程序的地址空間分為若干個(gè)大小不同的段,每段可定義一組相對(duì)完整的信息。例如,有主程序段MAIN、子程序段X、數(shù)據(jù)段D及棧段S等。在內(nèi)存分配時(shí),以段為單位,這些段在內(nèi)存中可以不相鄰接,所以也同樣實(shí)現(xiàn)了離散分配。系統(tǒng)為每個(gè)進(jìn)程建立一張段映射表,簡(jiǎn)稱段表,段表項(xiàng)記錄了該段在內(nèi)存中的起始地址(又稱“基址”)和段的長(zhǎng)度,段表的作用是實(shí)現(xiàn)從邏輯段到物理內(nèi)存區(qū)的映射的。
  4. 段頁(yè)式管理:
    段頁(yè)式管理機(jī)制結(jié)合了段式管理和頁(yè)式管理的優(yōu)點(diǎn)。簡(jiǎn)單來(lái)說(shuō)段頁(yè)式管理機(jī)制就是先將用戶程序分成若干段,再把每個(gè)段分成若干頁(yè),并為每一個(gè)段賦予一個(gè)段名。

3、塊表和多級(jí)頁(yè)表

快表
由于頁(yè)表是存放在內(nèi)存中的,這使CPU在每存取一個(gè)數(shù)據(jù)時(shí),都要訪問(wèn)兩次內(nèi)存。第一次是訪問(wèn)內(nèi)存中的頁(yè)表,從中找到指定頁(yè)的物理塊號(hào),再將塊號(hào)與頁(yè)內(nèi)偏移量拼接,以形成物理地址。第二次訪問(wèn)內(nèi)存時(shí),才是從第一次所得地址中獲得所需數(shù)據(jù)(或向此地址中寫(xiě)入數(shù)據(jù))。
為了提高地址變換速度,操作系統(tǒng)在頁(yè)表方案基礎(chǔ)之上引入了快表來(lái)加速虛擬地址到物理地址的轉(zhuǎn)換。
快表可以看作頁(yè)表的一種緩存,用以存放當(dāng)前訪問(wèn)的那些頁(yè)表項(xiàng)。
使用快表之后的地址轉(zhuǎn)換流程是這樣的:

  1. 根據(jù)虛擬地址中的頁(yè)號(hào)查找快表;
  2. 如果該頁(yè)在快表中,直接從快表中讀取相應(yīng)的物理地址;
  3. 如果該頁(yè)不在快表中,就訪問(wèn)內(nèi)存中的頁(yè)表,再?gòu)捻?yè)表中得到物理地址,同時(shí)將頁(yè)表中的該表項(xiàng)添加到快表中;
  4. 當(dāng)快表填滿后,又要登記新頁(yè)時(shí),就按照一定的淘汰策略淘汰掉快表中的一個(gè)頁(yè)。

多級(jí)頁(yè)表
引?多級(jí)頁(yè)表的主要?的是為了避免把全部頁(yè)表?直放在內(nèi)存中占?過(guò)多空間,特別是那些根本就不需要的頁(yè)表就不需要保留在內(nèi)存中。

4、段頁(yè)式管理機(jī)制的地址變換過(guò)程

在段頁(yè)式系統(tǒng)中,為了獲得一條指令或數(shù)據(jù),須三次訪問(wèn)內(nèi)存。
第一次訪問(wèn)是訪問(wèn)內(nèi)存中的段表,從中取得頁(yè)表始址;
第二次訪問(wèn)是訪問(wèn)內(nèi)存中的頁(yè)表,從中取出該頁(yè)所在的物理塊號(hào),并將該塊號(hào)與頁(yè)內(nèi)地址一起形成指令或數(shù)據(jù)的物理地址;
第三次訪問(wèn)才是珍重從第二次訪問(wèn)所得的地址中取出指令或數(shù)據(jù)。

5、分頁(yè)機(jī)制和分段機(jī)制的共同點(diǎn)和區(qū)別

  1. 共同點(diǎn)
    • 分頁(yè)機(jī)制和分段機(jī)制都是為了提?內(nèi)存利?率,減少內(nèi)存碎?。
    • 頁(yè)和段都是離散存儲(chǔ)的,所以兩者都是離散分配內(nèi)存的?式。但是,每個(gè)頁(yè)和段中的內(nèi)存是連續(xù)的。
  2. 區(qū)別
    • ?的大小是固定的,由操作系統(tǒng)決定;而段的大小不固定,取決于我們當(dāng)前運(yùn)行的程序。
    • 分頁(yè)僅僅是為了滿?操作系統(tǒng)內(nèi)存管理的需求,而段是邏輯信息的單位,在程序中可以體現(xiàn)為代碼段,數(shù)據(jù)段,能夠更好滿?用戶的需要。

6、邏輯(虛擬)地址與物理地址

  1. 為什么要有虛擬地址?

    • 如果直接把物理地址暴露出來(lái)的話會(huì)帶來(lái)嚴(yán)重問(wèn)題,比如可能對(duì)操作系統(tǒng)造成傷害以及給同時(shí)運(yùn)?多個(gè)程序造成困難。
    • 如果沒(méi)有虛擬地址,在編寫(xiě)程序時(shí),必須要知道程序所在的物理地址空間,這在實(shí)際中是難以確定的。而通過(guò)虛擬地址可以屏蔽掉物理地址的細(xì)節(jié),使程序員只關(guān)注程序本身的地址空間。
    • 直接暴露物理地址無(wú)法對(duì)各個(gè)進(jìn)程能訪問(wèn)的地址空間進(jìn)行隔離。
  2. 通過(guò)虛擬地址訪問(wèn)內(nèi)存有哪些優(yōu)勢(shì)

    • 程序可以使??系列相鄰的虛擬地址來(lái)訪問(wèn)物理內(nèi)存中不相鄰的大內(nèi)存緩沖區(qū)。
    • 程序可以使??系列虛擬地址來(lái)訪問(wèn)?于可?物理內(nèi)存的內(nèi)存緩沖區(qū)。當(dāng)物理內(nèi)存的供應(yīng)量變小時(shí),內(nèi)存管理器會(huì)將物理內(nèi)存頁(yè)(通常大小為 4 KB)保存到磁盤(pán)?件。數(shù)據(jù)或代碼頁(yè)會(huì)根據(jù)需要在物理內(nèi)存與磁盤(pán)之間移動(dòng)。
    • 不同進(jìn)程使?的虛擬地址彼此隔離。?個(gè)進(jìn)程中的代碼無(wú)法更改正在由另?進(jìn)程或操作系統(tǒng)使?的物理內(nèi)存。

7、對(duì)換(Swapping)技術(shù)

“對(duì)換”,是指把內(nèi)存中暫時(shí)不能運(yùn)行的進(jìn)程或暫時(shí)不用的程序和數(shù)據(jù)換出到外存上,以便騰出足夠的內(nèi)存空間,再把已具備運(yùn)行條件的進(jìn)程或進(jìn)程所需要的程序和數(shù)據(jù)換入內(nèi)存。對(duì)換是改善內(nèi)存利用率的有效措施,它可以解決內(nèi)存緊張問(wèn)題,直接提高處理機(jī)的利用率和系統(tǒng)的吞吐量。

四 虛擬內(nèi)存

1、什么是虛擬內(nèi)存

  • 廣義 :虛擬內(nèi)存使得應(yīng)?程序認(rèn)為它擁有連續(xù)的可?的內(nèi)存(?個(gè)連續(xù)完整的地址空間),而實(shí)際上,它通常是被分隔成多個(gè)物理內(nèi)存碎片,還有部分暫時(shí)存儲(chǔ)在外部磁盤(pán)存儲(chǔ)器上,在需要時(shí)進(jìn)行數(shù)據(jù)交換。與沒(méi)有使?虛擬內(nèi)存技術(shù)的系統(tǒng)相比,使用這種技術(shù)的系統(tǒng)使得大型程序的編寫(xiě)變得更容易,對(duì)真正的物理內(nèi)存(例如 RAM)的使?也更有效率。
  • 狹義:虛擬內(nèi)存是現(xiàn)代操作系統(tǒng)中內(nèi)存管理的一項(xiàng)重要技術(shù),實(shí)現(xiàn)內(nèi)存擴(kuò)充功能。但該功能并非是從物理上實(shí)際地?cái)U(kuò)大內(nèi)存地容量,而是從邏輯上實(shí)現(xiàn)對(duì)內(nèi)存容量地?cái)U(kuò)充,讓用戶感覺(jué)到的內(nèi)存容量比實(shí)際內(nèi)存容量大得多。于是便可以讓比內(nèi)存空間更大的程序運(yùn)行,或者讓更多的用戶程序并發(fā)運(yùn)行。這樣既滿足了用戶的需要,又改善了系統(tǒng)的性能。

2、局部性原理

要想更好地理解虛擬內(nèi)存技術(shù),必須要知道計(jì)算機(jī)中著名的局部性原理,該原理又表現(xiàn)在以下兩個(gè)方面:

  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ǔ)的。

時(shí)間局部性是通過(guò)將近來(lái)使?的指令和數(shù)據(jù)保存到?速緩存存儲(chǔ)器中,并使??速緩存的層次結(jié)構(gòu)實(shí)現(xiàn)??臻g局部性通常是使用較大的?速緩存,并將預(yù)取機(jī)制集成到?速緩存控制邏輯中實(shí)現(xiàn)。虛擬內(nèi)存技術(shù)實(shí)際上就是建立了 “內(nèi)存?外存”的兩級(jí)存儲(chǔ)器的結(jié)構(gòu),利?局部性原理實(shí)現(xiàn)高速緩存。

3、虛擬存儲(chǔ)器的基本工作

基于局部性原理,在程序裝入時(shí),可以僅將程序當(dāng)前要運(yùn)行的?部分裝?內(nèi)存,?將其他部分留在外存,就可以啟動(dòng)程序執(zhí)行。由于外存往往比內(nèi)存?很多,所以我們運(yùn)?的軟件的內(nèi)存大小實(shí)際上是可以比計(jì)算機(jī)系統(tǒng)實(shí)際的內(nèi)存大小大的。在程序執(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、虛擬內(nèi)存的技術(shù)實(shí)現(xiàn)

  • 基于局部性原理可知,應(yīng)用程序在運(yùn)行之前沒(méi)有必要將之全部裝入內(nèi)存,而僅須將那些當(dāng)前要運(yùn)行的少數(shù)頁(yè)面或段先裝入內(nèi)存便可運(yùn)行,其余部分暫留在盤(pán)上。
  • 程序在運(yùn)行時(shí),如果它所要訪問(wèn)的頁(yè)或段已調(diào)入內(nèi)存,便可繼續(xù)執(zhí)行下去;但如果程序所要訪問(wèn)的頁(yè)或段尚未調(diào)入內(nèi)存(稱為缺頁(yè)或缺段),便發(fā)出缺頁(yè)或缺段的中斷請(qǐng)求,此時(shí)OS將利用請(qǐng)求調(diào)頁(yè)(段)功能將它們調(diào)入內(nèi)存,以使進(jìn)程能繼續(xù)執(zhí)行下去。
  • 如果此時(shí)內(nèi)存已滿,無(wú)法再裝入新的頁(yè)或段,OS還需要再利用頁(yè)或段的置換功能,將內(nèi)存中暫時(shí)不用的頁(yè)或段調(diào)至盤(pán)上,騰出足夠的內(nèi)存空間后,再將需要訪問(wèn)的頁(yè)或段調(diào)入內(nèi)存,使程序繼續(xù)執(zhí)行下去。
  • 這樣,便可使一個(gè)大的用戶程序再較小的內(nèi)存空間中運(yùn)行,也可在內(nèi)存中同時(shí)裝入更多的進(jìn)程,使它們并發(fā)執(zhí)行。

5、頁(yè)面置換算法的作用

當(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)選擇淘汰哪??的規(guī)則叫做頁(yè)面置換算法,我們可以把頁(yè)面置換算法看成是淘汰頁(yè)面的規(guī)則。
置換算法的好壞將直接影響到系統(tǒng)的性能。
不適當(dāng)?shù)乃惴赡軙?huì)導(dǎo)致進(jìn)程發(fā)生“抖動(dòng)”,即剛被換出的頁(yè)很快又要被訪問(wèn),需要將它重新調(diào)入,此時(shí)又需再選一頁(yè)調(diào)出;而此剛被調(diào)出的頁(yè)很快又被訪問(wèn),又需將它調(diào)入,如此頻繁的更換頁(yè)面,以致一個(gè)進(jìn)程在運(yùn)行中把大部分時(shí)間都花費(fèi)在頁(yè)面置換工作上,我們稱該進(jìn)程發(fā)生了“抖動(dòng)”。

產(chǎn)生抖動(dòng)的原因

  1. 進(jìn)程分配的物理塊數(shù)太少
  2. 置換算法選擇不當(dāng)
  3. 全局置換使抖動(dòng)傳播

7、常見(jiàn)的頁(yè)面置換算法

  • OPT(Optimal)頁(yè)面置換算法(最佳頁(yè)面置換算法) :最佳(Optimal, OPT)置換算法所選擇的被淘汰頁(yè)面將是以后永不使?的,或者是在最?時(shí)間內(nèi)不再被訪問(wèn)的頁(yè)面,這樣可以保證獲得最低的缺頁(yè)率。但由于人們目前?法預(yù)知進(jìn)程在內(nèi)存下的若千頁(yè)面中哪個(gè)是未來(lái)最?時(shí)間內(nèi)不再被訪問(wèn)的,因而該算法無(wú)法實(shí)現(xiàn)。?般作為衡量其他置換算法的方法。
  • FIFO(First In First Out) 頁(yè)面置換算法(先進(jìn)先出頁(yè)面置換算法) :總是淘汰最先進(jìn)入內(nèi)存的頁(yè)面,即選擇在內(nèi)存中駐留時(shí)間最久的頁(yè)面進(jìn)?淘汰。
  • LRU (Least Currently Used)頁(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è)面予以淘汰。
  • LFU (Least Frequently Used)頁(yè)面置換算法(最少使?頁(yè)面置換算法) : 該置換算法選擇在之前時(shí)期使?最少的頁(yè)面作為淘汰頁(yè)。
最后編輯于
?著作權(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)容

  • 目錄 1 概述 2 系統(tǒng)調(diào)用 3 進(jìn)程 4 內(nèi)存管理 5 文件系統(tǒng) 6 I/O 1 概述 1.1 操作系...
    小小千千閱讀 560評(píng)論 0 0
  • 用戶態(tài):當(dāng)一個(gè)進(jìn)程在執(zhí)行用戶自己的代碼時(shí)位用戶態(tài),可以直接讀取用戶程序的數(shù)據(jù)內(nèi)核態(tài):控制計(jì)算機(jī)的硬件資源,并提供上...
    Lugton閱讀 1,925評(píng)論 0 7
  • 邏輯地址和物理地址 程序的執(zhí)行過(guò)程: 源代碼編譯成目標(biāo)模塊,高級(jí)語(yǔ)言翻譯成機(jī)器語(yǔ)言 鏈接程序?qū)⒛繕?biāo)模塊和它的庫(kù)函數(shù)...
    leap_閱讀 1,322評(píng)論 0 0
  • OS相關(guān)概念 1.操作系統(tǒng)(OS): 操作系統(tǒng)是指控制和管理整個(gè)計(jì)算機(jī)系統(tǒng)的硬件和軟件資源,并合理地組織調(diào)度計(jì)算機(jī)...
    MTR木頭人閱讀 1,254評(píng)論 0 2
  • 夜鶯2517閱讀 128,180評(píng)論 1 9

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