【轉】校園招聘面試-操作系統知識總結

本文轉載自http://blog.csdn.net/houzuoxin/article/details/38957969

有問題請掃描下圖



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,full:semaphore:=1,n,0;  // 定義三個信號量

    buffer:array[0,...,n-1]of item;  // 定義緩衝池,容量爲n

    in,out:integer:=0,0;

    begin

        parbegin

            proceducer:begin // 生產者

                    repeat

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

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

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

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

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

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

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

                    until false;

                end

            consumer:begin

                    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(),也叫做PV操作,這兩個操作是

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

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

2.記錄型信號量------------------1的基礎上種了一個鏈表,記錄請求該資源的線程,解決1中沒有讓權等待的問題

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

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

    34又屬於信號量集機制。

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;

 }}

CallableRunnable有幾點不同:

Callable規定的方法是call(),而Runnable規定的方法是run(). 

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

call()方法可拋出異常,而run()方法是不能拋出異常的。 

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

    

6. 用戶態和核心態的區別。

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

用戶態切換到內核態的3種方式:系統調用、異常、外圍設備中斷。

 

7. 用戶棧和內核棧的區別。

內核棧和用戶棧區別:

intelcpu分爲四個運行級別ring0~ring3,內核創建進程,創建進程的同時創建進程控制塊,創建進程自己的堆棧。一個進程有兩個堆棧,用戶棧和系統棧。用戶堆棧的空間指向用戶地址空間,內核堆棧的空間指向內核地址空間。

有個CPU堆棧指針寄存器,進程運行的狀態有用戶態和內核態,當進程運行在用戶態時。CPU堆棧指針寄存器指向的是用戶堆棧地址,使用的是用戶堆棧;當進程運行在內核態時,CPU堆棧指針寄存器指向的是內核堆棧地址,使用的是內核堆棧。

堆棧切換

當系統因爲系統調用(軟中斷)或硬件中斷,CPU切換到特權工作模式,進程陷入內核態,進程使用的棧也要從用戶棧轉向系統棧。

從用戶態到內核態要兩步驟,首先是將用戶堆棧地址保存到內核堆棧中,然後將CPU堆棧指針寄存器指向內核堆棧。

當由內核態轉向用戶態,步驟首先是將內核堆棧中得用戶堆棧地址恢復到CPU堆棧指針寄存器中。

內核棧和用戶棧區別

1.棧是系統運行在內核態的時候使用的棧,用戶棧是系統運行在用戶態時候使用的棧。

當進程由於中斷進入內核態時,系統會把一些用戶態的數據信息保存到內核棧中,當返回到用戶態時,取出內核棧中得信息恢復出來,返回到程序原來執行的地方。用戶棧就是進程在用戶空間時創建的棧,比如一般的函數調用,將會用到用戶棧。

2.內核棧是屬於操作系統空間的一塊固定區域,可以用於保存中斷現場、保存操作系統子程序間相互調用的參數、返回值等。用戶棧是屬於用戶進程空間的一塊區域,用戶保存用戶進程子程序間的相互調用的參數、返回值等。

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

爲何要設置兩個不同的棧?

共享原因:內核的代碼和數據是爲所有的進程共享的,如果不爲每一個進程設置對應的內核棧,那麼就不能實現不同的進程執行不同的代碼。

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

 

8. 內存池、進程池、線程池(c++程序員必須掌握)

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

應用程序自定義的內存池根據不同的適用場景又有不同的類型。

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

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

 

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

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

    主要原因(1) 因爲系統資源不足。(2) 進程運行推進的順序不合適。(3) 資源分配不當等。

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

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

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

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

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

4) 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關係。

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

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

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

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

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

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

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

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

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

13. 進程調度算法。(週轉時間 =  程序結束時間 -- 開始服務時間、帶權週轉時間=  週轉時間 /  要求服務時間)

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

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

最高優先級優先(Highest Priority FirstHPF)調度算法的核心是確定進程的優先級。首先,系統或用戶按某種原則爲進程指定一個優先級來表示該進程所享有的調度優先權。確定優先級的方法較多,一般可分爲兩類,即靜態法和動態法。靜態法根據進程的靜態特性,在進程開始執行之前就確定它們的優先級,一旦開始執行之後就不能改變。動態法則不然,它把進程的靜態特性和動態特性結合起來確定進程的優先級,隨着進程的執行過程,其優先級不斷變化。   

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

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

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

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

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

• (2)根據就緒進程等待CPU的時間長短來決定。一個就緒進程在就緒隊列中等待的時間越長,則它獲得調度選中的優先級就越高。

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

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

 時間片輪轉(Round RobinRR)的基本思路是讓每個進程在就緒隊列中的等待時間與享受服務的時間成比例。在時間片輪轉法中,需要將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時間和外存空間換取昂貴內存空間的操作系統中的資源轉換技術 

基本思想:程序,數據,堆棧的大小可以超過內存的大小,操作系統把程序當前使用的部分保留在內存,而把其他部分保存在磁盤上,並在需要時在內存和磁盤之間動態交換,虛擬存儲器支持多道程序設計技術 

目的:提高內存利用率 

管理方式 

請求式分頁存儲管理 

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

請求式分段存儲管理 

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

 

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

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

1、頁是信息的物理單位,分頁是爲實現離散分配方式,以消減內存的外零頭,提高內存的利用率;或者說,分頁僅僅是由於系統管理的需要,而不是用戶的需要。

段是信息的邏輯單位,它含有一組其意義相對完整的信息。分段的目的是爲了能更好的滿足用戶的需要。

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

段的長度卻不固定,決定於用戶所編寫的程序,通常由編輯程序在對源程序進行編輯時,根據信息的性質來劃分。

 

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

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

20. 幾種頁面置換算法,會算所需換頁數(LRU用程序如何實現?)

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

1)最佳置換算法(OPT)(理想置換算法)

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

2)先進先出置換算法(FIFO

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

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

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

3)最近最久未使用(LRU)算法

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

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

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

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

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

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

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

4Clock置換算法(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. 外存分配的幾種方式,及各種優劣。

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

鏈接分配:離散分配方式。優缺點:消除了碎片,有利於文件的增//改。隱式鏈接

在文件的每個目錄項中,都含有指向鏈接文件第一盤塊和最後一個盤塊的指針,只適合於順序訪;顯式鏈接,把用於鏈接文件各物理塊的指針,顯式地存放在內存的一張鏈接表中。

索引分配:單級索引分配每個文件一個索引塊(表);多級索引分配當文件較大,需要很多個索引塊時,可以爲各索引塊建立一個索引表(塊);混合索引分配方式。


2
0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章