作業系統知識點

作業系統

內核態和用戶態

內核態和用戶態的區別?

內核態與用戶態是作業系統的兩種運行級別,當程式運行在 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. 空間局部性 :⼀旦程式訪問了某個存儲單元,在不久之後,其附近的存儲單元也將被訪問,即
    程式在⼀段時間內所訪問的地址,可能集中在⼀定的範圍之內,這是因為指令通常是順序存放、
    順序執⾏的,數據也⼀般是以向量、數組、表等形式簇聚存儲的。
    時間局部性是通過將近來使⽤的指令和數據保存到⾼速快取存儲器中,並使⽤⾼速快取的層次結構實
    現。空間局部性通常是使⽤᫾⼤的⾼速快取,並將預取機制集成到⾼速快取控制邏輯中實現。虛擬記憶體
    技術實際上就是建⽴了 「記憶體⼀外存」的兩級存儲器的結構,利⽤局部性原理實現髙速快取。
Tags: