吐血精簡總結之操作系統

前言

即將參加今年的秋招,校招比較考覈學生的底層知識,開始擼操作系統、計算機組成原理、計算機網絡以及Java的知識了。希望能在2020年本就不怎麼友好的一年收穫理想的Offer。

目錄

操作系統

一、基礎

1. 操作系統的定義(小鵬)

管理軟硬件資源的 程序

2. 操作系統的特徵

特徵一、併發

併發和並行的區別(歡聚時代)

併發: 同一時間段
並行: 同一時刻
解釋一: 並行是指兩個或者多個事件在同一時刻發生;而併發是指兩個或多個事件在同一時間間隔發生。
解釋二: 並行是在不同實體上的多個事件,併發是在同一實體上的多個事件。
解釋三: 並行是在多臺處理器上同時處理多個任務。如 hadoop 分佈式集羣,併發是在一臺處理器上“同時”處理多個任務。

特徵二、共享

在OS環境下的資源共享或稱爲資源複用,指的是系統中的資源可供內存中多個併發執行的進程共同使用。
目前實現資源共享的方式(2種):
1)互斥共享方式:系統中的某些資源:如打印機、磁帶機等,雖然可以提供給多個進程(線程)使用,但是應規定在一段時間內,只允許一個進程訪問該資源。
——“臨界資源”:一段時間內只允許一個進程訪問的資源
2)同時訪問方式:系統中還有另外一些資源,允許在一段時間內由多個進程“同時”對它們進行訪問。
——這裏的“同時”也就是在微觀下交替進行的。

特徵三、虛擬

多道程序設計:是指在計算機內存中同時存放幾道相互獨立的程序,使它們在管理程序控制之下,相互穿插的運行。 兩個或兩個以上程序在計算機系統中同處於開始到結束之間的狀態。這就稱爲多道程序設計。多道程序技術運行的特徵:多道、宏觀上並行、微觀上串行。

虛擬是把一個物理上的實體變爲若干邏輯上的對應物。
物理實體(前者)是實際存在的;而後者是虛的,是用戶感覺上的事務
虛擬技術:用於實現虛擬的技術
虛擬處理器(CPU):通過多道程序設計技術,採用讓多道程序併發執行的方法,分時來使用一個CPU,實際物理上只有一個CPU,但是用戶感覺到有多個CPU
虛擬存儲器:從邏輯上擴充存儲器容量,用戶感覺到的但實際不存在的存儲器
虛擬設備:將一臺物理設備虛擬爲邏輯上的多臺設備,使多個用戶在同一時間段內訪問同一臺設備,即同時共享,用戶宏觀上感覺是同時的,但實際上是微觀交替訪問同一臺設備的
操作系統的虛擬技術科歸納爲:
時分複用技術:如處理器的分時共享
空間複用技術:如虛擬存儲器
“時分複用”和“空分複用”技術。可以在邏輯上無限擴展

虛擬內存(好未來)

基於局部性原理,在程序裝入時,可以將程序的一部分裝入內存,而將其餘部分留在外存,就可以啓動程序執行。在程序執行過程中,當所訪問的信息不在內存時,由操作系統將所需要的部分調入內存,然後繼續執行程序。另一方面,操作系統將內存中暫時不使用的內容換出到外存上,從而騰出空間存放將要調入內存的信息。這樣,系統好像爲用戶提供了一個比實際內存大得多的存儲器,稱爲虛擬存儲器(虛擬內存)。
往深還有段頁管理、交換算法等。

物理內存(百果園)

實際內存條的大小。

特徵四、異步

異步:多道程序環境允許多個程序併發執行,但由於資源有限,如cpu只有一個,進程的執行並不是一貫到底的,而是走走停停的,它以不可預知的速度向前推進。
比如A進程正在佔用CPU計算,B進程這時也想佔用CPU計算,B進程只有等,等A進程算完了,A進程去訪問磁盤資源了,這時B進程再佔用CPU進行計算,B進程還沒計算完,A進程從磁盤取出資源了,A進程發現B這時在佔用CPU,這時A進程就需要等待,等B算完後再繼續到CPU中進行計算。由於每個進程佔用資源的時間不固定,所以進程的執行以不可預知的速度前進
即不確定性。同一程序和數據的多次運行可能得到不同的結果;程序的運行時間、運行順序也具有不確定性;外部輸入的請求、運行故障發生的時間難以預測。這些都是不確定性的表現。

