操作系統 面試全集[轉]

目錄:
1. 進程的有哪幾種狀態,狀態轉換圖,及導致轉換的事件。
2. 進程與線程的區別。
3. 進程通信的幾種方式。
4. 線程同步幾種方式。
5. 線程的實現方式. (用戶線程與內核線程的區別)
6. 用戶態和核心態的區別。
7. 用戶棧和內核棧的區別。
8. 內存池、進程池、線程池。
9. 死鎖的概念,導致死鎖的原因,導致死鎖的四個必要條件,處理死鎖的四個方式,預防死鎖的方法、避免死鎖的方法。
10. 進程調度算法。
11. Windows內存管理的方式(塊式、頁式、段式、段頁式).
12. 內存連續分配方式採用的幾種算法及各自優劣。
13. 動態鏈接及靜態鏈接.
14. 基本分頁、請求分頁儲存管理方式。
15. 基本分段、請求分段儲存管理方式。
16. 分段分頁方式的比較各自優缺點。
17. 幾種頁面置換算法,會算所需換頁數。(LRU用程序如何實現?)
18. 虛擬內存的定義及實現方式。
19. 操作系統的四個特性。
20. DMA。
21. Spooling。
22. 外存分配的幾種方式,及各種優劣。


  操作系統是管理計算機硬件與軟件資源的計算機程序,同時也是計算機系統的內核與基石。操作系統需要處理管理與配置內存、決定系統資源供需的優先次序、控制輸入與輸出設備、操作網絡與管理文件系統等基本事務。操作系統也提供一個讓用戶與系統交互的操作界面。
  操作系統上運行的計算機程序通常由一個或一組進程組成。因此,本文便從進程開始說起!
  1.進程的有哪幾種狀態,狀態轉換圖,及導致轉換的事件。
