本文導讀:

一、操作系統常見面試題總結
進程與線程的區別
進程的狀態及其轉換
進程同步與互斥
進程間通信方法
作業(或進程)的調度算法有哪些?
死鎖產生的原因,死鎖產生的必要條件是什么,如何預防死鎖,如何避免死鎖,死鎖定理?
分段式存儲管理、分頁式存儲管理,兩個的區別?
頁面置換算法有哪些?
ThreadLocal與其它同步機制的比較
Linux文件屬性有哪些?(共十位)
makefile文件的作用是什么?
什么是中斷?中斷時CPU做什么工作?
你知道操作系統的內容分為幾塊嗎?什么叫做虛擬內存?他和主存的關系如何?內存管理屬於操作系統的內容嗎?
線程是否具有相同的堆棧?dll是否有獨立的堆棧?
什么是緩沖區溢出?有什么危害?其原因是什么?
二、常見的操作系統使用的文件系統整理
三、內核怎么樣管理你的內存
操作系統常見面試題總結
1. 進程與線程的區別
(1)粒度性分析:線程的粒度小於進程。
(2)調度性分析:進程是資源擁有的基本單位,線程是獨立調度與獨立運行的基本單位,出了寄存器,程序計數器等必要的資源外基本不擁有其他資源。
(3)系統開銷分析:由於線程基本不擁有系統資源,所以在進行切換時,線程切換的開銷遠遠小於進程。
比較 |
進程 |
線程 |
活潑性 |
不活潑(只是線程的容器) |
活潑 |
地址空間 |
系統賦予的獨立的虛擬地址空間(對於32位進程來說,這個地址空間是4GB) |
在進程的地址空間執行代碼。線程只有一個內核對象和一個堆棧,保留的記錄很少,因此所需要的內存也很少。因為線程需要的開銷比進程少 |
調度 |
僅是資源分配的基本單位 |
獨立調度、分派的基本單位 |
並發性 |
僅進程間並發(傳統OS) |
進程間、線程間並發 |
擁有資源 |
資源擁有的基本單位 |
基本上不擁有資源 |
系統開銷 |
創建、撤銷、切換開銷大 |
僅保存少量寄存器內容,開銷小。 |
附注補充:
進程線程的區別聯系如下:
(1)線程是進程的一個實體,一個進程可以擁有多個線程,多個線程也可以並發執行。一個沒有線程的進程也可以看做是單線程的,同樣線程也經常被看做是一種輕量級的進程。並且進程可以不依賴於線程而單獨存在,而線程則不然。
(2)進程是並發程序在一個數據集合上的一次執行過程,進程是系統進行資源分配和調度的獨立單位,線程是進程的實體,它是比進程更小的能夠獨立執行的基本單元,線程自己不擁有任何系統資源,但是它可以訪問其隸屬進程的全部資源。
(3) 與進程的控制表PCB相似,線程也有自己的控制表TCB,但是TCB中所保存的線程狀態比PCB表少得多。
進程的作用與定義:是為了提高CPU的執行效率,為了避免因等待而造成CPU空轉以及其他計算機硬件資源的浪費而提出來的。
線程的引入:例如,有一個Web服務器要進程的方式並發地處理來自不同用戶的網頁訪問請求的話,可以創建父進程和多個子進程的方式來進行處理,但是創建一個進程要花費較大的系統開銷和占用較多的資源。除外,這些不同的用戶子進程在執行的時候涉及到進程上下文切換,上下文切換是一個復雜的過程。所以,為了減少進程切換和創建的開銷,提高執行效率和節省資源,人們在操作系統中引入了"線程(thread)"的概念。
2. 進程的狀態及其轉換
3. 進程同步與互斥的區別
互斥:是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。
同步:是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源。
簡單地說:同步體現的是一種協作性,互斥體現的是一種排他性。
附注補充:
進程同步的主要任務:是對多個相關進程在執行次序上進行協調,以使並發執行的諸進程之間能有效地共享資源和相互合作,從而使程序的執行具有可再現性。
同步機制遵循的原則:
(1)空閑讓進;
(2)忙則等待(保證對臨界區的互斥訪問);
(3)有限等待(有限代表有限的時間,避免死等);
(4)讓權等待(當進程不能進入自己的臨界區時,應該釋放處理機,以免陷入忙等狀態)。
線程同步指多個線程同時訪問某資源時,采用一系列的機制以保證同時最多只能一個線程訪問該資源。線程同步是多線程中必須考慮和解決的問題,因為很可能發生多個線程同時訪問(主要是寫操作)同一資源,如果不進行線程同步,很可能會引起數據混亂,造成線程死鎖等問題。
線程同步的方式:
- 臨界區:通過對多線程的串行化來訪問公共資源或者一段代碼,速度快,適合控制數據訪問
- 互斥量:采用互斥對象機制,只有擁有互斥對象的線程才有訪問公共資源的權限,因為互斥對象只有一個,所以可以保證公共資源不會同時被多個線程訪問
- 信號量:它允許多個線程同一時刻訪問同一資源,但是需要限制同一時刻訪問此資源的最大線程數目。信號量對象對線程的同步方式與前面幾種方法不同,信號允許多個線程同時使用共享資源,這與操作系統中PV操作相似。
- 事件(信號):通過通知操作的方式來保持多線程的同步,還可以方便的實現多線程的優先級比較的操作
根據用戶模式及內核模式下的同步方式的不同,分類及對比如下:
|
內核對象/ 非內核對象 |
含義 |
缺點 |
適用 |
關鍵代碼段(臨界區)CriticalSection |
非內核對象,工作在用戶方式下,為用戶模式對象 |
從程序代碼的角度來控制線程的並發性 |
1.因為在等待進入關鍵代碼段時無法設定超時值,所以其很容易進入死鎖狀態。2.不能跨進程使用。 |
單個進程中線程間的同步(同步速度快) |
事件對象Event |
內核對象 |
所有內核對象中最基本的。 |
速度較慢(相比用戶模式實現線程同步) |
多個進程間的各個線程間實現同步 |
互斥對象Mutex |
內核對象 |
代表對一個資源的獨占式訪問 |
||
信號量 Semaphore |
內核對象 |
使用計數器來控制程序對一個共享資源的訪問 |
由於進程同步產生了一系列經典的同步問題“生產者-消費者”問題,“哲學家進餐”問題,“讀者-寫者”問題。
線程同步不同方式間的總結比較:
- 互斥量與臨界區的作用非常相似,但互斥量是可以命名的,也就是說它可以跨越進程使用。所以創建互斥量需要的資源更多,所以如果只為了在進程內部是用的話使用臨界區會帶來速度上的優勢並能夠減少資源占用量。因為互斥量是跨進程的互斥量一旦被創建,就可以通過名字打開它。
- 互斥量(Mutex),信號燈(Semaphore),事件(Event)都可以被跨越進程使用來進行同步數據操作,而其他的對象與數據同步操作無關,但對於進程和線程來講,如果進程和線程在運行狀態則為無信號狀態,在退出后為有信號狀態。所以可以使用WaitForSingleObject來等待進程和線程退出。
- 通過互斥量可以指定資源被獨占的方式使用,但如果有下面一種情況通過互斥量就無法處理,比如現在一位用戶購買了一份三個並發訪問許可的數據庫系統,可以根據用戶購買的訪問許可數量來決定有多少個線程/進程能同時進行數據庫操作,這時候如果利用互斥量就沒有辦法完成這個要求,信號燈對象可以說是一種資源計數器。
4. 進程間的通信方式有哪些?
(1) 管道( pipe ):管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系。
(2)有名管道 (named pipe) : 有名管道也是半雙工的通信方式,但是它允許無親緣關系進程間的通信。
(3)信號量( semophore ) : 信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作為進程間以及同一進程內不同線程之間的同步手段。
(4) 消息隊列( message queue ) : 消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩沖區大小受限等缺點。
(5)信號 ( sinal ) : 信號是一種比較復雜的通信方式,用於通知接收進程某個事件已經發生。
(6)共享內存( shared memory ) :共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號兩,配合使用,來實現進程間的同步和通信。
(7)套接字( socket ) : 套解口也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同及其間的進程通信。
附注補充:
進程間通訊的方式:
- 管道中還有命名管道和非命名管道之分,非命名管道只能用於父子進程通訊,命名管道可用於非父子進程,命名管道就是FIFO,管道是先進先出的通訊方式。FIFO是一種先進先出的隊列。它類似於一個管道,只允許數據的單向流動。每個FIFO都有一個名字,允許不相關的進程訪問同一個FIFO,因此也成為命名管。
- 消息隊列:是用於兩個進程之間的通訊,首先在一個進程中創建一個消息隊列,然后再往消息隊列中寫數據,而另一個進程則從那個消息隊列中取數據。需要注意的是,消息隊列是用創建文件的方式建立的,如果一個進程向某個消息隊列中寫入了數據之后,另一個進程並沒有取出數據,即使向消息隊列中寫數據的進程已經結束,保存在消息隊列中的數據並沒有消失,也就是說下次再從這個消息隊列讀數據的時候,就是上次的數據!!!
- 信號量, 不能傳遞復雜消息,只能用來同步
- 共享內存,只要首先創建一個共享內存區,其它進程按照一定的步驟就能訪問到這個共享內存區中的數據,當然可讀可寫;
幾種方式的比較:
- 管道:速度慢,容量有限
- 消息隊列:容量受到系統限制,且要注意第一次讀的時候,要考慮上一次沒有讀完數據的問題。
- 信號量:不能傳遞復雜消息,只能用來同步
- 共享內存區:能夠很容易控制容量,速度快,但要保持同步,比如一個進程在寫的時候,另一個進程要注意讀寫的問題,相當於線程中的線程安全,當然,共享內存區同樣可以用作線程間通訊,不過沒這個必要,線程間本來就已經共享了一塊內存的。
5. 作業(或進程)的調度算法有哪些?
(1)先來先服務(FCFS,First-Come-First-Served): 此算法的原則是按照作業到達后備作業隊列(或進程進入就緒隊列)的先后次序來選擇作業(或進程)。
(2)短作業優先(SJF,Shortest Process Next):這種調度算法主要用於作業調度,它從作業后備隊列中挑選所需運行時間(估計值)最短的作業進入主存運行。
(3)時間片輪轉調度算法(RR,Round-Robin):當某個進程執行的時間片用完時,調度程序便停止該進程的執行,並將它送就緒隊列的末尾,等待分配下一時間片再執行。然后把處理機分配給就緒隊列中新的隊首進程,同時也讓它執行一個時間片。這樣就可以保證就緒隊列中的所有進程,在一給定的時間內,均能獲得一時間片處理機執行時間。
(4)高響應比優先(HRRN,Highest Response Ratio Next): 按照高響應比((已等待時間+要求運行時間)/ 要求運行時間)優先的原則,在每次選擇作業投入運行時,先計算此時后備作業隊列中每個作業的響應比RP然后選擇其值最大的作業投入運行。
(5)優先權(Priority)調度算法: 按照進程的優先權大小來調度,使高優先權進程得到優先處理的調度策略稱為優先權調度算法。注意:優先數越多,優先權越小。
(6)多級隊列調度算法:多隊列調度是根據作業的性質和類型的不同,將就緒隊列再分為若干個子隊列,所有的作業(或進程)按其性質排入相應的隊列中,而不同的就緒隊列采用不同的調度算法。
6. 死鎖產生的原因,死鎖產生的必要條件是什么,如何預防死鎖,如何避免死鎖,死鎖定理?
死鎖產生的原因:(1)競爭資源;(2)進程推進順序不當。
死鎖產生的必要條件:
(1)互斥條件:一個資源一次只能被一個進程所使用,即是排它性使用。
(2)不剝奪條件:一個資源僅能被占有它的進程所釋放,而不能被別的進程強占。
(3)請求與保持條件:進程已經保持了至少一個資源,但又提出了新的資源要求,而該資源又已被其它進程占有,此時請求進程阻塞,但又對已經獲得的其它資源保持不放。
(4)環路等待條件:當每類資源只有一個時,在發生死鎖時,必然存在一個進程-資源的環形鏈。
預防死鎖:破壞四個必要條件之一。
死鎖的避免:銀行家算法,該方法允許進程動態地申請資源,系統在進行資源分配之前,先計算資源分配的安全性。若此次分配不會導致系統從安全狀態向不安全狀態轉換,便可將資源分配給進程;否則不分配資源,進程必須阻塞等待。從而避免發生死鎖。
死鎖定理:S為死鎖狀態的充分條件是:尚且僅當S狀態的資源分配圖是不可完全簡化的,該充分條件稱為死鎖定理。
死鎖的解除:
(1)方法1:強制性地從系統中撤消一個或多個死鎖的進程以斷開循環等待鏈,並收回分配給終止進程的全部資源供剩下的進程使用。
(2)方法2:使用一個有效的掛起和解除機構來掛起一些死鎖的進程,其實質是從被掛起的進程那里搶占資源以解除死鎖。
7. 分段式存儲管理、分頁式存儲管理,兩個的區別?
分段式存儲管理:分頁存儲管理是將一個進程的地址(邏輯地址空間)空間划分成若干個大小相等的區域,稱為頁,相應地,將內存空間划分成與頁相同大小(為了保證頁內偏移一致)的若干個物理塊,稱為塊或頁框(頁架)。在為進程分配內存時,將進程中的若干頁分別裝入多個不相鄰接的塊中。
分頁式存儲管理:在分段存儲管理方式中,作業的地址空間被划分為若干個段,每個段是一組完整的邏輯信息,如有主程序段、子程序段、數據段及堆棧段等,每個段都有自己的名字,都是從零開始編址的一段連續的地址空間,各段長度是不等的。
兩者的區別:
1.頁是信息的物理單位,分頁是為了實現非連續的分配,以便解決內存的碎片問題,或者說分頁是為了由於系統管理的需要。
2.頁的大小固定是由系統確定的,將邏輯地址划分為頁號和頁內地址是由機器硬件實現的。而段的長度是不固定的,決定與用戶的程序長度,通常由編譯程序進行編譯時根據信息的性質來划分。
3.分頁式存儲管理的作業地址空間是一維的,分段式的存儲管理的作業管理地址空間是二維的。
8. 頁面置換算法有哪些?
(1)最佳置換算法(Optimal):即選擇那些永不使用的,或者是在最長時間內不再被訪問的頁面置換出去。(它是一種理想化的算法,性能最好,但在實際上難於實現)。
(2)先進先出置換算法FIFO:該算法總是淘汰最先進入內存的頁面,即選擇在內存中駐留時間最久的頁面予以淘汰。
(3)最近最久未使用置換算法LRU(Least Recently Used):該算法是選擇最近最久未使用的頁面予以淘汰,系統在每個頁面設置一個訪問字段,用以記錄這個頁面自上次被訪問以來所經歷的時間T,當要淘汰一個頁面時,選擇T最大的頁面。
(4)Clock置換算法:也叫最近未用算法NRU(Not RecentlyUsed)。該算法為每個頁面設置一位訪問位,將內存中的所有頁面都通過鏈接指針鏈成一個循環隊列。當某頁被訪問時,其訪問位置“1”。在選擇一頁淘汰時,就檢查其訪問位,如果是“0”,就選擇該頁換出;若為“1”,則重新置為“0”,暫不換出該頁,在循環隊列中檢查下一個頁面,直到訪問位為“0”的頁面為止。由於該算法只有一位訪問位,只能用它表示該頁是否已經使用過,而置換時是將未使用過的頁面換出去,所以把該算法稱為最近未用算法。
(5)最少使用置換算法LFU:該算法選擇最近時期使用最少的頁面作為淘汰頁。
9. ThreadLocal與其它同步機制的比較
Threadlocal和其他所有的同步機制都是為了解決多線程中的對同一變量的訪問沖突,在普通的同步機制中,是通過對對象加鎖來實現多個線程對同一變量的安全訪問的。這時該變量是多個線程共享的,使用這種同步機制需要很細致的分析在什么時候對變量進行讀寫,什么時候需要鎖定某個對象,什么時候釋放該對象的索等等。所有這些都是因為多個線程共享了該資源造成的。Threadlocal就從另一個角度來解決多線程的並發訪問,Threadlocal會為每一個線程維護一個和該線程綁定的變量副本,從而隔離了多個線程的數據共享,每一個線程都擁有自己的變量副本,從而也就沒有必要對該變量進行同步了。ThreadLocal提供了線程安全的共享對象,在編寫多線程代碼時,可以把不安全的變量封裝進ThreadLocal。
總結:當然ThreadLocal並不能替代同步機制,兩者面向的問題領域不同。同步機制是為了同步多個線程對相同資源的並發訪問,是為了多個線程之間進行通信的有效方式;而ThreadLocal是隔離多個線程的數據共享,從根本上就不在多個線程之間共享資源(變量),這樣當然不需要對多個線程進行同步了。所以,如果你需要進行多個線程之間進行通信,則使用同步機制;如果需要隔離多個線程之間的共享沖突,可以使用ThreadLocal,這將極大地簡化你的程序,使程序更加易讀、簡潔。
10. Linux文件屬性有哪些?(共十位)
-rw-r--r--那個是權限符號,總共是- --- --- ---這幾個位。
第一個短橫處是文件類型識別符:-表示普通文件;c表示字符設備(character);b表示塊設備(block);d表示目錄(directory);l表示鏈接文件(link);后面第一個三個連續的短橫是用戶權限位(User),第二個三個連續短橫是組權限位(Group),第三個三個連續短橫是其他權限位(Other)。每個權限位有三個權限,r(讀權限),w(寫權限),x(執行權限)。如果每個權限位都有權限存在,那么滿權限的情況就是:-rwxrwxrwx;權限為空的情況就是- --- --- ---。
權限的設定可以用chmod命令,其格式位:chmod ugoa+/-/=rwx filename/directory。例如:
一個文件aaa具有完全空的權限- --- --- ---。
chmod u+rw aaa(給用戶權限位設置讀寫權限,其權限表示為:- rw- --- ---)
chmod g+r aaa(給組設置權限為可讀,其權限表示為:- --- r-- ---)
chmod ugo+rw aaa(給用戶,組,其它用戶或組設置權限為讀寫,權限表示為:- rw- rw- rw-)
如果aaa具有滿權限- rwx rwx rwx。
chmod u-x aaa(去掉用戶可執行權限,權限表示為:- rw- rwx rwx)
如果要給aaa賦予制定權限- rwx r-x r-x,命令為:
chmod u=rwx,go=rx aaa
11 . makefile文件的作用是什么?
一個工程中的源文件不計其數,其按類型、功能、模塊分別放在若干個目錄中。makefile定義了一系列的規則來指定哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至於進行更復雜的功能操作。因為makefile就像一個Shell腳本一樣,其中也可以執行操作系統的命令。makefile帶來的好處就是——“自動化編譯”。一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大地提高了軟件開發的效率。make是一個命令工具,是一個解釋makefile中指令的命令工具。一般來說,大多數的IDE都有這個命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可見,makefile都成為了一種在工程方面的編譯方法。
什么是中斷?中斷時CPU做什么工作?
中斷是指在計算機執行期間,系統內發生任何非尋常的或非預期的急需處理事件,使得CPU暫時中斷當前正在執行的程序而轉去執行相應的事件處理程序。待處理完畢后又返回原來被中斷處繼續執行或調度新的進程執行的過程。
12. 你知道操作系統的內容分為幾塊嗎?什么叫做虛擬內存?他和主存的關系如何?內存管理屬於操作系統的內容嗎?
操作系統的主要組成部分:進程和線程的管理,存儲管理,設備管理,文件管理。虛擬內存是一些系統頁文件,存放在磁盤上,每個系統頁文件大小為4K,物理內存也被分頁,每個頁大小也為4K,這樣虛擬頁文件和物理內存頁就可以對應,實際上虛擬內存就是用於物理內存的臨時存放的磁盤空間。頁文件就是內存頁,物理內存中每頁叫物理頁,磁盤上的頁文件叫虛擬頁,物理頁+虛擬頁就是系統所有使用的頁文件的總和。
13. 線程是否具有相同的堆棧?dll是否有獨立的堆棧?
每個線程有自己的堆棧。
dll是否有獨立的堆棧?這個問題不好回答,或者說這個問題本身是否有問題。因為dll中的代碼是被某些線程所執行,只有線程擁有堆棧。如果dll中的代碼是exe中的線程所調用,那么這個時候是不是說這個dll沒有獨立的堆棧?如果dll中的代碼是由dll自己創建的線程所執行,那么是不是說dll有獨立的堆棧?
以上講的是堆棧,如果對於堆來說,每個dll有自己的堆,所以如果是從dll中動態分配的內存,最好是從dll中刪除;如果你從dll中分配內存,然后在exe中,或者另外一個dll中刪除,很有可能導致程序崩潰。
14. 什么是緩沖區溢出?有什么危害?其原因是什么?
緩沖區溢出是指當計算機向緩沖區內填充數據時超過了緩沖區本身的容量,溢出的數據覆蓋在合法數據上。
危害:在當前網絡與分布式系統安全中,被廣泛利用的50%以上都是緩沖區溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕蟲。而緩沖區溢出中,最為危險的是堆棧溢出,因為入侵者可以利用堆棧溢出,在函數返回時改變返回程序的地址,讓其跳轉到任意地址,帶來的危害一種是程序崩潰導致拒絕服務,另外一種就是跳轉並且執行一段惡意代碼,比如得到shell,然后為所欲為。通過往程序的緩沖區寫超出其長度的內容,造成緩沖區的溢出,從而破壞程序的堆棧,使程序轉而執行其它指令,以達到攻擊的目的。
造成緩沖區溢出的主原因是程序中沒有仔細檢查用戶輸入的參數。
常見的操作系統使用的文件系統整理
文件系統是操作系統用於明確磁盤或分區上的文件的方法和數據結構;即在磁盤上組織文件的方法。也指用於存儲文件的磁盤或分區,或文件系統種類。操作系統中負責管理和存儲文件信息的軟件機構稱為文件管理系統,簡稱文件系統。文件系統由三部分組成:與文件管理有關軟件、被管理文件以及實施文件管理所需數據結構。從系統角度來看,文件系統是對文件存儲器空間進行組織和分配,負責文件存儲並對存入的文件進行保護和檢索的系統。具體地說,它負責為用戶建立文件,存入、讀出、修改、轉儲文件,控制文件的存取,當用戶不再使用時撤銷文件等。
【FAT】:
常PC機使用的文件系統是FAT16。像基於MS-DOS,Win 95等系統都采用了FAT16文件系統。在Win 9X下,FAT16支持的分區最大為2GB。我們知道計算機將信息保存在硬盤上稱為“簇”的區域內。使用的簇越小,保存信息的效率就越高。在FAT16的情況下,分區越大簇就相應的要大,存儲效率就越低,勢必造成存儲空間的浪費。並且隨着計算機硬件和應用的不斷提高,FAT16文件系統已不能很好地適應系統的要求。在這種情況下,推出了增強的文件系統FAT32。同FAT16相比,FAT32主要具有以下特點:
1、同FAT16相比FAT32最大的優點是可以支持的磁盤大小達到32G,但是不能支持小於512MB的分區。
*基於FAT32的Win 2000可以支持分區最大為32GB;而基於 FAT16的Win 2000支持的分區最大為4GB。
2、由於采用了更小的簇,FAT32文件系統可以更有效率地保存信息。如兩個分區大小都為2GB,一個分區采用了FAT16文件系統,另一個分區采用了FAT32文件系統。采用FAT16的分區的簇大小為32KB,而FAT32分區的簇只有4KB的大小。這樣FAT32就比FAT16的存儲效率要高很多,通常情況下可以提高15%。
3、FAT32文件系統可以重新定位根目錄和使用FAT的備份副本。另外FAT32分區的啟動記錄被包含在一個含有關鍵數據的結構中,減少了計算機系統崩潰的可能性。
【NTFS】:
NTFS文件系統是一個基於安全性的文件系統,是Windows NT所采用的獨特的文件系統結構,它是建立在保護文件和目錄數據基礎上,同時照顧節省存儲資源、減少磁盤占用量的一種先進的文件系統。使用非常廣泛的Windows NT 4.0采用的就是NTFS 4.0文件系統,相信它所帶來的強大的系統安全性一定給廣大用戶留下了深刻的印象。Win 2000采用了更新版本的NTFS文件系統??NTFS 5.0,它的推出使得用戶不但可以像Win 9X那樣方便快捷地操作和管理計算機,同時也可享受到NTFS所帶來的系統安全性。
NTFS 5.0的特點主要體現在以下幾個方面:
1、NTFS可以支持的分區(如果采用動態磁盤則稱為卷)大小可以達到2TB。而Win 2000中的FAT32支持分區的大小最大為32GB。
2、NTFS是一個可恢復的文件系統。在NTFS分區上用戶很少需要運行磁盤修復程序。NTFS通過使用標准的事物處理日志和恢復技術來保證分區的一致性。發生系統失敗事件時,NTFS使用日志文件和檢查點信息自動恢復文件系統的一致性。
3、NTFS支持對分區、文件夾和文件的壓縮。任何基於Windows的應用程序對NTFS分區上的壓縮文件進行讀寫時不需要事先由其他程序進行解壓縮,當對文件進行讀取時,文件將自動進行解壓縮;文件關閉或保存時會自動對文件進行壓縮。
4、NTFS采用了更小的簇,可以更有效率地管理磁盤空間。在Win 2000的FAT32文件系統的情況下,分區大小在2GB~8GB時簇的大小為4KB;分區大小在8GB~16GB時簇的大小為8KB;分區大小在16GB~32GB時,簇的大小則達到了16KB。而Win 2000的NTFS文件系統,當分區的大小在2GB以下時,簇的大小都比相應的FAT32簇小;當分區的大小在2GB以上時(2GB~2TB),簇的大小都為4KB。相比之下,NTFS可以比FAT32更有效地管理磁盤空間,最大限度地避免了磁盤空間的浪費。
5、在NTFS分區上,可以為共享資源、文件夾以及文件設置訪問許可權限。許可的設置包括兩方面的內容:一是允許哪些組或用戶對文件夾、文件和共享資源進行訪問;二是獲得訪問許可的組或用戶可以進行什么級別的訪問。訪問許可權限的設置不但適用於本地計算機的用戶,同樣也應用於通過網絡的共享文件夾對文件進行訪問的網絡用戶。與FAT32文件系統下對文件夾或文件進行訪問相比,安全性要高得多。另外,在采用NTFS格式的Win 2000中,應用審核策略可以對文件夾、文件以及活動目錄對象進行審核,審核結果記錄在安全日志中,通過安全日志就可以查看哪些組或用戶對文件夾、文件或活動目錄對象進行了什么級別的操作,從而發現系統可能面臨的非法訪問,通過采取相應的措施,將這種安全隱患減到最低。這些在FAT32文件系統下,是不能實現的。
6、在Win 2000的NTFS文件系統下可以進行磁盤配額管理。磁盤配額就是管理員可以為用戶所能使用的磁盤空間進行配額限制,每一用戶只能使用最大配額范圍內的磁盤空間。設置磁盤配額后,可以對每一個用戶的磁盤使用情況進行跟蹤和控制,通過監測可以標識出超過配額報警閾值和配額限制的用戶,從而采取相應的措施。磁盤配額管理功能的提供,使得管理員可以方便合理地為用戶分配存儲資源,避免由於磁盤空間使用的失控可能造成的系統崩潰,提高了系統的安全性。
7、NTFS使用一個“變更”日志來跟蹤記錄文件所發生的變更。
【Ext2】:
Ext2是 GNU/Linux 系統中標准的文件系統,其特點為存取文件的性能極好,對於中小型的文件更顯示出優勢,這主要得利於其簇快取層的優良設計。
其單一文件大小與文件系統本身的容量上限與文件系統本身的簇大小有關,在一般常見的 x86 電腦系統中,簇最大為 4KB,則單一文件大小上限為 2048GB,而文件系統的容量上限為 16384GB。
但由於目前核心 2.4 所能使用的單一分割區最大只有 2048GB,實際上能使用的文件系統容量最多也只有 2048GB。
至於Ext3文件系統,它屬於一種日志文件系統,是對ext2系統的擴展。它兼容ext2,並且從ext2轉換成ext3並不復雜。
【Ext3】:
Ext3是一種日志式文件系統,是對ext2系統的擴展,它兼容ext2。日志式文件系統的優越性在於:由於文件系統都有快取層參與運作,如不使用時必須將文件系統卸下,以便將快取層的資料寫回磁盤中。因此每當系統要關機時,必須將其所有的文件系統全部shutdown后才能進行關機。
如果在文件系統尚未shutdown前就關機 (如停電) 時,下次重開機后會造成文件系統的資料不一致,故這時必須做文件系統的重整工作,將不一致與錯誤的地方修復。然而,此一重整的工作是相當耗時的,特別是容量大的文件系統,而且也不能百分之百保證所有的資料都不會流失。
為了克服此問題,使用所謂‘日志式文件系統 (Journal File System) ’。此類文件系統最大的特色是,它會將整個磁盤的寫入動作完整記錄在磁盤的某個區域上,以便有需要時可以回溯追蹤。
由於資料的寫入動作包含許多的細節,像是改變文件標頭資料、搜尋磁盤可寫入空間、一個個寫入資料區段等等,每一個細節進行到一半若被中斷,就會造成文件系統的不一致,因而需要重整。
然而,在日志式文件系統中,由於詳細紀錄了每個細節,故當在某個過程中被中斷時,系統可以根據這些記錄直接回溯並重整被中斷的部分,而不必花時間去檢查其他的部分,故重整的工作速度相當快,幾乎不需要花時間。
【Ext4】:
Linux kernel 自 2.6.28 開始正式支持新的文件系統 Ext4。Ext4 是 Ext3 的改進版,修改了 Ext3 中部分重要的數據結構,而不僅僅像 Ext3 對 Ext2 那樣,只是增加了一個日志功能而已。Ext4 可以提供更佳的性能和可靠性,還有更為豐富的功能:
1、與 Ext3 兼容。執行若干條命令,就能從 Ext3 在線遷移到 Ext4,而無須重新格式化磁盤或重新安裝系統。原有 Ext3 數據結構照樣保留,Ext4 作用於新數據,當然,整個文件系統因此也就獲得了 Ext4 所支持的更大容量。
2、更大的文件系統和更大的文件。較之 Ext3 目前所支持的最大 16TB 文件系統和最大 2TB 文件,Ext4 分別支持 1EB(1,048,576TB, 1EB=1024PB, 1PB=1024TB)的文件系統,以及 16TB 的文件。
3、無限數量的子目錄。Ext3 目前只支持 32,000 個子目錄,而 Ext4 支持無限數量的子目錄。
4、Extents。Ext3 采用間接塊映射,當操作大文件時,效率極其低下。比如一個 100MB 大小的文件,在 Ext3 中要建立 25,600 個數據塊(每個數據塊大小為 4KB)的映射表。而 Ext4 引入了現代文件系統中流行的 extents 概念,每個 extent 為一組連續的數據塊,上述文件則表示為“該文件數據保存在接下來的 25,600 個數據塊中”,提高了不少效率。
5、多塊分配。當寫入數據到 Ext3 文件系統中時,Ext3 的數據塊分配器每次只能分配一個 4KB 的塊,寫一個 100MB 文件就要調用 25,600 次數據塊分配器,而 Ext4 的多塊分配器“multiblock allocator”(mballoc) 支持一次調用分配多個數據塊。
6、延遲分配。Ext3 的數據塊分配策略是盡快分配,而 Ext4 和其它現代文件操作系統的策略是盡可能地延遲分配,直到文件在 cache 中寫完才開始分配數據塊並寫入磁盤,這樣就能優化整個文件的數據塊分配,與前兩種特性搭配起來可以顯著提升性能。
7、快速 fsck。以前執行 fsck 第一步就會很慢,因為它要檢查所有的 inode,現在 Ext4 給每個組的 inode 表中都添加了一份未使用 inode 的列表,今后 fsck Ext4 文件系統就可以跳過它們而只去檢查那些在用的 inode 了。
8、日志校驗。日志是最常用的部分,也極易導致磁盤硬件故障,而從損壞的日志中恢復數據會導致更多的數據損壞。Ext4 的日志校驗功能可以很方便地判斷日志數據是否損壞,而且它將 Ext3 的兩階段日志機制合並成一個階段,在增加安全性的同時提高了性能。
9、“無日志”(No Journaling)模式。日志總歸有一些開銷,Ext4 允許關閉日志,以便某些有特殊需求的用戶可以借此提升性能。
10、在線碎片整理。盡管延遲分配、多塊分配和 extents 能有效減少文件系統碎片,但碎片還是不可避免會產生。Ext4 支持在線碎片整理,並將提供 e4defrag 工具進行個別文件或整個文件系統的碎片整理。
11、inode 相關特性。Ext4 支持更大的 inode,較之 Ext3 默認的 inode 大小 128 字節,Ext4 為了在 inode 中容納更多的擴展屬性(如納秒時間戳或 inode 版本),默認 inode 大小為 256 字節。Ext4 還支持快速擴展屬性(fast extended attributes)和 inode 保留(inodes reservation)。
12、持久預分配(Persistent preallocation)。P2P 軟件為了保證下載文件有足夠的空間存放,常常會預先創建一個與所下載文件大小相同的空文件,以免未來的數小時或數天之內磁盤空間不足導致下載失敗。Ext4 在文件系統層面實現了持久預分配並提供相應的 API(libc 中的 posix_fallocate()),比應用軟件自己實現更有效率。
13、默認啟用 barrier。磁盤上配有內部緩存,以便重新調整批量數據的寫操作順序,優化寫入性能,因此文件系統必須在日志數據寫入磁盤之后才能寫 commit 記錄,若 commit 記錄寫入在先,而日志有可能損壞,那么就會影響數據完整性。Ext4 默認啟用 barrier,只有當 barrier 之前的數據全部寫入磁盤,才能寫 barrier 之后的數據。(可通過 “mount -o barrier=0” 命令禁用該特性。)
【ZFS】:
ZFS源自於Sun Microsystems為Solaris操作系統開發的文件系統。ZFS是一個具有高存儲容量、文件系統與卷管理概念整合、嶄新的磁盤邏輯結構的輕量級文件系統,同時也是一個便捷的存儲池管理系統。ZFS是一個使用CDDL協議條款授權的開源項目。
【HFS】:
1、HFS文件系統概念
分層文件系統(Hierarchical File System,HFS)是一種由蘋果電腦開發,並使用在Mac OS上的文件系統。最初被設計用於軟盤和硬盤,同時也可以在在只讀媒體如CD-ROM上見到。
2、HFS文件系統開發過程
HFS首次出現在1985年9月17日,作為Macintosh電腦上新的文件系統。它取代只用於早期Mac型號所使用的平面文件系統Macintosh File System(MFS)。因為Macintosh電腦所產生的數據,比其它通常的文件系統,如DOS使用的FAT或原始Unix文件系統所允許存儲的數據更多。蘋果電腦開發了一種新式更適用的文件系統,而不是采用現有的規格。例如,HFS允許文件名最多有31個字符的長度,支持metadata和雙分支(每個文件的數據和資源支分開存儲)文件。
盡管HFS象其它大多數文件系統一樣被視為專有的格式,因為只有它為大多數最新的操作系統提供了很好的通用解決方法以存取HFS格式磁盤。
在1998年,蘋果電腦發布了HFS Plus,其改善了HFS對磁盤空間的地址定位效率低下,並加入了其它的改進。當前版本的Mac OS仍舊支持HFS,但從Mac OS X開始HFS卷不能作為啟動用。
3、構成方式
分層文件系統把一個卷分為許多512字節的“邏輯塊”。這些邏輯塊被編組為“分配塊”,這些分配塊可以根據卷的尺寸包含一個或多個邏輯塊。HFS對地址分配塊使用16位數值,分配塊的最高限制數量是65536。
組成一個HFS卷需要下面的五個結構:
1)卷的邏輯塊0和1是啟動塊,它包含了系統啟動信息。例如,啟動時載入的系統名稱和殼(通常是Finder)文件。
2)邏輯塊2包含主目錄塊(Master Directory Block,簡稱MDB)。
3)邏輯塊3是卷位圖(Volume Bitmap)的啟動塊,它追蹤分配塊使用狀態。
4)總目錄文件(Catalog File)是一個包含所有文件的記錄和儲存在卷中目錄的B*-tree。
5)擴展溢出文件(Extent Overflow File)是當最初總目錄文件中三個擴展占用后,另外一個包含額外擴展記錄的分配塊對應信息的B*-tree。
內核怎樣管理你的內存
在分析了進程的虛擬地址布局,我們轉向內核以及他管理用戶內存的機制。下圖是gonzo的例子:
Linux進程在內核中是由task_struct進程描述符實現的,task_struct的mm字段指向內存描述符mm_struct,他是進程的一個內存執行摘要。如上圖所示,mm_struct存儲了內存各個段的開始和結束地址、進程所使用的內存頁面數(rss代表常駐集合大小)、使用的虛擬地址空間總數等等。在內存描述符中我們也可以找到兩個用於管理進程內層的字段:虛擬內存集合和頁表。Gonzo的內存區域如下圖:
每個虛擬內存區域(VMA)是一個虛擬地址空間上連續的區域;這些區域不會彼此覆蓋。Vm_area_struct結構描述了一個內存區域,包括他的開始和技術地址、flags字段指定了他的行為和訪問權限,vm_file字段指定了該區域映射的實際文件。一個沒有映射文件的VMA成為匿名的。除了內存映射段以外,上面的每個內存段(堆、棧等等)相當於一個單獨的VMA。這不是必須的,盡管在x86機器上通常是這樣。VMA不會關心他在哪個段里面。
一個進程的所有VMA以兩種方式存儲在他的內存描述符中,一種是以鏈表的方式存放在mmap字段,以開始虛擬地址進行了排序,另一種是以紅黑樹的方式存放,mm_rb字段為這顆紅黑樹的根。紅黑樹可以讓內核根據給定的虛擬地址快速地找到內存區域。當我們讀取文件/proc/pid_of_process/maps,內核僅僅是通過進程VMA的鏈接同時打印出每一個。
本文參考:操作系統常見面試題總結