3. 用戶態和內核態

爲什麼要分用戶態和內核態

在CPU的所有指令中,有一些指令是非常危險的,如果錯用,將導致整個系統崩潰。比如:清內存、設置時鐘等。所以,CPU將指令分爲特權指令和非特權指令,對於那些危險的指令,只允許操作系統及其相關模塊使用,普通的應用程序只能使用那些不會造成災難的指令。

用戶態

運行用戶程序。內核態與用戶態是操作系統的兩種運行級別,當程序運行在3級特權上時,就可以稱之爲運行在用戶態。運行在用戶態的程序不能直接訪問操作系統內核數據結構和程序。處於用戶態執行時,進程所能訪問的內存空間和對象受到限制,其所佔有的處理機是可以被搶佔的。

內核態

運行操作系統程序。當程序運行在0級特權上時,就可以稱之爲運行在內核態。處於內核態執行的進程,則能訪問所有的內存空間和對象,且所佔有的處理機是不允許被搶佔的。

用戶態到內核態的切換(快手)

系統調用

用戶進程通過系統調用申請使用操作系統提供的服務程序完成工作,例如: fork() 實際上就是執行了一個創建新進程的系統調用

異常

發生觸發由當前運行進程切換到處理此異常的內核相關程序,例如:缺頁異常。

外圍設備的中斷

比如硬盤讀寫操作完成,系統會切換到硬盤,讀寫的中斷處理程序中執行後續操作等。

二、進程管理

1. 進程和線程的區別(愛奇藝)

調度

進程是資源分配的基本單位
線程是CPU調度的基本單位

資源

進程是有資源的(進程不是一次性加載到內存中)
線程沒有資源

開銷

線程開銷大
進程開銷小

關係

一個進程至少包含一個線程
這個引入一下知乎上一個比較好的評論:
在這裏插入圖片描述

2. 協程(騰訊)

協程,英文Coroutines,是一種比線程更加輕量級的存在。正如一個進程可以擁有多個線程一樣,一個線程也可以擁有多個協程。協程不是被操作系統內核所管理,而完全是由程序所控制(也就是在用戶態執行)。
Java中並沒有這個概念,但是Python中,學過Python的都知道有個 yield 關鍵字,可以通過指令來控制這條語句的執行與暫停。但是,yield讓協程暫停,和線程的阻塞是有本質區別的。協程的暫停完全由程序控制,線程的阻塞狀態是由操作系統內核來進行切換。

在這裏插入圖片描述

3. 進程死鎖(流利說)

什麼是死鎖

死鎖是指兩個或兩個以上的進程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱爲死鎖進程。
在這裏插入圖片描述

死鎖必要條件

互斥條件

一個資源每次只能被一個進程使用。

不可搶佔條件

進程持有的資源不可被其他進程剝奪。

請求與保持條件

一個進程因請求資源而阻塞時,對已獲得的資源保持不放。

循環等待條件

若干線程直接形成了一種頭尾相接的循環等待資源關係。

防止死鎖(多益網絡)

死鎖預防(快手)

預防死鎖的發生只需破壞死鎖產生的四個必要條件之一即可。
互斥條件:由於資源互斥是資源使用的固有特性是無法改變的。
不可搶佔條件:允許進程剝剝奪或者加入超時放棄。
請求與保持條件:第一種,靜態資源分配策略,一次性獲取所有資源。第二種是隻有他申請到所有資源了才分配資源。
循環等待條件:資源有序分配法,對系統中的所有資源順序編號,將緊缺的,稀少的採用較大的編號,在申請資源時必須按照編號的順序進行,一個進程只有獲得較小編號的進程才能申請較大編號的進程。

死鎖避免(百果園)

對進程發出的資源申請進行檢查。
有n個進程,共享的同類資源數爲m,則避免死鎖的最少資源數是 n(m-1)+1。

銀行家算法:銀行家算法(Banker’s Algorithm)是一個避免死鎖(Deadlock)的著名算法。
我們可以把操作系統看作是銀行家,操作系統管理的資源相當於銀行家管理的資金,進程向操作系統請求分配資源相當於用戶向銀行家貸款。
爲保證資金的安全,銀行家規定:
(1) 當一個顧客對資金的最大需求量不超過銀行家現有的資金時就可接納該顧客;
(2) 顧客可以分期貸款,但貸款的總數不能超過最大需求量;
(3) 當銀行家現有的資金不能滿足顧客尚需的貸款數額時,對顧客的貸款可推遲支付,但總能使顧客在有限的時間裏得到貸款;
(4) 當顧客得到所需的全部資金後,一定能在有限的時間裏歸還所有的資金。
銀行家算法步驟
進程提出申請->判斷申請是否安全->判斷是否有可用資源->試圖分配資源->檢查系統新狀態是否安全。

死鎖檢測

1.對單實例資源可用,構建資源分配圖,簡化該圖,最終簡化圖存在環證明存在死鎖。
2.對多實例資源可用,構建向量矩陣。

死鎖解除

資源剝奪法: 掛起某些死鎖進程,並搶佔它的資源,將這些資源分配給其他的死鎖進程。但應防止被掛起的進程長時間得不到資源,而處於資源匱乏的狀態。

撤銷進程法: 強制撤銷部分、甚至全部死鎖進程並剝奪這些進程的資源。撤銷的原則可以按進程優先級和撤銷進程代價的高低進行。

進程回退法: 讓一(多)個進程回退到足以迴避死鎖的地步,進程回退時自願釋放資源而不是被剝奪。要求系統保持進程的歷史信息,設置還原點。

4. 進程調度算法

先來先服務算法 (FCFS,first come first served)

介紹: 先來先去服務調度算法是一種最簡單的調度算法,也稱爲先進先出或嚴格排隊方案。當每個進程就緒後,它加入就緒隊列。當前正運行的進程停止執行,選擇在就緒隊列中存在時間最長的進程運行。該算法既可以用於作業調度,也可以用於進程調度。先來先去服務比較適合於長作業(進程),而不利於短作業(進程)。
優點: 簡單。
缺點:
平均等待時間波動較大,短進程可能排在長進程後面。
I/O資源和CPU資源的利用率較低,CPU密集型進程會導致I/O設備閒置時,I/O密集型進程也等待。

短進程優先算法 (SJF,Shortest Job First)

介紹: 短進程優先是一個非搶佔策略,他的原則是下一次選擇預計處理時間最短的進程,因此短進程將會越過長作業,跳至隊列頭。該算法即可用於作業調度,也可用於進程調度。但是他對長作業不利,不能保證緊迫性作業(進程)被及時處理,作業的長短只是被估算出來的。
缺點: 可能導致飢餓(連續的短進程流會使長進程無法獲得CPU資源)。

時間片輪轉算法 (RR,Round-Robin)

介紹: 輪轉法是基於適中的搶佔策略的,以一個週期性間隔產生時鐘中斷,當中斷髮生後,當前正在運行的進程被置於就緒隊列中,然後基於先來先去服務策略選擇下一個就緒作業的運行。這種技術也稱爲時間片,因爲每個進程再被搶佔之前都給定一片時間。
缺點: 額外的上下文切換開銷。

最高響應比優先算法 (HRRN,Hight Response Ratio Next)

公式:R = (w+s)/ s ; R:響應比 w:等待時間 s:執行時間
和最短進程優先、最短剩餘時間優先一樣,使用最高響應比策略需要估計預計服務時間。
(1) 如果作業的等待時間相同,則要求服務的時間愈短,其優先權愈高,因而該算法有利於短作業.
(2) 當要求服務的時間相同時,作業的優先權決定於其等待時間,等待時間愈長,其優先權愈高,因而它實現的是先來先服務.
(3) 對於長作業,作業的優先級可以隨等待時間的增加而提高,當其等待時間足夠長時,其優先級便可升到很高, 從而也可獲得處理機.
優點: 對短進程比較有利,但是長進程隨着等待的時間增加,也能被執行。該算法照顧了短作業,且不會使長作業長期得不到服務。
缺點: 由於每次調度前要計算響應比,增大了系統開銷。

優先級調度算法

介紹: 優先級調度算法又稱優先權調度算法,該算法中的優先級用於描述作業運行的緊迫程度。
在作業調度中,優先級調度算法每次從後備作業隊列中選擇優先級最髙的一個或幾個作業,將它們調入內存,分配必要的資源,創建進程並放入就緒隊列。在進程調度中,優先級調度算法每次從就緒隊列中選擇優先級最高的進程,將處理機分配給它,使之投入運行。
 
根據新的更高優先級進程能否搶佔正在執行的進程,可將該調度算法分爲:

非剝奪式優先級調度算法: 當某一個進程正在處理機上運行時,即使有某個更爲重要或緊迫的進程進入就緒隊列,仍然讓正在運行的進程繼續運行,直到由於其自身的原因而主動讓出處理機時(任務完成或等待事件),才把處理機分配給更爲重要或緊迫的進程。
剝奪式優先級調度算法: 當一個進程正在處理機上運行時,若有某個更爲重要或緊迫的進程進入就緒隊列,則立即暫停正在運行的進程,將處理機分配給更重要或緊迫的進程。

而根據進程創建後其優先級是否可以改變,可以將進程優先級分爲以下兩種:

靜態優先級: 優先級是在創建進程時確定的,且在進程的整個運行期間保持不變。確定靜態優先級的主要依據有進程類型、進程對資源的要求、用戶要求。
動態優先級: 在進程運行過程中,根據進程情況的變化動態調整優先級。動態調整優先級的主要依據爲進程佔有CPU時間的長短、就緒進程等待CPU時間的長短。

公平共享調度算法

主要用於:一些用戶組比其他用戶組更重要,保證不重要的組無法壟斷資源。未使用的資源按比例分配,沒有達到資源使用率目標的組獲得更高的優先級

多級隊列調度算法

就緒隊列被劃分成多個獨立的子隊列,每個隊列擁有自己的調度策略。

多級反饋隊列算法(360)

多級反饋隊列調度算法的實現思想如下:
1、設有N個隊列(Q1,Q2…QN),其中各個隊列對於處理機的優先級是不一樣的,也就是說位於各個隊列中的作業(進程)的優先級也是不一樣的。一般來說,優先級Priority(Q1) > Priority(Q2) > … > Priority(QN)。怎麼講,位於Q1中的任何一個作業(進程)都要比Q2中的任何一個作業(進程)相對於CPU的優先級要高(也就是說,Q1中的作業一定要比Q2中的作業先被處理機調度),依次類推其它的隊列。
2、對於優先級最低的隊列來說,裏面是遵循時間片輪轉法。也就是說,位於隊列QN中有M個作業,它們的運行時間是通過QN這個隊列所設定的時間片來確定的;對於其他隊列,遵循的是先來先服務算法,每一進程分配一定的時間片,若時間片運行完時進程未結束,則進入下一優先級隊列的末尾。
3、各個隊列的時間片是一樣的嗎?不一樣,這就是該算法設計的精妙之處。各個隊列的時間片是隨着優先級的增加而減少的,也就是說,優先級越高的隊列中它的時間片就越短。同時,爲了便於那些超大作業的完成,最後一個隊列QN(優先級最低的隊列)的時間片一般很大(不需要考慮這個問題)。
在這裏插入圖片描述
 
算法描述
1、進程在進入待調度的隊列等待時,首先進入優先級最高的Q1等待。
2、首先調度優先級高的隊列中的進程。若高優先級中隊列中已沒有調度的進程,則調度次優先級隊列中的進程。例如:Q1,Q2,Q3三個隊列,當且僅當在Q1中沒有進程等待時纔去調度Q2,同理,只有Q1,Q2都爲空時纔會去調度Q3。
3、對於同一個隊列中的各個進程,按照FCFS分配時間片調度。比如Q1隊列的時間片爲N,那麼Q1中的作業在經歷了N個時間片後若還沒有完成,則進入Q2隊列等待,若Q2的時間片用完後作業還不能完成,一直進入下一級隊列,直至完成。
4、在最後一個隊列QN中的各個進程,按照時間片輪轉分配時間片調度。
5、在低優先級的隊列中的進程在運行時,又有新到達的作業,此時須立即把正在運行的進程放回當前隊列的隊尾,然後把處理機分給高優先級進程。換而言之,任何時刻,只有當第1~i-1隊列全部爲空時,纔會去執行第i隊列的進程(搶佔式)。特別說明,當再度運行到當前隊列的該進程時,僅分配上次還未完成的時間片,不再分配該隊列對應的完整時間片。
 