程序員的自我修養(1)——操作系統篇 - 第1張 | 快課網
  如上圖所示,進程包括三種狀態:就緒態、運行態和阻塞態。詳細說明如下:
  注意:創建和退出不是進程的狀態。阻塞也叫等待,等待和就緒的區別:等待是等待除CPU以外的資源,而就緒等待的是CPU資源。
  1)就緒——執行:對就緒狀態的進程,當進程調度程序按一種選定的策略從中選中一個就緒進程,爲之分配了處理機後,該進程便由就緒狀態變爲執行狀態;
  2)執行——等待:正在執行的進程因發生某等待事件而無法執行,則進程由執行狀態變爲等待狀態,如進程提出輸入/輸出請求而變成等待外部設備傳輸信息的狀態,進程申請資源(主存空間或外部設備)得不到滿足時變成等待資源狀態,進程運行中出現了故障(程序出錯或主存儲器讀寫錯等)變成等待干預狀態等等;
  3)等待——就緒:處於等待狀態的進程,在其等待的事件已經發生,如輸入/輸出完成,資源得到滿足或錯誤處理完畢時,處於等待狀態的進程並不馬上轉入執行狀態,而是先轉入就緒狀態,然後再由系統進程調度程序在適當的時候將該進程轉爲執行狀態;
  4)執行——就緒:正在執行的進程,因時間片用完而被暫停執行,或在採用搶先式優先級調度算法的系統中,當有更高優先級的進程要運行而被迫讓出處理機時,該進程便由執行狀態轉變爲就緒狀態。
  2.進程與線程的區別。
  詳見快課之前分享的文章:
  進程與線程的圖文描述
  進程和線程的區別
  3.進程通信的幾種方式。
  以linux操作系統爲例(window也類似),linux下進程間通信方式如下:
  1管道(Pipe)及有名管道(namedpipe):管道可用於具有親緣關係進程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係進程間的通信;
  2信號(Signal):信號是比較複雜的通信方式,用於通知接受進程有某種事件發生,除了用於進程間通信外,進程還可以發送信號給進程本身;linux除了支持Unix早期信號語義函數sigal外,還支持語義符合Posix.1標準的信號函數sigaction(實際上,該函數是基於BSD的,BSD爲了實現可靠信號機制,又能夠統一對外接口,用sigaction函數重新實現了signal函數);
  3報文(Message)隊列(消息隊列):消息隊列是消息的鏈接表,包括Posix消息隊列systemV消息隊列。有足夠權限的進程可以向隊列中添加消息,被賦予讀權限的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式字節流以及緩衝區大小受限等缺點。
  4共享內存:使得多個進程可以訪問同一塊內存空間,是最快的可用IPC形式。是針對其他通信機制運行效率較低而設計的。往往與其它通信機制,如信號量結合使用,來達到進程間的同步及互斥。
  5信號量(semaphore):主要作爲進程間以及同一進程不同線程之間的同步手段。
  6套接口(Socket):更爲一般的進程間通信機制,可用於不同機器之間的進程間通信。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和SystemV的變種都支持套接字。
  4.線程同步幾種方式。
  線程同步的方式主要有以下四種:臨界區(CriticalSection)、互斥量(Mutex)、信號量(Semaphore)、事件(Event)的區別。
  他們的主要區別和特點如下:
  1)臨界區:通過對多線程的串行化來訪問公共資源或一段代碼,速度快,適合控制數據訪問。在任意時刻只允許一個線程對共享資源進行訪問,如果有多個線程試圖訪問公共資源,那麼在有一個線程進入後,其他試圖訪問公共資源的線程將被掛起,並一直等到進入臨界區的線程離開,臨界區在被釋放後,其他線程纔可以搶佔。
  2)互斥量:採用互斥對象機制。只有擁有互斥對象的線程纔有訪問公共資源的權限,因爲互斥對象只有一個,所以能保證公共資源不會同時被多個線程訪問。互斥不僅能實現同一應用程序的公共資源安全共享,還能實現不同應用程序的公共資源安全共享。
  3)信號量:它允許多個線程在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大線程數目。
  4)事件:通過通知操作的方式來保持線程的同步,還可以方便實現對多個線程的優先級比較的操作。
  5.線程的實現方式.(換種方式說即:用戶線程與內核線程的區別)
  線程的實現可以分爲兩類:用戶級線程(User-LevelThread)和內核線線程(Kernel-LevelThread),後者又稱爲內核支持的線程或輕量級進程。在多線程操作系統中,各個系統的實現方式並不相同,在有的系統中實現了用戶級線程,有的系統中實現了內核級線程。
  用戶線程指不需要內核支持而在用戶程序中實現的線程,其不依賴於操作系統核心,應用進程利用線程庫提供創建、同步、調度和管理線程的函數來控制用戶線程。不需要用戶態/核心態切換,速度快,操作系統內核不知道多線程的存在,因此一個線程阻塞將使得整個進程(包括它的所有線程)阻塞。由於這裏的處理器時間片分配是以進程爲基本單位,所以每個線程執行的時間相對減少。
  內核線程:由操作系統內核創建和撤銷。內核維護進程及線程的上下文信息以及線程切換。一個內核線程由於I/O操作而阻塞,不會影響其它線程的運行。
  以下是用戶級線程和內核級線程的區別:
  1)內核支持線程是OS內核可感知的,而用戶級線程是OS內核不可感知的。
  2)用戶級線程的創建、撤消和調度不需要OS內核的支持,是在語言(如Java)這一級處理的;而內核支持線程的創建、撤消和調度都需OS內核提供支持,而且與進程的創建、撤消和調度大體是相同的。
  3)用戶級線程執行系統調用指令時將導致其所屬進程被中斷,而內核支持線程執行系統調用指令時,只導致該線程被中斷。
  4)在只有用戶級線程的系統內,CPU調度還是以進程爲單位,處於運行狀態的進程中的多個線程,由用戶程序控制線程的輪換運行;在有內核支持線程的系統內,CPU調度則以線程爲單位,由OS的線程調度程序負責線程的調度。
  5)用戶級線程的程序實體是運行在用戶態下的程序,而內核支持線程的程序實體則是可以運行在任何狀態下的程序。
  6.用戶態和核心態的區別。
  在講述用戶態和核心態的區別之前,我們先要說說“特權級”的概念。
  熟悉Unix/Linux系統的人都知道,我們創建一個子進程時,是通過調用fork函數來實現的。事實上,fork的工作實際上是以系統調用的方式完成進程創建功能的,具體的工作是由sys_fork負責實施。對於任何操作系統來說,創建一個新的進程都是屬於核心功能,因爲它要做很多底層細緻地工作,消耗系統的物理資源,比如分配物理內存,從父進程拷貝相關信息,拷貝設置頁目錄頁表等等,這些顯然不能隨便讓哪個程序就能去做,於是就自然引出特權級別的概念,顯然,最關鍵性的權力必須由高特權級的程序來執行,這樣纔可以做到集中管理,減少有限資源的訪問和使用衝突。
  特權級顯然是非常有效的管理和控制程序執行的手段,因此在硬件上對特權級做了很多支持,就Intelx86架構的CPU來說一共有0~3四個特權級,0級最高,3級最低,硬件上在執行每條指令時都會對指令所具有的特權級做相應的檢查,相關的概念有CPL、DPL和RPL,這裏不再過多闡述。硬件已經提供了一套特權級使用的相關機制,軟件自然就是好好利用的問題,這屬於操作系統要做的事情,對於Unix/Linux來說,只使用了0級特權級和3級特權級。也就是說在Unix/Linux系統中,一條工作在0級特權級的指令具有了CPU能提供的最高權力,而一條工作在3級特權級的指令具有CPU提供的最低或者說最基本權力。
  OK,有了上面對“特權級”概念的瞭解,就能更直觀的瞭解用戶態和核心態的區別。內核態與用戶態是操作系統的兩種運行級別,,當程序運行在3級特權級上時,就可以稱之爲運行在用戶態,因爲這是最低特權級,是普通的用戶進程運行的特權級,大部分用戶直接面對的程序都是運行在用戶態;反之,當程序運行在0級特權級上時,就可以稱之爲運行在內核態。運行在用戶態下的程序不能直接訪問操作系統內核數據結構和程序。當我們在系統中執行一個程序時,大部分時間是運行在用戶態下的,在其需要操作系統幫助完成某些它沒有權力和能力完成的工作時就會切換到內核態。通常來說,以下三種情況會導致用戶態到內核態的切換:
  1)系統調用
  這是用戶態進程主動要求切換到內核態的一種方式,用戶態進程通過系統調用申請使用操作系統提供的服務程序完成工作,比如前例中fork()實際上就是執行了一個創建新進程的系統調用。而系統調用的機制其核心還是使用了操作系統爲用戶特別開放的一箇中斷來實現,例如Linux的int80h中斷。
  2)異常
  當CPU在執行運行在用戶態下的程序時,發生了某些事先不可知的異常,這時會觸發由當前運行進程切換到處理此異常的內核相關程序中,也就轉到了內核態,比如缺頁異常。
  3)外圍設備的中斷
  當外圍設備完成用戶請求的操作後,會向CPU發出相應的中斷信號,這時CPU會暫停執行下一條即將要執行的指令轉而去執行與中斷信號對應的處理程序,如果先前執行的指令是用戶態下的程序,那麼這個轉換的過程自然也就發生了由用戶態到內核態的切換。比如硬盤讀寫操作完成,系統會切換到硬盤讀寫的中斷處理程序中執行後續操作等。
  這3種方式是系統在運行時由用戶態轉到內核態的最主要方式,其中系統調用可以認爲是用戶進程主動發起的,異常和外圍設備中斷則是被動的。
  7.用戶棧和內核棧的區別。
  操作系統中,每個進程會有兩個棧,一個用戶棧,存在於用戶空間,一個內核棧,存在於內核空間。當進程在用戶空間運行時,cpu堆棧指針寄存器裏面的內容是用戶堆棧地址,使用用戶棧;當進程在內核空間時,cpu堆棧指針寄存器裏面的內容是內核棧空間地址,使用內核棧。
  內核棧是內存中屬於操作系統空間的一塊區域,其主要用途爲:
  1)保存中斷現場,對於嵌套中斷,被中斷程序的現場信息依次壓入系統棧,中斷返回時逆序彈出;
  2)保存操作系統子程序間相互調用的參數、返回值、返回點以及子程序(函數)的局部變量。
  用戶棧是用戶進程空間中的一塊區域,用於保存用戶進程的子程序間相互調用的參數、返回值、返回點以及子程序(函數)的局部變量。
  PS:那麼爲什麼不直接用一個棧,何必浪費那麼多的空間呢?
  1)如果只用系統棧。系統棧一般大小有限,如果中斷有16個優先級,那麼系統棧一般大小爲15(只需保存15個低優先級的中斷,另一個高優先級中斷處理程序處於運行),但用戶程序子程序調用次數可能很多,那樣15次子程序調用以後的子程序調用的參數、返回值、返回點以及子程序(函數)的局部變量就不能被保存,用戶程序也就無法正常運行了。
  2)如果只用用戶棧。我們知道系統程序需要在某種保護下運行,而用戶棧在用戶空間(即cpu處於用戶態,而cpu處於核心態時是受保護的),不能提供相應的保護措施(或相當困難)。
  8.內存池、進程池、線程池。
  首先介紹一個概念“池化技術”。池化技術一言以蔽之就是:提前保存大量的資源,以備不時之需以及重複使用。池化技術應用廣泛,如內存池,線程池,連接池等等。內存池相關的內容,建議看看Apache、Nginx等開源web服務器的內存池實現。
  由於在實際應用當做,分配內存、創建進程、線程都會設計到一些系統調用,系統調用需要導致程序從用戶態切換到內核態,是非常耗時的操作。因此,當程序中需要頻繁的進行內存申請釋放,進程、線程創建銷燬等操作時,通常會使用內存池、進程池、線程池技術來提升程序的性能。
  線程池:線程池的原理很簡單,類似於操作系統中的緩衝區的概念,它的流程如下:先啓動若干數量的線程,並讓這些線程都處於睡眠狀態,當需要一個開闢一個線程去做具體的工作時,就會喚醒線程池中的某一個睡眠線程,讓它去做具體工作,當工作完成後,線程又處於睡眠狀態,而不是將線程銷燬。
  進程池與線程池同理。
  內存池:內存池是指程序預先從操作系統申請一塊足夠大內存,此後,當程序中需要申請內存的時候,不是直接向操作系統申請,而是直接從內存池中獲取;同理,當程序釋放內存的時候,並不真正將內存返回給操作系統,而是返回內存池。當程序退出(或者特定時間)時,內存池纔將之前申請的真正內存釋放。
  9.死鎖的概念,導致死鎖的原因,導致死鎖的四個必要條件,預防死鎖的方法、避免死鎖的方法
  計算機系統中,如果系統的資源分配策略不當,更常見的可能是程序員寫的程序有錯誤等,則會導致進程因競爭資源不當而產生死鎖的現象。
  產生死鎖的原因主要是:
  1)因爲系統資源不足。
  2)進程運行推進的順序不合適。
  3)資源分配不當等。
  如果系統資源充足,進程的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。其次,進程運行推進順序與速度不同,也可能產生死鎖。
  產生死鎖的四個必要條件:
  1)互斥條件:一個資源每次只能被一個進程使用。
  2)請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
  3)不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
  4)循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關係。
  這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖。
  死鎖的解除與預防:
  理解了死鎖的原因,尤其是產生死鎖的四個必要條件,就可以最大可能地避免、預防和解除死鎖。所以,在系統設計、進程調度等方面注意如何不讓這四個必要條件成立,如何確定資源的合理分配算法,避免進程永久佔據系統資源。
  此外,也要防止進程在處於等待狀態的情況下佔用資源,在系統運行過程中,對進程發出的每一個系統能夠滿足的資源申請進行動態檢查,並根據檢查結果決定是否分配資源,若分配後系統可能發生死鎖,則不予分配,否則予以分配。因此,對資源的分配要給予合理的規劃。
  10.進程調度算法。
  幾種進程調度算法:
  一、先來先服務和短作業(進程)優先調度算法
  1.先來先服務調度算法。先來先服務(FCFS)調度算法是一種最簡單的調度算法,該算法既可用於作業調度,也可用於進程調度。FCFS算法比較有利於長作業(進程),而不利於短作業(進程)。由此可知,本算法適合於CPU繁忙型作業,而不利於I/O繁忙型的作業(進程)。  2.短作業(進程)優先調度算法。短作業(進程)優先調度算法(SJ/PF)是指對短作業或短進程優先調度的算法,該算法既可用於作業調度,也可用於進程調度。但其對長作業不利;不能保證緊迫性作業(進程)被及時處理;作業的長短只是被估算出來的。
  二、高優先權優先調度算法
  1.優先權調度算法的類型。爲了照顧緊迫性作業,使之進入系統後便獲得優先處理,引入了最高優先權優先(FPF)調度算法。此算法常被用在批處理系統中,作爲作業調度算法,也作爲多種操作系統中的進程調度,還可以用於實時系統中。當其用於作業調度,將後備隊列中若干個優先權最高的作業裝入內存。當其用於進程調度時,把處理機分配給就緒隊列中優先權最高的進程,此時,又可以進一步把該算法分成以下兩種:
  1)非搶佔式優先權算法
  2)搶佔式優先權調度算法(高性能計算機操作系統)
  2.優先權類型
  對於最高優先權優先調度算法,其核心在於:它是使用靜態優先權還是動態優先權,以及如何確定進程的優先權。
  3.高響應比優先調度算法
  爲了彌補短作業優先算法的不足,我們引入動態優先權,使作業的優先等級隨着等待時間的增加而以速率a提高。該優先權變化規律可描述爲:優先權=(等待時間+要求服務時間)/要求服務時間;即=(響應時間)/要求服務時間
  三、基於時間片的輪轉調度算法
  1.時間片輪轉法。時間片輪轉法一般用於進程調度,每次調度,把CPU分配隊首進程,並令其執行一個時間片。當執行的時間片用完時,由一個記時器發出一個時鐘中斷請求,該進程被停止,並被送往就緒隊列末尾;依次循環。
  2.多級反饋隊列調度算法多級反饋隊列調度算法多級反饋隊列調度算法,不必事先知道各種進程所需要執行的時間,它是目前被公認的一種較好的進程調度算法。其實施過程如下:
  1)設置多個就緒隊列,併爲各個隊列賦予不同的優先級。在優先權越高的隊列中,爲每個進程所規定的執行時間片就越小。
  2)當一個新進程進入內存後,首先放入第一隊列的末尾,按FCFS原則排隊等候調度。如果他能在一個時間片中完成,便可撤離;如果未完成,就轉入第二隊列的末尾,在同樣等待調度……如此下去,當一個長作業(進程)從第一隊列依次將到第n隊列(最後隊列)後,便按第n隊列時間片輪轉運行。
  3)僅當第一隊列空閒時,調度程序才調度第二隊列中的進程運行;僅當第1到第(i-1)隊列空時,纔會調度第i隊列中的進程運行,並執行相應的時間片輪轉。
  4)如果處理機正在處理第i隊列中某進程,又有新進程進入優先權較高的隊列,則此新隊列搶佔正在運行的處理機,並把正在運行的進程放在第i隊列的隊尾。
  11.Windows內存管理的方式(塊式、頁式、段式、段頁式).
  塊式管理
  把主存分爲一大塊、一大塊的,當所需的程序片斷不在主存時就分配一塊主存空間,把程序片斷載入主存,就算所需的程序片度只有幾個字節也只能把這一塊分配給它。這樣會造成很大的浪費,但時易於管理。
  頁式管理
  把主存分爲一頁一頁的,每一頁的空間要比一塊一塊的空間小很多,顯然這種方法的空間利用率要比塊式管理高很多。
  段式
  把主存分爲一段一段的,每一段的空間又要比一頁一頁的空間小很多,這種方法在空間利用率上又比頁式管理高很多,但是也有另外一個缺點。一個程序片斷可能會被分爲幾十段,這樣很多時間就會被浪費在計算每一段的物理地址上(計算機最耗時間的大家都知道是I/O吧)。
  段頁式管理。(現在常用)
  結合了段式管理和頁式管理的優點。把主存分爲若干頁,每一頁又分爲若干段。
  12.內存連續分配方式採用的幾種算法及各自優劣。
  內存的連續分配方式有:單一連續分配、固定分區分配、動態分區分配以及動態重定位分區分配四種方式。
  單一連續分配:只能用於單用戶、單任務的操作系統中。
  固定分區分配:可運行多道程序的存儲管理方式。
  動態分區分配:根據進程的實際需要,動態地爲之分配內存空間。
  可重定位分區分配:必須把一個系統或用戶程序裝入一連續的內存空間。
  13.動態鏈接及靜態鏈接。
  靜態鏈接就是在編譯鏈接時直接將需要的執行代碼拷貝到調用處,優點就是在程序發佈的時候就不需要的依賴庫,也就是不再需要帶着庫一塊發佈,程序可以獨立執行,但是體積可能會相對大一些。
  動態鏈接就是在編譯的時候不直接拷貝可執行代碼,而是通過記錄一系列符號和參數,在程序運行或加載時將這些信息傳遞給操作系統,操作系統負責將需要的動態庫加載到內存中,然後程序在運行到指定的代碼時,去共享執行內存中已經加載的動態庫可執行代碼,最終達到運行時連接的目的。優點是多個程序可以共享同一段代碼,而不需要在磁盤上存儲多個拷貝,缺點是由於是運行時加載,可能會影響程序的前期執行性能。
  14.基本分頁、請求分頁儲存管理方式。
  基本分頁儲存管理方式具有如下特徵:
  1)一次性。要求將作業全部裝入內存後方能運行。許多作業在每次運行時,並非其全部程序和數據都要用到。如果一次性地裝入其全部程序,造成內存空間的浪費。
  2)駐留性。作業裝入內存後,便一直駐留在內存中,直至作業運行結束。儘管運行中的進程會因I/O而長期等待,或有的程序模塊在運行過一次後就不再需要(運行)了,但它們都仍將繼續佔用寶貴的內存資源。
  請求分頁儲存管理是實現虛擬存儲器的一種常用方式,它是在基本分頁儲存管理的基礎上實現的。其基本思想是:在進程開始運行之前,僅裝入當前要執行的部分頁面即可運行;在執行過程中,可使用請求調入中斷動態裝入要訪問但又不在內存的頁面;當內存空間已滿,而又需要裝入新的頁面時,者根據置換功能適當調出某個頁面,以便騰出空間而裝入新的頁面。爲實現請求分頁,需要一定的硬件支持,包括:頁表機制、缺頁中斷機構、地址變換機構。
  15.基本分段、請求分段儲存管理方式。(略)
  16.分段分頁方式的比較各自優缺點。
  分段和分頁其實都是一種對地址的劃分或者映射的方式。兩者的區別主要有以下幾點:
  1)頁是信息的物理單位,分頁是爲實現離散分配方式,以消減內存的外零頭,提高內存的利用率;或者說,分頁僅僅是由於系統管理的需要,而不是用戶的需要(也是對用戶透明的)。段是信息的邏輯單位,它含有一組其意義相對完整的信息(比如數據段、代碼段和堆棧段等)。分段的目的是爲了能更好的滿足用戶的需要(用戶也是可以使用的)。
  2)頁的大小固定且由系統確定,把邏輯地址劃分爲頁號和頁內地址兩部分,是由機器硬件實現的,因而一個系統只能有一種大小的頁面。段的長度卻不固定,決定於用戶所編寫的程序,通常由編輯程序在對源程序進行編輯時,根據信息的性質來劃分。
  3)分頁的作業地址空間是維一的,即單一的線性空間,程序員只須利用一個記憶符(線性地址的16進製表示),即可表示一地址。分段的作業地址空間是二維的,程序員在標識一個地址時,既需給出段名(比如數據段、代碼段和堆棧段等),又需給出段內地址。
  4)頁和段都有存儲保護機制。但存取權限不同:段有讀、寫和執行三種權限;而頁只有讀和寫兩種權限。
  17.幾種頁面置換算法。
  1)最佳置換算法(OPT)(理想置換算法)
  這是一種理想情況下的頁面置換算法,但實際上是不可能實現的。該算法的基本思想是:發生缺頁時,有些頁面在內存中,其中有一頁將很快被訪問(也包含緊接着的下一條指令的那頁),而其他頁面則可能要到10、100或者1000條指令後纔會被訪問,每個頁面都可以用在該頁面首次被訪問前所要執行的指令數進行標記。最佳頁面置換算法只是簡單地規定:標記最大的頁應該被置換。這個算法唯一的一個問題就是它無法實現。當缺頁發生時,操作系統無法知道各個頁面下一次是在什麼時候被訪問。雖然這個算法不可能實現,但是最佳頁面置換算法可以用於對可實現算法的性能進行衡量比較。
  2)先進先出置換算法(FIFO)
  最簡單的頁面置換算法是先入先出(FIFO)法。這種算法的實質是,總是選擇在主存中停留時間最長(即最老)的一頁置換,即先進入內存的頁,先退出內存。理由是:最早調入內存的頁,其不再被使用的可能性比剛調入內存的可能性大。建立一個FIFO隊列,收容所有在內存中的頁。被置換頁面總是在隊列頭上進行。當一個頁面被放入內存時,就把它插在隊尾上。
  這種算法只是在按線性順序訪問地址空間時纔是理想的,否則效率不高。因爲那些常被訪問的頁,往往在主存中也停留得最久,結果它們因變“老”而不得不被置換出去。
  FIFO的另一個缺點是,它有一種異常現象,即在增加存儲塊的情況下,反而使缺頁中斷率增加了。當然,導致這種異常現象的頁面走向實際上是很少見的。
  3)最近最久未使用(LRU)算法
  FIFO算法和OPT算法之間的主要差別是,FIFO算法利用頁面進入內存後的時間長短作爲置換依據,而OPT算法的依據是將來使用頁面的時間。如果以最近的過去作爲不久將來的近似,那麼就可以把過去最長一段時間裏不曾被使用的頁面置換掉。它的實質是,當需要置換一頁時,選擇在最近一段時間裏最久沒有使用過的頁面予以置換。這種算法就稱爲最久未使用算法(LeastRecentlyUsed,LRU)。LRU算法是與每個頁面最後使用的時間有關的。當必須置換一個頁面時,LRU算法選擇過去一段時間裏最久未被使用的頁面。
  18.虛擬內存的定義及實現方式。
  虛擬內存是計算機系統內存管理的一種技術。它使得應用程序認爲它擁有連續的可用的內存(一個連續完整的地址空間),而實際上,它通常是被分隔成多個物理內存碎片,還有部分暫時存儲在外部磁盤存儲器上,在需要時進行數據交換。與沒有使用虛擬內存技術的系統相比,使用這種技術的系統使得大型程序的編寫變得更容易,對真正的物理內存(例如RAM)的使用也更有效率。
  19.操作系統的四個特性。
  1)併發(concurrence)
  並行性與併發性這兩個概念是既相似又區別的兩個概念。並行性是指兩個或者多個事件在同一時刻發生,這是一個具有微觀意義的概念,即在物理上這些事件是同時發生的;而併發性是指兩個或者多個事件在同一時間的間隔內發生,它是一個較爲宏觀的概念。在多道程序環境下,併發性是指在一段時間內有多道程序在同時運行,但在單處理機的系統中,每一時刻僅能執行一道程序,故微觀上這些程序是在交替執行的。應當指出,通常的程序是靜態實體,它們是不能併發執行的。爲了使程序能併發執行,系統必須分別爲每個程序建立進程。進程,又稱任務,簡單來說,是指在系統中能獨立運行並作爲資源分配的基本單位,它是一個活動的實體。多個進程之間可以併發執行和交換信息。一個進程在運行時需要運行時需要一定的資源,如cpu,存儲空間,及i/o設備等。在操作系統中引入進程的目的是使程序能併發執行。
  2)共享(sharing)
  所謂共享是指,系統中的資源可供內存中多個併發執行的進程共同使用。由於資源的屬性不同,故多個進程對資源的共享方式也不同,可以分爲:互斥共享方式和同時訪問方式。
  3)虛擬(virtual)
  是指通過技術吧一個物理實體變成若干個邏輯上的對應物。在操作系統中虛擬的實現主要是通過分時的使用方法。顯然,如果n是某一個物理設備所對應的虛擬邏輯設備數,則虛擬設備的速度必然是物理設備速度的1/n。
  4)異步(asynchronism)
  在多道程序設計環境下,允許多個進程併發執行,由於資源等因素的限制,通常,進程的執行並非“一氣呵成”,而是以“走走停停”的方式運行。內存中每個進程在何時執行,何時暫停,以怎樣的方式向前推進,每道程序總共需要多少時間才能完成,都是不可預知的。或者說,進程是以一步的方式運行的。儘管如此,但只要運行環境相同,作業經過多次運行,都會獲得完全相同的結果。
  20.DMA
  直接存儲器訪問(DirectMemoryAccess,DMA)是計算機科學中的一種內存訪問技術。它允許某些計算機內部的硬件子系統(電腦外設),可以獨立地直接讀寫系統存儲器,而不需繞道中央處理器(CPU)。在同等程度的處理器負擔下,DMA是一種快速的數據傳送方式。很多硬件的系統會使用DMA,包含硬盤控制器、繪圖顯卡、網卡和聲卡。
  21.Spooling
  SPOOLing(即外部設備聯機並行操作),即SimultaneousPeripheralOperationOn-Line的縮寫,它是關於慢速字符設備如何與計算機主機交換信息的一種技術,通常稱爲“假脫機技術”。
  22.外存分配的幾種方式,及其優劣。
  1)連續分配
  連續分配:創建文件時,分配一組連續的塊;FAT中每個文件只要一項,說明起始塊和文件的長度。對順序文件有利。
  優點:
  簡單。適用於一次性寫入的操作
  支持順序存取和隨機存取,順序存取速度快
  所需的磁盤尋道次數和尋道時間最少(因爲由於空間的連續性,當訪問下一個磁盤塊時,一般無需移動磁頭,當需要磁頭移動,只需要移動一個磁道。
  缺點:
  文件不能動態增長(可能文件末尾處的空塊已經分配給別的文件)
  不利於文件插入和刪除
  外部碎片問題(反覆增刪文件後),使得很難找到空間大小足夠的連續塊。進行緊縮
  在創建文件時聲明文件的大小。
  2)鏈式分配
  鏈式分配:一個文件的信息存放在若干不連續的物理塊中,各塊之間通過指針連接,前一個物理塊指向下一個物理塊。FAT中每個文件同樣只需要一項,包括文件名、起始塊號和最後塊號。任何一個自由塊都可以加入到鏈中。
  優點:
  提高了磁盤空間利用率,不存在外部碎片問題
  有利於文件插入和刪除
  有利於文件動態擴充
  缺點:
  存取速度慢,一般僅適於對信息的順序存取,不適於隨機存取:查找某一個塊必須從頭開始沿指針進行。
  可靠性問題,如指針出錯;更多的尋道次數和尋道時間
  鏈接指針佔用一定的空間,將多個塊組成簇(cluster),按簇進行分配而不是按塊進行分配(增加了磁盤碎片)。
  3)索引分配
  索引分配:每個文件在FAT中有一個一級索引,索引包含分配給文件的每個分區的入口。文件的索引保存在一個單獨的塊中。FAT中該文件的入口指向這一塊。
  優點:
  保持了鏈接結構的優點,又解決了其缺點:按塊分配可以消除外部碎片,按大小可變的分區分配可以提高局部性。索引分配支持順序訪問文件和直接訪問文件,是普遍採用的一種方式。
  滿足了文件動態增長、插入刪除的要求(只要有空閒塊)
  也能充分利用外存空間
  缺點:
  較多的尋道次數和尋道時間.
  索引表本身帶來了系統開銷,如:內外存空間,存取時間

轉自:http://blog.csdn.net/lv836735240/article/details/39557789

發佈了405 篇原創文章 · 獲贊 67 · 訪問量 118萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章