1. 程式人生 > 遊戲資訊 >「皇室官方新聞報」:2022年4月份更新最新、最全、中文版資訊

「皇室官方新聞報」:2022年4月份更新最新、最全、中文版資訊

核心:

管理程序執行緒進行排程

管理記憶體

管理硬體裝置

提供系統呼叫(檔案、網路等)

 

CPU兩種執行狀態:使用者態、系統態(核心態)。

使用者態的程序可以使用使用者程式的資料,而系統態的程序可以使用計算機幾乎所有資源

系統呼叫:

使用者態的程序在涉及檔案管理、記憶體管理、裝置管理、程序控制等系統態級別操作時,必須通過系統呼叫 ,由作業系統代為完成。

 

虛擬地址空間:CPU通過MMU將虛擬地址對映為實體地址。

通過虛擬地址訪問記憶體有以下優勢:

  • 程式可以使用連續虛擬地址來訪問實體記憶體中非連續的空間。
  • 程式可以使用大於實體記憶體的虛擬記憶體。當實體記憶體的供應量變小時,記憶體管理器會將實體記憶體頁(通常大小為 4 KB)儲存到磁碟檔案。資料或內碼表會根據需要在實體記憶體與磁碟之間移動。
  • 不同程序使用的虛擬地址彼此隔離。一個程序中的程式碼無法更改正在由另一程序或作業系統使用的實體記憶體。

 

記憶體分段:段是邏輯資訊的單位

邏輯記憶體中儲存段選擇因子和段偏移量,作業系統通過段選擇因子索引到段表,將虛擬記憶體對映至實體記憶體。

問題:會產生記憶體碎片,而且記憶體交換效率低。

記憶體交換:將需要挪動的記憶體段讀取到硬碟,然後再從硬碟中讀取該記憶體段到新的區域。

記憶體分頁:

將邏輯記憶體和實體記憶體都分為固定大小的頁/幀(解決記憶體碎片),二者通過頁表對映。把最近沒有使用過的記憶體頁寫到硬碟上(釋放

單頁表問題:頁表佔用記憶體

多級頁表:空間結構的優化

一級頁表覆蓋所有記憶體空間,但不必建立沒有使用到的二級頁表,需要時建立即可。

而且根據區域性性原理,二級頁表可以儲存在磁碟中。

 

區域性性原理:

  1. 時間區域性性 :如果程式中的某條指令一旦執行,不久以後該指令可能再次執行;如果某資料被訪問過,不久以後該資料可能再次被訪問。產生時間區域性性的典型原因,是由於在程式中存在著大量的迴圈操作。
  2. 空間區域性性 :一旦程式訪問了某個儲存單元,在不久之後,其附近的儲存單元也將被訪問,即程式在一段時間內所訪問的地址,可能集中在一定的範圍之內,這是因為指令通常是順序存放、順序執行的,資料也一般是以向量、陣列、表等形式簇聚儲存的。

時間區域性性是通過將近來使用的指令和資料儲存到快取記憶體儲存器中,並使用快取記憶體的層次結構實現。空間區域性性通常是使用較大的快取記憶體,並將預取機制整合到快取記憶體控制邏輯中實現。虛擬記憶體技術實際上就是建立了 “記憶體一外存”的兩級儲存器的結構,利用區域性性原理實現髙速快取。

快表TLB:將經常使用到的頁表儲存在快取記憶體在進行地址對映時,先在快取中尋找,然後再去記憶體中尋找。

 

分頁分段區別:

  • 共同點 :
    • 分頁機制和分段機制都是為了提高記憶體利用率,減少記憶體碎片。
    • 頁和段都是離散儲存的,所以兩者都是離散分配記憶體的方式。但是,每個頁和段中的記憶體是連續的。
  • 區別 :
    • 頁的大小是固定的,由作業系統決定;而段的大小不固定,取決於我們當前執行的程式。
    • 分頁僅僅是為了滿足作業系統記憶體管理的需求,而段是邏輯資訊的單位,在程式中可以體現為程式碼段資料段,能夠更好滿足使用者的需要。

 

虛擬記憶體:

虛擬記憶體的目的是為了讓實體記憶體擴充成更大的邏輯記憶體,從而讓程式獲得更多的可用記憶體。為了更好的管理記憶體,作業系統將記憶體抽象成地址空間。每個程序擁有私有連續地址空間,這個地址空間被分割為固定大小的頁。這些頁被對映到實體記憶體,但不需要對映到連續的實體記憶體,也不需要所有頁都必須在實體記憶體中。用頁面置換的時間來換取比實體記憶體更大的空間。

請求分頁/分段儲存管理:當記憶體已滿,將頁面/段騰出至外存。若發現要訪問的頁面/段不在記憶體中,產生缺頁中斷  ,由CPU告知作業系統,將頁面/段調入記憶體。

請求分頁儲存管理是基於記憶體分頁機制上的,請求分頁儲存管理可以將記憶體的部分頁騰到外存中,而記憶體分頁機制本身不提供這種操作,僅僅將記憶體進行分頁處理。因此,記憶體分頁機制本身是不能實現虛擬記憶體的。

 

頁面置換:在程式執行過程中,如果要訪問的頁面不在記憶體中,就發生缺頁中斷從而將該頁調入記憶體中。此時如果記憶體已無空閒空間,系統必須從記憶體中調出一個頁面到磁碟對換區中來騰出空間。

  • LRU(最近最久未使用)

維護一個所有頁面的連結串列。當一個頁面被訪問時,將這個頁面移到連結串列表頭。這樣就能保證連結串列表尾的頁面是最久未訪問的。

  • FIFO、第二次機會、時鐘:基於FIFO,但增加標識位R,若一個頁面既老且R=0,則置換出去。若R=1,則將r改為0,並置入隊頭。時鐘使頁面連結串列變成迴圈連結串列,這樣就不用挪動頁面到隊頭,而只需要指標。

 

同步非同步: 指的是訊息通知機制。A執行緒交給B執行緒的任務,同步是A需要自己輪詢檢視B是否完成了這項任務,而非同步是B在完成這項任務後會通知A。

阻塞/非阻塞:指的是執行緒是否被掛起。以下載東西為例:同步就是指下載完沒有任何提示,得自己去看是否下載完。而阻塞是指在等下載東西的時候,自己是乾等著還是去做別的事情

下載東西

同步

非同步

阻塞

眼睛盯著下載條啥也不幹

啥也不幹,但是下載完會通知

非阻塞

去做別的事情,但是偶爾去看一眼下載完沒有

去做別的事情,下載完會通知

 

程序排程:

核心執行排程的條件:

一個程序被終結or一個程序從running切換到waiting

非搶佔的核心:

程序在執行系統呼叫時,在核心中,不會出現搶佔。也有搶佔的核心。

 

排程演算法:

  • 先到先服務(FCFS)排程演算法 : 從就緒佇列中選擇一個最先進入該佇列的程序為之分配資源,使它立即執行並一直執行到完成或發生某事件而被阻塞放棄佔用 CPU 時再重新排程。

會產生隊頭阻塞,平均週轉時間和平均等待時間大、平均等待時間波動大、非搶佔式。

  • 短作業優先(SJF)的排程演算法 : 從就緒佇列中選出一個估計執行時間最短的程序為之分配資源,使它立即執行並一直執行到完成或發生某事件而被阻塞放棄佔用 CPU 時再重新排程。也有可以搶佔正在佔用當前CPU時間片的演算法(SRT)。

平均等待時間最小。但會使長任務長時間得不到處理。需要預估執行時間。

  • 最高響應比優先:SJF的改進。R=(w+s)/s優先。
  • 時間片輪轉排程演算法 : 時間片輪轉排程是一種最古老,最簡單,最公平且使用最廣的演算法,又稱 RR(Round robin)排程。每個程序被分配一個時間片。上下文切換過於頻繁。
  • 多級反饋佇列 :分為多級佇列,每個佇列按優先順序決定先後,若當前程序在當前佇列中沒有執行完,則被交給下一級佇列的隊尾。程序的特徵會改變其佇列位置(反饋)
  • 優先順序排程 : 為每個流程分配優先順序,首先執行具有最高優先順序的程序,依此類推。具有相同優先順序的程序以 FCFS 方式執行。可以根據記憶體要求,時間要求或任何其他資源要求來確定優先順序。

 

程序的狀態:

  • 建立狀態(new) :程序正在被建立,尚未到就緒狀態。
  • 就緒狀態(ready) :程序已處於準備執行狀態,即程序獲得了除了處理器之外的一切所需資源,一旦得到處理器資源(處理器分配的時間片)即可執行。
  • 執行狀態(running) :程序正在處理器上上執行(單核 CPU 下任意時刻只有一個程序處於執行狀態)。
  • 阻塞狀態等待狀態(waiting) :程序正在等待某一事件而暫停執行如等待某資源為可用或等待 IO 操作完成。即使處理器空閒,該程序也不能執行。
  • 結束狀態(terminated) :程序正在從系統中消失。可能是程序正常結束或其他原因中斷退出執行。

程序間通訊:

  1. 匿名管道(Pipes) :用於具有親緣關係的父子程序間或者兄弟程序之間的通訊。在記憶體中。
  2. 有名管道(Names Pipes) : 匿名管道由於沒有名字,只能用於親緣關係的程序間通訊。為了克服這個缺點,提出了有名管道。有名管道嚴格遵循FIFO,以磁碟檔案的方式存在,可以實現本機任意兩個程序通訊。管道只能承載無格式位元組流
  3. 訊號(Signal) :軟中斷,用於通知程序某個事件已經發生,用於後續處理(或者不處理)。不能傳資料。
  4. 訊息佇列(Message Queuing) :訊息佇列是訊息的連結串列,具有特定的格式(而不是位元組流),訊息佇列存放在核心中,只有在核心重啟或者顯式地刪除,該訊息佇列才會被真正的刪除。訊息佇列可以實現訊息的隨機查詢,不一定被動接受(如FIFO),也可以按訊息的型別有選擇的讀取.。訊息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限等缺點。
  5. 訊號量(Semaphores) :訊號量是一個計數器,訊號量的意圖是多程序間同步。P:訊號量-1,若<0,則讓呼叫P的程序等待。V:訊號量+1,若<=0, 說明存在等待程序,選擇一/幾個喚醒(通常使用FIFO)。二進位制訊號量,類似互斥量、鎖機制。
  6. 共享記憶體(Shared memory) :使得多個程序可以訪問同一塊記憶體空間,不同程序可以及時看到對方程序中對共享記憶體中資料的更新。這種方式需要依靠某種同步操作,如互斥鎖和訊號量等。可以說這是最有用的程序間通訊方式。
  7. Sockets: TCP

 

程序死鎖條件與執行緒死鎖一樣。

程序死鎖的解決:鴕鳥策略(不管)、預防、避免、檢測解除

死鎖預防:破壞死鎖條件。死鎖預防條件太多開銷太大

避免:不破壞死鎖條件。進行資源預分配,若會產生不安全狀態,則拒絕分配。銀行家演算法。開銷略大

檢測解除:根據資源請求與分配關係建立有向圖,若圖中的環無法消除,則存在死鎖

解除:殺死死鎖程序、回滾(撤銷資源分配)、搶佔(強行分配)

 

Select, poll, epoll: