操作系統(tǒng)

一、筆記知識點

1、進程和線程的區(qū)別

(1) 一個運行的程序至少有一個進程,一個進程至少有一個線程。
進程有自己獨立的地址空間,而線程沒有,線程必須依賴于進程而存在,即只能在他所屬的進程的地址空間內活動)。
(2) 進程是資源分配的單位,線程是執(zhí)行的單位。(處理機分配給線程,即真正在處理機上運行的是線程)。
(3) 同一進程的線程除自己私有的少量資源外,要共享所屬進程的全部資源。
(4) 線程上下文切換比進程上下文切換要快得多,進程間切換消耗的資源更大。
(5) 同個進程下的線程之間通信更方便,因為它們共享所屬進程的信息。而進程的通信則需要借助其他方法才行。


2、進程通信
2.1 對于共享資源的同步與互斥

同步:多個進程因為合作關系產生的制約關系,使進程有一定的先后執(zhí)行順序;
互斥:對于一個共享資源來說,多個進程在同一時刻,只有能一個進程能夠訪問該共享資源。

(1) 臨界區(qū)

● 臨界資源:一次只允許一個進程使用的共享資源(類)。

為了互斥訪問臨界資源,每個進程或者線程再進入臨界區(qū)之前,都需要進行檢查。

(2) 信號量 + PV操作。

● 信號量:系統(tǒng)中某類資源的數(shù)目,其值大于0,表示系統(tǒng)中當前可用資源數(shù)目;其值小于0,其絕對值表示系統(tǒng)中因請求該類資源而被封鎖的進程數(shù)目。
● P操作:請求系統(tǒng)分配一個單位資源;● V操作:釋放一個單位資源。

生產者-消費者 問題
#define N 100
typedef int semaphore;
semaphore mutex = 1; # 互斥量,緩沖區(qū)是臨界資源
semaphore empty = N; # 信號量,表明空緩沖區(qū)的數(shù)量
semaphore full = 0; # 信號量,表明滿緩沖區(qū)的數(shù)量,當緩沖區(qū)有物品就滿,沒有就空

void producer() {
    while(TRUE) {
        int item = produce_item();
        P(&empty);
        P(&mutex);
        insert_item(item);
        V(&mutex);
        V(&full);
    }
}

void consumer() {
    while(TRUE) {
        P(&full);
        P(&mutex);
        int item = remove_item();
        consume_item(item);
        V(&mutex);
        V(&empty);
    }
}

\color{red}{注意:一定要先判斷信號量,再判斷互斥量(臨界區(qū)盡可能縮小),不然可能會導致死鎖!}

(3) 管程
管程是一種同步機制,用于協(xié)調多個進程或線程對共享資源的訪問。它可以看成是一種高級的互斥鎖,封裝了【共享資源和訪問共享資源的方式】,確保在任意時刻只有一個進程或者線程訪問該共享資源。Java中的sychronized關鍵字就是一種基于管程的同步機制。

2.2 高級進程通信方式:共享內存區(qū)、消息隊列方式、管道文件方式

(1) 共享內存方式:在內存中分配一片空間作為共享內存區(qū)。需要進行通信的各個進程把共享內存區(qū)映射到自己的地址空間中,之后就可以對共享內存區(qū)中的數(shù)據直接進行讀或寫。這種方式的通信效率更高,但需要依靠某種同步機制如信號量來避免同時讀寫的問題。

(2) 消息隊列方式:以消息為單位在進程間進行數(shù)據交換。
【同步】:發(fā)送進程和接收進程需要同步。在一個進程發(fā)送消息之前,接收進程需要準備好接收消息的緩沖區(qū),否則沒準備好可能會導致消息丟失或者被覆蓋。
【尋址】:有兩種方式
?● 直接通信方式:發(fā)送進程直接將消息掛在接收進程的消息緩沖隊列上,接收進程從消息緩沖隊列中得到消息。
??對稱尋址:進行通信的每一方都必須顯式的指明消息接收方或發(fā)送方是誰;
??非對稱尋址:只有發(fā)送方知道接收方的名字,而接收方不必知道發(fā)送方的名字。
?● 間接通信方式 / 信箱通信:發(fā)送進程將消息送到稱做信箱(有唯一標識)的中間設施中,接收進程從信箱中取得消息。
??公用信箱:由操作系統(tǒng)創(chuàng)建。所有進程都可以向公用信箱發(fā)送消息,也可以取出發(fā)送給自己的消息。
??共享信箱:由某個進程創(chuàng)建。對它要指明共享屬性及共享進程的名字,信箱的創(chuàng)建者和共享者都可從中取走發(fā)給自己的消息。
??私有信箱:用戶進程為自己創(chuàng)建的信箱。創(chuàng)建者有權從中讀取消息,而其他進程只能把消息發(fā)送到該信箱中。

(3) 管道文件方式:管道文件也稱管道線,它是連接兩個命令的一個打開文件。一個命令向該文件中寫入數(shù)據,另一個命令從該文件中讀出數(shù)據。讀寫方式類似于隊列。
匿名管道:一種半雙工的通信方式,數(shù)據只能單向流動(如果雙方通信,則需要建立起兩個管道),而且只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系。它只存在于內存中,沒有名字、文件描述符。
有名管道:也是半雙工的通信方式,但是它允許無親緣關系進程間的通信(通過提供進程的路徑名來實現(xiàn))。有名管道可以持久化,在文件系統(tǒng)中有對應的名字和文件描述符。

(4) 信號:異步通信方式,用于通知接收進程某個事件已經發(fā)生,比如按下ctrl + C就是信號。

2.3 網絡系統(tǒng)中的進程通信方式:socket套接字、遠程過程調用RPC

(1) socket套接字:可用于不同計算機間的進程通信,相當于端口和端口之間的通信。
一對進程通過網絡進行通信要用一對socket,每個進程一個。通常,它采用客戶端-服務器結構。服務器通過監(jiān)聽指定的端口,等待即將到來的客戶請求。一旦受到客戶請求,服務器就接收來自客戶socket的連接,形成完全連接。
但這種方式是一種低級通信形式,一個原因是socket只允許在通信線程間交換無結構的字節(jié)流,必須有客戶端或者服務器對數(shù)據加以構造。

(2) 遠程過程調用RPC:允許程序調用另外機器上的進程。當機器 A 的一個客戶進程或線程調用機器 B 上的一個進程時,A 上的調用進程掛起,被調用進程在 B 上開始執(zhí)行。調用者以參數(shù)形式把信息傳送給被調用者(通過 RPC 的超時重傳軟件),被調用者把進程執(zhí)行結果回送給調用者。


3、線程的通信
3.1 線程的串行執(zhí)行

串行訪問臨界區(qū),可以保證臨界資源同一時刻只有一個線程在訪問。

3.2 互斥量 Sychronized / Lock

采用互斥對象機制,只有擁有互斥對象的線程才有訪問公共資源的權限。因為互斥對象只有一個,所以可以保證公共資源不會被多個線程同時訪問。(可以和【條件變量】搭配使用,條件變量是一種附加在互斥鎖上的線程同步機制,可以使線程在滿足特定條件之前阻塞并釋放鎖,等到條件滿足后再從阻塞態(tài)到就緒態(tài),重新競爭鎖)

3.3 信號量

為控制具有有限數(shù)量的用戶資源而設計的,它允許多個線程在同一時刻去訪問同一個資源,但一般需要限制同一時刻訪問此資源的最大線程數(shù)目。

3.4 事件觸發(fā) wait / notify

在Java中,wait和notify是Object類方法。使用該方法的線程必須持有共享資源,否則會報出IllegalMonitorStateException。wait會將當前線程持有的對象鎖釋放,并使得線程進入等待池中,直到超時或者被喚醒;notify會將在等待池中需要該對象鎖的一個或全部線程移入池鎖,等待對象鎖釋放后,共同競爭該鎖。

3.5 信號

信號是以進程為單位的,進程收到信號時,由于線程共享進程的資源,該進程下的所有線程都可以處理該信號。


4、線程的實現(xiàn)方式

以下兩種不同的線程實現(xiàn)方式,主要區(qū)別在于線程的創(chuàng)建、調度和同步機制等方面。
(1) 用戶級線程
● 由用戶進程自行實現(xiàn)的多個線程,操作系統(tǒng)并不能知曉用戶線程的存在
● 在用戶級線程的實現(xiàn)中,所有的線程都共享同一個進程地址空間(用戶線程在操作系統(tǒng)中沒有單獨的堆棧等資源),因此線程之間的切換非常快速
● 同個進程的多個線程沒法同時占用cpu,即使是cpu有多核;因此,就線程的同時執(zhí)行而言,任意給定時刻每個進程只能夠有一個線程在運行,而且只有一個處理器內核會被分配給該進程。也就是說,在一個線程被阻塞時,整個進程的執(zhí)行也會被阻塞,因為操作系統(tǒng)無法將運行權轉移到其他線程。

(2) 內核級線程
● 內核線程建立和銷毀都是在內核的支持下運行,由操作系統(tǒng)負責管理,通過系統(tǒng)調用完成的。
● 操作系統(tǒng)為每個線程創(chuàng)建上下文。進程的每個線程在資源可用時都可以被指派到處理器內核,這些線程可以在全系統(tǒng)內進行資源的競爭。線程之間的切換需要進行系統(tǒng)調用,會涉及到用戶態(tài)和內核態(tài)之間的切換,因此線程的切換開銷比用戶級線程要大。
● 在一個線程被阻塞時,其他線程仍然可以繼續(xù)執(zhí)行,因為操作系統(tǒng)可以將運行權轉移到其他線程。


5、協(xié)程
協(xié)程圖例

(1) 如同一個進程可以擁有多個線程一樣:一個線程可以擁有多個協(xié)程。
(2) 協(xié)程是在用戶態(tài)執(zhí)行的。相比于進程和線程切換從“用戶態(tài)到內核態(tài)再到用戶態(tài)”,協(xié)程的切換過程只有用戶態(tài),即沒有陷入內核態(tài),因此切換效率高。
(3) 協(xié)程不是進程也不是線程,而是一個特殊的函數(shù),這個函數(shù)可以在某個地方掛起,并且可以重新在掛起處繼續(xù)運行。所以說,協(xié)程與進程、線程相比并不是一個維度的概念。
(4) 一個線程的多個協(xié)程的運行是串行的(一個線程內可以有多個函數(shù),但他們執(zhí)行必須時串行的),即同一個時刻只能由一個協(xié)程在運行。如果是多核CPU,多個進程或一個進程內的多個線程是可以并行運行的,但是一個線程內協(xié)程卻絕對是串行的,無論CPU有多少個核,即無法利用CPU的多核能力。當一個協(xié)程運行時,其它協(xié)程必須掛起。


6、堆與棧的區(qū)別

堆與棧實際上是操作系統(tǒng)對進程占用的內存空間的兩種管理方式【區(qū)別于JVM內存中的堆和?!浚饕腥缦聨追N區(qū)別:
(1) 管理方式不同。棧絕大部分情況由操作系統(tǒng)自動分配釋放,無需我們手動控制;堆的申請和釋放工作由程序員控制,容易產生內存泄漏;
(2) 分配方式不同。堆都是動態(tài)分配的,沒有靜態(tài)分配的堆。一般來說棧有2種分配方式:靜態(tài)分配和動態(tài)分配。靜態(tài)分配是由操作系統(tǒng)完成的,比如局部變量的分配。動態(tài)分配可以由alloca函數(shù)進行分配,但是棧的動態(tài)分配和堆是不同的,他的動態(tài)分配是由操作系統(tǒng)進行釋放,無需我們手工實現(xiàn)。
(3) 分配效率不同。棧由操作系統(tǒng)自動分配,會在硬件層級對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率比較高。堆則是由C/C++提供的庫函數(shù)或運算符來完成申請與管理,實現(xiàn)機制較為復雜,頻繁的內存申請容易產生內存碎片。顯然,堆的效率比棧要低得多。
(4) 生長方向不同。堆的生長方向向上,內存地址由低到高;棧的生長方向向下,內存地址由高到低。

Linux內存的邏輯分區(qū)

(5) 空間大小不同。每個進程擁有的棧的大小要遠遠小于堆的大小。理論上,程序員可申請的堆大小為虛擬內存的大小,這個虛擬內存空間可以比物理內存空間大得多,因為不是所有的虛擬地址都需要被映射到物理內存中。當進程需要訪問虛擬地址時,操作系統(tǒng)會根據需要將虛擬地址映射到物理內存中的實際地址;
(6) 存放內容不同。棧存放的內容,函數(shù)返回地址、相關參數(shù)、局部變量和寄存器內容等。堆,一般情況堆頂使用一個字節(jié)的空間來存放堆的大小,而堆中具體存放內容是由程序員來填充的。


7、避免僵死進程的方法

(1) 父進程通過wait或waitpid函數(shù)等待子進程結束,這樣有個問題,就是會導致父進程掛起
(2) 如果父進程很忙,可以采用異步的方式,注冊SIGCHLD信號處理函數(shù),在處理函數(shù)中wait回收子進程。或者是注冊SIG_IGN告知內核,忽略掉該信號,當然子進程結束后,內核會幫助回收。
(3) 還可以用一些技巧,比如fork兩次。子進程退出(此時孫進程就短暫的變成了孤兒進程),然后孫進程就由init進程(進程號為1)接管回收了。


8、線程安全

當多個線程訪問某個方法時,不管你通過怎樣的調用方式或者說這些線程如何交替的執(zhí)行,我們在主程序中不需要去做任何的同步,這個類的結果行為都是我們設想的正確行為,那么我們就可以說這個類是線程安全的。

