作業系統知識點

ww0809發表於2024-04-03

作業系統

核心態和使用者態

核心態和使用者態的區別?

核心態與使用者態是作業系統的兩種執行級別,當程式執行在 3 級特權級上時,就可以稱之為執行在使用者態。因為這是最低特權級,是普通的使用者程式執行的特權級,大部分使用者直接面對的程式都是執行在使用者態;當程式執行在 0 級特權級上時,就可以稱之為執行在核心態。處於使用者態執行時,程式所能訪問的記憶體空間和物件受到限制,其佔有的處理器是可被搶佔的;處於核心態執行時,則能訪問所有的記憶體空間和物件,且所佔有的處理器是不允許被搶佔的。

導致使用者態到核心態的切換場景

  1. 系統呼叫。這是使用者態程式主動要求切換到核心態的一種方式,使用者態程式通過系統呼叫申請使用作業系統提供的服務程式完成工作。
  2. 異常。當 CPU 在執行執行在使用者態下的程式時,發生了某些事先不可知的異常,這時會觸發由當前執行程式切換到處理此異常的核心相關程式中,也就轉到了核心態,比如缺頁異常。
  3. 外圍裝置的中斷。當外圍裝置完成使用者請求的操作後,會向 CPU 發出相應的中斷訊號,這時 CPU 會暫停執行下一條即將要執行的指令轉而去執行與中斷訊號對應的處理程式。

這 3 種方式是系統在執行時由使用者態轉到核心態的最主要方式,其中系統呼叫可以認為是使用者程式主動發起的,異常和外圍裝置中斷則是被動的。

程式與執行緒

程式和執行緒的區別?

程式和執行緒的主要差別在於它們是不同的作業系統資源管理方式。

  1. 程式是作業系統資源分配的最小單位,執行緒是 CPU 任務排程的最小單位。一個程式可以包含多個執行緒。
  2. 不同程式間資料很難共享,同一程式下不同執行緒間資料很易共享。
  3. 每個程式都有獨立的程式碼和資料空間,程式要比執行緒消耗更多的計算機資源,一個程式崩潰後,在保護模式下不會對其它程式產生影響。執行緒可以看做輕量級的程式,同一類執行緒共享程式碼和資料空間,每個執行緒都有自己獨立的執行棧和程式計數器,執行緒之間切換的開銷小,但執行緒之間沒有單獨的地址空間,一個執行緒死掉就等於整個程式死掉,所以多程式的程式要比多執行緒的程式健壯,但在程式切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變數的併發操作,只能用執行緒,不能用程式。

並行和併發

  1. 併發:當有多個執行緒在操作時,如果系統只有一個 CPU,則它根本不可能真正同時進行一個以上的執行緒,它只能把 CPU 執行時間劃分成若干個時間段,再將時間段分配給各個執行緒執行,在一個時間段的執行緒程式碼執行時,其它執行緒處於掛起狀態。這種方式我們稱之為併發(Concurrent)。
  2. 並行:當系統有一個以上 CPU 時,一個 CPU 執行一個執行緒,另一個 CPU 可以執行另一個執行緒,兩個執行緒互不搶佔 CPU 資源,可以同時進行,這種方式我們稱之為並行(Parallel)。

程式之間的通訊方式以及優缺點

  • 管道(PIPE)
    • 有名管道:一種半雙工的通訊方式,可以實現任意關係的程式間的通訊
      • 優點:可以實現任意關係的程式間的通訊
      • 缺點:
        1. 長期存於系統中,使用不當容易出錯
        2. 緩衝區有限
    • 無名管道:一種半雙工的通訊方式,只能在具有親緣關係的程式間使用(父子程式)
      • 優點:簡單方便
      • 缺點:
        1. 侷限於單向通訊
        2. 只能在建立它的程式以及其有親緣關係的程式之間通訊
        3. 緩衝區有限
  • 訊號量(Semaphore):一個計數器,可以用來控制多個執行緒對共享資源的訪問
    • 優點:可以同步程式
    • 缺點:訊號量有限
  • 訊號(Signal):一種比較複雜的通訊方式,用於通知接收程式某個事件已經發生
  • 訊息佇列(Message Queue):是訊息的連結串列,存放在核心中並由訊息佇列識別符號標識
    • 優點:可以實現任意程式間的通訊,並通過系統呼叫函式來實現訊息傳送和接收之間的同步,無需考慮同步問題,方便
    • 缺點:資訊的複製需要額外消耗 CPU 的時間,不適宜於資訊量大或操作頻繁的場合
  • 共享記憶體(Shared Memory):對映一段能被其他程式所訪問的記憶體,這段共享記憶體由一個程式建立,但多個程式都可以訪問
    • 優點:無須複製,快捷,資訊量大
    • 缺點:
      1. 通訊是通過將共享空間緩衝區直接附加到程式的虛擬地址空間中來實現的,因此要考慮程式間的讀寫操作的同步問題
      2. 利用記憶體緩衝區直接交換資訊,記憶體的實體存在於計算機中,只能同一個計算機系統中的諸多程式共享,不方便網路通訊
  • 套接字(Socket):可用於不同計算機間的程式通訊
    • 優點:
      1. 傳輸資料為位元組級,傳輸資料可自定義
      2. 傳輸資料時間短,效能高
      3. 適合於客戶端和伺服器端之間資訊實時互動
      4. 可以加密,資料安全性強
    • 缺點:需對傳輸的資料進行解析,轉化成應用級的資料。

執行緒之間的通訊方式

執行緒間的通訊目的主要是用於執行緒同步,所以執行緒沒有像程式通訊中的用於資料交換的通訊機制

  • 鎖(lock):包括互斥鎖/量(mutex)、讀寫鎖(reader-writer lock)、自旋鎖(spin lock)、條件變數(condition)
    • 互斥鎖/量(mutex):提供了以排他方式防止資料結構被併發修改的方法。
    • 讀寫鎖(reader-writer lock):允許多個執行緒同時讀共享資料,而對寫操作是互斥的。
    • 自旋鎖(spin lock):互斥鎖是當資源被佔用,申請者進入睡眠狀態;而自旋鎖則迴圈檢測保持者是否已經釋放鎖。
    • 條件變數(condition):可以以原子的方式阻塞程式,直到某個特定條件為真為止。對條件的測試是在互斥鎖的保護下進行的。條件變數始終與互斥鎖一起使用。
  • 訊號量(Semaphore)
  • 訊號(Signal)
  • 屏障(barrier):屏障允許每個執行緒等待,直到所有的合作執行緒都達到某一點,然後從該點繼續執行。

多程式與多執行緒的優劣對比

優劣 多程式 多執行緒
優點 程式設計除錯簡單,可靠性較高 速度快,資源佔用小
缺點 速度慢,資源佔用大 程式設計、除錯複雜,可靠性較差

互斥鎖和自旋鎖的應用場景?

執行緒的休眠和喚醒都是相當昂貴的操作,它們需要大量的 CPU 指令,因此需要花費一些時間,如果互斥量僅僅被鎖住很短的一段時間,用來使執行緒休眠和喚醒執行緒的時間會比該執行緒睡眠的時間還長,甚至有可能比不斷在自旋鎖上輪訓的時間還長,這時就應該用自旋鎖。如果鎖持有的時間過長,其它嘗試獲取自旋鎖的執行緒會一直輪訓自旋鎖的狀態,這將非常浪費 CPU 的執行時間,這時候使用互斥鎖會是一個更好的選擇。

死鎖

原因?

  1. 系統資源不足
  2. 資源分配不當
  3. 程式執行推進順序不合適

死鎖的 4 個必要條件

  1. 互斥條件:一個資源每次只能被一個執行緒使用;
  2. 請求與保持條件:一個執行緒因請求資源而阻塞時,對已獲得的資源保持不放;
  3. 不剝奪條件:程式已經獲得的資源,在未使用完之前,不能強行剝奪;
  4. 迴圈等待條件:若干執行緒之間形成一種頭尾相接的迴圈等待資源關係。

