六月丁香五月婷婷,丁香五月婷婷网,欧美激情网站,日本护士xxxx,禁止18岁天天操夜夜操,18岁禁止1000免费,国产福利无码一区色费

學(xué)習(xí)啦>學(xué)習(xí)電腦>操作系統(tǒng)>操作系統(tǒng)基礎(chǔ)知識(shí)>

操作系統(tǒng)面試總結(jié)

時(shí)間: 佳洲1085 分享

  畢業(yè)季將臨近,許多同學(xué)開(kāi)始面試找工作,那么面試操作系統(tǒng)相關(guān)的時(shí)候會(huì)問(wèn)到什么問(wèn)題呢?下面由學(xué)習(xí)啦小編為大家整理了操作系統(tǒng)面試總結(jié),希望對(duì)大家有所幫助!

  操作系統(tǒng)面試總結(jié)一

  1. 進(jìn)程的有哪幾種狀態(tài),狀態(tài)轉(zhuǎn)換圖,及導(dǎo)致轉(zhuǎn)換的事件。

  狀態(tài):

  1)就緒狀態(tài)  進(jìn)程已獲得除處理機(jī)外的所需資源,等待分配處理機(jī)資源,只要分配到CPU就可執(zhí)行。在某一時(shí)刻,可能有若干個(gè)進(jìn)程處于該狀態(tài)。

  2)運(yùn)行狀態(tài) 占用處理機(jī)資源運(yùn)行,處于此狀態(tài)的進(jìn)程的數(shù)目小于等于CPU的數(shù)目。

  3)阻塞狀態(tài)  由于進(jìn)程等待某種條件(如I/O操作或進(jìn)程同步),在條件滿足之前無(wú)法繼續(xù)執(zhí)行。該事件發(fā)生前即使把處理機(jī)分配給該進(jìn)程,也無(wú)法運(yùn)行。

  轉(zhuǎn)換解釋?zhuān)簭臓顟B(tài)轉(zhuǎn)換圖中,存在四種狀態(tài)轉(zhuǎn)換。

  當(dāng)進(jìn)程調(diào)度程序從就緒隊(duì)列中選取一個(gè)進(jìn)程投入運(yùn)行時(shí)引起轉(zhuǎn)換1;

  正在執(zhí)行的進(jìn)程如因時(shí)間片用完而被暫停執(zhí)行就會(huì)引起轉(zhuǎn)換2;

  正在執(zhí)行的進(jìn)程因等待的事件尚未發(fā)生而無(wú)法執(zhí)行(如進(jìn)程請(qǐng)求完成I/O)會(huì)引去轉(zhuǎn)換3;

  當(dāng)進(jìn)程等待的事件發(fā)生時(shí)(如I/O完成)則會(huì)引起轉(zhuǎn)換4。

  事件:就緒隊(duì)列非空,則一個(gè)進(jìn)程的轉(zhuǎn)換3會(huì)立即引去另一個(gè)進(jìn)程的轉(zhuǎn)換1。這是因?yàn)橐粋€(gè)進(jìn)程發(fā)生轉(zhuǎn)換3意味著正在執(zhí)行的進(jìn)程由執(zhí)行狀態(tài)變?yōu)樽枞麪顟B(tài),這時(shí)處理機(jī)空閑,進(jìn)程調(diào)度程序必然會(huì)從就緒隊(duì)列中選取一個(gè)進(jìn)程并將它投入運(yùn)行,因此只要就緒隊(duì)列非空,一個(gè)進(jìn)程的轉(zhuǎn)換3能立即引起一個(gè)進(jìn)程的轉(zhuǎn)換1。

  2. 進(jìn)程與線程的區(qū)別。dll是否有獨(dú)立的堆棧?

  進(jìn)程是具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位.

  線程是進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位.線程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),但是它可與同屬一個(gè)進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源.

  一個(gè)線程可以創(chuàng)建和撤銷(xiāo)另一個(gè)線程;同一個(gè)進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行

  進(jìn)程是死的,只是一些資源的集合,真正的程序執(zhí)行都是線程來(lái)完成的,程序啟動(dòng)的時(shí)候操作系統(tǒng)就幫你創(chuàng)建了一個(gè)主線程。每個(gè)線程有自己的堆棧。 DLL(動(dòng)態(tài)連接庫(kù))中有沒(méi)有獨(dú)立的堆棧,這個(gè)問(wèn)題不好回答,或者說(shuō)這個(gè)問(wèn)題本身是否有問(wèn)題。因?yàn)镈LL中的代碼是被某些線程所執(zhí)行,只有線程擁有堆棧,如果DLL中的代碼是EXE中的線程所調(diào)用,那么這個(gè)時(shí)候是不是說(shuō)這個(gè)DLL沒(méi)有自己獨(dú)立的堆棧?如果DLL中的代碼是由DLL自己創(chuàng)建的線程所執(zhí)行,那么是不是說(shuō)DLL有獨(dú)立的堆棧?以上講的是堆棧,如果對(duì)于堆來(lái)說(shuō),每個(gè)DLL有自己的堆,所以如果是從DLL中動(dòng)態(tài)分配的內(nèi)存,最好是從DLL中刪除,如果你從DLL中分配內(nèi)存,然后在EXE中,或者另外一個(gè)DLL中刪除,很有可能導(dǎo)致程序崩潰。

  另進(jìn)程和程序的區(qū)別:進(jìn)程即運(yùn)行中的程序,從中即可知,進(jìn)程是在運(yùn)行的,程序是非運(yùn)行的,當(dāng)然本質(zhì)區(qū)別就是動(dòng)態(tài)和靜態(tài)的區(qū)別。程序可以存在外存中,也可以存在內(nèi)存中

  3. 進(jìn)程通信的幾種方式。

  管道( pipe ):管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動(dòng),而且只能在具有親緣關(guān)系的進(jìn)程間使用。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系。

  有名管道 (named pipe) : 有名管道也是半雙工的通信方式,但是它允許無(wú)親緣關(guān)系進(jìn)程間的通信。

  信號(hào)量( semophore ) : 信號(hào)量是一個(gè)計(jì)數(shù)器,可以用來(lái)控制多個(gè)進(jìn)程對(duì)共享資源的訪問(wèn)。它常作為一種鎖機(jī)制,防止某進(jìn)程正在訪問(wèn)共享資源時(shí),其他進(jìn)程也訪問(wèn)該資源。因此,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段。

  消息隊(duì)列( message queue ) : 消息隊(duì)列是由消息的鏈表,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí)。消息隊(duì)列克服了信號(hào)傳遞信息少、管道只能承載無(wú)格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。

  信號(hào) ( signal ) : 信號(hào)是一種比較復(fù)雜的通信方式,用于通知接收進(jìn)程某個(gè)事件已經(jīng)發(fā)生。

  共享內(nèi)存( shared memory ) :共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問(wèn)的內(nèi)存,這段共享內(nèi)存由一個(gè)進(jìn)程創(chuàng)建,但多個(gè)進(jìn)程都可以訪問(wèn)。共享內(nèi)存是最快的 IPC 方式,它是針對(duì)其他進(jìn)程間通信方式運(yùn)行效率低而專(zhuān)門(mén)設(shè)計(jì)的。它往往與其他通信機(jī)制,如信號(hào)量,配合使用,來(lái)實(shí)現(xiàn)進(jìn)程間的同步和通信。

  套接字( socket ) : 套解字也是一種進(jìn)程間通信機(jī)制,與其他通信機(jī)制不同的是,它可用于不同及其間的進(jìn)程通信。

  4. 線程同步幾種方式。(一定要會(huì)寫(xiě)生產(chǎn)者、消費(fèi)者問(wèn)題,完全消化理解)

  臨界區(qū)(CCriticalSection):通過(guò)對(duì)多線程的串行化來(lái)訪問(wèn)公共資源或一段代碼,速度快,適合控制數(shù)據(jù)訪問(wèn)。

  事件(CEvent):為協(xié)調(diào)共同對(duì)一個(gè)共享資源的單獨(dú)訪問(wèn)而設(shè)計(jì)的。

  互斥量(CMutex):為控制一個(gè)具有有限數(shù)量用戶(hù)資源而設(shè)計(jì)。

  信號(hào)量(CSemaphore):用來(lái)通知線程有一些事件已發(fā)生,從而啟動(dòng)后繼任務(wù)的開(kāi)始。

  生產(chǎn)者、消費(fèi)者問(wèn)題

  Var mutex,empty,full:semaphore:=1,n,0; // 定義三個(gè)信號(hào)量

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

  in,out:integer:=0,0;

  begin

  parbegin

  proceducer:begin // 生產(chǎn)者

  repeat

  producer an item nextp; // 生產(chǎn)一個(gè)產(chǎn)品 .

  wait(empty); // 申請(qǐng)一個(gè)空緩沖區(qū)

  wait(mutex); // 申請(qǐng)緩沖池的使用權(quán)

  buffer(in):=nextp; // 將產(chǎn)品放入緩沖池中

  in:=(in+1)mod n; // 下一個(gè)空緩沖區(qū)地址

  signal(mutex); //釋放緩沖池使用權(quán)

  signal(full); // 釋放一個(gè)滿緩沖區(qū)

  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 應(yīng)該是next proceducer的意思吧

  nextc 應(yīng)該是next consumer

  貌似也不是什么變量,屬于語(yǔ)言描述而已

  下面的消費(fèi)者也是差不多的。

  至于生產(chǎn)者進(jìn)程如何被阻塞和喚醒,因?yàn)槌绦蛑杏幸粋€(gè) repeat語(yǔ)句,所以進(jìn)程不斷測(cè)試緩沖池是否有空緩沖區(qū),以及緩沖池是否有其他進(jìn)程使用。若兩個(gè)條件不滿足,則進(jìn)入阻塞隊(duì)列等待。若某一時(shí)刻兩個(gè)條件都能滿足,則能喚醒該進(jìn)程。

  信號(hào)量:

  只支持兩種操作,wait()和signal(),也叫做P、V操作,這兩個(gè)操作是

  原子操作,不會(huì)被打斷。信號(hào)量機(jī)制有以下幾種:

  1.整型信號(hào)量--------------------一個(gè)整數(shù),只能由PV操作對(duì)其加減

  2.記錄型信號(hào)量------------------在1的基礎(chǔ)上種了一個(gè)鏈表,記錄請(qǐng)求該資源的線程,解決1中沒(méi)有讓權(quán)等待的問(wèn)題

  3.AND信號(hào)量---------------------1和2只是對(duì)一個(gè)資源,而這個(gè)機(jī)制能解決一次請(qǐng)求多個(gè)資源的情況

  4.一般信號(hào)量--------------------這是最一般的信號(hào)量機(jī)制,能夠表示以上幾種,表示方法也比較特殊,見(jiàn)操作系統(tǒng)

  3和4又屬于信號(hào)量集機(jī)制。

  5. 線程的實(shí)現(xiàn)方式. (也就是用戶(hù)線程與內(nèi)核線程的區(qū)別)

  用戶(hù)線程與內(nèi)核線程的區(qū)別

  根據(jù)操作系統(tǒng)內(nèi)核是否對(duì)線程可感知,可以把線程分為內(nèi)核線程和用戶(hù)線程。

  內(nèi)核線程建立和銷(xiāo)毀都是由操作系統(tǒng)負(fù)責(zé)、通過(guò)系統(tǒng)調(diào)用完成的,操作系統(tǒng)在調(diào)度時(shí),參考各進(jìn)程內(nèi)的線程運(yùn)行情況做出調(diào)度決定,如果一個(gè)進(jìn)程中沒(méi)有就緒態(tài)的線程,那么這個(gè)進(jìn)程也不會(huì)被調(diào)度占用CPU。

  和內(nèi)核線程相對(duì)應(yīng)的是用戶(hù)線程,用戶(hù)線程指不需要內(nèi)核支持而在用戶(hù)程序中實(shí)現(xiàn)的線程,其不依賴(lài)于操作系統(tǒng)核心,用戶(hù)進(jìn)程利用線程庫(kù)提供創(chuàng)建、同步、調(diào)度和管理線程的函數(shù)來(lái)控制用戶(hù)線程。用戶(hù)線程多見(jiàn)于一些歷史悠久的操作系統(tǒng),例如Unix操作系統(tǒng),不需要用戶(hù)態(tài)/核心態(tài)切換,速度快,操作系統(tǒng)內(nèi)核不知道多線程的存在,因此一個(gè)線程阻塞將使得整個(gè)進(jìn)程(包括它的所有線程)阻塞。由于這里的處理器時(shí)間片分配是以進(jìn)程為基本單位,所以每個(gè)線程執(zhí)行的時(shí)間相對(duì)減少為了在操作系統(tǒng)中加入線程支持,采用了在用戶(hù)空間增加運(yùn)行庫(kù)來(lái)實(shí)現(xiàn)線程,這些運(yùn)行庫(kù)被稱(chēng)為“線程包”,用戶(hù)線程是不能被操作系統(tǒng)所感知的。

  引入用戶(hù)線程,具體而言,有以下四個(gè)方面的優(yōu)勢(shì):

  (1)可以在不支持線程的操作系統(tǒng)中實(shí)現(xiàn)。

  (2)創(chuàng)建和銷(xiāo)毀線程、線程切換代價(jià)等線程管理的代價(jià)比內(nèi)核線程少得多。

  (3)允許每個(gè)進(jìn)程定制自己的調(diào)度算法,線程管理比較靈活。

  (4)線程能夠利用的表空間和堆??臻g比內(nèi)核級(jí)線程多。

  用戶(hù)線程的缺點(diǎn)主要有以下兩點(diǎn):

  (1)同一進(jìn)程中只能同時(shí)有一個(gè)線程在運(yùn)行,如果有一個(gè)線程使用了系統(tǒng)調(diào)用而阻塞,那么整個(gè)進(jìn)程都會(huì)被掛起。

  (2)頁(yè)面失效也會(huì)產(chǎn)生類(lèi)似的問(wèn)題。

  內(nèi)核線程的優(yōu)缺點(diǎn)剛好跟用戶(hù)線程相反。實(shí)際上,操作系統(tǒng)可以使用混合的方式來(lái)實(shí)現(xiàn)線程。

  Java實(shí)現(xiàn)線程的方式有三種:

  (1)繼承Thread類(lèi),重寫(xiě)run函數(shù)

  創(chuàng)建:

  class xx extends Thread{

  public void run(){

  Thread.sleep(1000) //線程休眠1000毫秒,sleep使線程進(jìn)入Block狀態(tài),并釋放資源

  }}

  開(kāi)啟線程:

  對(duì)象.start() //啟動(dòng)線程,run函數(shù)運(yùn)行

  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)實(shí)現(xiàn)Runnable接口,重寫(xiě)run函數(shù)

  開(kāi)啟線程:

  Thread t = new Thread(對(duì)象) //創(chuàng)建線程對(duì)象

  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)實(shí)現(xiàn)Callable接口,重寫(xiě)call函數(shù)

  Callable是類(lèi)似于Runnable的接口,實(shí)現(xiàn)Callable接口的類(lèi)和實(shí)現(xiàn)Runnable的類(lèi)都是可被其它線程執(zhí)行的任務(wù)。

  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有幾點(diǎn)不同:

 ?、貱allable規(guī)定的方法是call(),而Runnable規(guī)定的方法是run().

  ②Callable的任務(wù)執(zhí)行后可返回值,而Runnable的任務(wù)是不能返回值的

 ?、踓all()方法可拋出異常,而run()方法是不能拋出異常的。

  ④運(yùn)行Callable任務(wù)可拿到一個(gè)Future對(duì)象,F(xiàn)uture表示異步計(jì)算的結(jié)果。它提供了檢查計(jì)算是否完成的方法,以等待計(jì)算的完成,并檢索計(jì)算的結(jié)果.通過(guò)Future對(duì)象可了解任務(wù)執(zhí)行情況,可取消任務(wù)的執(zhí)行,還可獲取任務(wù)執(zhí)行的結(jié)果

  6. 用戶(hù)態(tài)和核心態(tài)的區(qū)別。

  當(dāng)一個(gè)任務(wù)(進(jìn)程)執(zhí)行系統(tǒng)調(diào)用而陷入內(nèi)核代碼中執(zhí)行時(shí),我們就稱(chēng)進(jìn)程處于內(nèi)核運(yùn)行態(tài)(或簡(jiǎn)稱(chēng)為內(nèi)核態(tài))。此時(shí)處理器處于特權(quán)級(jí)最高的(0級(jí))內(nèi)核代碼中執(zhí)行。當(dāng)進(jìn)程處于內(nèi)核態(tài)時(shí),執(zhí)行的內(nèi)核代碼會(huì)使用當(dāng)前進(jìn)程的內(nèi)核棧。每個(gè)進(jìn)程都有自己的內(nèi)核棧。當(dāng)進(jìn)程在執(zhí)行用戶(hù)自己的代碼時(shí),則稱(chēng)其處于用戶(hù)運(yùn)行態(tài)(用戶(hù)態(tài))。即此時(shí)處理器在特權(quán)級(jí)最低的(3級(jí))用戶(hù)代碼中運(yùn)行。當(dāng)正在執(zhí)行用戶(hù)程序而突然被中斷程序中斷時(shí),此時(shí)用戶(hù)程序也可以象征性地稱(chēng)為處于進(jìn)程的內(nèi)核態(tài)。因?yàn)橹袛嗵幚沓绦驅(qū)⑹褂卯?dāng)前進(jìn)程的內(nèi)核棧。這與處于內(nèi)核態(tài)的進(jìn)程的狀態(tài)有些類(lèi)似。

  用戶(hù)態(tài)切換到內(nèi)核態(tài)的3種方式:系統(tǒng)調(diào)用、異常、外圍設(shè)備中斷。

  7. 用戶(hù)棧和內(nèi)核棧的區(qū)別。

  內(nèi)核棧和用戶(hù)棧區(qū)別:

  intel的cpu分為四個(gè)運(yùn)行級(jí)別ring0~ring3,內(nèi)核創(chuàng)建進(jìn)程,創(chuàng)建進(jìn)程的同時(shí)創(chuàng)建進(jìn)程控制塊,創(chuàng)建進(jìn)程自己的堆棧。一個(gè)進(jìn)程有兩個(gè)堆棧,用戶(hù)棧和系統(tǒng)棧。用戶(hù)堆棧的空間指向用戶(hù)地址空間,內(nèi)核堆棧的空間指向內(nèi)核地址空間。

  有個(gè)CPU堆棧指針寄存器,進(jìn)程運(yùn)行的狀態(tài)有用戶(hù)態(tài)和內(nèi)核態(tài),當(dāng)進(jìn)程運(yùn)行在用戶(hù)態(tài)時(shí)。CPU堆棧指針寄存器指向的是用戶(hù)堆棧地址,使用的是用戶(hù)堆棧;當(dāng)進(jìn)程運(yùn)行在內(nèi)核態(tài)時(shí),CPU堆棧指針寄存器指向的是內(nèi)核堆棧地址,使用的是內(nèi)核堆棧。

  堆棧切換

  當(dāng)系統(tǒng)因?yàn)橄到y(tǒng)調(diào)用(軟中斷)或硬件中斷,CPU切換到特權(quán)工作模式,進(jìn)程陷入內(nèi)核態(tài),進(jìn)程使用的棧也要從用戶(hù)棧轉(zhuǎn)向系統(tǒng)棧。

  從用戶(hù)態(tài)到內(nèi)核態(tài)要兩步驟,首先是將用戶(hù)堆棧地址保存到內(nèi)核堆棧中,然后將CPU堆棧指針寄存器指向內(nèi)核堆棧。

  當(dāng)由內(nèi)核態(tài)轉(zhuǎn)向用戶(hù)態(tài),步驟首先是將內(nèi)核堆棧中得用戶(hù)堆棧地址恢復(fù)到CPU堆棧指針寄存器中。

  內(nèi)核棧和用戶(hù)棧區(qū)別

  1.棧是系統(tǒng)運(yùn)行在內(nèi)核態(tài)的時(shí)候使用的棧,用戶(hù)棧是系統(tǒng)運(yùn)行在用戶(hù)態(tài)時(shí)候使用的棧。

  當(dāng)進(jìn)程由于中斷進(jìn)入內(nèi)核態(tài)時(shí),系統(tǒng)會(huì)把一些用戶(hù)態(tài)的數(shù)據(jù)信息保存到內(nèi)核棧中,當(dāng)返回到用戶(hù)態(tài)時(shí),取出內(nèi)核棧中得信息恢復(fù)出來(lái),返回到程序原來(lái)執(zhí)行的地方。用戶(hù)棧就是進(jìn)程在用戶(hù)空間時(shí)創(chuàng)建的棧,比如一般的函數(shù)調(diào)用,將會(huì)用到用戶(hù)棧。

  2.內(nèi)核棧是屬于操作系統(tǒng)空間的一塊固定區(qū)域,可以用于保存中斷現(xiàn)場(chǎng)、保存操作系統(tǒng)子程序間相互調(diào)用的參數(shù)、返回值等。用戶(hù)棧是屬于用戶(hù)進(jìn)程空間的一塊區(qū)域,用戶(hù)保存用戶(hù)進(jìn)程子程序間的相互調(diào)用的參數(shù)、返回值等。

  3.每個(gè)Windows 都有4g的進(jìn)程空間,系統(tǒng)棧使用進(jìn)程空間的地段部分,用戶(hù)棧是高端部分如果用戶(hù)要直接訪問(wèn)系統(tǒng)棧部分,需要有特殊的方式。

  為何要設(shè)置兩個(gè)不同的棧?

  共享原因:內(nèi)核的代碼和數(shù)據(jù)是為所有的進(jìn)程共享的,如果不為每一個(gè)進(jìn)程設(shè)置對(duì)應(yīng)的內(nèi)核棧,那么就不能實(shí)現(xiàn)不同的進(jìn)程執(zhí)行不同的代碼。

  安全原因:如果只有一個(gè)棧,那么用戶(hù)就可以修改棧內(nèi)容來(lái)突破內(nèi)核安全保護(hù)。

  8. 內(nèi)存池、進(jìn)程池、線程池。(c++程序員必須掌握)

  自定義內(nèi)存池的思想通過(guò)這個(gè)"池"字表露無(wú)疑,應(yīng)用程序可以通過(guò)系統(tǒng)的內(nèi)存分配調(diào)用預(yù)先一次性申請(qǐng)適當(dāng)大小的內(nèi)存作為一個(gè)內(nèi)存池,之后應(yīng)用程序自己對(duì)內(nèi)存的分配和釋放則可以通過(guò)這個(gè)內(nèi)存池來(lái)完成。只有當(dāng)內(nèi)存池大小需要?jiǎng)討B(tài)擴(kuò)展時(shí),才需要再調(diào)用系統(tǒng)的內(nèi)存分配函數(shù),其他時(shí)間對(duì)內(nèi)存的一切操作都在應(yīng)用程序的掌控之中。

  應(yīng)用程序自定義的內(nèi)存池根據(jù)不同的適用場(chǎng)景又有不同的類(lèi)型。

  從線程安全的角度來(lái)分,內(nèi)存池可以分為單線程內(nèi)存池和多線程內(nèi)存池。單線程內(nèi)存池整個(gè)生命周期只被一個(gè)線程使用,因而不需要考慮互斥訪問(wèn)的問(wèn)題;多線程內(nèi)存池有可能被多個(gè)線程共享,因此則需要在每次分配和釋放內(nèi)存時(shí)加鎖。相對(duì)而言,單線程內(nèi)存池性能更高,而多線程內(nèi)存池適用范圍更廣。

  從內(nèi)存池可分配內(nèi)存單元大小來(lái)分,可以分為固定內(nèi)存池和可變內(nèi)存池。所謂固定內(nèi)存池是指應(yīng)用程序每次從內(nèi)存池中分配出來(lái)的內(nèi)存單元大小事先已經(jīng)確定,是固定不變的;而可變內(nèi)存池則每次分配的內(nèi)存單元大小可以按需變化,應(yīng)用范圍更廣,而性能比固定內(nèi)存池要低。

  9. 死鎖的概念,導(dǎo)致死鎖的原因.

  死鎖: 是指兩個(gè)或兩個(gè)以上的進(jìn)程在執(zhí)行過(guò)程中,因爭(zhēng)奪資源而造成的一種互相等待的現(xiàn)象,若無(wú)外力作用,它們都將無(wú)法推進(jìn)下去.此時(shí)稱(chēng)系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在互相等待的進(jìn)程稱(chēng)為死鎖進(jìn)程.

  主要原因(1) 因?yàn)橄到y(tǒng)資源不足。(2) 進(jìn)程運(yùn)行推進(jìn)的順序不合適。(3) 資源分配不當(dāng)?shù)取?/p>

  10. 導(dǎo)致死鎖的四個(gè)必要條件。

  產(chǎn)生死鎖的四個(gè)必要條件:

  (1) 互斥條件:一個(gè)資源每次只能被一個(gè)進(jìn)程使用。

  (2) 請(qǐng)求與保持條件:一個(gè)進(jìn)程因請(qǐng)求資源而阻塞時(shí),對(duì)已獲得的資源保持不放。

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

  (4) 循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。

  這四個(gè)條件是死鎖的必要條件,只要系統(tǒng)發(fā)生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會(huì)發(fā)生死鎖。

  操作系統(tǒng)面試總結(jié)二

  11. 處理死鎖的四個(gè)方式。

  1)忽略該問(wèn)題。例如鴕鳥(niǎo)算法,該算法可以應(yīng)用在極少發(fā)生死鎖的的情況下。為什么叫鴕鳥(niǎo)算法呢,(鴕鳥(niǎo)策略)

  2)檢測(cè)死鎖并且恢復(fù)。(檢測(cè)與解除策略)

  3)仔細(xì)地對(duì)資源進(jìn)行動(dòng)態(tài)分配,以避免死鎖。(避免策略)

  4)通過(guò)破除死鎖四個(gè)必要條件之一,來(lái)防止死鎖產(chǎn)生。(預(yù)防策略)

  12. 預(yù)防死鎖的方法、避免死鎖的方法。

  通過(guò)破除死鎖四個(gè)必要條件之一,來(lái)預(yù)防死鎖產(chǎn)生,有兩種方法,一種是當(dāng)其申請(qǐng)的資源得不到滿足時(shí),也必須放棄其原先占有的資源;另一種方法是只適用于申請(qǐng)資源的進(jìn)程優(yōu)先級(jí)比占有該資源的進(jìn)程優(yōu)先級(jí)高時(shí),如果一個(gè)進(jìn)程申請(qǐng)的資源被其它進(jìn)程占用,而申請(qǐng)進(jìn)程的優(yōu)先級(jí)較高,那么它可以強(qiáng)迫占有資源的進(jìn)程放棄。

  仔細(xì)地對(duì)資源進(jìn)行動(dòng)態(tài)分配,以避免死鎖。

  13. 進(jìn)程調(diào)度算法。(周轉(zhuǎn)時(shí)間 = 程序結(jié)束時(shí)間 -- 開(kāi)始服務(wù)時(shí)間、帶權(quán)周轉(zhuǎn)時(shí)間= 周轉(zhuǎn)時(shí)間 / 要求服務(wù)時(shí)間)

  先來(lái)先服務(wù)(First Come First Service,F(xiàn)CFS)調(diào)度算法按照進(jìn)程進(jìn)入就緒隊(duì)列的先后順序選擇可以占用處理器的進(jìn)程。這是一種不可搶占方式的調(diào)度算法,優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單,缺點(diǎn)是后來(lái)的進(jìn)程等待CPU的時(shí)間較長(zhǎng)。它現(xiàn)今主要用作輔助調(diào)度法;例如結(jié)合在優(yōu)先級(jí)調(diào)度算法中使用,當(dāng)有兩個(gè)最高優(yōu)先級(jí)的進(jìn)程時(shí),則誰(shuí)先來(lái),誰(shuí)就先被調(diào)度。

  短執(zhí)行進(jìn)程優(yōu)先算法(Shortest Process First,SPF)就是從就緒隊(duì)列中選擇一個(gè)CPU執(zhí)行時(shí)間預(yù)期最短的進(jìn)程,將處理器分配給它。雖然較公平,但實(shí)現(xiàn)難度較大,因?yàn)橐獪?zhǔn)確預(yù)定下一個(gè)進(jìn)程的CPU執(zhí)行周期是很困難的。

  •最高優(yōu)先級(jí)優(yōu)先(Highest Priority First,HPF)調(diào)度算法的核心是確定進(jìn)程的優(yōu)先級(jí)。首先,系統(tǒng)或用戶(hù)按某種原則為進(jìn)程指定一個(gè)優(yōu)先級(jí)來(lái)表示該進(jìn)程所享有的調(diào)度優(yōu)先權(quán)。確定優(yōu)先級(jí)的方法較多,一般可分為兩類(lèi),即靜態(tài)法和動(dòng)態(tài)法。靜態(tài)法根據(jù)進(jìn)程的靜態(tài)特性,在進(jìn)程開(kāi)始執(zhí)行之前就確定它們的優(yōu)先級(jí),一旦開(kāi)始執(zhí)行之后就不能改變。動(dòng)態(tài)法則不然,它把進(jìn)程的靜態(tài)特性和動(dòng)態(tài)特性結(jié)合起來(lái)確定進(jìn)程的優(yōu)先級(jí),隨著進(jìn)程的執(zhí)行過(guò)程,其優(yōu)先級(jí)不斷變化。

  •進(jìn)程的靜態(tài)優(yōu)先級(jí)確定最基本的方法是按照進(jìn)程的類(lèi)型給予不同的優(yōu)先級(jí)。例如,在有些系統(tǒng)中,進(jìn)程被劃分為系統(tǒng)進(jìn)程和用戶(hù)進(jìn)程。系統(tǒng)進(jìn)程享有比用戶(hù)進(jìn)程高的優(yōu)先級(jí);對(duì)于用戶(hù)進(jìn)程來(lái)說(shuō),則可以分為:I/O繁忙的進(jìn)程、CPU繁忙的進(jìn)程、I/O與CPU均衡的進(jìn)程和其他進(jìn)程等。

  •對(duì)系統(tǒng)進(jìn)程,也可以根據(jù)其所要完成的功能劃分為不同的類(lèi)型。例如,調(diào)度進(jìn)程、I/O進(jìn)程、中斷處理進(jìn)程、存儲(chǔ)管理進(jìn)程等。這些進(jìn)程還可進(jìn)一步劃分為不同類(lèi)型并賦予不同的優(yōu)先級(jí)。例如,在操作系統(tǒng)中,對(duì)于鍵盤(pán)中斷的處理優(yōu)先級(jí)和對(duì)于電源掉電中斷的處理優(yōu)先級(jí)是不相同的。

  •基于靜態(tài)優(yōu)先級(jí)的調(diào)度算法實(shí)現(xiàn)簡(jiǎn)單,系統(tǒng)開(kāi)銷(xiāo)小,但由于靜態(tài)優(yōu)先級(jí)一旦確定之后,直到執(zhí)行結(jié)束為止始終保持不變,從而系統(tǒng)效率較低,調(diào)度性能不高?,F(xiàn)在的操作系統(tǒng)中,如果使用優(yōu)先級(jí)調(diào)度的話,則大多采用動(dòng)態(tài)優(yōu)先級(jí)的調(diào)度策略。

  •進(jìn)程的動(dòng)態(tài)優(yōu)先級(jí)一般可以根據(jù)以下兩個(gè)方面來(lái)確定:

  • (1)根據(jù)進(jìn)程占有CPU時(shí)間的長(zhǎng)短來(lái)決定。一個(gè)進(jìn)程占有處理機(jī)的時(shí)間愈長(zhǎng),則在被阻塞之后再次獲得調(diào)度的優(yōu)先級(jí)就越低。反之,其獲得調(diào)度的可能性就會(huì)越大。

  • (2)根據(jù)就緒進(jìn)程等待CPU的時(shí)間長(zhǎng)短來(lái)決定。一個(gè)就緒進(jìn)程在就緒隊(duì)列中等待的時(shí)間越長(zhǎng),則它獲得調(diào)度選中的優(yōu)先級(jí)就越高。

  •由于動(dòng)態(tài)優(yōu)先級(jí)隨時(shí)間的推移而變化,系統(tǒng)要經(jīng)常計(jì)算各個(gè)進(jìn)程的優(yōu)先級(jí),因此,系統(tǒng)要為此付出一定的開(kāi)銷(xiāo)。

  •最高優(yōu)先級(jí)優(yōu)先調(diào)度算法用于多道批處理系統(tǒng)中較好,但它使得優(yōu)先級(jí)較低的進(jìn)程等待時(shí)間較長(zhǎng),這對(duì)于分時(shí)系統(tǒng)中要想獲得較好的響應(yīng)時(shí)間是不允許的,所以在分時(shí)系統(tǒng)中多采用時(shí)間片輪轉(zhuǎn)法來(lái)進(jìn)行進(jìn)程調(diào)度。

  時(shí)間片輪轉(zhuǎn)(Round Robin,RR)法的基本思路是讓每個(gè)進(jìn)程在就緒隊(duì)列中的等待時(shí)間與享受服務(wù)的時(shí)間成比例。在時(shí)間片輪轉(zhuǎn)法中,需要將CPU的處理時(shí)間分成固定大小的時(shí)間片,例如,幾十毫秒至幾百毫秒。如果一個(gè)進(jìn)程在被調(diào)度選中之后用完了系統(tǒng)規(guī)定的時(shí)間片,但又未完成要求的任務(wù),則它自行釋放自己所占有的CPU而排到就緒隊(duì)列的末尾,等待下一次調(diào)度。同時(shí),進(jìn)程調(diào)度程序又去調(diào)度當(dāng)前就緒隊(duì)列中的第一個(gè)進(jìn)程。

  •顯然,輪轉(zhuǎn)法只能用來(lái)調(diào)度分配一些可以搶占的資源。這些可以搶占的資源可以隨時(shí)被剝奪,而且可以將它們?cè)俜峙浣o別的進(jìn)程。CPU是可搶占資源的一種。但打印機(jī)等資源是不可搶占的。由于作業(yè)調(diào)度是對(duì)除了CPU之外的所有系統(tǒng)硬件資源的分配,其中包含有不可搶占資源,所以作業(yè)調(diào)度不使用輪轉(zhuǎn)法。在輪轉(zhuǎn)法中,時(shí)間片長(zhǎng)度的選取非常重要。首先,時(shí)間片長(zhǎng)度的選擇會(huì)直接影響到系統(tǒng)的開(kāi)銷(xiāo)和響應(yīng)時(shí)間。如果時(shí)間片長(zhǎng)度過(guò)短,則調(diào)度程序搶占處理機(jī)的次數(shù)增多。這將使進(jìn)程上下文切換次數(shù)也大大增加,從而加重系統(tǒng)開(kāi)銷(xiāo)。反過(guò)來(lái),如果時(shí)間片長(zhǎng)度選擇過(guò)長(zhǎng),例如,一個(gè)時(shí)間片能保證就緒隊(duì)列中所需執(zhí)行時(shí)間最長(zhǎng)的進(jìn)程能執(zhí)行完畢,則輪轉(zhuǎn)法變成了先來(lái)先服務(wù)法。時(shí)間片長(zhǎng)度的選擇是根據(jù)系統(tǒng)對(duì)響應(yīng)時(shí)間的要求和就緒隊(duì)列中所允許最大的進(jìn)程數(shù)來(lái)確定的。

  • 在輪轉(zhuǎn)法中,加入到就緒隊(duì)列的進(jìn)程有3種情況,一種是分給它的時(shí)間片用完,但進(jìn)程還未完成,回到就緒隊(duì)列的末尾等待下次調(diào)度去繼續(xù)執(zhí)行。另一種情況是分給該進(jìn)程的時(shí)間片并未用完,只是因?yàn)檎?qǐng)求I/O或由于進(jìn)程的互斥與同步關(guān)系而被阻塞。當(dāng)阻塞解除之后再回到就緒隊(duì)列。第三種情況就是新創(chuàng)建進(jìn)程進(jìn)入就緒隊(duì)列。如果對(duì)這些進(jìn)程區(qū)別對(duì)待,給予不同的優(yōu)先級(jí)和時(shí)間片,從直觀上看,可以進(jìn)一步改善系統(tǒng)服務(wù)質(zhì)量和效率。例如,我們可把就緒隊(duì)列按照進(jìn)程到達(dá)就緒隊(duì)列的類(lèi)型和進(jìn)程被阻塞時(shí)的阻塞原因分成不同的就緒隊(duì)列,每個(gè)隊(duì)列按FCFS原則排列,各隊(duì)列之間的進(jìn)程享有不同的優(yōu)先級(jí),但同一隊(duì)列內(nèi)優(yōu)先級(jí)相同。這樣,當(dāng)一個(gè)進(jìn)程在執(zhí)行完它的時(shí)間片之后,或從睡眠中被喚醒以及被創(chuàng)建之后,將進(jìn)入不同的就緒隊(duì)列。

  14. Windows內(nèi)存管理的方式(塊式、頁(yè)式、段式、段頁(yè)式).

  內(nèi)存管理是操作系統(tǒng)中的重要部分,兩三句話恐怕誰(shuí)也說(shuō)不清楚吧~~我先說(shuō)個(gè)大概,希望能夠拋磚引玉吧 當(dāng)程序運(yùn)行時(shí)需要從內(nèi)存中讀出這段程序的代碼。代碼的位置必須在物理內(nèi)存中才能被運(yùn)行,由于現(xiàn)在的操作系統(tǒng)中有非常多的程序運(yùn)行著,內(nèi)存中不能夠完全放下,所以引出了虛擬內(nèi)存的概念。把哪些不常用的程序片斷就放入虛擬內(nèi)存,當(dāng)需要用到它的時(shí)候在load入主存(物理內(nèi)存)中。這個(gè)就是內(nèi)存管理所要做的事。內(nèi)存管理還有另外一件事需要做:計(jì)算程序片段在主存中的物理位置,以便CPU調(diào)度。 內(nèi)存管理有塊式管理,頁(yè)式管理,段式和段頁(yè)式管理?,F(xiàn)在常用段頁(yè)式管理。

  塊式管理:把主存分為一大塊、一大塊的,當(dāng)所需的程序片斷不在主存時(shí)就分配一塊主存空間,把程序片斷l(xiāng)oad入主存,就算所需的程序片度只有幾個(gè)字節(jié)也只能把這一塊分配給它。這樣會(huì)造成很大的浪費(fèi),平均浪費(fèi)了50%的內(nèi)存空間,但是易于管理。

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

  段式管理:把主存分為一段一段的,每一段的空間又要比一頁(yè)一頁(yè)的空間小很多,這種方法在空間利用率上又比頁(yè)式管理高很多,但是也有另外一個(gè)缺點(diǎn)。一個(gè)程序片斷可能會(huì)被分為幾十段,這樣很多時(shí)間就會(huì)被浪費(fèi)在計(jì)算每一段的物理地址上(計(jì)算機(jī)最耗時(shí)間的大家都知道是I/O吧)。

  段頁(yè)式管理:結(jié)合了段式管理和頁(yè)式管理的優(yōu)點(diǎn)。把主存分為若干頁(yè),每一頁(yè)又分為若干段。

  二維邏輯地址:段號(hào)+段內(nèi)地址

  分頁(yè)與分段的主要區(qū)別:

  1)、段是信息的邏輯單位,它是根據(jù)用戶(hù)的需要?jiǎng)澐值?,因此段?duì)用戶(hù)是可見(jiàn)的;頁(yè)是信息的物理單位,是為了管理主存的方便而劃分的,對(duì)用戶(hù)是透明的。

  2)、頁(yè)的大小固定不變,由系統(tǒng)決定。段的大小是不固定的,它由其完成的功能決定。

  3)、段式向用戶(hù)提供的是二維地址空間,頁(yè)式向用戶(hù)提供的是一維地址空間,其頁(yè)號(hào)和頁(yè)內(nèi)偏移是機(jī)器硬件的功能。

  4)、由于段是信息的邏輯單位,因此便于存貯保護(hù)和信息的共享,頁(yè)的保護(hù)和共享受到限制。

  分頁(yè)與分段存儲(chǔ)管理系統(tǒng)雖然在很多地方相似,但從概念上講,兩者是完全不同的,它們之間的區(qū)別如下:

 ?、夙?yè)是信息的物理單位。分頁(yè)的目的是實(shí)現(xiàn)離散分配,減少外部碎片,提高內(nèi)存利用率。段是信息的邏輯單位。每一段在邏輯上是一組相對(duì)完整的信息集合。

  ②分頁(yè)式存儲(chǔ)管理的作業(yè)地址空間是一維的,而分段式存儲(chǔ)管理的作業(yè)地址空間是二維的。

 ?、垌?yè)的大小固定且由系統(tǒng)確定,是等長(zhǎng)的。而段的長(zhǎng)度不定。

 ?、芊猪?yè)的優(yōu)點(diǎn)體現(xiàn)在內(nèi)存空間的管理上,而分段的優(yōu)點(diǎn)體現(xiàn)在地址空間的管理上。

  15. 內(nèi)存連續(xù)分配方式采用的幾種算法及各自?xún)?yōu)劣。

  1) 單一連續(xù)分配 是一種最簡(jiǎn)單的存儲(chǔ)管理方式,其優(yōu)點(diǎn)是軟件處理簡(jiǎn)單,最大缺點(diǎn)是存儲(chǔ)器不能充分利用。多用于單用戶(hù)微機(jī)操作系統(tǒng)中。

  2) 動(dòng)態(tài)分區(qū)分配 是多道程序環(huán)境下各種存儲(chǔ)管理方式中最簡(jiǎn)單的一種。它將內(nèi)存劃分成若干個(gè)分區(qū),在每個(gè)分區(qū)中按照連續(xù)分配方式分配給一個(gè)作業(yè)。分區(qū)形式: a) 固定分區(qū)分配:指內(nèi)存在處理作業(yè)前已被劃分成若干個(gè)大小不等的分區(qū),存儲(chǔ)管理程序根據(jù)每個(gè)作業(yè)步的最大存儲(chǔ)量分配一個(gè)足夠大的分區(qū)給它。當(dāng)找不到一個(gè)足夠大的分區(qū)時(shí),則通知作業(yè)調(diào)度挑選另一作業(yè),這種方式分配和回收內(nèi)存簡(jiǎn)單,但內(nèi)存利用不充分,會(huì)產(chǎn)生“碎片”空間。b) 可變分區(qū)分配:指內(nèi)存事先并未被分區(qū),只有當(dāng)作業(yè)進(jìn)入內(nèi)存時(shí),才根據(jù)作業(yè)的大小建立分區(qū)。其特點(diǎn)是分區(qū)的個(gè)數(shù)和大小都是可變的,但需要建立分配區(qū)表和空白區(qū)表,且表的長(zhǎng)度是不固定的。

  3) 可重定位分區(qū)分配 為使各分區(qū)中的用戶(hù)程序能移到內(nèi)存的一端,使碎片集中于另一端成為一個(gè)大分區(qū),在程序執(zhí)行過(guò)程中,需對(duì)作業(yè)移動(dòng)過(guò)程中的與地址有關(guān)項(xiàng)進(jìn)行調(diào)整。這種分配方法的優(yōu)點(diǎn)是清除碎片,更大程度地利用內(nèi)存空間,但必須硬件的支持,且要花費(fèi)時(shí)間。

  16. 動(dòng)態(tài)鏈接及靜態(tài)鏈接.

  靜態(tài)鏈接庫(kù)與動(dòng)態(tài)鏈接庫(kù)都是共享代碼的方式,如果采用靜態(tài)鏈接庫(kù),則無(wú)論你愿不愿意,lib 中的指令都全部被直接包含在最終生成的 EXE 文件中了。但是若使用 DLL,該 DLL 不必被包含在最終 EXE 文件中,EXE 文件執(zhí)行時(shí)可以“動(dòng)態(tài)”地引用和卸載這個(gè)與 EXE 獨(dú)立的 DLL 文件。靜態(tài)鏈接庫(kù)和動(dòng)態(tài)鏈接庫(kù)的另外一個(gè)區(qū)別在于靜態(tài)鏈接庫(kù)中不能再包含其他的動(dòng)態(tài)鏈接庫(kù)或者靜態(tài)庫(kù),而在動(dòng)態(tài)鏈接庫(kù)中還可以再包含其他的動(dòng)態(tài)或靜態(tài)鏈接 庫(kù)

  動(dòng)態(tài)鏈接是指在生成可執(zhí)行文件時(shí)不將所有程序用到的函數(shù)鏈接到一個(gè)文件,因?yàn)橛性S多函數(shù)在操作系統(tǒng)帶的dll文件中,當(dāng)程序運(yùn)行時(shí)直接從操作系統(tǒng)中找。

  而靜態(tài)鏈接就是把所有用到的函數(shù)全部鏈接到exe文件中。

  動(dòng)態(tài)鏈接是只建立一個(gè)引用的接口,而真正的代碼和數(shù)據(jù)存放在另外的可執(zhí)行模塊中,在運(yùn)行時(shí)再裝入;

  而靜態(tài)鏈接是把所有的代碼和數(shù)據(jù)都復(fù)制到本模塊中,運(yùn)行時(shí)就不再需要庫(kù)了。

  17. 基本分頁(yè)、請(qǐng)求分頁(yè)儲(chǔ)存管理方式。18. 基本分段、請(qǐng)求分段儲(chǔ)存管理方式。

  分頁(yè)式存儲(chǔ)管理的基本原理:采用分頁(yè)存儲(chǔ)器允許把一個(gè)作業(yè)存放到若干不相鄰的分區(qū)中,既可免去移動(dòng)信息的工作,又可盡量減少主存的碎片。分頁(yè)式存儲(chǔ)管理的基本原理如下:

  1、 頁(yè)框:物理地址分成大小相等的許多區(qū),每個(gè)區(qū)稱(chēng)為一塊;

  2、址分成大小相等的區(qū),區(qū)的大小與塊的大小相等,每個(gè)稱(chēng)一個(gè)頁(yè)面。

  3、 邏輯地址形式:與此對(duì)應(yīng),分頁(yè)存儲(chǔ)器的邏輯地址由兩部分組成,頁(yè)號(hào)和單元號(hào)。邏輯地址格式為

  頁(yè)號(hào) 單元號(hào)(頁(yè)內(nèi)地址)

  采用分頁(yè)式存儲(chǔ)管理時(shí),邏輯地址是連續(xù)的。所以,用戶(hù)在編制程序時(shí)仍只須使用順序的地址,而不必考慮如何去分頁(yè)。

  4、頁(yè)表和地址轉(zhuǎn)換:如何保證程序正確執(zhí)行呢?采用的辦法是動(dòng)態(tài)重定位技術(shù),讓程序的指令執(zhí)行時(shí)作地址變換,由于程序段以頁(yè)為單位,所以,我們給每個(gè)頁(yè)設(shè)立一個(gè)重定位寄存器,這些重定位寄存器的集合便稱(chēng)頁(yè)表。頁(yè)表是操作系統(tǒng)為每個(gè)用戶(hù)作業(yè)建立的,用來(lái)記錄程序頁(yè)面和主存對(duì)應(yīng)頁(yè)框的對(duì)照表,頁(yè)表中的每一欄指明了程序中的一個(gè)頁(yè)面和分得的頁(yè)框的對(duì)應(yīng)關(guān)系。絕對(duì)地址=塊號(hào)*塊長(zhǎng)+單元號(hào)

  以上從拓?fù)浣Y(jié)構(gòu)角度分析了對(duì)稱(chēng)式與非對(duì)稱(chēng)式虛擬存儲(chǔ)方案的異同,實(shí)際從虛擬化存儲(chǔ)的實(shí)現(xiàn)原理來(lái)講也有兩種方式;即數(shù)據(jù)塊虛擬與虛擬文件系統(tǒng).

  數(shù)據(jù)塊虛擬存儲(chǔ)方案著重解決數(shù)據(jù)傳輸過(guò)程中的沖突和延時(shí)問(wèn)題.在多交換機(jī)組成的大型Fabric結(jié)構(gòu)的SAN中,由于多臺(tái)主機(jī)通過(guò)多個(gè)交換機(jī)端口訪問(wèn)存儲(chǔ)設(shè)備,延時(shí)和數(shù)據(jù)塊沖突問(wèn)題非常嚴(yán)重.數(shù)據(jù)塊虛擬存儲(chǔ)方案利用虛擬的多端口并行技術(shù),為多臺(tái)客戶(hù)機(jī)提供了極高的帶寬,最大限度上減少了延時(shí)與沖突的發(fā)生,在實(shí)際應(yīng)用中,數(shù)據(jù)塊虛擬存儲(chǔ)方案以對(duì)稱(chēng)式拓?fù)浣Y(jié)構(gòu)為表現(xiàn)形式.

  虛擬文件系統(tǒng)存儲(chǔ)方案著重解決大規(guī)模網(wǎng)絡(luò)中文件共享的安全機(jī)制問(wèn)題.通過(guò)對(duì)不同的站點(diǎn)指定不同的訪問(wèn)權(quán)限,保證網(wǎng)絡(luò)文件的安全.在實(shí)際應(yīng)用中,虛擬文件系統(tǒng)存儲(chǔ)方案以非對(duì)稱(chēng)式拓?fù)浣Y(jié)構(gòu)為表現(xiàn)形式.

  虛擬存儲(chǔ)技術(shù),實(shí)際上是虛擬存儲(chǔ)技術(shù)的一個(gè)方面,特指以CPU時(shí)間和外存空間換取昂貴內(nèi)存空間的操作系統(tǒng)中的資源轉(zhuǎn)換技術(shù)

  基本思想:程序,數(shù)據(jù),堆棧的大小可以超過(guò)內(nèi)存的大小,操作系統(tǒng)把程序當(dāng)前使用的部分保留在內(nèi)存,而把其他部分保存在磁盤(pán)上,并在需要時(shí)在內(nèi)存和磁盤(pán)之間動(dòng)態(tài)交換,虛擬存儲(chǔ)器支持多道程序設(shè)計(jì)技術(shù)

  目的:提高內(nèi)存利用率

  管理方式

  A 請(qǐng)求式分頁(yè)存儲(chǔ)管理

  在進(jìn)程開(kāi)始運(yùn)行之前,不是裝入全部頁(yè)面,而是裝入一個(gè)或零個(gè)頁(yè)面,之后根據(jù)進(jìn)程運(yùn)行的需要,動(dòng)態(tài)裝入其他頁(yè)面;當(dāng)內(nèi)存空間已滿,而又需要裝入新的頁(yè)面時(shí),則根據(jù)某種算法淘汰某個(gè)頁(yè)面,以便裝入新的頁(yè)面

  B 請(qǐng)求式分段存儲(chǔ)管理

  為了能實(shí)現(xiàn)虛擬存儲(chǔ),段式邏輯地址空間中的程序段在運(yùn)行時(shí)并不全部裝入內(nèi)存,而是如同請(qǐng)求式分頁(yè)存儲(chǔ)管理,首先調(diào)入一個(gè)或若干個(gè)程序段運(yùn)行,在運(yùn)行過(guò)程中調(diào)用到哪段時(shí),就根據(jù)該段長(zhǎng)度在內(nèi)存分配一個(gè)連續(xù)的分區(qū)給它使用.若內(nèi)存中沒(méi)有足夠大的空閑分區(qū),則考慮進(jìn)行段的緊湊或?qū)⒛扯位蚰承┒翁蕴鋈?這種存儲(chǔ)管理技術(shù)稱(chēng)為請(qǐng)求式分段存儲(chǔ)管理

  19. 分段分頁(yè)方式的比較各自?xún)?yōu)缺點(diǎn)。

  頁(yè)和分段系統(tǒng)有許多相似之處,但在概念上兩者完全不同,主要表現(xiàn)在:

  1、頁(yè)是信息的物理單位,分頁(yè)是為實(shí)現(xiàn)離散分配方式,以消減內(nèi)存的外零頭,提高內(nèi)存的利用率;或者說(shuō),分頁(yè)僅僅是由于系統(tǒng)管理的需要,而不是用戶(hù)的需要。

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

  2、頁(yè)的大小固定且由系統(tǒng)確定,把邏輯地址劃分為頁(yè)號(hào)和頁(yè)內(nèi)地址兩部分,是由機(jī)器硬件實(shí)現(xiàn)的,因而一個(gè)系統(tǒng)只能有一種大小的頁(yè)面。

  段的長(zhǎng)度卻不固定,決定于用戶(hù)所編寫(xiě)的程序,通常由編輯程序在對(duì)源程序進(jìn)行編輯時(shí),根據(jù)信息的性質(zhì)來(lái)劃分。

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

  分段的作業(yè)地址空間是二維的,程序員在標(biāo)識(shí)一個(gè)地址時(shí),既需給出段名,又需給出段內(nèi)地址。

  20. 幾種頁(yè)面置換算法,會(huì)算所需換頁(yè)數(shù)。(LRU用程序如何實(shí)現(xiàn)?)

  地址映射過(guò)程中,若在頁(yè)面中發(fā)現(xiàn)所要訪問(wèn)的頁(yè)面不再內(nèi)存中,則產(chǎn)生缺頁(yè)中斷。當(dāng)發(fā)生缺頁(yè)中斷時(shí)操作系統(tǒng)必須在內(nèi)存選擇一個(gè)頁(yè)面將其移出內(nèi)存,以便為即將調(diào)入的頁(yè)面讓出空間。而用來(lái)選擇淘汰哪一頁(yè)的規(guī)則叫做頁(yè)面置換算法。常見(jiàn)的置換算法有:

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

  這是一種理想情況下的頁(yè)面置換算法,但實(shí)際上是不可能實(shí)現(xiàn)的。該算法的基本思想是:發(fā)生缺頁(yè)時(shí),有些頁(yè)面在內(nèi)存中,其中有一頁(yè)將很快被訪問(wèn)(也包含緊接著的下一條指令的那頁(yè)),而其他頁(yè)面則可能要到10、100或者1000條指令后才會(huì)被訪問(wèn),每個(gè)頁(yè)面都可以用在該頁(yè)面首次被訪問(wèn)前所要執(zhí)行的指令數(shù)進(jìn)行標(biāo)記。最佳頁(yè)面置換算法只是簡(jiǎn)單地規(guī)定:標(biāo)記最大的頁(yè)應(yīng)該被置換。這個(gè)算法唯一的一個(gè)問(wèn)題就是它無(wú)法實(shí)現(xiàn)。當(dāng)缺頁(yè)發(fā)生時(shí),操作系統(tǒng)無(wú)法知道各個(gè)頁(yè)面下一次是在什么時(shí)候被訪問(wèn)。雖然這個(gè)算法不可能實(shí)現(xiàn),但是最佳頁(yè)面置換算法可以用于對(duì)可實(shí)現(xiàn)算法的性能進(jìn)行衡量比較。

  2)先進(jìn)先出置換算法(FIFO)

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

  這種算法只是在按線性順序訪問(wèn)地址空間時(shí)才是理想的,否則效率不高。因?yàn)槟切┏1辉L問(wèn)的頁(yè),往往在主存中也停留得最久,結(jié)果它們因變“老”而不得不被置換出去。

  FIFO的另一個(gè)缺點(diǎn)是,它有一種異常現(xiàn)象,即在增加存儲(chǔ)塊的情況下,反而使缺頁(yè)中斷率增加了。當(dāng)然,導(dǎo)致這種異?,F(xiàn)象的頁(yè)面走向?qū)嶋H上是很少見(jiàn)的。

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

  FIFO算法和OPT算法之間的主要差別是,F(xiàn)IFO算法利用頁(yè)面進(jìn)入內(nèi)存后的時(shí)間長(zhǎng)短作為置換依據(jù),而OPT算法的依據(jù)是將來(lái)使用頁(yè)面的時(shí)間。如果以最近的過(guò)去作為不久將來(lái)的近似,那么就可以把過(guò)去最長(zhǎng)一段時(shí)間里不曾被使用的頁(yè)面置換掉。它的實(shí)質(zhì)是,當(dāng)需要置換一頁(yè)時(shí),選擇在最近一段時(shí)間里最久沒(méi)有使用過(guò)的頁(yè)面予以置換。這種算法就稱(chēng)為最久未使用算法(Least Recently Used,LRU)。

  LRU算法是與每個(gè)頁(yè)面最后使用的時(shí)間有關(guān)的。當(dāng)必須置換一個(gè)頁(yè)面時(shí),LRU算法選擇過(guò)去一段時(shí)間里最久未被使用的頁(yè)面。

  LRU算法是經(jīng)常采用的頁(yè)面置換算法,并被認(rèn)為是相當(dāng)好的,但是存在如何實(shí)現(xiàn)它的問(wèn)題。LRU算法需要實(shí)際硬件的支持。其問(wèn)題是怎么確定最后使用時(shí)間的順序,對(duì)此有兩種可行的辦法:

  1.計(jì)數(shù)器。最簡(jiǎn)單的情況是使每個(gè)頁(yè)表項(xiàng)對(duì)應(yīng)一個(gè)使用時(shí)間字段,并給CPU增加一個(gè)邏輯時(shí)鐘或計(jì)數(shù)器。每次存儲(chǔ)訪問(wèn),該時(shí)鐘都加1。每當(dāng)訪問(wèn)一個(gè)頁(yè)面時(shí),時(shí)鐘寄存器的內(nèi)容就被復(fù)制到相應(yīng)頁(yè)表項(xiàng)的使用時(shí)間字段中。這樣我們就可以始終保留著每個(gè)頁(yè)面最后訪問(wèn)的“時(shí)間”。在置換頁(yè)面時(shí),選擇該時(shí)間值最小的頁(yè)面。這樣做,不僅要查頁(yè)表,而且當(dāng)頁(yè)表改變時(shí)(因CPU調(diào)度)要維護(hù)這個(gè)頁(yè)表中的時(shí)間,還要考慮到時(shí)鐘值溢出的問(wèn)題。

  2.棧。用一個(gè)棧保留頁(yè)號(hào)。每當(dāng)訪問(wèn)一個(gè)頁(yè)面時(shí),就把它從棧中取出放在棧頂上。這樣一來(lái),棧頂總是放有目前使用最多的頁(yè),而棧底放著目前最少使用的頁(yè)。由于要從棧的中間移走一項(xiàng),所以要用具有頭尾指針的雙向鏈連起來(lái)。在最壞的情況下,移走一頁(yè)并把它放在棧頂上需要改動(dòng)6個(gè)指針。每次修改都要有開(kāi)銷(xiāo),但需要置換哪個(gè)頁(yè)面卻可直接得到,用不著查找,因?yàn)槲仓羔樦赶驐5?,其中有被置換頁(yè)。

  因?qū)崿F(xiàn)LRU算法必須有大量硬件支持,還需要一定的軟件開(kāi)銷(xiāo)。所以實(shí)際實(shí)現(xiàn)的都是一種簡(jiǎn)單有效的LRU近似算法。

  一種LRU近似算法是最近未使用算法(Not Recently Used,NUR)。它在存儲(chǔ)分塊表的每一表項(xiàng)中增加一個(gè)引用位,操作系統(tǒng)定期地將它們置為0。當(dāng)某一頁(yè)被訪問(wèn)時(shí),由硬件將該位置1。過(guò)一段時(shí)間后,通過(guò)檢查這些位可以確定哪些頁(yè)使用過(guò),哪些頁(yè)自上次置0后還未使用過(guò)。就可把該位是0的頁(yè)淘汰出去,因?yàn)樵谧罱欢螘r(shí)間里它未被訪問(wèn)過(guò)。

  4)Clock置換算法(LRU算法的近似實(shí)現(xiàn))

  5)最少使用(LFU)置換算法

  在采用最少使用置換算法時(shí),應(yīng)為在內(nèi)存中的每個(gè)頁(yè)面設(shè)置一個(gè)移位寄存器,用來(lái)記錄該頁(yè)面被訪問(wèn)的頻率。該置換算法選擇在最近時(shí)期使用最少的頁(yè)面作為淘汰頁(yè)。由于存儲(chǔ)器具有較高的訪問(wèn)速度,例如100 ns,在1 ms時(shí)間內(nèi)可能對(duì)某頁(yè)面連續(xù)訪問(wèn)成千上萬(wàn)次,因此,通常不能直接利用計(jì)數(shù)器來(lái)記錄某頁(yè)被訪問(wèn)的次數(shù),而是采用移位寄存器方式。每次訪問(wèn)某頁(yè)時(shí),便將該移位寄存器的最高位置1,再每隔一定時(shí)間(例如100 ns)右移一次。這樣,在最近一段時(shí)間使用最少的頁(yè)面將是∑Ri最小的頁(yè)。

  LFU置換算法的頁(yè)面訪問(wèn)圖與LRU置換算法的訪問(wèn)圖完全相同;或者說(shuō),利用這樣一套硬件既可實(shí)現(xiàn)LRU算法,又可實(shí)現(xiàn)LFU算法。應(yīng)該指出,LFU算法并不能真正反映出頁(yè)面的使用情況,因?yàn)樵诿恳粫r(shí)間間隔內(nèi),只是用寄存器的一位來(lái)記錄頁(yè)的使用情況,因此,訪問(wèn)一次和訪問(wèn)10 000次是等效的。

  21. 虛擬內(nèi)存的定義及實(shí)現(xiàn)方式。

  虛擬內(nèi)存,它的作用與物理內(nèi)存基本相似,但它是作為物理內(nèi)存的“后備力量”而存在的,也就是說(shuō),只有在物理內(nèi)存已經(jīng)不夠使用的時(shí)候,它才會(huì)發(fā)揮作用。

  改變頁(yè)面文件位置的方法是:用鼠標(biāo)右鍵點(diǎn)擊“我的電腦”,選擇“屬性→高級(jí)→性能設(shè)置→高級(jí)→更改虛擬內(nèi)存”,在驅(qū)動(dòng)器欄里選擇想要改變到的位置

  22. 操作系統(tǒng)的四個(gè)特性。

  并發(fā)性(concurrency):指在計(jì)算機(jī)系統(tǒng)中存在著許多并發(fā)執(zhí)行的活動(dòng)。對(duì)計(jì)算機(jī)系統(tǒng) 而言,并發(fā)是指宏觀上看系統(tǒng)內(nèi)有多道程序同時(shí)運(yùn)行,微觀上看是串行運(yùn)行。因?yàn)樵?大多數(shù)計(jì)算機(jī)系統(tǒng)中一般只有一個(gè)CPU,在任意時(shí)刻只能有一道程序占用CPU。

  共享性(sharing):系統(tǒng)中各個(gè)并發(fā)活動(dòng)要共享計(jì)算機(jī)系統(tǒng)中的各種軟、硬件資源,因此操作系統(tǒng)必須解決在多道程序間合理地分配和使用資源問(wèn)題。

  虛擬性(virtual):虛擬是操作系統(tǒng)中的重要特征,所謂虛擬是指把物理上的一臺(tái)設(shè)備 變成邏輯上的多臺(tái)設(shè)備。例如,在操作系統(tǒng)中采用了spooling技術(shù),可以利用快速、 大容量可共享的磁盤(pán)作為中介,模擬多個(gè)非共享的低速的輸入輸出設(shè)備,這樣的設(shè)備 稱(chēng)為虛擬設(shè)備。

  異步性:在多道程序環(huán)境下允許多個(gè)進(jìn)程并發(fā)執(zhí)行,但只有進(jìn)程在獲得所需的資源后方能執(zhí)行。在單處理機(jī)環(huán)境下,由于系統(tǒng)中只有一臺(tái)處理機(jī),因而每次只允許一個(gè)進(jìn)程執(zhí)行,其余進(jìn)程只能等待。

  23. DMA。

  直接內(nèi)存存取(Direct Memory Access) 改善系統(tǒng)實(shí)時(shí)效能的一個(gè)熟知的方法是,額外提供一個(gè)邏輯模塊,在事件發(fā)生時(shí)產(chǎn)生響應(yīng),并允許處理器在較方便的時(shí)間來(lái)處理信息。這個(gè)DMA控制器通常將傳送到模塊的信息復(fù)制到內(nèi)存(RAM),并允許已處理的信息自動(dòng)從內(nèi)存移到外部外圍裝置。所有這些工作皆獨(dú)立于目前的CPU活動(dòng)-詳見(jiàn)圖1。

  這種方式肯定有所助益,但其效益僅限于延遲必然發(fā)生的事件-CPU還是得在某一時(shí)間處理信息。S12X采用一個(gè)根本的方法,即提供「智能型DMA」控制器,不只移動(dòng)資料,同時(shí)直接執(zhí)行所有的處理工作。

  24. Spooling。

  脫機(jī)輸入和脫機(jī)輸出

  在多道環(huán)境下,可以用OS的一道管理程序?qū)崿F(xiàn)從I/O設(shè)備輸入數(shù)據(jù)并存放到磁盤(pán)上,模擬脫機(jī)輸入;用OS的另一道管理程序?qū)⒋疟P(pán)上的數(shù)據(jù)輸出到I/O設(shè)備上,模擬脫機(jī)輸出;這種假脫機(jī)I/O操作稱(chēng)為Spooling技術(shù)。

  Spooling是一種虛擬設(shè)備技術(shù)、一種資源轉(zhuǎn)換技術(shù)。

  25. 外存分配的幾種方式,及各種優(yōu)劣。

  連續(xù)分配:為每一個(gè)文件分配一組相鄰接的盤(pán)塊;物理上形成了順序文件結(jié)構(gòu);外存上會(huì)出現(xiàn)“ 碎片” ,用“ 緊湊” 的方法解決。優(yōu)缺點(diǎn):順序(批量)訪問(wèn)容易、速度快;要求有連續(xù)的存儲(chǔ)空間(有時(shí)需要作緊湊處理)、必須事先知道文件的長(zhǎng)度。

  鏈接分配:離散分配方式。優(yōu)缺點(diǎn):消除了“碎片”,有利于文件的增/刪/改。隱式鏈接

  在文件的每個(gè)目錄項(xiàng)中,都含有指向鏈接文件第一盤(pán)塊和最后一個(gè)盤(pán)塊的指針,只適合于順序訪;顯式鏈接,把用于鏈接文件各物理塊的指針,顯式地存放在內(nèi)存的一張“鏈接表”中。

  索引分配:?jiǎn)渭?jí)索引分配每個(gè)文件一個(gè)索引塊(表);多級(jí)索引分配當(dāng)文件較大,需要很多個(gè)索引塊時(shí),可以為各索引塊建立一個(gè)索引表(塊);混合索引分配方式。

3594388