● 怎么做到線程安全?
(1) 棧內的數(shù)據是線程安全的。棧是線程私有的,其他線程不能操作也不需要操作(如方法的局部變量)。
(2) 只能讀取不能修改的數(shù)據是線程安全的。指常量或者只讀變量,它們想改也改不了。
(3) 堆內數(shù)據加鎖后是線程安全的。當多個線程想要操作同一份數(shù)據,為了確保數(shù)據的安全性(或者說一致性),需要先獲取鎖才能操作數(shù)據,操作完之后釋放鎖。沒有拿到鎖的線程只能等待鎖的釋放。


9、linux中的鎖
(1) 自旋鎖:

自旋鎖的主要特征是使用者在想要獲得臨界區(qū)執(zhí)行權限時,如果臨界區(qū)已經被加鎖,那么自旋鎖并不會阻塞睡眠,等待系統(tǒng)來主動喚醒,而是原地忙輪詢資源是否被釋放加鎖,自旋就是自我旋轉,這個名字還是很形象的。自旋鎖有它的優(yōu)點就是避免了系統(tǒng)的喚醒,自己來執(zhí)行輪詢,如果在臨界區(qū)的資源代碼非常短且是原子的,那么使用起來是非常方便的,避免了各種上下文切換,開銷非常小,因此在內核的一些數(shù)據結構中自旋鎖被廣泛的使用。

(2) 信號量:

信號量在創(chuàng)建時需要設置一個初始值,表示同時可以有幾個任務可以訪問該信號量保護的共享資源,初始值為1就變成互斥鎖(Mutex),即同時只能有一個任務可以訪問信號量保護的共享資源。一個任務要想訪問共享資源,首先必須得到信號量,獲取信號量的操作將把信號量的值減1,若當前信號量的值為負數(shù),表明無法獲得信號量,該任務必須掛起在該信號量的等待隊列等待該信號量可用;若當前信號量的值為非負數(shù),表示可以獲得信號量,因而可以立刻訪問被該信號量保護的共享資源。當任務訪問完被信號量保護的共享資源后,必須釋放信號量,釋放信號量通過把信號量的值加1實現(xiàn),如果信號量的值為非正數(shù),表明有任務等待當前信號量,因此它也喚醒所有等待該信號量的任務。

(3) 讀寫鎖:

讀寫鎖也叫共享互斥鎖:讀模式共享和寫模式互斥,本質上這種非常合理,因為在數(shù)據沒有被寫的前提下,多個使用者讀取時完全不需要加鎖。讀寫鎖有讀加鎖狀態(tài)、寫加鎖狀態(tài)和不加鎖狀態(tài)三種狀態(tài),當讀寫鎖在寫加鎖模式下,任何試圖對這個鎖進行加鎖的線程都會被阻塞,直到寫進程對其解鎖。

(4) 條件變量【它常常和互斥鎖一起使用】

通常用于解決對線程的同步和互斥問題。它允許線程在等待某個條件時進入阻塞狀態(tài),并釋放當前和條件變量綁定的鎖,等到條件滿足時線程會被喚醒,從阻塞態(tài)進入就緒態(tài),重新競爭鎖。但條件變量本身并不是一種鎖,它只是一種線程同步機制,常常附加在互斥鎖上,搭配使用,用于等待和喚醒其他線程。
java中的java.util.concurrent.locks.Condition包下提供了條件變量相關的類。

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Example {
    private final Lock lock = new ReentrantLock();
    private final Condition condition = lock.newCondition();
    private volatile boolean resultReady = false;

    public void calculate() {
        lock.lock();
        try {
            // 計算結果
            resultReady = true;
            // 通知等待線程
            condition.signal(); 【通知等待線程】
        } finally {
            lock.unlock();
        }
    }

    public void output() {
        lock.lock();
        try {
            while (!resultReady) {
                // 等待計算線程完成
                condition.await();【阻塞并釋放lock鎖,等待被喚醒進入就緒態(tài)】
            }
            // 輸出結果
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        } finally {
            lock.unlock();
        }
    }
}

