作業系統面試總結

  畢業季將臨近,許多同學開始面試找工作,那麼面試作業系統相關的時候會問到什麼問題呢?下面由小編為大家整理了,希望對大家有所幫助!

  一

  1. 程序的有哪幾種狀態,狀態轉換圖,及導致轉換的事件。

  狀態:

  1***就緒狀態  程序已獲得除處理機外的所需資源,等待分配處理機資源,只要分配到CPU就可執行。在某一時刻,可能有若干個程序處於該狀態。

  2***執行狀態 佔用處理機資源執行,處於此狀態的程序的數目小於等於CPU的數目。

  3***阻塞狀態  由於程序等待某種條件***如I/O操作或程序同步***,在條件滿足之前無法繼續執行。該事件發生前即使把處理機分配給該程序,也無法執行。

  轉換解釋:從狀態轉換圖中,存在四種狀態轉換。

  當程序排程程式從就緒佇列中選取一個程序投入執行時引起轉換1;

  正在執行的程序如因時間片用完而被暫停執行就會引起轉換2;

  正在執行的程序因等待的事件尚未發生而無法執行***如程序請求完成I/O***會引去轉換3;

  當程序等待的事件發生時***如I/O完成***則會引起轉換4。

  事件:就緒佇列非空,則一個程序的轉換3會立即引去另一個程序的轉換1。這是因為一個程序發生轉換3意味著正在執行的程序由執行狀態變為阻塞狀態,這時處理機空閒,程序排程程式必然會從就緒佇列中選取一個程序並將它投入執行,因此只要就緒佇列非空,一個程序的轉換3能立即引起一個程序的轉換1。

  2. 程序與執行緒的區別。dll是否有獨立的堆疊?

  程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位.

  執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源***如程式計數器,一組暫存器和棧***,但是它可與同屬一個程序的其他的執行緒共享程序所擁有的全部資源.

  一個執行緒可以建立和撤銷另一個執行緒;同一個程序中的多個執行緒之間可以併發執行

  程序是死的,只是一些資源的集合,真正的程式執行都是執行緒來完成的,程式啟動的時候作業系統就幫你建立了一個主執行緒。每個執行緒有自己的堆疊。 DLL***動態連線庫***中有沒有獨立的堆疊,這個問題不好回答,或者說這個問題本身是否有問題。因為DLL中的程式碼是被某些執行緒所執行,只有執行緒擁有堆疊,如果DLL中的程式碼是EXE中的執行緒所呼叫,那麼這個時候是不是說這個DLL沒有自己獨立的堆疊?如果DLL中的程式碼是由DLL自己建立的執行緒所執行,那麼是不是說DLL有獨立的堆疊?以上講的是堆疊,如果對於堆來說,每個DLL有自己的堆,所以如果是從DLL中動態分配的記憶體,最好是從DLL中刪除,如果你從DLL中分配記憶體,然後在EXE中,或者另外一個DLL中刪除,很有可能導致程式崩潰。

  另程序和程式的區別:程序即執行中的程式,從中即可知,程序是在執行的,程式是非執行的,當然本質區別就是動態和靜態的區別。程式可以存在外存中,也可以存在記憶體中

  3. 程序通訊的幾種方式。

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

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

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

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

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

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

  套接字*** socket *** : 套解字也是一種程序間通訊機制,與其他通訊機制不同的是,它可用於不同及其間的程序通訊。

  4. 執行緒同步幾種方式。***一定要會寫生產者、消費者問題,完全消化理解***

  臨界區***CCriticalSection***:通過對多執行緒的序列化來訪問公共資源或一段程式碼,速度快,適合控制資料訪問。

  事件***CEvent***:為協調共同對一個共享資源的單獨訪問而設計的。

  互斥量***CMutex***:為控制一個具有有限數量使用者資源而設計。

  訊號量***CSemaphore***:用來通知執行緒有一些事件已發生,從而啟動後繼任務的開始。

  生產者、消費者問題

  Var mutex,empty,; // 定義三個訊號量

   item; // 定義緩衝池,容量為n

  in,;

  begin

  parbegin

   // 生產者

  repeat

  producer an item nextp; // 生產一個產品 .

  wait***empty***; // 申請一個空緩衝區

  wait***mutex***; // 申請緩衝池的使用權

  buffer***in***:=nextp; // 將產品放入緩衝池中

  in:=***in+1***mod n; // 下一個空緩衝區地址

  signal***mutex***; //釋放緩衝池使用權

  signal***full***; // 釋放一個滿緩衝區

  until false;

  end

  

  repeat

  wait***full***;

  wait***mutex***;

  nextc:=buffer***out***;

  out:=***out+1***mod n;

  signal***mutex***;

  signal***empty***;

  consumer the item in nextc;

  until false;

  end

  parend

  end

  nextp 應該是next proceducer的意思吧

  nextc 應該是next consumer

  貌似也不是什麼變數,屬於語言描述而已

  下面的消費者也是差不多的。

  至於生產者程序如何被阻塞和喚醒,因為程式中有一個 repeat語句,所以程序不斷測試緩衝池是否有空緩衝區,以及緩衝池是否有其他程序使用。若兩個條件不滿足,則進入阻塞佇列等待。若某一時刻兩個條件都能滿足,則能喚醒該程序。

  訊號量:

  只支援兩種操作,wait******和signal******,也叫做P、V操作,這兩個操作是

  原子操作,不會被打斷。訊號量機制有以下幾種:

  1.整型訊號量--------------------一個整數,只能由PV操作對其加減

  2.記錄型訊號量------------------在1的基礎上種了一個連結串列,記錄請求該資源的執行緒,解決1中沒有讓權等待的問題

  3.AND訊號量---------------------1和2只是對一個資源,而這個機制能解決一次請求多個資源的情況

  4.一般訊號量--------------------這是最一般的訊號量機制,能夠表示以上幾種,表示方法也比較特殊,見作業系統

  3和4又屬於訊號量集機制。

  5. 執行緒的實現方式. ***也就是使用者執行緒與核心執行緒的區別***

  使用者執行緒與核心執行緒的區別

  根據作業系統核心是否對執行緒可感知,可以把執行緒分為核心執行緒和使用者執行緒。

  核心執行緒建立和銷燬都是由作業系統負責、通過系統呼叫完成的,作業系統在排程時,參考各程序內的執行緒執行情況做出排程決定,如果一個程序中沒有就緒態的執行緒,那麼這個程序也不會被排程佔用CPU。

  和核心執行緒相對應的是使用者執行緒,使用者執行緒指不需要核心支援而在使用者程式中實現的執行緒,其不依賴於作業系統核心,使用者程序利用執行緒庫提供建立、同步、排程和管理執行緒的函式來控制使用者執行緒。使用者執行緒多見於一些歷史悠久的作業系統,例如Unix作業系統,不需要使用者態/核心態切換,速度快,作業系統核心不知道多執行緒的存在,因此一個執行緒阻塞將使得整個程序***包括它的所有執行緒***阻塞。由於這裡的處理器時間片分配是以程序為基本單位,所以每個執行緒執行的時間相對減少為了在作業系統中加入執行緒支援,採用了在使用者空間增加執行庫來實現執行緒,這些執行庫被稱為“執行緒包”,使用者執行緒是不能被作業系統所感知的。

  引入使用者執行緒,具體而言,有以下四個方面的優勢:

  ***1***可以在不支援執行緒的作業系統中實現。

  ***2***建立和銷燬執行緒、執行緒切換代價等執行緒管理的代價比核心執行緒少得多。

  ***3***允許每個程序定製自己的排程演算法,執行緒管理比較靈活。

  ***4***執行緒能夠利用的表空間和堆疊空間比核心級執行緒多。

  使用者執行緒的缺點主要有以下兩點:

  ***1***同一程序中只能同時有一個執行緒在執行,如果有一個執行緒使用了系統呼叫而阻塞,那麼整個程序都會被掛起。

  ***2***頁面失效也會產生類似的問題。

  核心執行緒的優缺點剛好跟使用者執行緒相反。實際上,作業系統可以使用混合的方式來實現執行緒。

  Java實現執行緒的方式有三種:

  ***1***繼承Thread類,重寫run函式

  建立:

  class xx extends Thread{

  public void run******{

  Thread.sleep***1000*** //執行緒休眠1000毫秒,sleep使執行緒進入Block狀態,並釋放資源

  }}

  開啟執行緒:

  物件.start****** //啟動執行緒,run函式執行

  public class java_thread extends Thread{

  public static void main***String args[]***

  {

  ***new java_thread*********.run******;

  System.out.println***"main thread run "***;

  }

  public synchronized void run******

  {

  System.out.println***"sub thread run "***;

  }

  }

  ***2***實現Runnable介面,重寫run函式

  開啟執行緒:

  Thread t = new Thread***物件*** //建立執行緒物件

  t.start******

  public class java_thread implements Runnable{

  public static void main***String args[]***

  {

  ***new Thread***new java_thread************.start******;

  System.out.println***"main thread run "***;

  }

  public void run******

  {

  System.out.println***"sub thread run "***;

  }

  }

  ***3***實現Callable介面,重寫call函式

  Callable是類似於Runnable的介面,實現Callable介面的類和實現Runnable的類都是可被其它執行緒執行的任務。

  import java.util.concurrent.Callable;

  public class CallableWorker implements Callable{

  private int i;

  public CallableWorker***int i*** throws Exception {

  this.i = i;}

  @Override

  public Integer call****** throws Exception {

  System.out.println***"Thread-" + Thread.currentThread******.getId****** + " CallableWorker test count " + i + "begin..."***;

  try {

  Thread.sleep***1000***;

  } catch ***InterruptedException e*** {

  e.printStackTrace******;

  }

  System.out.println***"Thread-" + Thread.currentThread******.getId****** + " CallableWorker test count " + i + "end"***;

  return i+1;

  }}

  Callable和Runnable有幾點不同:

  ①Callable規定的方法是call******,而Runnable規定的方法是run******.

  ②Callable的任務執行後可返回值,而Runnable的任務是不能返回值的

  ③call******方法可丟擲異常,而run******方法是不能丟擲異常的。

  ④執行Callable任務可拿到一個Future物件,Future表示非同步計算的結果。它提供了檢查計算是否完成的方法,以等待計算的完成,並檢索計算的結果.通過Future物件可瞭解任務執行情況,可取消任務的執行,還可獲取任務執行的結果

  6. 使用者態和核心態的區別。

  當一個任務***程序***執行系統呼叫而陷入核心程式碼中執行時,我們就稱程序處於核心執行態***或簡稱為核心態***。此時處理器處於特權級最高的***0級***核心程式碼中執行。當程序處於核心態時,執行的核心程式碼會使用當前程序的核心棧。每個程序都有自己的核心棧。當程序在執行使用者自己的程式碼時,則稱其處於使用者執行態***使用者態***。即此時處理器在特權級最低的***3級***使用者程式碼中執行。當正在執行使用者程式而突然被中斷程式中斷時,此時使用者程式也可以象徵性地稱為處於程序的核心態。因為中斷處理程式將使用當前程序的核心棧。這與處於核心態的程序的狀態有些類似。

  使用者態切換到核心態的3種方式:系統呼叫、異常、外圍裝置中斷。

  7. 使用者棧和核心棧的區別。

  核心棧和使用者棧區別:

  intel的cpu分為四個執行級別ring0~ring3,核心建立程序,建立程序的同時建立程序控制塊,建立程序自己的堆疊。一個程序有兩個堆疊,使用者棧和系統棧。使用者堆疊的空間指向使用者地址空間,核心堆疊的空間指向核心地址空間。

  有個CPU堆疊指標暫存器,程序執行的狀態有使用者態和核心態,當程序執行在使用者態時。CPU堆疊指標暫存器指向的是使用者堆疊地址,使用的是使用者堆疊;當程序執行在核心態時,CPU堆疊指標暫存器指向的是核心堆疊地址,使用的是核心堆疊。

  堆疊切換

  當系統因為系統呼叫***軟中斷***或硬體中斷,CPU切換到特權工作模式,程序陷入核心態,程序使用的棧也要從使用者棧轉向系統棧。

  從使用者態到核心態要兩步驟,首先是將使用者堆疊地址儲存到核心堆疊中,然後將CPU堆疊指標暫存器指向核心堆疊。

  當由核心態轉向使用者態,步驟首先是將核心堆疊中得使用者堆疊地址恢復到CPU堆疊指標暫存器中。

  核心棧和使用者棧區別

  1.棧是系統執行在核心態的時候使用的棧,使用者棧是系統執行在使用者態時候使用的棧。

  當程序由於中斷進入核心態時,系統會把一些使用者態的資料資訊儲存到核心棧中,當返回到使用者態時,取出核心棧中得資訊恢復出來,返回到程式原來執行的地方。使用者棧就是程序在使用者空間時建立的棧,比如一般的函式呼叫,將會用到使用者棧。

  2.核心棧是屬於作業系統空間的一塊固定區域,可以用於儲存中斷現場、儲存作業系統子程式間相互呼叫的引數、返回值等。使用者棧是屬於使用者程序空間的一塊區域,使用者儲存使用者程序子程式間的相互呼叫的引數、返回值等。

  3.每個Windows 都有4g的程序空間,系統棧使用程序空間的地段部分,使用者棧是高階部分如果使用者要直接訪問系統棧部分,需要有特殊的方式。

  為何要設定兩個不同的棧?

  共享原因:核心的程式碼和資料是為所有的程序共享的,如果不為每一個程序設定對應的核心棧,那麼就不能實現不同的程序執行不同的程式碼。

  安全原因:如果只有一個棧,那麼使用者就可以修改棧內容來突破核心安全保護。

  8. 記憶體池、程序池、執行緒池。***c++程式設計師必須掌握***

  自定義記憶體池的思想通過這個"池"字表露無疑,應用程式可以通過系統的記憶體分配呼叫預先一次性申請適當大小的記憶體作為一個記憶體池,之後應用程式自己對記憶體的分配和釋放則可以通過這個記憶體池來完成。只有當記憶體池大小需要動態擴充套件時,才需要再呼叫系統的記憶體分配函式,其他時間對記憶體的一切操作都在應用程式的掌控之中。

  應用程式自定義的記憶體池根據不同的適用場景又有不同的型別。

  從執行緒安全的角度來分,記憶體池可以分為單執行緒記憶體池和多執行緒記憶體池。單執行緒記憶體池整個生命週期只被一個執行緒使用,因而不需要考慮互斥訪問的問題;多執行緒記憶體池有可能被多個執行緒共享,因此則需要在每次分配和釋放記憶體時加鎖。相對而言,單執行緒記憶體池效能更高,而多執行緒記憶體池適用範圍更廣。

  從記憶體池可分配記憶體單元大小來分,可以分為固定記憶體池和可變記憶體池。所謂固定記憶體池是指應用程式每次從記憶體池中分配出來的記憶體單元大小事先已經確定,是固定不變的;而可變記憶體池則每次分配的記憶體單元大小可以按需變化,應用範圍更廣,而效能比固定記憶體池要低。

  9. 死鎖的概念,導致死鎖的原因.

  死鎖: 是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去.此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序.

  主要原因***1*** 因為系統資源不足。***2*** 程序執行推進的順序不合適。***3*** 資源分配不當等。

  10. 導致死鎖的四個必要條件。

  產生死鎖的四個必要條件:

  ***1*** 互斥條件:一個資源每次只能被一個程序使用。

  ***2*** 請求與保持條件:一個程序因請***而阻塞時,對已獲得的資源保持不放。

  ***3*** 不剝奪條件:程序已獲得的資源,在末使用完之前,不能強行剝奪。

  ***4*** 迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係。

  這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖。

  二

  11. 處理死鎖的四個方式。

  1***忽略該問題。例如鴕鳥演算法,該演算法可以應用在極少發生死鎖的的情況下。為什麼叫鴕鳥演算法呢,***鴕鳥策略***

  2***檢測死鎖並且恢復。***檢測與解除策略***

  3***仔細地對資源進行動態分配,以避免死鎖。***避免策略***

  4***通過破除死鎖四個必要條件之一,來防止死鎖產生。***預防策略***

  12. 預防死鎖的方法、避免死鎖的方法。

  通過破除死鎖四個必要條件之一,來預防死鎖產生,有兩種方法,一種是當其申請的資源得不到滿足時,也必須放棄其原先佔有的資源;另一種方法是隻適用於申請資源的程序優先順序比佔有該資源的程序優先順序高時,如果一個程序申請的資源被其它程序佔用,而申請程序的優先順序較高,那麼它可以強迫佔有資源的程序放棄。

  仔細地對資源進行動態分配,以避免死鎖。

  13. 程序排程演算法。***週轉時間 = 程式結束時間 -- 開始服務時間、帶權週轉時間= 週轉時間 / 要求服務時間***

  先來先服務***First Come First Service,FCFS***排程演算法按照程序進入就緒佇列的先後順序選擇可以佔用處理器的程序。這是一種不可搶佔方式的排程演算法,優點是實現簡單,缺點是後來的程序等待CPU的時間較長。它現今主要用作輔助排程法;例如結合在優先順序排程演算法中使用,當有兩個最高優先順序的程序時,則誰先來,誰就先被排程。

  短執行程序優先演算法***Shortest Process First,SPF***就是從就緒佇列中選擇一個CPU執行時間預期最短的程序,將處理器分配給它。雖然較公平,但實現難度較大,因為要準確預定下一個程序的CPU執行週期是很困難的。

  •最高優先順序優先***Highest Priority First,HPF***排程演算法的核心是確定程序的優先順序。首先,系統或使用者按某種原則為程序指定一個優先順序來表示該程序所享有的排程優先權。確定優先順序的方法較多,一般可分為兩類,即靜態法和動態法。靜態法根據程序的靜態特性,在程序開始執行之前就確定它們的優先順序,一旦開始執行之後就不能改變。動態法則不然,它把程序的靜態特性和動態特性結合起來確定程序的優先順序,隨著程序的執行過程,其優先順序不斷變化。

  •程序的靜態優先順序確定最基本的方法是按照程序的型別給予不同的優先順序。例如,在有些系統中,程序被劃分為系統程序和使用者程序。系統程序享有比使用者程序高的優先順序;對於使用者程序來說,則可以分為:I/O繁忙的程序、CPU繁忙的程序、I/O與CPU均衡的程序和其他程序等。

  •對系統程序,也可以根據其所要完成的功能劃分為不同的型別。例如,排程程序、I/O程序、中斷處理程序、儲存管理程序等。這些程序還可進一步劃分為不同型別並賦予不同的優先順序。例如,在作業系統中,對於鍵盤中斷的處理優先順序和對於電源掉電中斷的處理優先順序是不相同的。

  •基於靜態優先順序的排程演算法實現簡單,系統開銷小,但由於靜態優先順序一旦確定之後,直到執行結束為止始終保持不變,從而系統效率較低,排程效能不高。現在的作業系統中,如果使用優先順序排程的話,則大多采用動態優先順序的排程策略。

  •程序的動態優先順序一般可以根據以下兩個方面來確定:

  • ***1***根據程序佔有CPU時間的長短來決定。一個程序佔有處理機的時間愈長,則在被阻塞之後再次獲得排程的優先順序就越低。反之,其獲得排程的可能性就會越大。

  • ***2***根據就緒程序等待CPU的時間長短來決定。一個就緒程序在就緒佇列中等待的時間越長,則它獲得排程選中的優先順序就越高。

  •由於動態優先順序隨時間的推移而變化,系統要經常計算各個程序的優先順序,因此,系統要為此付出一定的開銷。

  •最高優先順序優先排程演算法用於多道批處理系統中較好,但它使得優先順序較低的程序等待時間較長,這對於分時系統中要想獲得較好的響應時間是不允許的,所以在分時系統中多采用時間片輪轉法來進行程序排程。

  時間片輪轉***Round Robin,RR***法的基本思路是讓每個程序在就緒佇列中的等待時間與享受服務的時間成比例。在時間片輪轉法中,需要將CPU的處理時間分成固定大小的時間片,例如,幾十毫秒至幾百毫秒。如果一個程序在被排程選中之後用完了系統規定的時間片,但又未完成要求的任務,則它自行釋放自己所佔有的CPU而排到就緒佇列的末尾,等待下一次排程。同時,程序排程程式又去排程當前就緒佇列中的第一個程序。

  •顯然,輪轉法只能用來排程分配一些可以搶佔的資源。這些可以搶佔的資源可以隨時被剝奪,而且可以將它們再分配給別的程序。CPU是可搶佔資源的一種。但印表機等資源是不可搶佔的。由於作業排程是對除了CPU之外的所有系統硬體資源的分配,其中包含有不可搶佔資源,所以作業排程不使用輪轉法。在輪轉法中,時間片長度的選取非常重要。首先,時間片長度的選擇會直接影響到系統的開銷和響應時間。如果時間片長度過短,則排程程式搶佔處理機的次數增多。這將使程序上下文切換次數也大大增加,從而加重系統開銷。反過來,如果時間片長度選擇過長,例如,一個時間片能保證就緒佇列中所需執行時間最長的程序能執行完畢,則輪轉法變成了先來先服務法。時間片長度的選擇是根據系統對響應時間的要求和就緒佇列中所允許最大的程序數來確定的。

  • 在輪轉法中,加入到就緒佇列的程序有3種情況,一種是分給它的時間片用完,但程序還未完成,回到就緒佇列的末尾等待下次排程去繼續執行。另一種情況是分給該程序的時間片並未用完,只是因為請求I/O或由於程序的互斥與同步關係而被阻塞。當阻塞解除之後再回到就緒佇列。第三種情況就是新建立程序進入就緒佇列。如果對這些程序區別對待,給予不同的優先順序和時間片,從直觀上看,可以進一步改善系統服務質量和效率。例如,我們可把就緒佇列按照程序到達就緒佇列的型別和程序被阻塞時的阻塞原因分成不同的就緒佇列,每個佇列按FCFS原則排列,各佇列之間的程序享有不同的優先順序,但同一佇列內優先順序相同。這樣,當一個程序在執行完它的時間片之後,或從睡眠中被喚醒以及被建立之後,將進入不同的就緒佇列。

  14. Windows記憶體管理的方式***塊式、頁式、段式、段頁式***.

  記憶體管理是作業系統中的重要部分,兩三句話恐怕誰也說不清楚吧~~我先說個大概,希望能夠拋磚引玉吧 當程式執行時需要從記憶體中讀出這段程式的程式碼。程式碼的位置必須在實體記憶體中才能被執行,由於現在的作業系統中有非常多的程式執行著,記憶體中不能夠完全放下,所以引出了虛擬記憶體的概念。把哪些不常用的程式片斷就放入虛擬記憶體,當需要用到它的時候在load入主存***實體記憶體***中。這個就是記憶體管理所要做的事。記憶體管理還有另外一件事需要做:計算程式片段在主存中的物理位置,以便CPU排程。 記憶體管理有塊式管理,頁式管理,段式和段頁式管理。現在常用段頁式管理。

  塊式管理:把主存分為一大塊、一大塊的,當所需的程式片斷不在主存時就分配一塊主存空間,把程式片斷load入主存,就算所需的程式片度只有幾個位元組也只能把這一塊分配給它。這樣會造成很大的浪費,平均浪費了50%的記憶體空間,但是易於管理。

  頁式管理:把主存分為一頁一頁的,每一頁的空間要比一塊一塊的空間小很多,顯然這種方法的空間利用率要比塊式管理高很多。

  段式管理:把主存分為一段一段的,每一段的空間又要比一頁一頁的空間小很多,這種方法在空間利用率上又比頁式管理高很多,但是也有另外一個缺點。一個程式片斷可能會被分為幾十段,這樣很多時間就會被浪費在計算每一段的實體地址上***計算機最耗時間的大家都知道是I/O吧***。

  段頁式管理:結合了段式管理和頁式管理的優點。把主存分為若干頁,每一頁又分為若干段。

  二維邏輯地址:段號+段內地址

  分頁與分段的主要區別:

  1***、段是資訊的邏輯單位,它是根據使用者的需要劃分的,因此段對使用者是可見的;頁是資訊的物理單位,是為了管理主存的方便而劃分的,對使用者是透明的。

  2***、頁的大小固定不變,由系統決定。段的大小是不固定的,它由其完成的功能決定。

  3***、段式向用戶提供的是二維地址空間,頁式向用戶提供的是一維地址空間,其頁號和頁內偏移是機器硬體的功能。

  4***、由於段是資訊的邏輯單位,因此便於存貯保護和資訊的共享,頁的保護和共享受到限制。

  分頁與分段儲存管理系統雖然在很多地方相似,但從概念上講,兩者是完全不同的,它們之間的區別如下:

  ①頁是資訊的物理單位。分頁的目的是實現離散分配,減少外部碎片,提高記憶體利用率。段是資訊的邏輯單位。每一段在邏輯上是一組相對完整的資訊集合。

  ②分頁式儲存管理的作業地址空間是一維的,而分段式儲存管理的作業地址空間是二維的。

  ③頁的大小固定且由系統確定,是等長的。而段的長度不定。

  ④分頁的優點體現在記憶體空間的管理上,而分段的優點體現在地址空間的管理上。

  15. 記憶體連續分配方式採用的幾種演算法及各自優劣。

  1*** 單一連續分配 是一種最簡單的儲存管理方式,其優點是軟體處理簡單,最大缺點是儲存器不能充分利用。多用於單使用者微機作業系統中。

  2*** 動態分割槽分配 是多道程式環境下各種儲存管理方式中最簡單的一種。它將記憶體劃分成若干個分割槽,在每個分割槽中按照連續分配方式分配給一個作業。分割槽形式: a*** 固定分割槽分配:指記憶體在處理作業前已被劃分成若干個大小不等的分割槽,儲存管理程式根據每個作業步的最大儲存量分配一個足夠大的分割槽給它。當找不到一個足夠大的分割槽時,則通知作業排程挑選另一作業,這種方式分配和回收記憶體簡單,但記憶體利用不充分,會產生“碎片”空間。b*** 可變分割槽分配:指記憶體事先並未被分割槽,只有當作業進入記憶體時,才根據作業的大小建立分割槽。其特點是分割槽的個數和大小都是可變的,但需要建立分配區表和空白區表,且表的長度是不固定的。

  3*** 可重定位分割槽分配 為使各分割槽中的使用者程式能移到記憶體的一端,使碎片集中於另一端成為一個大分割槽,在程式執行過程中,需對作業移動過程中的與地址有關項進行調整。這種分配方法的優點是清除碎片,更大程度地利用記憶體空間,但必須硬體的支援,且要花費時間。

  16. 動態連結及靜態連結.

  靜態連結庫與動態連結庫都是共享程式碼的方式,如果採用靜態連結庫,則無論你願不願意,lib 中的指令都全部被直接包含在最終生成的 EXE 檔案中了。但是若使用 DLL,該 DLL 不必被包含在最終 EXE 檔案中,EXE 檔案執行時可以“動態”地引用和解除安裝這個與 EXE 獨立的 DLL 檔案。靜態連結庫和動態連結庫的另外一個區別在於靜態連結庫中不能再包含其他的動態連結庫或者靜態庫,而在動態連結庫中還可以再包含其他的動態或靜態連結 庫

  動態連結是指在生成可執行檔案時不將所有程式用到的函式連結到一個檔案,因為有許多函式在作業系統帶的dll檔案中,當程式執行時直接從作業系統中找。

  而靜態連結就是把所有用到的函式全部連結到exe檔案中。

  動態連結是隻建立一個引用的介面,而真正的程式碼和資料存放在另外的可執行模組中,在執行時再裝入;

  而靜態連結是把所有的程式碼和資料都複製到本模組中,執行時就不再需要庫了。

  17. 基本分頁、請求分頁儲存管理方式。18. 基本分段、請求分段儲存管理方式。

  分頁式儲存管理的基本原理:採用分頁儲存器允許把一個作業存放到若干不相鄰的分割槽中,既可免去移動資訊的工作,又可儘量減少主存的碎片。分頁式儲存管理的基本原理如下:

  1、 頁框:實體地址分成大小相等的許多區,每個區稱為一塊;

  2、址分成大小相等的區,區的大小與塊的大小相等,每個稱一個頁面。

  3、 邏輯地址形式:與此對應,分頁儲存器的邏輯地址由兩部分組成,頁號和單元號。邏輯地址格式為

  頁號 單元號***頁內地址***

  採用分頁式儲存管理時,邏輯地址是連續的。所以,使用者在編制程式時仍只須使用順序的地址,而不必考慮如何去分頁。

  4、頁表和地址轉換:如何保證程式正確執行呢?採用的辦法是動態重定位技術,讓程式的指令執行時作地址變換,由於程式段以頁為單位,所以,我們給每個頁設立一個重定位暫存器,這些重定位暫存器的集合便稱頁表。頁表是作業系統為每個使用者作業建立的,用來記錄程式頁面和主存對應頁框的對照表,頁表中的每一欄指明瞭程式中的一個頁面和分得的頁框的對應關係。絕對地址=塊號*塊長+單元號

  以上從拓撲結構角度分析了對稱式與非對稱式虛擬儲存方案的異同,實際從虛擬化儲存的實現原理來講也有兩種方式;即資料塊虛擬與虛擬檔案系統.

  資料塊虛擬儲存方案著重解決資料傳輸過程中的衝突和延時問題.在多交換機組成的大型Fabric結構的SAN中,由於多臺主機通過多個交換機埠訪問儲存裝置,延時和資料塊衝突問題非常嚴重.資料塊虛擬儲存方案利用虛擬的多埠並行技術,為多臺客戶機提供了極高的頻寬,最大限度上減少了延時與衝突的發生,在實際應用中,資料塊虛擬儲存方案以對稱式拓撲結構為表現形式.

  虛擬檔案系統儲存方案著重解決大規模網路中檔案共享的安全機制問題.通過對不同的站點指定不同的訪問許可權,保證網路檔案的安全.在實際應用中,虛擬檔案系統儲存方案以非對稱式拓撲結構為表現形式.

  虛擬儲存技術,實際上是虛擬儲存技術的一個方面,特指以CPU時間和外存空間換取昂貴記憶體空間的作業系統中的資源轉換技術

  基本思想:程式,資料,堆疊的大小可以超過記憶體的大小,作業系統把程式當前使用的部分保留在記憶體,而把其他部分儲存在磁碟上,並在需要時在記憶體和磁碟之間動態交換,虛擬儲存器支援多道程式設計技術

  目的:提高記憶體利用率

  管理方式

  A 請求式分頁儲存管理

  在程序開始執行之前,不是裝入全部頁面,而是裝入一個或零個頁面,之後根據程序執行的需要,動態裝入其他頁面;當記憶體空間已滿,而又需要裝入新的頁面時,則根據某種演算法淘汰某個頁面,以便裝入新的頁面

  B 請求式分段儲存管理

  為了能實現虛擬儲存,段式邏輯地址空間中的程式段在執行時並不全部裝入記憶體,而是如同請求式分頁儲存管理,首先調入一個或若干個程式段執行,在執行過程中呼叫到哪段時,就根據該段長度在記憶體分配一個連續的分割槽給它使用.若記憶體中沒有足夠大的空閒分割槽,則考慮進行段的緊湊或將某段或某些段淘汰出去,這種儲存管理技術稱為請求式分段儲存管理

  19. 分段分頁方式的比較各自優缺點。

  頁和分段系統有許多相似之處,但在概念上兩者完全不同,主要表現在:

  1、頁是資訊的物理單位,分頁是為實現離散分配方式,以消減記憶體的外零頭,提高記憶體的利用率;或者說,分頁僅僅是由於系統管理的需要,而不是使用者的需要。

  段是資訊的邏輯單位,它含有一組其意義相對完整的資訊。分段的目的是為了能更好的滿足使用者的需要。

  2、頁的大小固定且由系統確定,把邏輯地址劃分為頁號和頁內地址兩部分,是由機器硬體實現的,因而一個系統只能有一種大小的頁面。

  段的長度卻不固定,決定於使用者所編寫的程式,通常由編輯程式在對源程式進行編輯時,根據資訊的性質來劃分。

  3、分頁的作業地址空間是維一的,即單一的線性空間,程式設計師只須利用一個記憶符,即可表示一地址。

  分段的作業地址空間是二維的,程式設計師在標識一個地址時,既需給出段名,又需給出段內地址。

  20. 幾種頁面置換演算法,會算所需換頁數。***LRU用程式如何實現?***

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

  1***最佳置換演算法***OPT******理想置換演算法***

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

  2***先進先出置換演算法***FIFO***

  最簡單的頁面置換演算法是先入先出***FIFO***法。這種演算法的實質是,總是選擇在主存中停留時間最長***即最老***的一頁置換,即先進入記憶體的頁,先退出記憶體。理由是:最早調入記憶體的頁,其不再被使用的可能性比剛調入記憶體的可能性大。建立一個FIFO佇列,收容所有在記憶體中的頁。被置換頁面總是在佇列頭上進行。當一個頁面被放入記憶體時,就把它插在隊尾上。

  這種演算法只是在按線性順序訪問地址空間時才是理想的,否則效率不高。因為那些常被訪問的頁,往往在主存中也停留得最久,結果它們因變“老”而不得不被置換出去。

  FIFO的另一個缺點是,它有一種異常現象,即在增加儲存塊的情況下,反而使缺頁中斷率增加了。當然,導致這種異常現象的頁面走向實際上是很少見的。

  3***最近最久未使用***LRU***演算法

  FIFO演算法和OPT演算法之間的主要差別是,FIFO演算法利用頁面進入記憶體後的時間長短作為置換依據,而OPT演算法的依據是將來使用頁面的時間。如果以最近的過去作為不久將來的近似,那麼就可以把過去最長一段時間裡不曾被使用的頁面置換掉。它的實質是,當需要置換一頁時,選擇在最近一段時間裡最久沒有使用過的頁面予以置換。這種演算法就稱為最久未使用演算法***Least Recently Used,LRU***。

  LRU演算法是與每個頁面最後使用的時間有關的。當必須置換一個頁面時,LRU演算法選擇過去一段時間裡最久未被使用的頁面。

  LRU演算法是經常採用的頁面置換演算法,並被認為是相當好的,但是存在如何實現它的問題。LRU演算法需要實際硬體的支援。其問題是怎麼確定最後使用時間的順序,對此有兩種可行的辦法:

  1.計數器。最簡單的情況是使每個頁表項對應一個使用時間欄位,並給CPU增加一個邏輯時鐘或計數器。每次儲存訪問,該時鐘都加1。每當訪問一個頁面時,時鐘暫存器的內容就被複制到相應頁表項的使用時間欄位中。這樣我們就可以始終保留著每個頁面最後訪問的“時間”。在置換頁面時,選擇該時間值最小的頁面。這樣做,不僅要查頁表,而且當頁表改變時***因CPU排程***要維護這個頁表中的時間,還要考慮到時鐘值溢位的問題。

  2.棧。用一個棧保留頁號。每當訪問一個頁面時,就把它從棧中取出放在棧頂上。這樣一來,棧頂總是放有目前使用最多的頁,而棧底放著目前最少使用的頁。由於要從棧的中間移走一項,所以要用具有頭尾指標的雙向鏈連起來。在最壞的情況下,移走一頁並把它放在棧頂上需要改動6個指標。每次修改都要有開銷,但需要置換哪個頁面卻可直接得到,用不著查詢,因為尾指標指向棧底,其中有被置換頁。

  因實現LRU演算法必須有大量硬體支援,還需要一定的軟體開銷。所以實際實現的都是一種簡單有效的LRU近似演算法。

  一種LRU近似演算法是最近未使用演算法***Not Recently Used,NUR***。它在儲存分塊表的每一表項中增加一個引用位,作業系統定期地將它們置為0。當某一頁被訪問時,由硬體將該位置1。過一段時間後,通過檢查這些位可以確定哪些頁使用過,哪些頁自上次置0後還未使用過。就可把該位是0的頁淘汰出去,因為在最近一段時間裡它未被訪問過。

  4***Clock置換演算法***LRU演算法的近似實現***

  5***最少使用***LFU***置換演算法

  在採用最少使用置換演算法時,應為在記憶體中的每個頁面設定一個移位暫存器,用來記錄該頁面被訪問的頻率。該置換演算法選擇在最近時期使用最少的頁面作為淘汰頁。由於儲存器具有較高的訪問速度,例如100 ns,在1 ms時間內可能對某頁面連續訪問成千上萬次,因此,通常不能直接利用計數器來記錄某頁被訪問的次數,而是採用移位暫存器方式。每次訪問某頁時,便將該移位暫存器的最高位置1,再每隔一定時間***例如100 ns***右移一次。這樣,在最近一段時間使用最少的頁面將是∑Ri最小的頁。

  LFU置換演算法的頁面訪問圖與LRU置換演算法的訪問圖完全相同;或者說,利用這樣一套硬體既可實現LRU演算法,又可實現LFU演算法。應該指出,LFU演算法並不能真正反映出頁面的使用情況,因為在每一時間間隔內,只是用暫存器的一位來記錄頁的使用情況,因此,訪問一次和訪問10 000次是等效的。

  21. 虛擬記憶體的定義及實現方式。

  虛擬記憶體,它的作用與實體記憶體基本相似,但它是作為實體記憶體的“後備力量”而存在的,也就是說,只有在實體記憶體已經不夠使用的時候,它才會發揮作用。

  改變頁面檔案位置的方法是:用滑鼠右鍵點選“我的電腦”,選擇“屬性→高階→效能設定→高階→更改虛擬記憶體”,在驅動器欄裡選擇想要改變到的位置

  22. 作業系統的四個特性。

  併發性***concurrency***:指在計算機系統中存在著許多併發執行的活動。對計算機系統 而言,併發是指巨集觀上看系統內有多道程式同時執行,微觀上看是序列執行。因為在 大多數計算機系統中一般只有一個CPU,在任意時刻只能有一道程式佔用CPU。

  共享性***sharing***:系統中各個併發活動要共享計算機系統中的各種軟、硬體資源,因此作業系統必須解決在多道程式間合理地分配和使用資源問題。

  虛擬性***virtual***:虛擬是作業系統中的重要特徵,所謂虛擬是指把物理上的一臺裝置 變成邏輯上的多臺裝置。例如,在作業系統中採用了spooling技術,可以利用快速、 大容量可共享的磁碟作為中介,模擬多個非共享的低速的輸入輸出裝置,這樣的裝置 稱為虛擬裝置。

  非同步性:在多道程式環境下允許多個程序併發執行,但只有程序在獲得所需的資源後方能執行。在單處理機環境下,由於系統中只有一臺處理機,因而每次只允許一個程序執行,其餘程序只能等待。

  23. DMA。

  直接記憶體存取***Direct Memory Access*** 改善系統實時效能的一個熟知的方法是,額外提供一個邏輯模組,在事件發生時產生響應,並允許處理器在較方便的時間來處理資訊。這個DMA控制器通常將傳送到模組的資訊複製到記憶體***RAM***,並允許已處理的資訊自動從記憶體移到外部外圍裝置。所有這些工作皆獨立於目前的CPU活動-詳見圖1。

  這種方式肯定有所助益,但其效益僅限於延遲必然發生的事件-CPU還是得在某一時間處理資訊。S12X採用一個根本的方法,即提供「智慧型DMA」控制器,不只行動資料,同時直接執行所有的處理工作。

  24. Spooling。

  離線輸入和離線輸出

  在多道環境下,可以用OS的一道管理程式實現從I/O裝置輸入資料並存放到磁碟上,模擬離線輸入;用OS的另一道管理程式將磁碟上的資料輸出到I/O裝置上,模擬離線輸出;這種假離線I/O操作稱為Spooling技術。

  Spooling是一種虛擬裝置技術、一種資源轉換技術。

  25. 外存分配的幾種方式,及各種優劣。

  連續分配:為每一個檔案分配一組相鄰接的盤塊;物理上形成了順序檔案結構;外存上會出現“ 碎片” ,用“ 緊湊” 的方法解決。優缺點:順序***批量***訪問容易、速度快;要求有連續的儲存空間***有時需要作緊湊處理***、必須事先知道檔案的長度。

  連結分配:離散分配方式。優缺點:消除了“碎片”,有利於檔案的增/刪/改。隱式連結

  在檔案的每個目錄項中,都含有指向連結檔案第一盤塊和最後一個盤塊的指標,只適合於順序訪;顯式連結,把用於連結檔案各物理塊的指標,顯式地存放在記憶體的一張“連結表”中。

  索引分配:單級索引分配每個檔案一個索引塊***表***;多級索引分配當檔案較大,需要很多個索引塊時,可以為各索引塊建立一個索引表***塊***;混合索引分配方式。