如何避免(預防)死鎖

  1. 破壞請求和保持條件:有兩種方法:
    1. 讓程式在申請資源時,一次性申請所有需要用到的資源,不要一次一次來申請,當申請的資源有一些沒空,那就讓執行緒等待。不過這個方法比較浪費資源,程式可能經常處於飢餓狀態。
    2. 要求程式在申請資源前,釋放已經獲得的資源。
  2. 破壞不剝奪條件:允許程式進行搶佔,有兩種方法:
    1. 如果去搶資源,被拒絕,就釋放自己的資源。
    2. 只要優先順序大,可以搶到。
  3. 破壞迴圈等待條件:將系統中的所有資源統一編號,程式可在任何時刻提出資源申請,但所有申請必須按照資源的編號順序提出。

虛擬儲存器

程式訪問的侷限性原理?

程式訪問的區域性性原理:是指程式在執行時呈現出區域性性規律,即在一段時間內,整個程式的執行僅限於程式中的某一部分。相應地,執行所訪問的儲存空間也侷限於某個記憶體區域。區域性性原理又表現為:時間區域性性和空間區域性性。時間區域性性是指如果程式中的某條指令一旦執行,則不久之後該指令可能再次被執行;如果某資料被訪問,則不久之後該資料可能再次被訪問。空間區域性性是指一旦程式訪問了某個儲存單元,則不久之後,其附近的儲存單元也將被訪問。

虛擬儲存?

根據程式執行的時間區域性性和空間區域性性,我們允許作業裝入的時候只裝入一部分,另一部分放在磁碟上,當需要的時候再裝入主存。使用者的邏輯地址空間可以比主存的絕對地址空間要大。之所以將其稱為虛擬儲存器,是因為這種儲存器實際上並不存在,只是由於系統提供了部分裝入、請求調入和置換功能後(對使用者完全透明),給使用者的感覺是好像存在一個比實際實體記憶體大得多的儲存器。虛擬儲存器的大小由計算機的地址結構決定,並非是記憶體和外存的簡單相加。虛擬儲存器有以下三個主要特徵:

  1. 多次性,是指無需在作業執行時一次性地全部裝入記憶體,而是允許被分成多次調入記憶體執行。
  2. 對換性,是指無需在作業執行時一直常駐記憶體,而是允許在作業的執行過程中,進行換進和換出。
  3. 虛擬性,是指從邏輯上擴充記憶體的容量,使使用者所看到的記憶體容量,遠大於實際的記憶體容量。

虛擬記憶體中,允許將一個作業分多次調入記憶體。釆用連續分配方式時,會使相當一部分記憶體空間都處於暫時或永久的空閒狀態,造成記憶體資源的嚴重浪費,而且也無法從邏輯上擴大記憶體容量。因此,虛擬記憶體需要建立在離散分配的記憶體管理方式的基礎上。虛擬記憶體的實現有以下三種方式:

  1. 請求分頁儲存管理。
  2. 請求分段儲存管理。
  3. 請求段頁式儲存管理。

不管哪種方式,都需要有一定的硬體支援。一般需要的支援有以下幾個方面:

  1. 一定容量的記憶體和外存。
  2. 頁表機制(或段表機制),作為主要的資料結構。
  3. 中斷機構,當使用者程式要訪問的部分尚未調入記憶體,則產生中斷。
  4. 地址變換機構,邏輯地址到實體地址的變換。

頁面置換演算法

在地址對映過程中,若在頁面中發現所要訪問的頁面不在記憶體中,則產生缺頁中斷。當發生缺頁中斷時,如果作業系統記憶體中沒有空閒頁面,則作業系統必須在記憶體選擇一個頁面將其移出記憶體,以便為即將調入的頁面讓出空間。而用來選擇淘汰哪一頁的規則叫做頁面置換演算法。

cache 工作原理?