10、同步與異步、阻塞與非阻塞 (\color{red}{區(qū)分}

同步與異步:主要是從消息通知機制來劃分的。
同步:需要調用方主動的查詢被調用方任務執(zhí)行結果。調用方要持續(xù)查看,或者每隔一定時間去檢查一下被調用方的狀態(tài),效率低;

異步:調用方不需要主動查詢,可能不能立刻得到返回消息,后續(xù)被調用方執(zhí)行完畢后可以使用通知、回調等方式通知調用方。

阻塞與非阻塞:主要是從等待消息通知時(無所謂同步還是異步)任務的狀態(tài)來劃分的。
阻塞:在等待結果返回的過程中,任務被掛起。
非阻塞:在等待任務返回的過程中,任務沒有被掛起,還可以處理其他的事情。

以小明下載文件,舉例說明,四種概念:

(1) 同步阻塞:小明一直盯著下載進度條,持續(xù)等待。
● 同步體現(xiàn)在:主動盯著進度條。
● 阻塞體現(xiàn)在:等待下載完成的過程中,什么都不能做。

(2) 同步非阻塞:小明開始下載后就去干別的,但會每隔一段時間回來瞄一眼進度條。
● 同步體現(xiàn)在:每隔一段時間主動查看進度條。
● 非阻塞體現(xiàn)在:在等待下載完成的過程中,還有干別的任務。

(3) 異步阻塞:下載完成后會有“?!钡囊宦曁崾疽?,但是小明仍然一直等待下載完成。(這看起來很傻)
● 異步體現(xiàn)在:下載完成“?!钡囊宦曂ㄖ?br> ● 阻塞體現(xiàn)在:等待下載完成的過程中,什么都不能做。

(4) 異步非阻塞:仍然是那個下載完成后會有“?!钡囊宦暤奶崾疽舻能浖?,小明在開始下載后,就去干別的了,聽到“?!钡囊宦暰椭劳瓿闪恕?br> ● 異步體現(xiàn)在:下載完成“?!钡囊宦曂ㄖ?。
● 非阻塞體現(xiàn)在:在等待下載完成的過程中,還有干別的任務。


二、八股文鏈接

1、操作系統(tǒng)常見面試題總結(上) | JavaGuide(Java面試 + 學習指南)
?● 操作系統(tǒng)基礎:幾大功能、用戶態(tài)和內核態(tài)(系統(tǒng)調用、異常、中斷;中斷向量表、中斷處理程序)
?● 進程和線程:概念、通信方式、狀態(tài)、PCB、進程調度算法
??進程調度算法:
????① 先到先服務
????② 短作業(yè)優(yōu)先(CPU運行時間;實現(xiàn)困難(可以以歷史替代后來);對長作業(yè)不友好——“饑餓”現(xiàn)象)
????③ 最短剩余時間(短作業(yè)優(yōu)先的變形,搶占式)
????④ 時間片輪轉法(基于先到先服務,給每個進程分配相同的時間片,可能要經過幾次輪轉才能執(zhí)行完該進程)
????⑤ 優(yōu)先級調度(靜態(tài)/動態(tài);非搶占式/搶占式)
????⑥ 多級反饋隊列調度(搶占式;優(yōu)先級從高到低設計多個隊列,高優(yōu)先級隊列的時間片短;最開始的進程加入第一個隊列的隊尾,如果在規(guī)定時間內沒有執(zhí)行完,則移交到下一個隊列的隊尾;只有上一個隊列執(zhí)行完畢才能執(zhí)行當前隊列,可能會產生“饑餓”問題,優(yōu)化點:提升那些在隊列中等待了很久的進程優(yōu)先級)

????⑦ 高響應比優(yōu)先法(非搶占式;兼顧短作業(yè)核長作業(yè);難以在實時系統(tǒng)實現(xiàn))
????⑧ 公平共享法(根據用戶持有進程數(shù)量分配CPU時間比例)
?● 僵尸進程、孤兒進程
?● 死鎖:一個進程集合中,每個進程本身自己占有一部分資源,不釋放,并且等待該集合中另一個進程占有的資源,從而出現(xiàn)循環(huán)等待,無限期僵持下去的局面。
??死鎖產生的4個必要條件(同時):
????① 互斥條件
????② 占有且等待條件
????③ 不可搶占條件
????④ 循環(huán)等待條件

?● 內存管理
??……
??頁缺失:硬性頁缺失(物理內存總沒有物理頁)、軟性頁缺失(物理內存中有物理頁,但是沒有建立虛擬頁和物理頁的映射)、無效缺頁錯誤
?● 文件系統(tǒng)
??(1) 作用:存儲管理、文件管理、目錄管理、共享和保護、用戶接口……
??(2) 文件:普通文件、目錄文件、特殊文件(也可按其他分類標準分)
??(3) 鏈接
????① inode(文件和目錄唯一的索引節(jié)點號);
????② 硬鏈接(通過inode建立連接,硬鏈接和源文件的inode節(jié)點號相同,可以認為在文件系統(tǒng)中兩者等價,即刪除一個對另外一個完全沒有影響;只有刪除了源文件和所有對應的硬鏈接文件,文件才會被真正刪除;不能對不存在的文件或目錄創(chuàng)建硬鏈接,不能跨文件系統(tǒng)建立硬鏈接,因為不同文件系統(tǒng)可能會有同名inode節(jié)點號,導致沖突和混亂),通過 ln 命令創(chuàng)建硬鏈接
????③ 軟鏈接(軟鏈接和源文件的inode節(jié)點號不同,軟鏈接指向一個文件路徑;源文件刪除后,軟鏈接仍然存在,但是指向一個無效的文件路徑,類似于Windows系統(tǒng)的快捷方式;可以對不存在的文件或者目錄創(chuàng)建軟鏈接,可以跨文件系統(tǒng)建立軟鏈接),通過 ln -s 命令創(chuàng)建軟鏈接
?● 輸入/輸出管理
??(1) 相關概念:盤片、盤面、磁道、磁頭、磁臂、扇區(qū)、柱面
????一個磁盤,有多個盤片;
????一個盤片,可以有兩個盤面(取決于是否涂上磁性物質);
????一個盤面,附著一個磁頭;
????所有磁頭,連接同一個磁臂,磁頭“同進退”;
????一個盤面,有若干圈磁道;
????一個磁道,有若干塊扇區(qū);
????相對位置相同的所有磁道,共同構成一個柱面;
??——(柱面號,盤面號,扇區(qū)號)來定位任意一個“磁盤塊”
參考鏈接:(39條消息) 5 分鐘圖解 磁盤的結構(盤片、磁道、扇區(qū)、柱面)柱面磁道扇區(qū)圖解一劍何風情的博客-CSDN博客
??(2) 磁盤存取時間:尋道時間(磁頭移到相應的磁道或者柱面) + 旋轉延遲時間(扇區(qū)轉到讀/寫頭下) + 傳輸時間(信息在盤和內存之間傳送)
??(3) 磁盤調度算法【主要考慮尋道時間,因為它遠大于另外兩部分】:
????① 先來先服務算法(按照請求到達磁盤調度器的順序進行處理,由于沒有考慮磁頭移動的路徑和方向,平均尋道時間較長)
????② 最短尋道時間優(yōu)先算法 / 最佳服務優(yōu)先算法(優(yōu)先選擇距離當前磁頭位置最近的請求進行服務,可能會導致饑餓問題)
????③ 掃描算法 SCAN (磁頭沿一個方向掃描磁盤,如果有請求就處理,到達邊界時換向掃描,循環(huán)往復)
????④ 巡回掃描算法 C-SCAN (SCAN的變體,只朝一個方向掃描,到達磁盤邊界后,再次回到磁盤起點,重新開始掃描)
????⑤ 電梯法 / 巡查法 LOOK (SCAN算法碰到了邊界才掉頭,有可能磁頭移動方向上已經沒有請求了,這樣就會有很多無用功;改進SCAN算法,如果磁頭移動方向已經沒有別的請求了,就可以立即改變磁頭移動方向,循環(huán)往復)
????⑥ 均衡循環(huán)掃描算法 C-LOOK (類似LOOK對SCAN的改進,C-LOOK是對C-SCAN的改進,當磁頭方向沒有請求了,讓磁頭立即返回,并且只需要返回到有磁道訪問請求的位置)

2、操作系統(tǒng)01-20 | 阿秀的學習筆記 (interviewguide.cn)
?● 內存覆蓋和交換
??覆蓋技術:是一項已經成為歷史的早期技術
????(1) 早期計算機內存很小,不夠使用,所以使用覆蓋技術來解決程序大小超出物理內存總和的問題;
????(2) 內存中包含一個固定區(qū)若干個覆蓋區(qū),基本思想是:把一個程序劃分成多個段,分別存放在兩個區(qū)中,固定區(qū)存放常駐內存的段,而覆蓋區(qū)存放不常用的段,在需要的時候在調入內存;
????(3) 覆蓋技術需要程序員聲明覆蓋結構,對用戶不透明,增加了工作負擔。
??交換技術
????(1) 基本思想是:在內存空間緊張時,可以把內存中的某些進程暫時換出外存的對換區(qū)掛起,把外存中已經具備運行條件的程序換入內存;
????(2) 磁盤存儲通常分為:文件區(qū)對換區(qū)。文件區(qū)主要用來存放文件,因追求存儲空間的利用率,所以采用離散分配方式;而對換區(qū)占據磁盤空間一小部分,因追求速度所以采用連續(xù)分配的方式。
??兩者的區(qū)別:覆蓋是針對同一個進程或程序的,交換是針對不同的進程或程序的;覆蓋技術打破了程序必須全部裝入內存才能運行的限制,交換技術打破了進程進入內存就一直會運行到結束的限制。
?● 操作系統(tǒng)經典問題
??(1) 生產者-消費者問題:緩沖區(qū)互斥量mutex、empty信號量(>0才能生產)、full信號量(>0才能消費)
??(2) 哲學家進餐問題:狀態(tài)數(shù)組(互斥量)、允許進餐數(shù)組(互斥量)【檢查左右兩邊的人是否在進餐,沒有的話說明左右筷子可用,才能進餐】
??(3) 讀者-寫者問題:讀者數(shù)量(互斥量)、寫者數(shù)量(互斥量)、寫操作(互斥量)【分成讀者優(yōu)先、寫者優(yōu)先兩種情況】

● 寫者優(yōu)先

typedef int semaphore;
semaphore resource_mutex = 1;
semaphore read_mutex = 1;
semaphore write_mutex = 1;
int read_count = 0;
int write_count = 0;

void reader() {
    while(TRUE) {
        down(&read_count_mutex);
        read_count++;
        if(read_count == 1) down(&write_mutex); // 第一個讀者需要等待所有寫者完成操作
        up(&read_count_mutex);

        // 訪問共享資源
        read();

        down(&read_count_mutex);
        read_count--;
        if(read_count == 0) up(&write_mutex); // 最后一個讀者離開時,通知所有等待中的寫者
        up(&read_count_mutex);
    }
}

void writer() {
    while(TRUE) {
       【注意:比讀者優(yōu)先新增的代碼部分1】
        down(&write_count_mutex);
        write_count++;
        if(write_count == 1) down(&read_count_mutex); // 第一個寫者需要等待所有讀者完成操作
        up(&write_count_mutex);

        down(&write_mutex);
        // 訪問共享資源
        write();
        up(&write_mutex);

        【注意:比讀者優(yōu)先新增的代碼部分2】
        down(&write_count_mutex);
        write_count--;
        if(write_count == 0) up(&read_count_mutex); // 最后一個寫者離開時,通知所有等待中的讀者
        up(&write_count_mutex);
    }
}

?● 終端退出,終端運行的進程會怎么樣?
??我們在終端輸入命令時,終端會將命令傳遞給bash進程進行解釋執(zhí)行。bash進程是一個Unix/Linux系統(tǒng)的命令行解釋器,終端開啟的進程就是bash進程。bash進程會作為終端的子進程運行。當終端關閉的時候,會發(fā)送SIGHUP信號給這些bash進程,如果程序沒有對SIGHUP信號做特殊處理,那么進程會隨著終端的關閉而退出。
?● 如何讓進程后臺運行?
??(1) 在命令后面加上“&”,加入后臺隊列中,在后臺運行;
??(2) 使用 ctrl+Z,使得當前進程被掛起,然后使用“jobs”查看作業(yè)號,并使用“bg %作業(yè)號”來使其在后臺運行
??(3) 在命令前使用nohup命令,并在最后加上“&”,可使進程忽略SIGHUP信號,在后臺運行;
??(4) 將命令(可以是多條的)用“()”包裹起來,最后加上“&”,可使進程忽略SIGHUP信號,在后臺運行;
??(5) 在命令前使用setsid,并在最后加上“&” ,使得進程變成init進程的子進程,不受SIGHUP信號的影響;
?● 執(zhí)行malloc申請內存時,操作系統(tǒng)是怎么做的?
??(1) brk操作:當分配的內存不超過128k時,它將進程數(shù)據段的最高地址指針高地址移動,以擴大運行時堆的大小。
??(2) mmap操作:當分配的內存超過128k時,在進程的棧和堆中間尋找一塊空閑的虛擬內存
??先通過這兩個系統(tǒng)調用獲取進程的虛擬內存地址,然后在訪問這些虛擬內存時,通過缺頁中斷,讓內核分配相應的物理空間,并建立地址映射,這樣內存分配才算完成。
?● 守護進程:在后臺運行的一種特殊進程,他會周期性的執(zhí)行一些任務,如檢查日志、清理臨時文件等,它會一直運行直到系統(tǒng)關閉。
?● 中斷和異常的區(qū)別
??中斷:由硬件設備產生,產生的來源在程序指令之外,會發(fā)送給CPU,然后CPU發(fā)送給內核,由內核處理中斷,內核需要根據是異常還是中斷調用不用的處理程序。中斷不一定是時鐘同步的,這意味著終端隨時可能會來。
??異常:由程序指令內部產生的,通常是意外的事件,它同樣會由CPU發(fā)送給內核,由內核處理異常,內核需要根據是異常還是中斷調用不用的處理程序。異常是CPU調度指令時產生的,因此它是時鐘同步的。
?● Linux下的內存分布情況

7種不同的內存段

?● 內存操作相關的常見開發(fā)錯誤
??(1) 內存未分配成功,卻使用了它。可能會存在空指針異常,要有意識的判斷空;
??(2) 超出內存使用范圍,導致越界;
?● 在發(fā)生內存交換時,有哪些進程被優(yōu)先考慮?
??可優(yōu)先換出阻塞進程、優(yōu)先級低的進程。
?● 并發(fā)和并行的區(qū)別
??● 并發(fā):在宏觀上一定時間內能運行多個程序(實際上是串行執(zhí)行,時間片輪轉);
??● 并行:同一時刻運行多個指令
?● 共享
??互斥共享:互斥的資源為臨界資源,多個進程或線程訪問時,需要使用專門的同步互斥機制來保證安全問題;
??同時共享:資源可以同時被多個進程或者線程訪問,而不需要通過專門的互斥機制來保證獨占訪問。例如可以使用線程安全的數(shù)據結構、使用原子操作等來保證同時共享的多線程安全問題。
?● 馮諾依曼體系結構
馮諾依曼體系結構圖

??(1) 輸入設備:鍵盤
??(2) 輸出設備:顯示器
??(3) 控制器:CPU(現(xiàn)代計算機中將它
和運算器合并,稱為中央處理器CPU
??(4) 運算器:CPU(現(xiàn)代計算機中將它
和控制器合并,稱為中央處理器CPU
??(5) 存儲器:內存、外存

?● 什么時候用多進程?什么時候用多線程?
??(1) 當涉及到大量的創(chuàng)建銷毀、或者計算操作時,應優(yōu)先選擇【多線程】。因為這涉及到CPU資源的利用,進程的切換要比線程切換開銷大得多;
??(2) 當相互協(xié)作的關聯(lián)性比較強時,優(yōu)先選擇【多線程】,因為同屬一個進程的多個線程共享資源,并且通訊起來較為方便;
??(3) 當任務擴展到多機分布時,應該用【多進程】;而任務涉及的是單機中的多核分布,應該優(yōu)先選擇【多線程】。
??此外,更常見的是多進程和多線程結合的方式,因為他們兩種并不是非此即彼的關系。
?● 服務器高并發(fā)的解決方案有哪些?
??(1) 應用數(shù)據和靜態(tài)資源分離。比如在訪問web網頁的時候,可以將靜態(tài)資源放到專門的服務器中,在客戶端訪問的時候,直接從這個服務器返回,而數(shù)據可以通過異步的方式請求到主服務器中,速度更快,無需等到數(shù)據裝載入頁面后再從主服務器返回。
??(2) 利用緩存機制。訪問web網頁就用到了這種機制,如果客戶端判斷是同一個請求,會將之前緩存的頁面取出,如果說頁面過期,或者有數(shù)據更新,再從服務器拉取。這樣當大量請求過來的時候,就不需要全部去訪問服務器,給服務器降低壓力。
??(3) 集群和分布式【注意區(qū)分】。集群和分布式都是利用多臺計算機協(xié)同工作。

集群:所有的服務器具有相似的功能,請求哪一臺都可以,主要起到負載均衡、故障恢復的作用,但是計算機之間的同步和通信的開銷大;
● 分布式:將一個大型的計算任務分散到多臺計算機上進行處理,每臺計算機可以具有不同的功能或者業(yè)務模塊,處理一個請求可能需要用到多態(tài)服務器,通過彼此的協(xié)同工作,最終將結果匯總。請求的速度大大加快,但是計算機之間的通訊比較困難,需要設計復雜的協(xié)議共同工作。

??(4) 反向代理。在訪問服務器的時候,通過一個中間服務器請求資源并返回結果。


三、《操作系統(tǒng)》知識點

第3章-死鎖
3.2 死鎖的概念

● 概念
● 產生死鎖的4個必要條件【同時滿足】:互斥、占有且等待、非搶占、循環(huán)等待
● 資源分配圖(申請邊、賦予邊;沒有環(huán)路,一定不會出現(xiàn)死鎖,有環(huán)路,可能不會產生死鎖)

3.3 死鎖的預防——靜態(tài)策略

(1) 破壞互斥條件:資源的固有屬性,難以被破壞
(2) 破壞占有且等待條件:① 預分資源策略;② “空手”申請資源策略(僅在它不占有資源時才可以申請資源)
(3) 破壞非搶占條件:隱式搶占方式(等待進程的全部資源可被搶占)、搶占等待者的資源
(4) 破壞循環(huán)等待條件:資源有序分配(給各個資源分配一個自然數(shù),只能申請比當前占有資源更大的資源)、“棄大取小”(想要申請某個資源,必須要釋放掉數(shù)字比它大的那些資源)

3.4 死鎖的避免——動態(tài)策略,但在可能產生死鎖的情況下(不安全狀態(tài)),即使資源可用,也不會進行分配,資源利用率下降

● 安全序列:一個進程序列,系統(tǒng)按照次序以此為進程分配資源,能夠使得它們依次成功的運行完畢。
● 安全狀態(tài):系統(tǒng)存在這樣一個安全序列,則系統(tǒng)此時的分配狀態(tài)時安全的;如果系統(tǒng)不存在這樣一個安全序列,則系統(tǒng)是不安全的。
存在安全序列時,一定不會產生死鎖,但是系統(tǒng)進入不安全狀態(tài),也不一定會產生死鎖,但產生死鎖時,系統(tǒng)一定是不安全狀態(tài)。
● 資源分配圖算法(新增要求邊;環(huán)路檢測算法,需要{n^2}次操作,n為進程數(shù)量)——針對單體資源類
● 銀行家算法——針對多體資源類

銀行家算法-思想描述

?優(yōu)點:相比起預防來說,允許產生死鎖的前三個條件,會避免第四個條件,限制條件更少,資源利用率提高;
?缺點:① 要求進程數(shù)量保持不變;② 在實時系統(tǒng)中難以實現(xiàn);③ 尋找安全序列,增加系統(tǒng)開銷

3.5 死鎖的檢測與恢復

● 等待圖(資源分配圖的變形,只保留進程,并把邊折疊)——針對單體資源類的死鎖檢測
假設有p1→p2,說明進程p1需要p2占有的某個資源;如果有環(huán)說明檢測到了死鎖。
● 對多體資源類的死鎖檢測

對多體資源類的死鎖檢測

【類似死鎖避免的安全性算法】區(qū)別在于:
死鎖的避免中的安全性算法:針對一個進程的一次request請求,先嘗試分配,然后判斷是否存在安全序列(比較的是當前系統(tǒng)可用資源work 和 Need剩余所需資源);
而這里的檢測算法:針對所有進程都分配了request請求,先不分配,判斷是否存在安全序列能夠實現(xiàn)依次分配(比較的是當前系統(tǒng)可用資源work 和 Request總申請資源)

● 死鎖檢測的時機:① 資源請求時;② 定時檢測; ③ CPU資源利用率低
● 死鎖恢復:① 搶占資源; ② 回退進程; ③ 殺掉進程(重啟系統(tǒng);僅殺死死鎖進程;逐步殺死死鎖進程)
● 饑餓:某個或者某些進程永遠得不到完成工作的機會,因為他們所需的資源總是被別的進程占有或者搶占。饑餓進程可以在就緒態(tài),而死鎖進程一定是在阻塞態(tài)。
● 活鎖:某個或者某些進程在輪詢的等待某個不可能為真的條件為真,導致一直嘗試,失敗,嘗試,失敗……這導致CPU資源被耗盡,系統(tǒng)效能大大下降?;铈i進程【忙式等待,且占用CPU,不會讓出CPU】可以在運行中,且有可能自行解開;而死鎖進程【總是讓出CPU,造成無限期等待】一定是在阻塞態(tài),不可能自行解開。

第5章-存儲管理
5.1 引言

● 程序裝入內存:絕對裝入、可重定位裝入、動態(tài)執(zhí)行時裝入(使用對換技術)
● 邏輯地址空間 vs 物理空間(內存空間)
● 重定位:靜態(tài)重定位、動態(tài)重定位(一對寄存器:基址寄存器、限長寄存器)
● 對換技術:要求把進程放置在一片連續(xù)的內存區(qū)域,也會產生碎片。對換空間在物理內存被充滿時使用,內存中不活躍的頁就會被移到交換空間去?!綪CB會常駐內存,不會被換出到外存】而當系統(tǒng)的負荷沒有那么高時,就會暫停交換。

5.2 分區(qū)法——程序裝入一個一個連續(xù)的內存空間中,產生碎片

● 固定分區(qū)法(等分、差分;分區(qū)說明表)——空間浪費,內部碎片嚴重;系統(tǒng)生成時指定分區(qū)個數(shù),一個分區(qū)一個進程,限制了活動的進程數(shù)量。
● 動態(tài)分區(qū)法(內存登記表/鏈;分裂、合并)——會產生外部碎片
● 分配空閑區(qū)算法:最先適應算法(按地址排序)、最佳適應算法(容量從小到大排序)、最壞適應算法(容量從大到小,找最大)、循環(huán)適應算法(設立指針從上次找到的可用分區(qū)開始找)
● 內部碎片、外部碎片
● 可重定位分區(qū)分配(即:動態(tài)分區(qū)使用緊縮技術,消除外部碎片)
?緊縮的方式:將已經分配的內存塊聚集在一起,以空出連續(xù)的可用空閑內存塊(優(yōu)化:合并的方向可以往兩邊靠,空出中間)
?緊縮的時機:釋放分區(qū)時不鄰近空閑區(qū)時緊縮、分配分區(qū)無可用空間時緊縮

5.3 分頁技術——允許程序的存儲空間不一定連續(xù),不會產生外部碎片,但會產生內部碎片

● 若干大小相等的頁塊、若干大小相等的內存塊(頁框)——兩者大小一一對應(相等),由硬件決定
● 邏輯地址表示


分頁技術-邏輯地址表示

● 頁表(存在于進程中,一個進程一個頁表):記錄頁號-物理塊號的映射
● 內存塊表(存在于系統(tǒng)中,一個系統(tǒng)一個內存塊表):記錄內存塊的分配/空閑狀態(tài),分配給的進程和對應的頁號
● 地址映射

分頁系統(tǒng)-地址轉換硬件支持

● 專用、高速、小容量的快表(作為頁表,可同時和所有的鍵進行比較,可在每項設置地址空間標識符;沒有命中再去內存找,并對快表項進行置換)——當頁表太大時,緩解放在內存中會帶來存取速度下降的問題。(內存中的頁表常被稱為慢表
● 頁的保護:避免不同進程越界訪問:利用頁表在進程中、頁表項的存取控制字段(只讀、讀寫……)、頁表項非法設置(該程序的地址空間用不到的一些頁號)
● 多級頁表——解決頁號(頁的數(shù)量)過多,一級頁表龐大的問題(頁表要求內存連續(xù)) → 將頁號再分頁,并且通過對換技術將需要用到的內層頁號再動態(tài)調入內存
兩級頁表-邏輯地址表示

● 散列頁表(邏輯地址表示:頁號+頁內地址;頁號做哈希映射,相同散列值的元素鏈接形成鏈表,一個元素包含:頁號、內存塊、指向下一個的指針;匹配時,根據頁號進行匹配)
● 倒置頁表(邏輯地址表示:進程號+頁號+頁內地址;頁表總表項≠頁號總長度,而是=內存塊總長度【當然這說的是沒有對換技術,且全部存在內存的的前提下】;頁表中檢索進程號、頁號,匹配上了返回頁表的下標【下標即內存塊號】,拼接上頁內地址,即為實際的物理內存地址)


倒置頁表-地址轉換

● 頁面共享(期望各個進程相同的程序都被映射到同一塊內存塊,盡管他們的邏輯地址不同;每個進程同時又有自己私有的數(shù)據頁;分頁機制很難實現(xiàn),因為數(shù)據和程序可能在同一個頁面,并且倒置頁表幾乎不能實現(xiàn)這種共享,因為一個物理內存塊僅能對應唯一的進程和頁號)

5.4 分段技術:

● 段、段號
● 段表 段表基址寄存器、段表長度
● 二維地址結構(分頁是一維,也就是說只要給出一個邏輯地址,就可以自動算出頁號、頁內偏移量兩個部分,并且在處理的時候轉換成二進制的,后跟真實的頁內地址拼接;而段因為有段號的存在,需要顯示指明段內地址有多少位,它用十進制轉換每個段的完整基址,跟真實的偏移量相加)

段-邏輯地址表示

● 地址轉換(注意這里是相加,而分頁是拼接)


段-地址轉換

● 分段和分頁的區(qū)別
相似點:可以將整體劃分成若干部分,每一部分可以不相鄰。都要用地址映射機構將邏輯地址映射為物理地址。
不同點:
(1) 頁表的邏輯地址是一維的,段表是二維的
(2) 頁是物理存儲單位,段是邏輯存儲單位
(3) 頁的大小是由系統(tǒng)決定的,并且大小一樣;段的大小是由用戶程序每一邏輯模塊決定的,每段大小可以不一樣
(4) 分頁的數(shù)據和代碼不分離,難以實現(xiàn)共享和保護;而分段則很容易實現(xiàn)這些功能

● 段的共享(地址覆蓋,只要段表項中的段長、段內地址相同即可;把不能共享的放在各自私有的段中
● 段的保護:段表長度以及段長的驗證、利用段表在進程中、段表項的存取控制字段、保護環(huán)

5.5 段頁式技術:在段內按頁劃分

● 面向用戶的地址空間段式劃分,面向物理的地址空間頁式劃分——結合兩者的優(yōu)點
?段式(按照用戶邏輯劃分;但容易產生大量外部碎片)
????????????+
?頁式(碎片程度少,內存利用率高;但邏輯性差,難以保護和共享數(shù)據)
● 邏輯地址結構


段頁式-邏輯地址

● 地址轉換
?段表基址寄存器 (加段號找到) 段表項(存放頁表基址、頁表長度) (加頁號找到) 頁表項(存放了頁對應的物理基址,拼接頁內地址)

段頁式-地址轉換

● 缺頁中斷:該頁不在內存中,然后系統(tǒng)進行缺頁中斷處理;
● 缺段中斷:該段的頁表不在內存中,然后系統(tǒng)為該段在內存建立頁表

5.6 虛擬存儲器:操作系統(tǒng)給用戶提供一個比真實內存空間大的多的地址空間,實現(xiàn)邏輯存儲器與物理存儲器分離

● 基于局部性性原理
只把需要的那部分的程序和數(shù)據裝入內存,其他部分暫且放在外存。待以后實際需要這些內容時,再從外存調入內存(換入),當然內存中不用的部分也可以從內存中搬移到外存(換出)。
● 虛擬存儲器容量受限于:
(1) 地址長度
(2) 外存容量

5.7 請求分頁技術:基于分頁技術 + 虛擬存儲器(對換技術) —— linux系統(tǒng)

● 單純的分頁系統(tǒng):沒有引入虛擬存儲器,所有的頁雖然不在物理空間中相鄰,但需要把所有頁放入內存中。
● 頁表項:新增標志位(1-在內存中;0-未在內存中)、修改位(在換出時,如果有內存頁已修改,需要重新寫回外存,否則不用寫回)、引用位(記載最近對該頁訪問過沒有,當沒有空閑內存塊時,置換算法淘汰某頁會考慮)
● 缺頁中斷機構:軟硬件相互配合


缺頁中斷機構

?對換空間:一般占用磁盤上一片連續(xù)的空間(因為:這個空間是臨時的,速度是關鍵),速度比文件系統(tǒng)快。

● 處理缺頁中斷主要考慮的時間:
(1) 中斷處理程序的時間
(2) 從外存調入該頁的時間:磁頭尋道時間、扇區(qū)旋轉時間、數(shù)據傳輸時間
(3) 重啟指令的時間

5.8 頁面置換算法

● 內存塊的分配算法:如果有多個進程存在內存中,要決定為每個進程分配多少個內存塊
● 頁面置換算法:當需要置換頁面時(沒有空閑內存塊 或 第一次訪問頁面),要確定必須要淘汰哪個頁面
● 抖動:被換出的頁很快又被訪問,頻繁的更換頁面,導致系統(tǒng)大部分時間都花費在頁面的調度和傳輸上。系統(tǒng)很忙,但效率很低。
● 頁面走向:存儲訪問序列

(1) 先進先出法 FIFO:先進入的頁面先被淘汰
(如果已經在內存的頁,再次進入會重新插入隊尾)
?可能會產生Belady異?,F(xiàn)象,即缺頁率隨著內存塊的增加而增加。一般來說,內存塊被分配的越多,缺頁數(shù)會更少,但是由于FIFO算法的會把在內存中停留最久的頁換走,但往往那些常被訪問的頁在內存中停留最久,導致總是沒有把進程所需要的頁放入內存,形成異?,F(xiàn)象)
(2) 最佳置換算法:淘汰的頁面應在將來不被使用,或者在最遠的將來才被使用
(要預先知道整個頁面走向,較為理想化)
(3) 最近最久未使用置換法:類比于最遠的將來,淘汰最近(過去)那個最久沒有使用的頁面
(需要在每個頁面中一個訪問字段,用來記錄自上次被訪問經歷的時間t;實現(xiàn)起來需要軟硬件的支持)
實現(xiàn)的方法:
① 計數(shù)器,給每個頁面增加一個時間的字段,淘汰時間最先的頁
② 棧,最新訪問的頁在棧頂,淘汰棧低(由于需要操作棧的底部和中間,需要使用雙向鏈)
(4) 最近未使用置換法:根據引用位、修改位,將頁面分成4類,利用循環(huán)隊列查找,最壞情況是第四輪開始找到

最近未使用-搜索步驟

(5) 第二次機會置換法:基于FIFO,根據引用位(=1)給機會,將該頁面重新移入隊尾,并把引用位置0
(6) 時鐘置換法:第二次機會置換法的變形,將隊列改成環(huán)形結構,提升了頁面在鏈表中的移動效率
(7) 最少使用置換法:每個頁面的引用位會在每個時鐘中斷累加到每個頁面的軟件技術器;老化算法(計算右移,加到左邊的位置上,右移保證越早訪問的作用越小)
(8) 頁面緩沖算法:維護空閑頁鏈表、修改頁鏈表,基于FIFO選擇淘汰頁,但它不會實際從內存中移除,而是先鏈入表(2選1)的隊尾,淘汰的是空閑頁鏈表隊首的頁;當修改頁鏈表到了一定數(shù)量,再一次寫回到外存。

5.9 內存塊的分配和抖動問題

● 最少內存塊數(shù)(保證進程正常運行的最少內存塊數(shù))、最多內存塊數(shù)(由可用內存總量決定)
● 內存塊置換范圍:全局置換(系統(tǒng)整體的存儲塊可被調度)、局部置換(只有當前進程的內存塊集可被調度)
● 內存塊分配策略:
?(1) 固定分配策略:分配給進程的內存塊數(shù)量固定(并不是說均等分配,而是說運行過程中不能動態(tài)增加內存塊)
?(2) 可變分配策略:分給進程的內存塊數(shù)隨著進程的活動可以改變
● 內存塊分配算法:
(1) 等分法
(2) 比例法:根據地址空間劃分比例
(3) 優(yōu)先權法

● 抖動
?原因:進程過多→頁面頻繁置換→CPU利用率低→引入更多進程→……【惡性循環(huán)】
?緩解方法:
?(1) 局部置換:使抖動局限在一個小范圍;
?(2) 掛起某些進程;
?(3) 控制缺頁率:設置上限或者下限
?(4) 工作集策略
??a) 工作集:一個進程在某一小段時間內訪問頁面的集合;
??b) 局部性:空間(某一個位置被訪問過,它附近的位置也很快要用到)、時間(某條指令或者數(shù)據被訪問過,段時間內可能又被訪問)
??c) 利用工作集控制進程數(shù)量:計算當前所有進程的工作集數(shù)量D,與當前可用的總內存塊m。如果D>m,將其中一個進程掛起,將它的頁面全部寫回外存,空出新的可用內存塊;如果D<m,分配新的進程。

● 利用工作集進行頁面置換:找出一個不在工作集的頁面,將它淘汰

5.10 請求分段技術:類似請求分頁技術(請求分段需要像分區(qū)那樣緊縮,請求分頁因為是內部碎片,不需要緊縮)

● 單純的分段系統(tǒng):沒有引入虛擬存儲器,所有的段雖然可以不在物理空間中相鄰,但需要把所有段放入內存中。

5.11 Linux系統(tǒng)的存儲管理

● 請求分頁(虛擬內存管理機制)技術
● Linux的三級頁表結構
● 內存頁的分配與釋放:數(shù)組每一項,記錄的是內存頁組,包含位圖+(雙向)鏈表
● kswap交換守護進程:內存不足時,釋放內存頁?!緹o限循環(huán),循環(huán)末尾進入睡眠,然后一定會事件后又會被喚醒】系統(tǒng)會設置空閑內存頁的上限和下限,當高于上限值不做任何事;當?shù)陀谏舷拗?,甚至低于下限值,就要進行兌換,以釋放空閑內存頁。
● 頁面淘汰:LRU


