操做系統知識總結

操做系統知識總結java

http://blog.csdn.net/houzuoxin/article/details/38957969c++

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

狀態:算法

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

2)運行狀態   佔用處理機資源運行,處於此狀態的進程的數目小於等於CPU的數目。   網絡

3)阻塞狀態  因爲進程等待某種條件(如I/O操做或進程同步),在條件知足以前沒法繼續執行。該事件發生前即便把處理機分配給該進程,也沒法運行。多線程

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

當進程調度程序從就緒隊列中選取一個進程投入運行時引發轉換1;異步

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

正在執行的進程因等待的事件還沒有發生而沒法執行(如進程請求完成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(),也叫作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. 死鎖的概念,致使死鎖的緣由.

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

    主要緣由(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. 基本分段、請求分段儲存管理方式。

分頁式存儲管理的基本原理:採用分頁存儲器容許把一個做業存放到若干不相鄰的分區中,既可免去移動信息的工做,又可儘可能減小主存的碎片。分頁式存儲管理的基本原理以下: 

一、 頁框:物理地址分紅大小相等的許多區,每一個區稱爲一塊; 

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

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

頁號 單元號(頁內地址) 

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

四、頁表和地址轉換:如何保證程序正確執行呢?採用的辦法是動態重定位技術,讓程序的指令執行時做地址變換,因爲程序段以頁爲單位,因此,咱們給每一個頁設立一個重定位寄存器,這些重定位寄存器的集合便稱頁表。頁表是操做系統爲每一個用戶做業創建的,用來記錄程序頁面和主存對應頁框的對照表,頁表中的每一欄指明瞭程序中的一個頁面和分得的頁框的對應關係。絕對地址=塊號*塊長+單元號 

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

數據塊虛擬存儲方案着重解決數據傳輸過程當中的衝突和延時問題.在多交換機組成的大型Fabric結構的SAN中,因爲多臺主機經過多個交換機端口訪問存儲設備,延時和數據塊衝突問題很是嚴重.數據塊虛擬存儲方案利用虛擬的多端口並行技術,爲多臺客戶機提供了極高的帶寬,最大限度上減小了延時與衝突的發生,在實際應用中,數據塊虛擬存儲方案以對稱式拓撲結構爲表現形式. 

虛擬文件系統存儲方案着重解決大規模網絡中文件共享的安全機制問題.經過對不一樣的站點指定不一樣的訪問權限,保證網絡文件的安全.在實際應用中,虛擬文件系統存儲方案以非對稱式拓撲結構爲表現形式. 

虛擬存儲技術,其實是虛擬存儲技術的一個方面,特指以CPU時間和外存空間換取昂貴內存空間的操做系統中的資源轉換技術 

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

目的:提升內存利用率 

管理方式 

A 請求式分頁存儲管理 

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

B 請求式分段存儲管理 

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

 

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

頁和分段系統有許多類似之處,但在概念上二者徹底不一樣,主要表如今:

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

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

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

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

 

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

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

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

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

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

這是一種理想狀況下的頁面置換算法,但其實是不可能實現的。該算法的基本思想是:發生缺頁時,有些頁面在內存中,其中有一頁將很快被訪問(也包含緊接着的下一條指令的那頁),而其餘頁面則可能要到十、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. 外存分配的幾種方式,及各類優劣。

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

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

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

索引分配:單級索引分配每一個文件一個索引塊(表);多級索引分配當文件較大,須要不少個索引塊時,能夠爲各索引塊創建一個索引表(塊);混合索引分配方式。

相關文章
相關標籤/搜索