多級反饋隊列的優勢有:
終端型作業用戶:短作業優先。
短批處理作業用戶:週轉時間較短。
長批處理作業用戶:經過前面幾個隊列得到部分執行,不會長期得不到處理。

進程狀態(百度)

在這裏插入圖片描述

進程的通信方式(瓜子)

管道

管道,通常指無名管道
1、特點:
它是半雙工的(即數據只能在一個方向上流動),具有固定的讀端和寫端。
它只能用於具有親緣關係的進程之間的通信(也是父子進程或者兄弟進程之間)。
它可以看成是一種特殊的文件,對於它的讀寫也可以使用普通的read、write 等函數。但是它不是普通的文件,並不屬於其他任何文件系統,並且只存在於內存中。
當一個管道建立時,它會創建兩個文件描述符:fd[0]爲讀而打開,fd[1]爲寫而打開。如下圖:
在這裏插入圖片描述
要關閉管道只需將這兩個文件描述符關閉即可。

FIFO(命名管道)

FIFO,也稱爲命名管道,它是一種文件類型。
1、特點
FIFO可以在無關的進程之間交換數據,與無名管道不同。
FIFO有路徑名與之相關聯,它以一種特殊設備文件形式存在於文件系統中。
任何進程間都能通訊,但速度慢。
FIFO的通信方式類似於在進程中使用文件來傳輸數據,只不過FIFO類型文件同時具有管道的特性。在數據讀出時,FIFO管道中同時清除數據,並且“先進先出”。

消息隊列

消息隊列,是消息的鏈接表,存放在內核中。一個消息隊列由一個標識符(即隊列ID)來標識。
1、特點
消息隊列是面向記錄的,其中的消息具有特定的格式以及特定的優先級。
消息隊列獨立於發送與接收進程。進程終止時,消息隊列及其內容並不會被刪除。
消息隊列可以實現消息的隨機查詢,消息不一定要以先進先出的次序讀取,也可以按消息的類型讀取。
容量受到系統限制,且要注意第一次讀的時候,要考慮上一次沒有讀完數據的問題。

信號量(七牛雲)

信號量用於實現進程間的互斥與同步,而不是用於存儲進程間通信數據。
1、特點
信號量用於進程間同步,若要在進程間傳遞數據需要結合共享內存。
信號量基於操作系統的 PV 操作,程序對信號量的操作都是原子操作。
每次對信號量的 PV 操作不僅限於對信號量值加 1 或減 1,而且可以加減任意正整數。
支持信號量組。
不能傳遞複雜消息,只能用來同步
5個進程共享同一程序段,而且每次最多允許3個進程進入該程序段,則信號量的變化 範圍【3, 2, 1, 0,-1, -2】

共享內存

共享內存(Shared Memory),指兩個或多個進程共享一個給定的存儲區。
同一塊物理內存被映射到進程 A、B 各自的進程地址空間
共享內存是最快的一種 IPC,因爲進程是直接對內存進行存取。
因爲多個進程可以同時操作,所以需要進行同步。
信號量+共享內存通常結合在一起使用,信號量用來同步對共享內存的訪問。
優缺點:
能夠很容易控制容量
速度快,但要保持同步
必須在同一物理機器上

套接字

需要建立連接,有資源消耗。

三、內存管理

1. 頁面置換算法(字節跳動)

最佳置換算法(OPT)

這是一種理想情況下的頁面置換算法,但實際上是不可能實現的。該算法的基本思想是:發生缺頁時,有些頁面在內存中,其中有一頁將很快被訪問(也包含緊接着的下一條指令的那頁),而其他頁面則可能要到10、100或者1000條指令後纔會被訪問,每個頁面都可以用在該頁面首次被訪問前所要執行的指令數進行標記。最佳頁面置換算法只是簡單地規定:標記最大的頁應該被置換。這個算法唯一的一個問題就是它無法實現。當缺頁發生時,操作系統無法知道各個頁面下一次是在什麼時候被訪問。雖然這個算法不可能實現,但是最佳頁面置換算法可以用於對可實現算法的性能進行衡量比較。

FIFO

最簡單的頁面置換算法是先入先出(FIFO)法。這種算法的實質是,總是選擇在主存中停留時間最長(即最老)的一頁置換,即先進入內存的頁,先退出內存。理由是:最早調入內存的頁,其不再被使用的可能性比剛調入內存的可能性大。建立一個FIFO隊列,收容所有在內存中的頁。被置換頁面總是在隊列頭上進行。當一個頁面被放入內存時,就把它插在隊尾上。
這種算法只是在按線性順序訪問地址空間時纔是理想的,否則效率不高。因爲那些常被訪問的頁,往往在主存中也停留得最久,結果它們因變“老”而不得不被置換出去。
FIFO的另一個缺點是,它有一種異常現象,即在增加存儲塊的情況下,反而使缺頁中斷率增加了。當然,導致這種異常現象的頁面走向實際上是很少見的。

LRU(百度)

當需要置換一頁時,選擇在之前一段時間裏最久沒有使用過的頁面予以置換。這種算法就稱爲最久未使用算法(Least Recently Used,LRU)。
LRU算法需要實際硬件的支持。
Java手撕LRU: LinkedHashMap
每次掃描表中節點,掃到就把節點調到表頭,沒有掃到就把表尾去掉,把新節點加到表頭;
優化1:使用雙鏈表加快表頭尾速度;
優化2:使用Hash取代掃描;

時鐘(CLOCK)置換算法

LRU算法的性能接近於OPT,但是實現起來比較困難,且開銷大;FIFO算法實現簡單,但性能差。所以操作系統的設計者嘗試了很多算法,試圖用比較小的開銷接近LRU的性能,這類算法都是CLOCK算法的變體。
 
簡單的CLOCK算法是給每一幀關聯一個附加位,稱爲使用位。
當某一頁首次裝入主存時,該幀的使用位設置爲1;
當該頁隨後再被訪問到時,它的使用位也被置爲1。
對於頁替換算法,用於替換的候選幀集合看做一個循環緩衝區,並且有一個指針與之相關聯。當某一頁被替換時,該指針被設置成指向緩衝區中的下一幀。
當需要替換一頁時,操作系統掃描緩衝區,以查找使用位被置爲0的一幀。每當遇到一個使用位爲1的幀時,操作系統就將該位重新置爲0;如果在這個過程開始時,緩衝區中所有幀的使用位均爲0,則選擇遇到的第一個幀替換;如果所有幀的使用位均爲1,則指針在緩衝區中完整地循環一週,把所有使用位都置爲0,並且停留在最初的位置上,替換該幀中的頁。
由於該算法循環地檢查各頁面的情況,故稱爲CLOCK算法,又稱爲最近未用(Not Recently Used, NRU)算法。
 
改進算法
CLOCK算法的性能比較接近LRU,而通過增加使用的位數目,可以使得CLOCK算法更加高效。在使用位的基礎上再增加一個修改位,則得到改進型的CLOCK置換算法。這樣,每一幀都處於以下四種情況之一:
最近未被訪問,也未被修改(u=0, m=0)。
最近被訪問,但未被修改(u=1, m=0)。
最近未被訪問,但被修改(u=0, m=1)。
最近被訪問,被修改(u=1, m=1)。
 
算法執行如下操作步驟:
從指針的當前位置開始,掃描幀緩衝區。在這次掃描過程中,對使用位不做任何修改。選擇遇到的第一個幀(u=0, m=0)用於替換。
如果第1)步失敗,則重新掃描,查找(u=0, m=1)的幀。選擇遇到的第一個這樣的幀用於替換。在這個掃描過程中,對每個跳過的幀,把它的使用位設置成0。
如果第2)步失敗,指針將回到它的最初位置,並且集合中所有幀的使用位均爲0。重複第1步,並且如果有必要,重複第2步。這樣將可以找到供替換的幀。
 
改進型的CLOCK算法優於簡單CLOCK算法之處在於替換時首選沒有變化的頁。由於修改過的頁在被替換之前必須寫回,因而這樣做會節省時間。

內存抖動

置換算法選擇不當,缺頁現象頻繁

2. 頁式

邏輯空間等分爲頁;並從0開始編號
內存空間等分爲塊,與頁面大小相同;從0開始編號
分配內存時,以塊爲單位將進程中的若干個頁分別裝入到多個可以不相鄰接的物理塊中。
把邏輯地址空間劃分爲相同大小的基本分配單位。
訪問一個內存單元需要2次內存訪問:1.獲取頁表項;2.訪問數據。
優點:沒有外碎片,每個內碎片不超過頁的大小。
缺點:程序全部裝入內存,要求有相應的硬件支持。

地址結構

分兩部分:頁號、位移量(頁內地址)
在這裏插入圖片描述
因爲塊的大小=頁的大小,所以塊內位移量=頁內位移量,所以只需求出塊號

3. 段式

邏輯空間分爲若干個段,每個段定義了一組有完整邏輯意義的信息。
內存空間爲每個段分配一個連續的分區
段表示訪問方式和存儲數據等屬性相同的一段地址空間,對應一個連續的內存“塊”, 若干個段組成進程邏輯地址空間。
優點:可以分別編寫和編譯,可以針對不同類型的段採用不同的保護,可以按段爲單位來進行共享,包括通過動態鏈接進行代碼共享。
缺點:會產生碎片。

地址結構

分兩部分:段號、位移量(段內地址)
在這裏插入圖片描述
(物理地址=基址+段內地址)
求基址的過程與頁式存儲中求塊號的過程原理相同,這裏需要注意的是,物理地址是基址+段內地址,而不是基址&段內地址,由邏輯地址得到段號、段內地址,再根據段號和段表求出基址,再由基址+段內地址即可得物理地址。

4. 分頁和分段的區別

分頁 分段
信息的物理單位,大小由系統決定,地址空間是一維的 信息的邏輯單位,大小由用戶決定,地址空間是二維的

5. 段頁式

用戶程序先分段,每個段內部再分頁(內部原理同基本的分頁、分段相同)
在段式存儲管理基礎上,給每個段加一級頁表在段式存儲管理基礎上,給每個段加一級頁表 通過指向相同的頁表基址,實現進程間的段共享。
段頁式管理是段式管理與頁式管理方案結合而成的所以具有他們兩者的優點。但反過來說,由於管理軟件的增加,複雜性和開銷也就隨之增加了。

地址結構

分三部分:段號、段內頁號、頁內地址
在這裏插入圖片描述

6. 其他

內存分區

Linux 中 swap分區
swap space是磁盤上的一塊區域,可以是一個分區,也可以是一個文件,或者是他們的組合。簡單點說,當系統物理內存喫緊時,Linux會將內存中不常訪問的數據保存到swap上,這樣系統就有更多的物理內存爲各個進程服務,而當系統需要訪問swap上存儲的內容時,再將swap上的數據加載到內存中,這就是我們常說的swap out和swap in。

Windows 中虛擬內存

磁盤緩衝區(快手)

磁盤緩存 ,又稱磁盤快取,實際上就是將下載到的數據先保存於系統爲軟件分配的內存空間中(這個內存空間被稱之爲“內存池”),當保存到內存池中的數據達到一個程度時,便將數據保存到硬盤中。這樣可以減少實際的磁盤操作,有效的保護磁盤免於重複的讀寫操作而導致的損壞。
磁盤緩衝區,磁盤的緩衝區是硬盤與外部總線交換數據的場所。硬盤的讀數據的過程是將磁信號轉化爲電信號後,通過緩衝區一次次地填充與清空,再填充,再清空,一步步按照PCI總線的週期送出,可見,緩衝區的作用是相當重要的。它的作用也是提高性能,但是它與緩存的不同之處在於:一、它是容量固定的硬件,而不像緩存是可以由操作系統在內存中動態分配的。二、它對性能的影響大大超過磁盤緩存對性能的影響,因爲如果沒有緩衝區,就會要求每傳一個字(通常是4字節)就需要讀一次磁盤或寫一次磁盤。
總而言之,磁盤緩存是屬於內存的,而磁盤緩衝區是硬盤與PCI總線之間的容量固定的硬件。
目的: 減少磁盤 I/O 次數

—————————————————————————————————————————————
有什麼問題可以評論或者私信我,每日在線解(LIAO)疑(SAO)。

我是大誌,一位準備996的卑微碼農🐶,覺得好用記得點贊收藏!!!
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章