另,時鐘中斷:https://blog.csdn.net/LSG_Down/article/details/81074672/
● 時鐘周期(單片機層面)< 機器周期(由若干時鐘周期構成,也叫CPU周期,指基本操作,如取地址,需要的最小周期)< 指令周期(由若干機器周期構成,完成一條指令需要的周期)

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

相關閱讀更多精彩內容

  • 復習操作系統(tǒng)真象還原,記錄一些知識點 實模式內存布局 如下圖所示: 編譯器給程序中各符號(變量名或函數(shù)名等)分配的...
    sk邵楷閱讀 1,510評論 0 2
  • 第一章.計算機系統(tǒng)概述1.基本構成2.指令的執(zhí)行3.中斷3.1 目的3.2 類型3.3 中斷控制流3.4 中斷處理...
    某WAP閱讀 934評論 0 0
  • 1. 操作系統(tǒng)基本特征 (1) 并發(fā) 并發(fā)是指宏觀上在一段時間內能同時運行多個程序,而并行則指同一時刻能運行多個...
    _code_x閱讀 1,652評論 1 17
  • 操作系統(tǒng)期末預習筆記 whye 本課程教學采用的是32位操作系統(tǒng) 什么是操作系統(tǒng) 通用圖靈機:操作+數(shù)據等于處理結...
    jun123123閱讀 2,022評論 0 1
  • 1. 基礎知識 1.1、 基本概念、 功能 馮諾伊曼體系結構1、計算機處理的數(shù)據和指令一律用二進制數(shù)表示2、順序執(zhí)...
    yunpiao閱讀 5,792評論 1 22

友情鏈接更多精彩內容