cache,高速緩衝儲存器,是一種容量小而速度快的高度緩衝器,以 RAM 為材料製成。引入的原因主要有:

  1. I/O 裝置向主存的訪問級別高於 CPU,在 I/O 訪存期間,CPU 將處於空閒狀態。
  2. 主存速度的提高始終跟不上 CPU 的發展,主存與 CPU 的速度明顯不匹配。

Cache 直接做在 CPU 內,速度幾乎與 CPU 一樣快,任何時刻都有一些主存塊處於快取之中,因此,CPU 欲訪問主存的時候,有兩種可能:

  1. 所需要的字已經在快取中,於是 CPU 直接訪問 Cache,簡稱 Cache 命中。
  2. 所需要的字不在快取中,那麼此時需要將字所在的主存塊整塊一次調入 Cache 中,(即主存-Cache 之間以塊為單位進行傳送 )。

通常用命中率來衡量 Cache 的效率 。 在一個程式執行期間,設總的命中次數為 Nc,訪問主存的次數為 Nm,那麼命中率為:$H=N_c/(N_c+N_m)$

在 Cache 中,地址對映是指把主存地址空間對映到 Cache 地址空間,在將主存塊複製到 Cache 中的時候遵循一定的對映規則,標誌位為 1 時候,表示其 Cache 對映的主存塊資料有效。 地址對映有三種方式:直接對映,全相聯對映,組相聯對映。

  1. 直接對映

    這種方式主存塊只能裝入 Cache 的唯一位置,若該位置已有內容,則產生塊衝突,原來在 Cache 中的塊將無條件被替換出去,直接對映的關係可以定義為:$j=i\ mod\ 2^c$,其中,j 為 Cache 的塊號或者行號。i 為主存塊號,$2^c$為 Cache 的總塊數。這種方式對映不夠靈活。地址結構為:

    主存字塊標記 Cache 字塊標記 字塊內地址

    CPU 的訪存過程:首先根據地址中間的 Cache 字塊地址,直接找到對應的 Cache 塊號,若塊號的有效位為 1,則表示命;,否則為不命中,此時從主存中讀取該地址所在的主存塊號,並將其內容送到對應的 Cache 塊並將有效位置 1,同時將內容送到 CPU。

  2. 全相聯對映

    這種方式可以把主存資料塊裝入 Cache 的任意一塊,方式可以從已佔滿的 Cache 儲存塊中,替換出任一舊塊,顯然這種方式靈活,命中率也高,與直接相聯對映相比,其主存字塊位數增加,使得 Cache 標記位增多地址變換速度慢。通常使用“按內容定址的”相聯儲存器。其地址結構為:

    主存字塊標記 字塊內地址
  3. 組相聯對映

    將 Cache 空間分成大小相同的組,主存的一個資料塊可以裝到組內的任一個位置,即組間採取直接對映,組內採取全相聯對映。如果把 Cache 分成 Q 組,每組有 R 塊,那麼有: $i= j\ mod\ q$,其中 i 為快取的組號,j 為主存塊號主存地址分為三個欄位:

    主存字塊標記 組地址 字塊內地址

    當組內有 k 塊的時候,稱為 k 路組相聯對映。
    CPU 訪存過程:首先根據中間的組地址,找到對應的 Cache 組,若其標記位為 1,說明命中,此時根據塊內地址,在對應得 Cache 行中,存取資訊;若不命中,那麼此時從主存中讀出該地址所在的主存號塊,送到對應的 Cache 組的任一行,有效位置 1,同時將內容送到 CPU 中。

1.程式和執行緒的區別

  • 程式是系統進行資源分配和排程的基本單位;
  • 執行緒是CPU排程和分派的基本單位。
    • 每個程式都有獨立的程式碼和資料空間(程式上下文),程式之間的切換會有較大的開銷;執行緒可以看做輕量級的程式,同一類執行緒共享程式碼和資料空間,每個執行緒都有自己獨立的執行棧和程式計數器,執行緒之間切換的開銷小;
    • 一個程式至少有一個執行緒,執行緒依賴於程式而存在;
    • 每個獨立的程式有程式執行的入口、順序執行序列和程式出口。但是執行緒不能獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制,兩者均可併發執行;
    • 多執行緒程式只要有一個執行緒崩潰,整個程式就崩潰了,但多程式程式中一個程式崩潰並不會對其它程式造成影響,因為程式有自己的獨立地址空間,因此多程式更加健壯。

2.協程

  • 協程:協程是一種使用者態的輕量級執行緒,協程的排程完全由使用者控制。協程擁有自己的暫存器上下文和棧。協程排程切換時,將暫存器上下文和棧儲存到其他地方,在切回來的時候,恢復先前儲存的暫存器上下文和棧,直接操作棧則基本沒有核心切換的開銷,可以不加鎖的訪問全域性變數,所以上下文的切換非常快。

3.程式的狀態

三態模型

  • 執行:當一個程式在處理機上執行時,則稱該程式處於執行狀態。處於此狀態的程式的數目小於等於處理器的數目,對於單處理機系統,處於執行狀態的程式只有一個。在沒有其他程式可以執行時(如所有程式都在阻塞狀態),通常會自動執行系統的空閒程式。
  • 就緒:當一個程式獲得了除處理機以外的一切所需資源,一旦得到處理機即可執行,則稱此程式處於就緒狀態。就緒程式可以按多個優先順序來劃分佇列。例如,當一個程式由於時間片用完而進入就緒狀態時,排入低優先順序佇列;當程式由I/O操作完成而進入就緒狀態時,排入高優先順序佇列。
  • 阻塞:一個程式正在等待某一事件發生(例如請求I/O而等待I/O完成等)而暫時停止執行,這時即使把處理機分配給程式也無法執行,故稱該程式處於阻塞狀態。

三態模型

五態模型

  • 新建:對應於程式被建立時的狀態,尚未進入就緒佇列。
  • 終止:程式完成任務到達正常結束點,或出現無法克服的錯誤而異常終止,或被作業系統及有終止權的程式所終止時所處的狀態。

4.程式間通訊方式

  • 匿名管道:管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程式間使用。程式的親緣關係通常是指父子程式關係。

  • 高階管道:將另一個程式當做一個新的程式在當前程式程式中啟動,則它算是當前程式的子程式。

  • 有名管道:有名管道也是半雙工的通訊方式,但是它允許無親緣關係程式間的通訊。

  • 訊息佇列:訊息佇列是由訊息的連結串列,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點。

  • 訊號量:訊號量是一個計數器,可以用來控制多個程式對共享資源的訪問。它常作為一種鎖機制,防止某程式正在訪問共享資源時,其他程式也訪問該資源。因此,主要作為程式間以及同一程式內不同執行緒之間的同步手段。

  • 訊號: 訊號是一種比較複雜的通訊方式,用於通知接收程式某個事件已經發生。

  • 共享記憶體:共享記憶體就是對映一段能被其他程式所訪問的記憶體,這段共享記憶體由一個程式建立,但多個程式都可以訪問。共享記憶體是最快的 IPC 方式,它是針對其他程式間通訊方式執行效率低而專門設計的。它往往與其他通訊機制,如訊號兩,配合使用,來實現程式間的同步和通訊。

  • 套接字:套介面也是一種程式間通訊機制,與其他通訊機制不同的是,它可用於不同機器間的程式通訊。

5.殭屍程式和孤兒程式

  • 殭屍程式:一個程式使用fork建立子程式,如果子程式退出,而父程式並沒有呼叫wait或waitpid獲取子程式的狀態資訊,那麼子程式的程式描述符仍然儲存在系統中。這種程式稱之為殭屍程式。
  • 孤兒程式:一個父程式退出,而它的一個或多個子程式還在執行,那麼那些子程式將成為孤兒程式。孤兒程式將被init程式(程式號為1)所收養,並由init程式對它們完成狀態收集工作。

6.死鎖

  • 死鎖:死鎖是指兩個或兩個以上的程式在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。

死鎖產生的必要條件

  • 互斥條件:一個資源每次只能被一個程式使用;
  • 請求與保持條件:一個程式因請求資源而阻塞時,對已獲得的資源保持不放;
  • 不剝奪條件:程式已獲得的資源,在未使用完之前,不能強行剝奪;
  • 迴圈等待條件:若干程式之間形成一種頭尾相接的迴圈等待資源關係。

死鎖預防

  • 破壞互斥條件:允許某些資源同時被多個程式訪問,但是有些資源本身並不具有這種屬性;
  • 破壞請求與保持條件:
    • 實行資源預先分配策略(當一個程式開始執行之前,必須一次性向系統申請它所需要的全部資源,否則不執行);
    • 只允許程式在沒有佔用資源的時候才能申請資源(申請資源前先釋放佔有的資源);
  • 破壞不剝奪條件:允許程式強行搶佔被其它程式佔有的資源,這樣做會降低系統效能;
  • 破壞迴圈等待條件:將系統中的所有資源統一編號,程式可在任何時刻提出資源申請,但所有申請必須按照資源的編號順序(升序)提出。

死鎖避免

銀行家演算法

參考: 銀行家演算法

7.頁面置換演算法

  • 最佳置換演算法(OPT):選擇以後永不使用的或者是在最長時間內不再被訪問的頁面;

  • 先進先出置換演算法(FIFO):優先淘汰最早進入記憶體的頁面,亦即在記憶體中駐留時間最久的頁面;

  • 最近最久未使用置換演算法(LRU):置換出未使用時間最長的頁面;

  • 第二次機會演算法(SCR):按FIFO選擇某一頁面,若其訪問位為1,給第二次機會,並將訪問位置0;

  • 時鐘演算法(CLOCK):SCR中需要將頁面在連結串列中移動(第二次機會的時候要將這個頁面從連結串列頭移到連結串列尾),時鐘演算法使用環形連結串列,再使用一個指標指向最老的頁面,避免了移動頁面的開銷。

  • 注:LRU演算法題

8.分頁和分段的區別

  • 段是資訊的邏輯單位,它是根據使用者的需要劃分的,因此段對使用者是可見的 ;頁是資訊的物理單位,是為了管理主存的方便而劃分的,對使用者是透明的;
  • 段的大小不固定,由它所完成的功能決定;頁的大小固定,由系統決定;
  • 段向使用者提供二維地址空間;頁向使用者提供的是一維地址空間;
  • 段是資訊的邏輯單位,便於儲存保護和資訊的共享,頁的保護和共享受到限制。

9.硬中斷和軟中斷

硬中斷是由硬體產生的,比如,像磁碟,網路卡,鍵盤,時鐘等。每個裝置或裝置集都有它自己的IRQ(中斷請求)。

​ 處理中斷的驅動是需要執行在CPU上的,因此,當中斷產生的時候,CPU會中斷當前正在執行的任務,來處理中斷。在有多核心的系統上,一箇中斷通常只能中斷一顆CPU(也有一種特殊的情況,就是在大型主機上是有硬體通道的,它可以在沒有主CPU的支援下,可以同時處理多箇中斷)。

硬中斷可以直接中斷CPU。它會引起核心中相關的程式碼被觸發。對於那些需要花費一些時間去處理的程式,中斷程式碼本身也可以被其他的硬中斷中斷。

軟中斷的處理非常像硬中斷。然而,它們僅僅是由當前正在執行的程式所產生的。通常,軟中斷是一些對I/O的請求。這些請求會呼叫核心中可以排程I/O發生的程式。對於某些裝置,I/O請求需要被立即處理,而磁碟I/O請求通常可以排隊並且可以稍後處理。根據I/O模型的不同,程式或許會被掛起直到I/O完成,此時核心排程器就會選擇另一個程式去執行。I/O可以在程式之間產生並且排程過程通常和磁碟I/O的方式是相同。

軟中斷僅與核心相聯絡。而核心主要負責對需要執行的任何其他的程式進行排程。一些核心允許裝置驅動的一些部分存在於使用者空間,並且當需要的時候核心也會排程這個程式去執行。

軟中斷並不會直接中斷CPU。也只有當前正在執行的程式碼(或程式)才會產生軟中斷。這種中斷是一種需要核心為正在執行的程式去做一些事情(通常為I/O)的請求。有一個特殊的軟中斷是Yield呼叫,它的作用是請求核心排程器去檢視是否有一些其他的程式可以執行。

10.IO模型

  • 阻塞式 I/O:應用程式被阻塞,直到資料從核心緩衝區複製到應用程式緩衝區中才返回;

  • 非阻塞式 I/O:應用程式可以繼續執行,但是需要不斷地執行系統呼叫來獲知 I/O 是否完成,這種方式稱為輪詢;

  • I/O 複用:單個程式具有處理多個 I/O 事件的能力;

    • select:將檔案描述符放入一個集合中,呼叫select時,將這個集合從使用者空間拷貝到核心空間(缺點1:每次都要複製,開銷大),由核心根據就緒狀態修改該集合的內容。(缺點2)集合大小有限制,32位機預設是1024(64位:2048);採用水平觸發機制。select函式返回後,需要通過遍歷這個集合,找到就緒的檔案描述符(缺點3:輪詢的方式效率較低),當檔案描述符的數量增加時,效率會線性下降;

      預設單個程式開啟的FD有限制是1024個,可修改巨集定義,但是效率仍然慢。

    • poll:基本原理與select一致,也是輪詢+遍歷;唯一的區別就是poll採用連結串列的方式儲存,沒有最大檔案描述符限制。

    • epoll:通過核心和使用者空間共享記憶體,避免了不斷複製的問題;支援的同時連線數上限很高(1G左右的記憶體支援10W左右的連線數);檔案描述符就緒時,採用回撥機制,避免了輪詢(回撥函式將就緒的描述符新增到一個連結串列中,執行epoll_wait時,返回這個連結串列);支援水平觸發和邊緣觸發,採用邊緣觸發機制時,只有活躍的描述符才會觸發回撥函式。

  • 訊號驅動式 I/O:核心在資料到達時嚮應用程式傳送 SIGIO 訊號;

  • 非同步 I/O:核心完成所有操作後向應用程式傳送訊號。

區域性性原理
⾯試官 :要想更好地理解虛擬記憶體技術,必須要知道計算機中著名的區域性性原理。另外,區域性性原
理既適⽤於程式結構,也適⽤於資料結構,是⾮常重要的⼀個概念。
" 我 :區域性性原理是虛擬記憶體技術的基礎,正是因為程式運⾏具有區域性性原理,才可以只裝⼊部分
程式到記憶體就開始運⾏。
以下內容摘⾃《計算機作業系統教程》 第 4 章儲存器管理。
早在 1968 年的時候,就有⼈指出我們的程式在執⾏的時候往往呈現區域性性規律,也就是說在某個᫾短
的時間段內,程式執⾏侷限於某⼀⼩部分,程式訪問的儲存空間也侷限於某個區域。
區域性性原理表現在以下兩個⽅⾯:

  1. 時間區域性性 :如果程式中的某條指令⼀旦執⾏,不久以後該指令可能再次執⾏;如果某資料被
    訪問過,不久以後該資料可能再次被訪問。產⽣時間區域性性的典型原因,是由於在程式中存在著
    ⼤量的迴圈操作。
  2. 空間區域性性 :⼀旦程式訪問了某個儲存單元,在不久之後,其附近的儲存單元也將被訪問,即
    程式在⼀段時間內所訪問的地址,可能集中在⼀定的範圍之內,這是因為指令通常是順序存放、
    順序執⾏的,資料也⼀般是以向量、陣列、表等形式簇聚儲存的。
    時間區域性性是通過將近來使⽤的指令和資料儲存到⾼速快取儲存器中,並使⽤⾼速快取的層次結構實
    現。空間區域性性通常是使⽤᫾⼤的⾼速快取,並將預取機制整合到⾼速快取控制邏輯中實現。虛擬記憶體
    技術實際上就是建⽴了 “記憶體⼀外存”的兩級儲存器的結構,利⽤區域性性原理實現髙速快取。

相關文章