程序員的自我修養——操做系統篇

操做系統是管理計算機硬件與軟件資源的計算機程序,同時也是計算機系統的內核與基石。操做系統須要處理管理與配置內存、決定系統資源供需的優先次序、控制輸入與輸出設備、操做網絡與管理文件系統等基本事務。操做系統也提供一個讓用戶與系統交互的操做界面。   html

操做系統上運行的計算機程序一般由一個或一組進程組成。所以,本文便從進程開始提及!   linux

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

程序員的自我修養(1)——操做系統篇 - 第1張  | 快課網

如上圖所示,進程包括三種狀態:就緒態、運行態和阻塞態。詳細說明以下:   程序員

注意:建立和退出不是進程的狀態。阻塞也叫等待,等待和就緒的區別:等待是等待除CPU之外的資源,而就緒等待的是CPU資源。   web

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、先來先服務和短做業(進程)優先調度算法   

1.先來先服務調度算法。先來先服務(FCFS)調度算法是一種最簡單的調度算法,該算法既可用於做業調度,也可用於進程調度。FCFS算法比較有利於長做業(進程),而不利於短做業(進程)。由此可知,本算法適合於CPU繁忙型做業,而不利於I/O繁忙型的做業(進程)。  

2.短做業(進程)優先調度算法。短做業(進程)優先調度算法(SJ/PF)是指對短做業或短進程優先調度的算法,該算法既可用於做業調度,也可用於進程調度。但其對長做業不利;不能保證緊迫性做業(進程)被及時處理;做業的長短只是被估算出來的。   

2、高優先權優先調度算法   

1.優先權調度算法的類型。爲了照顧緊迫性做業,使之進入系統後便得到優先處理,引入了最高優先權優先(FPF)調度算法。此算法常被用在批處理系統中,做爲做業調度算法,也做爲多種操做系統中的進程調度,還能夠用於實時系統中。當其用於做業調度,將後備隊列中若干個優先權最高的做業裝入內存。當其用於進程調度時,把處理機分配給就緒隊列中優先權最高的進程,此時,又能夠進一步把該算法分紅如下兩種:   

1) 非搶佔式優先權算法   

2) 搶佔式優先權調度算法(高性能計算機操做系統)   

2.優先權類型   

對於最高優先權優先調度算法,其核心在於:它是使用靜態優先權仍是動態優先權,以及如何肯定進程的優先權。   

3.高響應比優先調度算法   

爲了彌補短做業優先算法的不足,咱們引入動態優先權,使做業的優先等級隨着等待時間的增長而以速率a提升。該優先權變化規律可描述爲:優先權=(等待時間+要求服務時間)/要求服務時間;即=(響應時間)/要求服務時間   

3、基於時間片的輪轉調度算法   

1.時間片輪轉法。時間片輪轉法通常用於進程調度,每次調度,把CPU分配隊首進程,並令其執行一個時間片。當執行的時間片用完時,由一個記時器發出一個時鐘中斷請求,該進程被中止,並被送往就緒隊列末尾;依次循環。   

2.多級反饋隊列調度算法多級反饋隊列調度算法多級反饋隊列調度算法,沒必要事先知道各類進程所須要執行的時間,它是目前被公認的一種較好的進程調度算法。其實施過程以下:   

1) 設置多個就緒隊列,併爲各個隊列賦予不一樣的優先級。在優先權越高的隊列中,爲每一個進程所規定的執行時間片就越小。   

2) 當一個新進程進入內存後,首先放入第一隊列的末尾,按FCFS原則排隊等候調度。若是他能在一個時間片中完成,即可撤離;若是未完成,就轉入第二隊列的末尾,在一樣等待調度……如此下去,當一個長做業(進程)從第一隊列依次將到第n隊列(最後隊列)後,便按第n隊列時間片輪轉運行。   

3) 僅當第一隊列空閒時,調度程序才調度第二隊列中的進程運行;僅當第1到第(i-1)隊列空時,纔會調度第i隊列中的進程運行,並執行相應的時間片輪轉。   

4) 若是處理機正在處理第i隊列中某進程,又有新進程進入優先權較高的隊列,則此新隊列搶佔正在運行的處理機,並把正在運行的進程放在第i隊列的隊尾。   

11.Windows內存管理的方式(塊式、頁式、段式、段頁式).   

1) 塊式管理   

把主存分爲一大塊、一大塊的,當所需的程序片段不在主存時就分配一塊主存空間,把程序片段載入主存,就算所需的程序片度只有幾個字節也只能把這一塊分配給它。這樣會形成很大的浪費,但時易於管理。   

2) 頁式管理   

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

3) 段式管理  

把主存分爲一段一段的,每一段的空間又要比一頁一頁的空間小不少,這種方法在空間利用率上又比頁式管理高不少,可是也有另一個缺點。一個程序片段可能會被分爲幾十段,這樣不少時間就會被浪費在計算每一段的物理地址上(計算機最耗時間的你們都知道是I/O吧)。   

4) 段頁式管理。(如今經常使用)   

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

12.內存連續分配方式採用的幾種算法及各自優劣。   

內存的連續分配方式有:單一連續分配、固定分區分配、動態分區分配以及動態重定位分區分配四種方式。   1) 單一連續分配:只能用於單用戶、單任務的操做系統中。   

2) 固定分區分配:可運行多道程序的存儲管理方式。   

3) 動態分區分配:根據進程的實際須要,動態地爲之分配內存空間。   

4) 可重定位分區分配:必須把一個系統或用戶程序裝入一連續的內存空間。   

13.動態連接及靜態連接。   

1) 靜態連接就是在編譯連接時直接將須要的執行代碼拷貝到調用處,優勢就是在程序發佈的時候就不須要的依賴庫,也就是再也不須要帶着庫一塊發佈,程序能夠獨立執行,可是體積可能會相對大一些。   

2) 動態連接就是在編譯的時候不直接拷貝可執行代碼,而是經過記錄一系列符號和參數,在程序運行或加載時將這些信息傳遞給操做系統,操做系統負責將須要的動態庫加載到內存中,而後程序在運行到指定的代碼時,去共享執行內存中已經加載的動態庫可執行代碼,最終達到運行時鏈接的目的。優勢是多個程序能夠共享同一段代碼,而不須要在磁盤上存儲多個拷貝,缺點是因爲是運行時加載,可能會影響程序的前期執行性能。   

14.基本分頁、請求分頁儲存管理方式。   

基本分頁儲存管理方式具備以下特徵:   

1) 一次性。要求將做業所有裝入內存後方能運行。許多做業在每次運行時,並不是其所有程序和數據都要用到。若是一次性地裝入其所有程序,形成內存空間的浪費。   

2) 駐留性。做業裝入內存後,便一直駐留在內存中,直至做業運行結束。儘管運行中的進程會因I/O而長期等待,或有的程序模塊在運行過一次後就再也不須要(運行)了,但它們都仍將繼續佔用寶貴的內存資源。   

請求分頁儲存管理是實現虛擬存儲器的一種經常使用方式,它是在基本分頁儲存管理的基礎上實現的。其基本思想是:在進程開始運行以前,僅裝入當前要執行的部分頁面便可運行;在執行過程當中,可以使用請求調入中斷動態裝入要訪問但又不在內存的頁面;當內存空間已滿,而又須要裝入新的頁面時,者根據置換功能適當調出某個頁面,以便騰出空間而裝入新的頁面。爲實現請求分頁,須要必定的硬件支持,包括:頁表機制、缺頁中斷機構、地址變換機構。   

15.基本分段、請求分段儲存管理方式。(略)   

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

分段和分頁其實都是一種對地址的劃分或者映射的方式。二者的區別主要有如下幾點:   

1) 頁是信息的物理單位,分頁是爲實現離散分配方式,以消減內存的外零頭,提升內存的利用率;或者說,分頁僅僅是因爲系統管理的須要,而不是用戶的須要(也是對用戶透明的)。段是信息的邏輯單位,它含有一組其意義相對完整的信息(好比數據段、代碼段和堆棧段等)。分段的目的是爲了能更好的知足用戶的須要(用戶也是可使用的)。   

2) 頁的大小固定且由系統肯定,把邏輯地址劃分爲頁號和頁內地址兩部分,是由機器硬件實現的,於是一個系統只能有一種大小的頁面。段的長度卻不固定,決定於用戶所編寫的程序,一般由編輯程序在對源程序進行編輯時,根據信息的性質來劃分。   

3) 分頁的做業地址空間是維一的,即單一的線性空間,程序員只須利用一個記憶符(線性地址的16進製表示),便可表示一地址。分段的做業地址空間是二維的,程序員在標識一個地址時,既需給出段名(好比數據段、代碼段和堆棧段等),又需給出段內地址。   

4) 頁和段都有存儲保護機制。但存取權限不一樣:段有讀、寫和執行三種權限;而頁只有讀和寫兩種權限。   

17.幾種頁面置換算法。   

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

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

優勢:   

  • 保持了連接結構的優勢,又解決了其缺點:按塊分配能夠消除外部碎片,按大小可變的分區分配能夠提升局部性。索引分配支持順序訪問文件和直接訪問文件,是廣泛採用的一種方式。   

  • 知足了文件動態增加、插入刪除的要求(只要有空閒塊)   

  • 也能充分利用外存空間   

缺點:   

  • 較多的尋道次數和尋道時間.   

  • 索引表自己帶來了系統開銷,如:內外存空間,存取時間

相關文章
相關標籤/搜索