操作系統總結

from:http://www.cnblogs.com/yinluhui0229/archive/2011/05/30/2063607.html

http://my.oschina.net/pangyangyang/blog/188507


第一章 操作系統引論

  1. 系統的目標:有效性(提高資源利用率和系統吞吐量)、方便性、可擴充性、開放性。
  2. 有效性方便性是操作系統最重要兩個目標。
  3. 操作系統的作用:

(1)     OS作爲用戶與計算機硬件系統之間的接口

(2)     OS作爲計算機系統資源的管理者(處理器、存儲器、I/O設備、數據程序)

(3)      OS實現了對計算機資源的抽象(在硬件上覆蓋I/O設備、文件和窗口管理軟件,即虛擬機)

  1. OS的發展過程:無操作系統的計算機系統→單道批處理系統→多道批處理系統→分時系統→實時系統→微機操作系統
  2. 操作系統的基本特徵:

(1)     併發性(兩個或多個事件在同一時間間隔內發生;進入進程和線程)

(2)     共享性(系統中資源可供內存中多個併發執行的進程(線程)共同使用,方式爲互斥共享方式和同時訪問方式

(3)     虛擬性(通過某種技術把一個物理實體變爲若干個邏輯上的對應物。方式:時分複用技術和空分複用技術

(4)     異步性(進程以不可預知的速度向前推進,多道程序設計固有的特點)

  1. OS的主要功能:

(1)     處理機管理(進程管理)功能;(主要包括創建和撤銷進程、協調諸進程的運行、實現進程間信息交換、把處理機分配給進程。進程同步機制功能是協調多個進程的運行,分爲競爭和協作兩種方式,實現進程同步常用的及時是信號量機制。調度包括作業調度和進程調度兩步。)

(2)     存儲器管理功能;(內存分配、內存保護、地址映射和內存擴充等功能。內存分配有動態和靜態兩方式。內容擴充的功能是請求調入和置換

(3)     設備管理功能(緩衝管理、設備分配、設備處理和虛擬設備。緩衝管理包括單、雙、公用緩衝機制。設備處理的人物是實現CPU和設備控制器之間的通信)

(4)     文件管理功能;(文件存儲空間管理、目錄管理、文件讀寫管理、共享保護功能)

(5)     操作系統與用戶之間的接口;(用戶接口和程序接口)

第二章 進程管理

  1. 進程與線程的基本概念

1)         進程是爲了使多個程序能併發執行,以提高資源利用率和系統吞吐量。

2)         線程是爲了減少程序在併發執行時所付出的空間開銷,是OS具有更好的併發性。

  1. 進程和線程的區別

1)         調度:線程作爲調度和分派的基本單位;進程作爲資源擁有的基本單位。

2)         併發性:進程之間可以併發執行,進程中的諸線程之間也可併發執行。

3)         擁有資源:進程擁有資源,線程無資源,但可以訪問所屬進程的資源

4)         系統開銷:創建可撤銷進程的代價比創建和撤銷線程的代價大的多。

  1. 前趨圖是描述進程之間執行的前後關係的。
  2. 進程的特徵:

1)         結構特徵;由程序段、相關的數據項和PCB三部分構成了進程實體。

2)         動態性;指從創建、調度執行到撤銷的過程是動態的。

3)         併發性;

4)         獨立性;因爲有PCB,可以獨立運行、獨立分配資源、獨立接受調度等功能

5)         異步性;各進程按各自獨立、不可預知的速度向前推進。

  1. 進程的三種基本狀態:

1)         就緒狀態;處CPU外,已佔有其他必要的資源的進程

2)         執行狀態;

3)         阻塞狀態;因事故是正在執行的進程停止,並讓出CPU。

  1. 信號量機制是一種卓有成效的進程同步工具。包括整形信號量、記錄型信號量、AND型信號量、信號量集。

第三章 處理機調度與死鎖

  1. 批量型作業通常需要經歷作業調度(高級調度或長程調度)和進程調度(低級調度和短程調度)兩個過程後方能獲得處理機。
  2. 處理機調度層次

1)         高級調度:把外存上處於後備隊列中的那些作業調入內存。

2)         低級調度:它決定就緒隊列中的哪個進程將獲得處理機,然後由分派程序執行把處理機分配給該進程的操作。對象是進程。功能是:保存處理機現場信息(PCB);按某種算法選取進程;把處理器分配給進程。方式分爲非搶佔方式和搶佔方式。

3)         中級調度:內存中不能有太多的進程,把進程從內存移到外存,當內存有足夠空間時,再將合適的進程換入內存,等待進程調度。目的是提高內存利用率和系統吞吐量。

  1. 死鎖:多個進程在運行過程中因爭奪資源而造成的一種僵局。

活鎖:多個進程在運行工程中因相互謙讓而造成的一種僵局。

  1. 產生死鎖的原因

1)         競爭資源

2)         進程間推進順序非法

  1. 產生死鎖的必要條件

1)         互斥條件:臨界資源的互斥訪問

2)         請求和保持條件:佔着自己的資源不放,又去請求別人的

3)         不剝奪條件:進程沒有完成則不是放佔有的資源

4)         環路等待條件:發生死鎖指必然存在一個資源環形鏈。

  1. 處理死鎖的基本方法

1)         預防死鎖

2)         避免死鎖

3)         檢測和解除死鎖

  1. 安全序列:是指系統能夠找到一個進程順序(P1、P2……Pn),來爲每個進程Pi分配所需資源,知道滿足每個進程的最大需求,是每個進程能夠順利完成,則P1、P2……Pn即爲安全狀態。
  2. 用資源分配圖對死鎖進行檢測,消去途中的所有邊,若節點爲孤立節點,則爲可完全簡化。
  3. 死鎖的解除

1)         剝奪資源:從其他進程剝奪足夠數量的資源給死鎖進程,以解除死鎖狀態

2)         撤銷進程:一種方法是夭折全部進程;另一種方法是按某個順序逐個撤銷進程,知道死鎖狀態被解除。

第四章 存儲器管理

  1. 連續分配方式:一個用戶程序分配一個連續的內存空間

1)         單一連續分配:一個程序裝入其他程序就不允許被裝入。只是用於單用戶單任務的OS中。

2)         固定分區分配:把內存分爲若干個固定大小的區域,每個分區裝入一個作業,允許併發執行。

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

4)         動態重定位分區分配:通過重定位寄存器把相對地址轉化成物理地址,此轉化過程是在程序執行期間,隨着每條指令或數據的訪問自動進行的,故稱爲動態重定位。

  1. 分區分配算法

1)         首次適應算法(以地址遞增次序訪問)

2)         循環首次適應算法(從上一次分配處開始查找)

3)         最佳適應算法(小內存到大內存依次查找)

4)         最壞適應算法(每次分配從大內存開始割讓)

5)         快速適應算法(對空閒分區進行分類,並建立索引表,選最適合的控件分配給請求的進程)

  1. 對換:把暫時不運行的程序調到外存,需要時再調到內存。
  2. 地址變換機制:將用戶地址空間中的邏輯地址變換爲內存空間中的物理地址。
  3. 引入分段存儲管理方式的目的,則主要是爲了滿足用戶在編程和使用上多方面的要求。
  4. 段表是用於實現從邏輯段到物理內存區的映射。
  5. 分頁和分段的主要區別

1)         兩者都採用離散分配方式,且都要通過地址應設機構來實現地址變換。

2)         頁是信息的物理單位,分頁是爲了有效的管理內存;段是邏輯單位,分段是爲了維護信息完整性和獨立性。

3)         頁的大小固定且由系統決定,段的長度不固定,決定於用戶編寫的程序。

4)         分頁的作業地址空間是一維的,而分段的作業地址空間是二維的。

  1. 段頁式存儲管理方式的原理:分段和分頁相結合,先將用戶程序分成若干個段,再把每個段分成若干個頁,併爲每個段賦予一個段名。其地質結構由段號、段內頁號和頁內地址組成。
  2. 頁面置換算法有:最佳置換算法、先進先出置換算法、最近最久未使用置換算法、Clock置換算法。

第五章 設備管理

  1. I/O系統是用於實現數據輸入、輸出及數據存儲的系統。
  2. I/O設備類型:

1)         特性:存儲設備;輸入/輸出設備。

2)         傳輸速率:低速設備;中速設備;高速設備。

3)         信息交換的單位分類:塊設備;字符設備。

4)         共享屬性:獨佔設備;共享設備;虛擬設備。

  1. 設備與控制器之間的接口:

1)         數據信號線:設備和設備控制器之間傳送數據信號

2)         控制信號線:設備控制器向I/O設備發送控制信號的通路

3)         狀態信號線:傳送指示設備當前狀態的信號。

  1. 設備控制器

主要職責是控制一個或多個I/O設備,以實現I/O設備和計算機之間的數據交換。是CPU和I/O設備的接口,他接受CPU指令去控制I/O設備工作,使減輕處理機的工作量。

設備控制器包括控制字符設備控制器控制塊設備的控制器

  1. 設備控制器的基本功能

1)         接受和識別命令

2)         數據交換

3)         標識和報告設備的狀態

4)         地址識別(CPU通過地質控制設備)

5)         數據緩衝

6)         差錯控制

  1. I/O通道是一種特殊的處理機,它具有執行I/O指令的能力,可以控制I/O操作。類型分爲:字節多路通道、數組選擇通道、數組多路通道。
  2. 解決“瓶頸”問題的最有效的方法是增加設備到主機間的通路而不增加通道。
  3. I/O控制方式

1)         程序I/O方式

2)         中斷驅動I/O控制方式

3)         直接存儲器訪問(DMA)I/O控制方式

4)         I/O通道控制方式

  1. SPOOLing技術

通過SPOOLing技術便可將一臺物理I/O設備虛擬爲多臺邏輯I/O設備,同樣允許多個用戶共享一臺物理I/O設備。

  1. Spooling系統的組成

輸入井和輸入井;輸入緩衝區和輸出緩衝區;輸入進程和輸出進程。

  1. SPOOLing系統的特點

1)         提高了I/O的速度

2)         將獨佔設備改造爲共享設備

3)         實現了虛擬設備功能

  1. 磁盤調度

磁盤調度的主要目標是使磁盤的平均尋道時間最少。

  1. 常用的磁盤調度算法

1)         先來先服務(適合進程較少的場合)

2)         最短尋道時間優先(要訪問的磁道與當前磁頭所在磁道距離最近。會導致進程“飢餓”現象)

3)         掃描算法(考慮訪問的磁道與當前磁頭所在磁道距離最近和磁頭當前移動的方向)

4)         循環掃描算法(規定磁頭單向移動)

5)         NSPetpSCAN和FSCAN調度算法

                                                                                                                                                                                                第六章 文件管理

  1. 文件邏輯結構的類型

1)  有結構文件(由一個以上的記錄構成的文件,又稱記錄式文件)

2)  無結構文件(由字符流構成的文件,又稱流式文件)

  1. 記錄式文件的長度分爲定長記錄和變長記錄。
  2. 記錄文件又分爲順序文件、索引文件、索引順序文件。
  3. 大量的數據結構而後數據庫是採用有結構的文件形式

而大量的源代碼、可執行文件、庫函數等採用無結構文件。

  1. 順序文件的優缺點

1)         適合進行批量存取

2)         存取效率是所有邏輯文件中最高的

3)         也只有順序文件才能存儲在磁帶上,並能有效的工作

4)         不適合查找或修改單個記錄

5)         增加或刪除一個記錄時比較困難

  1. 索引文件的缺點:除了有主文件外,還須配置一張索引表,而且每個記錄都要有一個索引表,因此提高了存儲費用。
  2. 對已直接文件,檢索時可以根據記錄鍵值直接獲得指定記錄的物理地址。
  3. 哈希文件是鍵值通過Hash函數指向目錄表,該表目的內容指向記錄所在的物理塊。
  4. 外存分配方式:連續分配、連接分配和索引分配三種。
  5. 連續分配的優缺點

1)         順序訪問容易

2)         順序訪問速度快

缺點:

1)         要求有連續的存儲空間

2)         必須實現知道文件的長度

  1. 鏈接分配中的鏈接方式分爲隱式鏈接顯式鏈接
  2. 爲新建文件分配存儲空間的方式分爲連續和離散的分配方式。前置具有較高的文件訪問速度,但可能產生較多的外存零頭。後者能有效的利用外存空間,但訪問速度較慢。無論哪種方式,存儲空間的基本分配單位都是磁盤塊而非字節。
  3. 文件存儲空間管理的方法

1)         空閒表法和空閒鏈表法

2)         位示圖法

3)         成組鏈接法

  1. 空閒表法和空閒鏈表法都不適用於大型文件系統可使用成組鏈接法。

常見面試題:

1、進程是併發過程中程序的執行過程

2、進程的特徵:結構特徵動態性併發性獨立性異步性

3、臨界區指在每個進程中訪問臨界資源的那段代碼

4,現在操作系統中申請資源的基本單位是進程,在CPU得到執行的基本單位是線程,進程是由程序段、數據段、PCB組成的

5,對臨界資源應採取互斥訪問方式來實現共享

6,P.V操作是一種低級進程通信原語

7,對於記錄性信號量,在執行一次P操作時,信號量的值應當減1,當其值爲小於0時進程應阻塞;在執行V操作時,信號量的值應當加1;當其值小於等於0時,應喚醒阻塞隊列中的進程

8,N個進程共享某一臨界資源,(n-1)~1

9,短作業優先算法,T1<T2<T3平均週轉時間爲:T1+2XT2/3+T3/3

10,響應比Rp=(等待時間+要求服務時間)/要求服務器時間=響應時間/要求服務時間

11死鎖是指多個進程在運行過程中因爭奪資源,而造成的一種僵局,當進程處於這種僵局狀態時,若無外力作用,他們都將無法再向前推進。

死鎖的避免是根據防止系統進入不安全狀態。

產生死鎖的根本原因是資源分配不當和資源數量不足發生死鎖的四個必要條件是:互斥條件,請求和保持條件,不剝奪條件和環路等待條件,銀行家算法用於避免死鎖

12,如果系統中有N個進程,最多爲(N-1)個

13,若系統採用輪轉法調度進程系統採用的是剝奪式調度

14,既考慮作業等待時間,又考慮作業執行時間,的調度算法是響應比優先調度算法

15,資源的有序分配策略可以破壞死鎖的“循環等待”

16,並非所有的不安全狀態都必然會轉爲死鎖狀態,但當系統進圖不安全按狀態後變有可能進入死鎖狀態,

17,重定位:在作業地址空間中使用的邏輯地址變爲內存物理地址

18,支持程序放在不連續內存中儲存管理方法有分取式分配,分段式分配,段頁式分配頁式存儲主要特點是不要將作業同時全部裝入到主存的的連續區域

19,適合多道程序運行的存儲管理中,存儲保護是爲了防止各道作業的相互干擾

20,採用頁式存儲管理時,重定位的工作由地址轉換機

21,段頁式存儲管理中的地址映像表每個作業或進程一張段表,每個段一張頁表

22,在虛擬頁式存儲管理方案中,完成將頁面調入內存的工作的是缺頁中斷處理

23,分段管理和分頁管理的主要區別是分頁管理有存儲保護,分段管理沒有

24,在股低估分區分配中,可以不同但預先固定的

25,不使用中斷機構的I/O控制方式是程序I/O方式

26,spooling技術能獨佔設備改造成可以共享的虛擬設備  

27,磁盤防僞中把數據從磁盤讀出,叫做傳輸時間

28,共享設備指同一時間內運行多個進程同時訪問的設備

29,通過軟件的功能擴充,把原來獨佔的設備愛造成若干個可共享的設備,虛擬設備

30,DMA方式如果I/O設備不通過CPU來完成

31,設備獨立性用戶程序獨立於具體物理設備的一種特性

32,虛擬設備一個物理設備變換成多個對應的邏輯設備

33,通道是一種特殊的處理機,通道按傳遞數據的方式分爲:字節多路通道,數組選擇通道,數組多路通道

通道涉及的數據結構是設備控制器,控制器控制塊,通道控制塊,系統設備表

34,磁盤高速緩衝設在內存中,目的是提高I/O磁盤速度

35,磁盤空間的地址有盤面號,柱面號,扇區號組成。訪問磁盤的時間有 尋道時間,旋轉等待時間,讀寫時間 

36,將系統段用參數翻譯成設備操作命令的工作由設備無關的操作系統完成

37,向設備寄存器寫入控制命令由設備驅動程序完成

38,尋找設備驅動程序由設備無關的操作系統軟件完成

39,設備管理的功能是設備分配,緩衝區管理和實現物理I/O設備的操作

40,根據設備的固有屬性特點,設備可分爲獨佔設備,共享設備和虛擬設備

41,引入緩衝區技術提高處理器執行程序設備的輸入輸出操作的並行程序文件管理

42,物理文件的組織方式是由操作系統確定的,文件的順序存取是按文件的邏輯號逐一存取

43,系統通過樹形目錄結構來解決重名問題

44,在UNIX操作系統中,把輸入輸出設備看做特殊文件

45,打開文件操作的主要工作是把指定的目錄複製到內存指定區域

46,文件路徑名是指從根目錄到該文件所經歷的路徑中各符號名的集合

47,按邏輯結構劃分,文件主要有兩類:記錄是文件,流式文件,文件系統的主要目的是實現對文件的按名存取

48連續結構文件必須採用連續分配方式,而鏈接結構文件和索引結構文件都可採取離散分配方式

49,文件系統中,若文件的物理結構採用連續結構有關文件的物理位置的信息包括首塊地址和文件長度

50,位示圖可用於磁盤空間管理,在文件系統中,爲實現文件保護,一般採用口令,密碼和訪問控制                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         

1、進程具有獨立功能程序在某個數據集合上的一次執行過程線程進程內的一個執行實體或執行單元

進程和線程的區別

(a)不同進程的地址空間是獨立的,而同一進程內的線程共享同一地址空間。一個進程的線程在另一個進程內是不可見的。

(b) 在引入線程的操作系統中,進程是資源分配和調度的單位,線程是處理機調度和分配的單位,資源是分配給進程的,線程只擁有很少資源,因而切換代價比進程切換低。


2、死鎖多道程序系統中當一組進程中的每個進程均無限期地等待被改組進程中的另一進程所佔有且永遠不會釋放的資源,此時的系統處於死鎖狀態

死鎖產生的原因:

(a)系統提供的資源有限;

(b)進程推進順序不當。

產生死鎖的必要條件:互斥條件、不可剝奪條件、請求和保持條件、循環等待條件


3、執行如下訪問頁號序列: 1,2,3,4,1,2,5,1,2,3,4,5 試說明採用先進(1)FIFO: 9次(2)LRU:10次 (3)OPT:7次   


4、什麼是操作系統的基本功能?

1.處理機管理。在多道程序或多用戶的情況下,要組織多個作業同時運行,就要解決對處理機分配調度策略、分配實施和資源回收等問題。

2.存儲管理。存儲管理的主要工作是對內部存儲器進行分配、保護和擴充和管理。

3.設備管理。涉及到通道、控制器、輸入輸出設備的分配和管理以及設備獨立性。

4.信息管理(文件系統管理) 是對系統的軟件資源的管理。

5.用戶接口。操作系統還爲用戶提供一個友好的用戶接口。一般來說,操作系統提供兩種方式的接口來爲用戶服務。


5、分級調度分爲4級:

(1) 作業調度

(2) 交換調度

(3) 進程調度 

(4) 線程調度。


6、試寫出程序進程區別

(1)進程是一個動態概念,而程序是一個靜態概念。

(2)進程具有並行特徵,而程序不反映執行所以沒有並行特徵

(3)進程是競爭計算機系統資源的基本單位,而程序不反映執行也就不會競爭計算機系統資源

(4)不同的進程可以包含同一程序,只要該程序所對應的數據集不同。 


7、頁式管理的基本原理是什麼?

(1)進程的虛擬空間被劃分成長度相等的頁。

(2)內存空間也按頁的大小劃分成長度相等的頁面。

(3)採用請求調頁或預調技術實現內外存儲器的統一管理。


8、進程調度有哪些功能?

(1)記錄系統中所有進程的執行情況。

(2)選擇佔有處理機的進程

(3)進行進程上下文切換


9、批處理操作系統、分時操作系統和實時操作系統的特點各是什麼?

(1) 批處理操作系統的特點:成批處理,系統吞吐量高,資源利用率高,用戶不能直接干預作業的執行。

(2)分時操作系統的特點:多路性、獨立性、及時性、交互性。

(3)實時操作系統的特點:及時響應、快速處理;高可靠性和安全性;不要求系統資源利用率。

10Windows下的內存是如何管理的?

  Windows提供了3種方法來進行內存管理:虛擬內存最適合用來管理大型對象或者結構數組;內存映射文件,最適合用來管理大型數據流(通常來自文件)以及在單個計算機上運行多個進程之間共享數據;內存堆棧,最適合用來管理大量的小對象。

  Windows操縱內存可以分兩個層面:物理內存和虛擬內存。

  其中物理內存由系統管理,不允許應用程序直接訪問,應用程序可見的只有一個2G地址空間,而內存分配是通過堆進行的。對於每個進程都有自己的默認堆,當一個堆創建後,就通過虛擬內存操作保留了相應大小的地址塊(不佔有實際的內存,系統消耗很小)。當在堆上分配一塊內存時,系統在堆的地址表裏找到一個空閒塊(如果找不到,且堆創建屬性是可擴充的,則擴充堆大小),爲這個空閒塊所包含的所有內存頁提交物理對象(在物理內存上或硬盤的交換文件上),這時就可以訪問這部分地址。提交時,系統將對所有進程的內存統一調配,如果物理內存不夠,系統試圖把一部分進程暫時不訪問的頁放入交換文件,以騰出部分物理內存。釋放內存時,只在堆中將所在的頁解除提交(相應的物理對象被解除),繼續保留地址空間。

  如果要知道某個地址是否被佔用/可不可以訪問,只要查詢此地址的虛擬內存狀態即可。如果是提交,則可以訪問。如果僅僅保留,或沒保留,則產生一個軟件異常。此外,有些內存頁可以設置各種屬性。如果是隻讀,向內存寫也會產生軟件異常。


11、Windows消息調度機制是(C)

  A)指令隊列;B)指令堆棧;C)消息隊列;D)消息堆棧

解析:

  處理消息隊列的順序。首先Windows絕對不是按隊列先進先出的次序來處理的,而是有一定優先級的。優先級通過消息隊列的狀態標誌來實現的。首先,最高優先級的是別的線程發過來的消息(通過sendmessage);其次,處理登記消息隊列消息;再次處理QS_QUIT標誌,處理虛擬輸入隊列,處理wm_paint;最後是wm_timer。


12、描述實時系統基本特性

  在特定時間內完成特定的任務,實時性與可靠性。

  所謂“實時操作系統”,實際上是指操作系統工作時,其各種資源可以根據需要隨時進行動態分配。由於各種資源可以進行動態分配,因此,其處理事務的能力較強、速度較快。


13、中斷輪詢特點

  對I/O設備的程序輪詢的方式,是早期的計算機系統對I/O設備的一種管理方式。它定時對各種設備輪流詢問一遍有無處理要求。輪流詢問之後,有要求的,則加以處理。在處理I/O設備的要求之後,處理機返回繼續工作。儘管輪詢需要時間,但輪詢要比I/O設備的速度要快得多,所以一般不會發生不能及時處理的問題。當然,再快的處理機,能處理的輸入輸出設備的數量也是有一定限度的。而且,程序輪詢畢竟佔據了CPU相當一部分處理時間,因此,程序輪詢是一種效率較低的方式,在現代計算機系統中已很少應用。

  程序中斷通常簡稱中斷,是指CPU在正常運行程序的過程中,由於預先安排或發生了各種隨機的內部或外部事件,使CPU中斷正在運行的程序,而轉到爲響應的服務程序去處理。

  輪詢——效率低,等待時間很長,CPU利用率不高。

  中斷——容易遺漏一些問題,CPU利用率高。

14、什麼是臨界區如何解決衝突

  每個進程中訪問臨界資源的那段程序稱爲臨界區每次只准許一個進程進入臨界區進入後不允許其他進程進入

  (1)如果有若干進程要求進入空閒的臨界區,一次僅允許一個進程進入;

  (2)任何時候,處於臨界區內的進程不可多於一個。如已有進程進入自己的臨界區,則其它所有試圖進入臨界區的進程必須等待;

  (3)進入臨界區的進程要在有限時間內退出,以便其它進程能及時進入自己的臨界區;

  (4)如果進程不能進入自己的臨界區,則應讓出CPU,避免進程出現“忙等”現象。


15、說說分段分頁

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

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

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

  分頁的作業地址空間是一維的,即單一的線性空間,程序員只須利用一個記憶符,即可表示一地址。分段的作業地址空間是二維的,程序員在標識一個地址時,既需給出段名,又需給出段內地址。


16、說出你所知道的保持進程同步的方法

  進程間同步的主要方法有原子操作、信號量機制、自旋鎖、管程、會合、分佈式系統等。


17、Linux中常用到的命令

  顯示文件目錄命令ls        如ls

  改變當前目錄命令cd        如cd /home

  建立子目錄mkdir           如mkdir xiong

  刪除子目錄命令rmdir       如rmdir /mnt/cdrom

  刪除文件命令rm            如rm /ucdos.bat

  文件複製命令cp            如cp /ucdos /fox

  獲取幫助信息命令man      如man ls

  顯示文件的內容less        如less mwm.lx

  重定向與管道type          如type readme>>direct,將文件readme的內容追加到文direct中


18、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


19、簡術OSI的物理層Layer1,鏈路層Layer2,網絡層Layer3的任務。

  網絡層:通過路由選擇算法,爲報文或分組通過通信子網選擇最適當的路徑。

  鏈路層:通過各種控制協議,將有差錯的物理信道變爲無差錯的、能可靠傳輸數據幀的數據鏈路。

  物理層:利用傳輸介質爲數據鏈路層提供物理連接,實現比特流的透明傳輸。


20、什麼是中斷中斷時CPU做什麼工作

  中斷指在計算機執行期間,系統內發生任何非尋常的或非預期的急需處理事件,使得CPU暫時中斷當前正在執行的程序而轉去執行相應的事件處理程序。待處理完畢後又返回原來被中斷處繼續執行或調度新的進程執行的過程。


21、你知道操作系統的內容分爲幾塊嗎?什麼叫做虛擬內存?他和主存的關係如何?內存管理屬於操作系統的內容嗎

  操作系統的主要組成部分:進程和線程的管理,存儲管理,設備管理,文件管理。虛擬內存是一些系統頁文件,存放在磁盤上,每個系統頁文件大小爲4K,物理內存也被分頁,每個頁大小也爲4K,這樣虛擬頁文件和物理內存頁就可以對應,實際上虛擬內存就是用於物理內存的臨時存放的磁盤空間。頁文件就是內存頁,物理內存中每頁叫物理頁,磁盤上的頁文件叫虛擬頁,物理頁+虛擬頁就是系統所有使用的頁文件的總和。


22、線程是否具有相同的堆棧dll是否有獨立的堆棧

  每個線程有自己的堆棧。

  dll是否有獨立的堆棧?這個問題不好回答,或者說這個問題本身是否有問題。因爲dll中的代碼是被某些線程所執行,只有線程擁有堆棧。如果dll中的代碼是exe中的線程所調用,那麼這個時候是不是說這個dll沒有獨立的堆棧?如果dll中的代碼是由dll自己創建的線程所執行,那麼是不是說dll有獨立的堆棧?

  以上講的是堆棧,如果對於堆來說,每個dll有自己的堆,所以如果是從dll中動態分配的內存,最好是從dll中刪除;如果你從dll中分配內存,然後在exe中,或者另外一個dll中刪除,很有可能導致程序崩潰。


23、什麼是緩衝區溢出?有什麼危害?其原因是什麼?

  緩衝區溢出是指當計算機向緩衝區內填充數據時超過了緩衝區本身的容量,溢出的數據覆蓋在合法數據上。

  危害:在當前網絡與分佈式系統安全中,被廣泛利用的50%以上都是緩衝區溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕蟲。而緩衝區溢出中,最爲危險的是堆棧溢出,因爲入侵者可以利用堆棧溢出,在函數返回時改變返回程序的地址,讓其跳轉到任意地址,帶來的危害一種是程序崩潰導致拒絕服務,另外一種就是跳轉並且執行一段惡意代碼,比如得到shell,然後爲所欲爲。通過往程序的緩衝區寫超出其長度的內容,造成緩衝區的溢出,從而破壞程序的堆棧,使程序轉而執行其它指令,以達到攻擊的目的。

  造成緩衝區溢出的主原因是程序中沒有仔細檢查用戶輸入的參數

24、什麼是死鎖?其條件是什麼?怎樣避免死鎖?

  死鎖的概念:在兩個或多個併發進程中,如果每個進程持有某種資源而又都等待別的進程釋放它或它們現在保持着的資源,在未改變這種狀態之前都不能向前推進,稱這一組進程產生了死鎖。通俗地講,就是兩個或多個進程被無限期地阻塞、相互等待的一種狀態。

  死鎖產生的原因主要是:

       (1)系統資源不足;

       (2) 進程推進順序非法。

  產生死鎖的必要條件:

  (1)互斥(mutualexclusion),一個資源每次只能被一個進程使用;

  (2)不可搶佔(nopreemption),進程已獲得的資源,在未使用完之前,不能強行剝奪;

  (3)佔有並等待(hold andwait),一個進程因請求資源而阻塞時,對已獲得的資源保持不放;

  (4)環形等待(circularwait),若干進程之間形成一種首尾相接的循環等待資源關係。

  這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖。

  死鎖的解除與預防:理解了死鎖的原因,尤其是產生死鎖的四個必要條件,就可以最大可能地避免、預防和解除死鎖。所以,在系統設計、進程調度等方面注意如何不讓這四個必要條件成立,如何確定資源的合理分配算法,避免進程永久佔據系統資源。此外,也要防止進程在處於等待狀態的情況下佔用資源。因此,對資源的分配要給予合理的規劃。

  死鎖的處理策略:鴕鳥策略、預防策略、避免策略、檢測與恢復策略


附錄:

1、什麼是進程(Process)和線程(Thread)?有何區別?

  進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。一個線程可以創建和撤銷另一個線程,同一個進程中的多個線程之間可以併發執行。

  進程與應用程序的區別在於應用程序作爲一個靜態文件存儲在計算機系統的硬盤等存儲空間中,而進程則是處於動態條件下由操作系統維護的系統資源管理實體。

  2、Windows下的內存是如何管理的?

  Windows提供了3種方法來進行內存管理:虛擬內存,最適合用來管理大型對象或者結構數組;內存映射文件,最適合用來管理大型數據流(通常來自文件)以及在單個計算機上運行多個進程之間共享數據;內存堆棧,最適合用來管理大量的小對象。

  Windows操縱內存可以分兩個層面:物理內存和虛擬內存。

  其中物理內存由系統管理,不允許應用程序直接訪問,應用程序可見的只有一個2G地址空間,而內存分配是通過堆進行的。對於每個進程都有自己的默認堆,當一個堆創建後,就通過虛擬內存操作保留了相應大小的地址塊(不佔有實際的內存,系統消耗很小)。當在堆上分配一塊內存時,系統在堆的地址表裏找到一個空閒塊(如果找不到,且堆創建屬性是可擴充的,則擴充堆大小),爲這個空閒塊所包含的所有內存頁提交物理對象(在物理內存上或硬盤的交換文件上),這時就可以訪問這部分地址。提交時,系統將對所有進程的內存統一調配,如果物理內存不夠,系統試圖把一部分進程暫時不訪問的頁放入交換文件,以騰出部分物理內存。釋放內存時,只在堆中將所在的頁解除提交(相應的物理對象被解除),繼續保留地址空間。

  如果要知道某個地址是否被佔用/可不可以訪問,只要查詢此地址的虛擬內存狀態即可。如果是提交,則可以訪問。如果僅僅保留,或沒保留,則產生一個軟件異常。此外,有些內存頁可以設置各種屬性。如果是隻讀,向內存寫也會產生軟件異常。

  3、Windows消息調度機制是?

  A)指令隊列;B)指令堆棧;C)消息隊列;D)消息堆棧

  答案:C

  處理消息隊列的順序。首先Windows絕對不是按隊列先進先出的次序來處理的,而是有一定優先級的。優先級通過消息隊列的狀態標誌來實現的。首先,最高優先級的是別的線程發過來的消息(通過sendmessage);其次,處理登記消息隊列消息;再次處理QS_QUIT標誌,處理虛擬輸入隊列,處理wm_paint;最後是wm_timer。

  4、描述實時系統的基本特性

  在特定時間內完成特定的任務,實時性與可靠性。

  所謂“實時操作系統”,實際上是指操作系統工作時,其各種資源可以根據需要隨時進行動態分配。由於各種資源可以進行動態分配,因此,其處理事務的能力較強、速度較快。

  5、中斷和輪詢的特點

  對I/O設備的程序輪詢的方式,是早期的計算機系統對I/O設備的一種管理方式。它定時對各種設備輪流詢問一遍有無處理要求。輪流詢問之後,有要求的,則加以處理。在處理I/O設備的要求之後,處理機返回繼續工作。儘管輪詢需要時間,但輪詢要比I/O設備的速度要快得多,所以一般不會發生不能及時處理的問題。當然,再快的處理機,能處理的輸入輸出設備的數量也是有一定限度的。而且,程序輪詢畢竟佔據了CPU相當一部分處理時間,因此,程序輪詢是一種效率較低的方式,在現代計算機系統中已很少應用。

  程序中斷通常簡稱中斷,是指CPU在正常運行程序的過程中,由於預先安排或發生了各種隨機的內部或外部事件,使CPU中斷正在運行的程序,而轉到爲響應的服務程序去處理。

  輪詢——效率低,等待時間很長,CPU利用率不高。

  中斷——容易遺漏一些問題,CPU利用率高。

6、什麼是臨界區?如何解決衝突?

  每個進程中訪問臨界資源的那段程序稱爲臨界區,每次只准許一個進程進入臨界區,進入後不允許其他進程進入。

  (1)如果有若干進程要求進入空閒的臨界區,一次僅允許一個進程進入;

  (2)任何時候,處於臨界區內的進程不可多於一個。如已有進程進入自己的臨界區,則其它所有試圖進入臨界區的進程必須等待;

  (3)進入臨界區的進程要在有限時間內退出,以便其它進程能及時進入自己的臨界區;

  (4)如果進程不能進入自己的臨界區,則應讓出CPU,避免進程出現“忙等”現象。

  7、說說分段和分頁

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

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

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

  分頁的作業地址空間是一維的,即單一的線性空間,程序員只須利用一個記憶符,即可表示一地址。分段的作業地址空間是二維的,程序員在標識一個地址時,既需給出段名,又需給出段內地址。

  8、說出你所知道的保持進程同步的方法?

  進程間同步的主要方法有原子操作、信號量機制、自旋鎖、管程、會合、分佈式系統等。

  9、Linux中常用到的命令

  顯示文件目錄命令ls        如ls

  改變當前目錄命令cd        如cd /home

  建立子目錄mkdir           如mkdir xiong

  刪除子目錄命令rmdir       如rmdir /mnt/cdrom

  刪除文件命令rm            如rm /ucdos.bat

  文件複製命令cp            如cp /ucdos /fox

  獲取幫助信息命令man      如man ls

  顯示文件的內容less        如less mwm.lx

  重定向與管道type          如type readme>>direct,將文件readme的內容追加到文direct中

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都成爲了一種在工程方面的編譯方法。

  12、簡術OSI的物理層Layer1,鏈路層Layer2,網絡層Layer3的任務。

  網絡層:通過路由選擇算法,爲報文或分組通過通信子網選擇最適當的路徑。

  鏈路層:通過各種控制協議,將有差錯的物理信道變爲無差錯的、能可靠傳輸數據幀的數據鏈路。

  物理層:利用傳輸介質爲數據鏈路層提供物理連接,實現比特流的透明傳輸。

  13、什麼是中斷?中斷時CPU做什麼工作?

  中斷是指在計算機執行期間,系統內發生任何非尋常的或非預期的急需處理事件,使得CPU暫時中斷當前正在執行的程序而轉去執行相應的事件處理程序。待處理完畢後又返回原來被中斷處繼續執行或調度新的進程執行的過程。

  14、你知道操作系統的內容分爲幾塊嗎?什麼叫做虛擬內存?他和主存的關係如何?內存管理屬於操作系統的內容嗎?

  操作系統的主要組成部分:進程和線程的管理,存儲管理,設備管理,文件管理。虛擬內存是一些系統頁文件,存放在磁盤上,每個系統頁文件大小爲4K,物理內存也被分頁,每個頁大小也爲4K,這樣虛擬頁文件和物理內存頁就可以對應,實際上虛擬內存就是用於物理內存的臨時存放的磁盤空間。頁文件就是內存頁,物理內存中每頁叫物理頁,磁盤上的頁文件叫虛擬頁,物理頁+虛擬頁就是系統所有使用的頁文件的總和。

15、線程是否具有相同的堆棧?dll是否有獨立的堆棧?

  每個線程有自己的堆棧。

  dll是否有獨立的堆棧?這個問題不好回答,或者說這個問題本身是否有問題。因爲dll中的代碼是被某些線程所執行,只有線程擁有堆棧。如果dll中的代碼是exe中的線程所調用,那麼這個時候是不是說這個dll沒有獨立的堆棧?如果dll中的代碼是由dll自己創建的線程所執行,那麼是不是說dll有獨立的堆棧?

  以上講的是堆棧,如果對於堆來說,每個dll有自己的堆,所以如果是從dll中動態分配的內存,最好是從dll中刪除;如果你從dll中分配內存,然後在exe中,或者另外一個dll中刪除,很有可能導致程序崩潰。

  16、什麼是緩衝區溢出?有什麼危害?其原因是什麼?

  緩衝區溢出是指當計算機向緩衝區內填充數據時超過了緩衝區本身的容量,溢出的數據覆蓋在合法數據上。

  危害:在當前網絡與分佈式系統安全中,被廣泛利用的50%以上都是緩衝區溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕蟲。而緩衝區溢出中,最爲危險的是堆棧溢出,因爲入侵者可以利用堆棧溢出,在函數返回時改變返回程序的地址,讓其跳轉到任意地址,帶來的危害一種是程序崩潰導致拒絕服務,另外一種就是跳轉並且執行一段惡意代碼,比如得到shell,然後爲所欲爲。通過往程序的緩衝區寫超出其長度的內容,造成緩衝區的溢出,從而破壞程序的堆棧,使程序轉而執行其它指令,以達到攻擊的目的。

  造成緩衝區溢出的主原因是程序中沒有仔細檢查用戶輸入的參數。

  17、什麼是死鎖?其條件是什麼?怎樣避免死鎖?

  死鎖的概念:在兩個或多個併發進程中,如果每個進程持有某種資源而又都等待別的進程釋放它或它們現在保持着的資源,在未改變這種狀態之前都不能向前推進,稱這一組進程產生了死鎖。通俗地講,就是兩個或多個進程被無限期地阻塞、相互等待的一種狀態。

  死鎖產生的原因主要是:? 系統資源不足;? 進程推進順序非法。

  產生死鎖的必要條件:

  (1)互斥(mutualexclusion),一個資源每次只能被一個進程使用;

  (2)不可搶佔(nopreemption),進程已獲得的資源,在未使用完之前,不能強行剝奪;

  (3)佔有並等待(hold andwait),一個進程因請求資源而阻塞時,對已獲得的資源保持不放;

  (4)環形等待(circularwait),若干進程之間形成一種首尾相接的循環等待資源關係。

  這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖。

  死鎖的解除與預防:理解了死鎖的原因,尤其是產生死鎖的四個必要條件,就可以最大可能地避免、預防和解除死鎖。所以,在系統設計、進程調度等方面注意如何不讓這四個必要條件成立,如何確定資源的合理分配算法,避免進程永久佔據系統資源。此外,也要防止進程在處於等待狀態的情況下佔用資源。因此,對資源的分配要給予合理的規劃。

  死鎖的處理策略:鴕鳥策略、預防策略、避免策略、檢測與恢復策略。

 1、程序和進程

  進程由兩個部分組成:1)操作系統用來管理進程的內核對象。內核對象也是系統用來存放關於進程的統計信息的地方。2)地址空間。它包含所有可執行模塊或DLL模塊的代碼和數據。它還包含動態內存分配的空間。如線程堆棧和堆分配空間。

 

定義

使用系統運行資源情況

程序

計算機指令的集合,它以文件的形式存儲在磁盤上。程序是靜態實體passive Entity),在多道程序系統中,它是不能獨立運行的,更不能與其他程序併發執行。

不使用【程序不能申請系統資源,不能被系統調度,也不能作爲獨立運行的單位,因此,它不佔用系統的運行資源】。

 

進程

通常被定義爲一個正在運行的程序的實例,是一個程序在其自身的地址空間中的一次執行活動。

定義:進程是進程實體(包括:程序段、相關的數據段、進程控制塊PCB)的運行過程,是系統進行資源分配和調度的一個獨立單位。

使用【進程是資源申請、調度和獨立運行的單位,因此,它使用系統中的運行資源。】

  2、進程與線程

  如果說操作系統引入進程的目的是爲了提高程序併發執行,以提高資源利用率和系統吞吐量。那麼操作系統中引入線程的目的,則是爲了減少進程併發執行過程中所付出的時空開銷,使操作系統能很好的併發執行。

  進程process定義了一個執行環境,包括它自己私有的地址空間、一個句柄表,以及一個安全環境;線程則是一個控制流,有他自己的調用棧call stack,記錄了它的執行歷史。

  線程由兩個部分組成:1)線程的內核對象,操作系統用它來對線程實施管理。內核對象也是系統用來存放線程統計信息的地方。2)線程堆棧,它用於維護線程在執行代碼時需要的所有參數和局部變量。當創建線程時,系統創建一個線程內核對象。該線程內核對象不是線程本身,而是操作系統用來管理線程的較小的數據結構。可以將線程內核對象視爲由關於線程的統計信息組成的一個小型數據結構。

  進程與線程的比較如下:

比較

進程

線程

活潑性

不活潑(只是線程的容器)

活潑

地址空間

系統賦予的獨立的虛擬地址空間(對於32位進程來說,這個地址空間是4GB

在進程的地址空間執行代碼。線程只有一個內核對象和一個堆棧,保留的記錄很少,因此所需要的內存也很少。因爲線程需要的開銷比進程少

調度

僅是資源分配的基本單位

獨立調度、分派的基本單位

併發性

僅進程間併發(傳統OS

進程間、線程間併發

擁有資源

資源擁有的基本單位

基本上不擁有資源

系統開銷

創建、撤銷、切換開銷大

僅保存少量寄存器內容,開銷小。

  3、進程同步

  進程同步的主要任務:是對多個相關進程在執行次序上進行協調,以使併發執行的諸進程之間能有效地共享資源和相互合作,從而使程序的執行具有可再現性。

  同步機制遵循的原則:

  (1)空閒讓進;

  (2)忙則等待(保證對臨界區的互斥訪問);

  (3)有限等待(有限代表有限的時間,避免死等);

  (4)讓權等待,(當進程不能進入自己的臨界區時,應該釋放處理機,以免陷入忙等狀態)。

4、進程間的通信是如何實現的?

  進程通信,是指進程之間的信息交換(信息量少則一個狀態或數值,多者則是成千上萬個字節)。因此,對於用信號量進行的進程間的互斥和同步,由於其所交換的信息量少而被歸結爲低級通信。

  所謂高級進程通信指:用戶可以利用操作系統所提供的一組通信命令傳送大量數據的一種通信方式。操作系統隱藏了進程通信的實現細節。或者說,通信過程對用戶是透明的。

  高級通信機制可歸結爲三大類:

  (1)共享存儲器系統(存儲器中劃分的共享存儲區);實際操作中對應的是“剪貼板”(剪貼板實際上是系統維護管理的一塊內存區域)的通信方式,比如舉例如下:word進程按下ctrl+c,在ppt進程按下ctrl+v,即完成了word進程和ppt進程之間的通信,複製時將數據放入到剪貼板,粘貼時從剪貼板中取出數據,然後顯示在ppt窗口上。

  (2)消息傳遞系統(進程間的數據交換以消息(message)爲單位,當今最流行的微內核操作系統中,微內核與服務器之間的通信,無一例外地都採用了消息傳遞機制。應用舉例:郵槽(MailSlot)是基於廣播通信體系設計出來的,它採用無連接的不可靠的數據傳輸。郵槽是一種單向通信機制,創建郵槽的服務器進程讀取數據,打開郵槽的客戶機進程寫入數據。

  (3)管道通信系統(管道即:連接讀寫進程以實現他們之間通信的共享文件(pipe文件,類似先進先出的隊列,由一個進程寫,另一進程讀))。實際操作中,管道分爲:匿名管道、命名管道。匿名管道是一個未命名的、單向管道,通過父進程和一個子進程之間傳輸數據。匿名管道只能實現本地機器上兩個進程之間的通信,而不能實現跨網絡的通信。命名管道不僅可以在本機上實現兩個進程間的通信,還可以跨網絡實現兩個進程間的通信。

 

同一機器兩個進程間通信

跨網絡通信

剪貼板Clipboard

可以

不可以

匿名管道Pipe

可以

不可以

命名管道(點對點單一通信,數據量可較大)Namedpipe

可以

可以

郵槽(一對多,數據量較小,424字節以下)Mailslot

可以

可以

  5、線程同步

  根據用戶模式及內核模式下的同步方式的不同,分類及對比如下:

 

內核對象/

非內核對象

含義

缺點

適用

關鍵代碼段(臨界區)CriticalSection

非內核對象,工作在用戶方式下,爲用戶模式對象

從程序代碼的角度來控制線程的併發性

1.因爲在等待進入關鍵代碼段時無法設定超時值,所以其很容易進入死鎖狀態。2.不能跨進程使用。

單個進程中線程間的同步(同步速度快)

事件對象Event

內核對象

所有內核對象中最基本的。

速度較慢(相比用戶模式實現線程同步)

多個進程間的各個線程間實現同步

互斥對象Mutex

內核對象

代表對一個資源的獨佔式訪問

信號量

Semaphore

內核對象

使用計數器來控制程序對一個共享資源的訪問

  由於進程同步產生了一系列經典的同步問題“生產者-消費者”問題,“哲學家進餐”問題,“讀者-寫者”問題。


常見的操作系統使用的文件系統整理

文件系統是操作系統用於明確磁盤或分區上的文件的方法和數據結構;即在磁盤上組織文件的方法。也指用於存儲文件的磁盤或分區,或文件系統種類。操作系統中負責管理和存儲文件信息的軟件機構稱爲文件管理系統,簡稱文件系統。文件系統由三部分組成:與文件管理有關軟件、被管理文件以及實施文件管理所需數據結構。從系統角度來看,文件系統是對文件存儲器空間進行組織和分配,負責文件存儲並對存入的文件進行保護和檢索的系統。具體地說,它負責爲用戶建立文件,存入、讀出、修改、轉儲文件,控制文件的存取,當用戶不再使用時撤銷文件等。

  【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的鏈接同時打印出每一個。

計算機組成

 

計算機的運行簡單理解爲這三層:硬件即組成計算機的所有摸得見看得着的東西是計算機運行的基礎;應用程序即完成特定功能、目的的用戶程序是計算機的價值體現;中間就是操作系統,連接了硬件和應用程序負責硬件調度、資源管理和分配(內存、文件、CPU等等)、安全等一系列功能。

硬件層

 

主要硬件包括CPU(算術、邏輯單元)、主存、輔助存儲、系統總線、I/O設備(即輸入輸出)。

CPU

CPU本身(Processor)可以是單核、多核、多CPU架構,主要目的就是滿足日益增長的運算需求。單核比較簡單,多核(包括一CPU多核心和多CPU)立即涉及到核心之間高速緩存的共享,此處是CPU內置高速緩存非主存,進程之間寄存器數據的共享和進程處理器調度問題。

總線:

總線連接了所有的設備提供通訊的能力,注意設備之間同一時間的通信是會衝突的,這就要涉及到總線的決策,負責決策的可能是CPU或專有芯片。所有設備需要通信時要提交通信請求有CPU決定下一個通信的設備。

另外一個問題顯然連接到總線上的設備越多,衝突的機率就越大效率越差。所以總線可以有多層總線設計,比如設置I/O總線所有的I/O設備都通過I/O總線和I/O控制器連接,I/O控制器則連接在系統總線上代理I/O的通信請求。

速度:

CPU飛快,其中CPU內置的一級高速緩存保持了和CPU同樣的速度但是容量極小,接下來可能存在二級、三級高速緩存;主存(內存)其次和CPU存在數量級上的差距;輔寸(多硬盤)的速度就不是一般的慢了,因爲有機械運動,但是容量大很多;I/O設備多數慢的要死,但不是沒有快的(比如圖形、千兆以太網的速度是超過硬盤的)。總而言之就是快的太貴,賤的太慢,訪問快的斷電數據即失效,不失效的訪問慢,所以就有了多級存儲的設計。程序的運行必然是加載到主存的(內存)!

局部性:

多級存儲的設計得益於侷限性能夠大幅提升性能。侷限性本身分爲時間侷限性和空間侷限性。時間侷限性是說現在用到的指令很可能短時間內還會多次調用,空間侷限性是現在調用的數據在輔寸上鄰接的塊很可能即將被用到。就是因爲侷限性的存在預讀取才有了市場(所以有了磁盤整理),當然侷限性是必然的——程序肯定趨向於統一存取、循環、分支邏輯肯定是指令的循環調用。——好的命中率決定了計算機的性能。

指令週期(取指週期):

計算機中CPU始終是取指-》執行的動作循環運行的,計算機從取指到完成指令的週期稱爲取指週期。因此針對CPU的性能優化有流水線和超標量體系結構,前者目的在於合理分割指令使取指和執行能夠並行進行(預取指),後者則通過相同的運算結構重複設置實現多條指令同時執行(得益於指令的亂序執行)。

I/O設備進化:

I/O設備一般較慢,極端點的比如鍵盤這貨簡直慢的沒法說。那麼當程序需要讀取I/O數據時(如讀取一塊數據、監聽鍵盤輸入)就會被I/O設備阻塞,這是最差的情況整個系統空轉直到I/O設備讀取數據完成。

於是有了可編程I/O設備——你可以定期問我準備好數據了沒,好了你就取沒好你就幹別的去,也就是輪詢這法子還是非常慢因爲CPU要定期過來問而且多數情況都是沒準備好空耗系統資源(進程切換)。

再後來有了中斷,前提是指令的運行是可被中斷和恢復的(現在當然都可以,把寄存器數據保存到緩存,完了再恢復嘛),需要讀取的時候CPU發給I/O指令然後不理它了,需要讀取的進程(或線程)進入阻塞狀態換下一個進程來執行,當I/O準備好數據後發送一箇中斷信號給CPU,這時現在執行的進程被中斷CPU會執行一段中斷處理程序(通常很短)把之前阻塞的進程標記爲Ready(可執行)狀態,處理完中斷後恢復之前中斷的進程(或線程)繼續執行。在當前進程執行完或者超時中斷後(分時多道程序處理,超時也是一種中斷),之前從阻塞中恢復的進程可能會被執行(取決於進程調度,不一定是下一個時間片裏也可能是下幾個時間片後或者乾脆餓死了)。

再後來又有了DMA(直接存儲器訪問),主要原因就是CPU很忙,你一個拷貝/傳輸整塊數據的動作就不要每塊數據都讓我來處理了,系統中多了一個專門的輔助芯片幹這個事情。CPU下達指令後輔助芯片負責設備之間的數據直接傳輸。DMA模塊可以是總線中的一個模塊也可以是I/O模塊,但是仍然要佔用總線(傳輸數據)所以並不是不會對系統性能產生影響,至少DMA衝突時CPU要等待一個總線週期。

操作系統

看完硬件層(簡單看看,後面可能還要回頭),再來看看操作系統層。最基本的元素肯定要包括進程、線程等等用於程序的執行。

操作系統

操作系統目的:

方便:簡化了計算機的使用,無論是用戶還是開發者角度都極大的簡化了對計算機的使用。用戶角度提供了交互的能力,開發者角度提供了底層設備的接口、公共庫等等。

有效:提高計算機的利用效率。對於操作系統CPU運算、內存、輔存、I/O等等都是資源,如何能最大的利用資源是計算機要考慮的事情。(沒有操作系統的年代顯然效率非常低,同一時間只運行一個程序計算資源多數時間都在等待I/O設備、人等)。

擴展的能力:在不阻礙服務前提下開發、測試、加入新的計算機能力。比如安裝個程序、加個設備。

操作系統發展

串行處理:這是個久遠的年代(上世紀50年代也不算太遠哈),計算機一次只能運行一個程序,要通過輸入設備讀入程序(讀卡器吧)運行結束後再將結果輸出到打印機。這個年代是沒有操作系統的。

簡單批處理:這個算是操作系統的鼻祖吧?就是常駐內存的一個監控程序,要運行的程序被管理員組織成一批,監控程序從存儲器(卡片或磁帶)讀取要執行的Job將處理器控制權轉交給程序運行結束後(成功或失敗)控制權返回監控程序繼續讀入下一個任務。

簡單批處理節約了計算機調度和準備的時間——任務不再是一個一個的處理了,變成一批了。

多道程序批處理:現代操作系統進程切換之父?哈哈。由於內存的加大除了容納操作系統、一個程序以外還有足夠的空間容納第二、第三個程序,所以就有了同時運行多個程序的能力。在第一個程序被阻塞後(I/O等),可以轉交控制權個第二、第三個程序。

多道程序批處理節約了CPU等待I/O等慢速設備的時間,這個效率的提升非常客觀。

分時操作系統:注意關注在人的交互上。人肯定是比I/O還慢的設備了,由於早年計算機資源的稀缺當然要達到多人共用一臺機器的目的。分時操作系統把計算機資源做時間切片,用戶通過終端連接到計算機,每個中斷都獲取到時間切片內的計算資源,由於人是反應很鈍的,所以就像沒人都有一臺計算機服務一樣。

操作系統的幾張表

Memory table:記錄內存的使用情況,回收和分配內存時這裏都會被更新。

I/O table:記錄I/O設備和通道的情況。

File table:文件系統的佔用情況,文件是否存在,文件狀態。

Process table:管理進程。

進程和線程

進程

進程包括程序代碼和一組(set)數據,是程序運行的實體(應該能算作最小單元吧,線程能執行的是一段邏輯,一個程序的啓動至少是一個或多個進程)。

進程的組成:

進程所有屬性的集合被稱爲進程映像(Process Image),這之中一共包括四部分:用戶程序(User Program)、數據(User Data)、棧(Stack)和進程控制塊(Process Control Block)。

用戶程序:要執行的程序。

數據:用戶空間中可以被用戶修改的部分。比如進程數據、可修改程序。

Stack:每個進程都有一個或者多個棧用於保存參數、過程調用地址、系統調用地址。

進程控制塊:操作系統控制進程需要的數據。包含了進程的屬性,最基本的每個進程總要有個Id吧,還有進程狀態、當前寄存器的值、程序計數器、Stack的指針等等。

進程狀態切換

最起碼的兩個狀態:ReadyRunning,進程自創建後進入Ready狀態也就是可以執行的,這時的進程進入等待隊列知道進程調度輪到自己執行時才能夠被分配資源進入執行狀體Running

進程的基本狀態一共五個,包括上面兩個以外還會有被阻塞的情況(I/O、等待生產者生產、信號量等等)所以存在Blocked狀態,進程創建過程中存在New狀態、進程運行終結後處於Exit狀態等待操作系統做進一步處理並銷燬進程。

進程狀態之間的切換可以參考圖中進程狀態部分,大體過程:進程被允許創建進入New狀態,這個過程中要分配進程Id、劃分內存區域、初始化PCBProcess control block)、連接和創建或擴展其它的數據;上述過程完成以後進程可以運行了所以進入Ready狀態等待系統調度;終於等到自己運行了,進程爲Running狀態這時候可能出現幾種情況。1,進程運行結束進入Exit狀態等待銷燬。2,進程運行超時重新進入Ready狀態等待下一次調度。3,進程被阻塞了進入Block狀態等待所需要的數據或信號準備好,重新喚醒進入Ready狀態。除此以外還有兩個掛起狀態,見下面的切換。

調度的示意圖參考進程調度示意子圖,其中一個改進是操作系統很可能爲不同的中斷事件設立不同的阻塞隊列,以便提高效率。

進程切換(Swapping):

說白了還是CPU計算資源寶貴和內存有限(內存在漲吃內存的程序也在漲)。爲了能讓更多的進程可以同時執行(實際上不是同時是調度),程序運行中有很大一部分會被I/O阻塞——原因是I/O太慢了,所以即便你要的數據不多那這個取數的過程CPU也夠跑很多其它程序的了。所以導致的問題就是在內存中的進程都阻塞了,內存沒地方了,CPU依然閒的蛋疼,怎麼辦?把硬盤上畫出一塊地兒(個人理解就是windows下的虛擬內存、Linux中的swap),塞得比較久的那些進程你們先出去待會,換些後面排着的進來。

看到進程切換的子圖中除了五個狀態以外還有兩個掛起態(就緒/掛起、阻塞/掛起)就是這個情況。雖然把進程從硬盤換入換出這個開銷非常高,但是硬盤比起I/O設備還是快了很多,所以這一步是有價值的。

當然還有一個路子是虛擬內存的時候,這個稍晚的時候再扯進來。

進程執行模式:

用戶模式和內核模式,這兩個模式還有多個別名不記錄了。這是出於操作系統安全考慮的,有些重要的指令就只有內核模式下才能被CPU執行(硬件支持),總不能任意來個程序什麼事情都給他幹吧。

有了執行模式就算有模式的切換,比如進程要調用系統操作時(system call)就有可能從用戶模式切換到內核模式,system call執行後也會在切換回去。

 

多線程定義

多線程是指進程內支持併發路徑執行的能力。

與進程的關係

一個進程至少包含一個線程,當進程中存在多個線程的時各個線程可以共享進程內的資源。進程內的線程共享進程的用戶空間,操作系統仍然通過進程控制塊控制進程進而影響到線程。線程本事具備自己的線程控制塊、用戶棧和系統棧。

創建方式

由於線程類型的不同(下面介紹)線程可以是操作系統創建的也可以使通過線程庫(Lib)由進程自己創建的,對於進程創建的線程操作系統是不知道的。

線程優勢

l 創建時間開銷遠小於進程的創建。因爲不需要分配用戶空間和那麼多初始化動作。

l 銷燬線程的成本也遠低於進程。

l 線程之間的切換消耗低於進程,特別是同一進程內的線程切換消耗更低。

l 線程間通信的效率比進程間通信要高,因爲進城之間安全性問題需要隔離和互斥,同一進程內的線程可以共享進程資源而不需要提前獲取鎖。

線程同步

進程也涉及到同步,但是線程的同步更需要開發者注意。上面提到了線程共享進程的資源並且不需要獲取鎖,所以線程之間是沒有操作系統來保證隔離的。

線程類型

類型分爲用戶級線程和內核級線程。用戶級線程即通過Lib創建的對操作系統是透明的,內核級線程是由操作系統創建的。

用戶級

內核級

通過線程庫創建,對操作系統不可見

由操作系統來管理

比內核級的線程更高效,不涉及模式切換

在線程切換時需要模式切換(因爲是調用系統級的指令)

進程中同時只能有一個線程在運行,還是多段程序的思路

線程可以併發運行,特別指多核計算機

一旦被阻塞整個進程就被阻塞,也就是所有的線程都完蛋了

只會阻塞引起阻塞的線程

 

線程的四個應用場景

l 前後臺運算:即有UI和後臺運算的程序,你總不希望後臺數據運算時前面的UI界面就對用戶沒響應了吧?所以這裏應該分開線程,後臺啓動單獨的線程運算,界面在不同的線程了所有能時時相應用戶的操作(哪怕只是提示計算中)。

l 異步計算:比如應對電路故障的實時備份功能,通過線程無論是在代碼量上還是開銷上都要比你編寫定時調度的功能要高效。

l 速度敏感的運算:多線程的計算機可以在計算一組數據的同時讀入下一組數據(當然弄幾個進程幹這事兒也可以,但是開銷明顯更大)。

l 模塊化的程序架構:對於包含多個活動或者多個源頭和目標的輸入輸出程序,也許更容易使用多線程來設計和實現(就是每個線程幹一攤子事兒,大家數據在一起自己取誰也別干涉誰)。

l 另外的比如Java程序,每個程序就是一個JVM的進程,至於這裏面你起多少線程操作系統是不關心的。

 

併發性

競爭條件

競爭條件發生在多進程或者多線程同時修改同一個數據項的情況下,這時數據的最終結果依賴於各個進程(線程)執行的順序(也就是結果不是唯一確定的了,比如同時修改變量bP1執行b = 1, P2執行b = 2結果有競爭失敗者決定)。

臨界區

類似於b的這種資源稱爲臨界資源(critical resource),程序中操作臨界資源的程序段稱爲臨界區(critical section)。就是說事兒肯定是出在臨界區裏的。

互斥(multual exclusion

多個進程嘗試進入同一個不可共享的資源的時候進程間需要是互斥的。這個不可共享的資源就是上面說的臨界資源,進入的程序段即臨界區。

互斥的要求:

l 互斥是系統強制的。

l 在臨界區外掛起的進程不能夠干涉其他進程。

l 請求臨界資源的進程不能被無限期的延遲,即不能有死鎖。

l 當沒有進程處於臨界區時,對臨界資源的請求必須立即分配。

l 互斥不能建立在任何關於進程相對速度或執行順序的假設上。

l 一個進程在臨界區的時間應該是有限的。

 

進程交互

進程交互分三種情況:

l 進程間互不相認:比如多道程序設計,這些進程間存在共享資源但是彼此不知道,操作系統需要保證進程間的安全。

l 進程間簡介知道彼此:進程不知道彼此的ID,但是知道存在共享資源,進程間表現爲合作。

l 進程間直接知道彼此:進程知道彼此的ID,存在共享資源,進程間表現爲合作。

 

併發性的硬件支持

Interrupt disable

進程聲明自己的某一段程序是不可被中斷的,這招只在單個處理器的情況下有用,因爲多個處理器則存在進程並行運行。

Compare & swap instruction

CPU提供的原子指令,用測試值(test value)檢查內存單元(*word),如果相等就用給定的值設置內存單元(newvalue),最終返回替換前的內存單元值。

使用:內存單元的初始值是0,多個進程執行用0去測試並替換爲1的指令,只有獲取到0的返回值的進程獲得了進入臨界區的資格,在離開臨界區前進程要重置內存單元值爲0

Exchange Instruction

CPU提供的原子指令,用內存區域的值和一個寄存器的值交換。也就是隻有換到寄存器初始值(換完以後檢查內存區域的值)的那個進程可以進入臨界區並在離開時重置寄存器。

硬件支持存在的弊端:

1,採用的是忙等待(busy waiting)的方式,CPU一直在進程間切換,效率低。

2,可能發生飢餓:總有一個二活人品差,搶不到而又沒有任何辦法干預。

3,可能存在死鎖:P1獲得了臨界資源但是同時P1P2中斷了(P2優先級高),P2卻無法獲得被P1佔有的臨界資源,P1同時得不到CPU的計算週期。

併發性的軟件支持

信號量(semaphore

用於進程間傳遞信號的一個整數值。提供了三種操作初始化、信號加和信號減。只有01的信號量稱爲二元信號量。減操作semwait用於阻塞一個進程(當信號量爲0的時候阻塞),加操作semsignal用於激活被阻塞的進程。、

生產者與消費者

生產者負責生產資源並加入到指定的緩存中,加入過程如果緩存已滿要阻塞生產者;消費者負責消費資源,如果緩存已空要避免消費者消費不存在的資源。

const int bufferSize = n1;

semaphore s = 1, n = 0, e = bufferSize;

producer

{

while(true)

{

produce();

semwait(e);

semwait(s);//s信號量用於控制每次只有一個進入critical section

append();

semsignal(s);

semsignal(n);

}

}

consumer

{

while(true)

{

semwait(n);

semwait(s);

taken();

semsignal(s);

semsignal(e);

consume();

}

}

監聽者(管程)

信號量的麻煩在於分佈在程序的各個地方,一處錯誤就可能導致併發同步的錯誤。監聽者提供了更完善的機制用於併發同步。參考監聽者子圖。

監聽者包括局部數據、條件變量和若干過程和等待隊列等,局部變量是被監聽者機制保存的處於外部進程不能訪問或影響局部變量。

進程可以通過調用監聽者的某一過程來進入監聽者,但是同一時間只有一個進程處於監聽者中(其它的在外面排隊,也就是進入隊列)。

監聽者包含若干個條件變量,可以視條件變量爲指向某一等待隊列的指針。

監聽者提供了cwaitcsignal方法,調用cwait(c)將在條件變量c上阻塞當前進程並使監聽者可用,當前進程加入到條件變量c的等待隊列,調用csignal(c)將激活條件變量c的等待隊列上的進程並重新嘗試獲得監聽者(一般是激活一個,也有可能是signalAll<對於條件變量不明確的情況激活所有的進程,使正確的進程運行其它的進程則因爲未獲得條件變量再次阻塞>)。

除此監聽者還提供了緊急隊列(也可能沒有),對於進入到過程中的但最後沒有調用csignal的進程(它可能是在過程中阻塞了或者怎麼完蛋了)有兩種處理方式:1,踢出去重新回到進入隊列和大家競爭。2,考慮到這個進程已經執行了過程的部分邏輯有必要把它加入到緊急隊列中,監聽者會在空閒後重新激活緊急隊列中的進程。

注意與信號量不同的是,在調用csignal(c)的時候如果條件變量c的等待隊列上沒有任何進程,那這個動作將不產生任何效果也不會累計下去。

生產者/消費者問題中Monitor的實現:

monitor

{

int size, nextin, nextout

appand(node)

{

if(nextin == size) cwait(notFull);

buffer[nextin] = node;

nextin = (nextin + 1) % size;

count++;

csignal(notEmpty);

}

 

take(char x)

{

if(count == 0)cwait(notEmpty);

x = buffer[nextout];

nextout = (next + 1) % size;

count--;

csignal(notFull);

}

}

消息傳遞

消息傳遞是進程間通信的另一個手段,其一個優點是除了進程間還可以適應分佈式、共享的系統。消息傳遞最典型的兩個原語:send(source, message)receive(destination, message),其中可以是阻塞send、阻塞receive的也可以是不阻塞send阻塞receive的或者兩者都不阻塞。

消息的組成包括消息頭和消息體,消息頭包括目的地Id、消息格式、源Id、消息長度等信息,消息體則是消息內容。

尋址:消息可以是一對一的也可以是一對多、多對一或者多對多。

消息的排隊原則:默認情況下消息的接收應該是先進先出的對了,除此還要考慮緊急程度的優先級設置。

生產者消費者的消息實現:

producer

{

while(true)

{

receive(mayproduce, pmsg);

pmsg = produce();

send(mayconsume, pmsg);

}

}

consumer

{

while(true)

{

receive(mayconsume, pmsg);

pmsg = consume();

send(mayproduce, pmsg);

}

}

main()

{

create_messagebox(mayconsume);

create_messagebox(mayproduce);

for(int i = 0; i < N; i++) send(mayproduce, null);

parbegin(producer, consumer);

}

 

讀者和寫者問題

讀者/寫者問題不同於生產者消費者,一個資源可以同時有多個讀者但是同一時間只能有一個寫者。寫者和讀者不能同時獲取資源。

可以存在兩種類型的鎖

1,讀者優先:文件未被佔用或存在讀者時可以繼續加入讀者。

2,寫者優先:文件被讀者佔用後一旦出現寫者後續不能加入讀者。

可以基於信號量或者消息發送來解決,個人覺得能通過信號量的一定能通過Monitor解決。

死鎖和飢餓

死鎖:兩個或多個進程間都需要幾個臨界資源,但是各個進程持有其中一個臨界資源而嘗試獲取另外的臨界資源。

飢餓:可能是優先級或者調度算法本身的原因導致某個進程始終無法獲取到臨界資源(競爭激烈),雖然不存在死鎖但是這個進程做不了任何事情。

聯合進程圖(Join Process Diagram

資源類型

可重用資源:比如I/O設備、文件等等,它們在同一時間只可以被一個進程使用,但是使用之後並不會因此而銷燬。

可消耗資源:比如存在I/O中的一段流數據,一旦被使用就不在存在了,但是可以被製造出來。除此以外還有信號、中斷、消息等等。

死鎖形成的條件

1.互斥

2.不存在搶佔

3.持有和等待

4.形成了等待的環路

1~3:有可能產生死鎖但是並沒死鎖。只有4發生的時候死鎖纔是真的產生了。

死鎖預防(protection

死鎖的預防不同於死鎖避免,死鎖預防的目的在於干涉死鎖形成的條件1~4使得死鎖無法形成,往往導致的成本很高並且不很實用。

1.互斥:無法消除,有併發就有互斥。

2.搶佔:這個可以做到有幾種途徑:a,當進程資源請求被拒絕時強制其釋放已佔有的資源,在後續需要時可以重新申請。b,當進程申請已被其它進程佔有的資源時系統允許其搶佔。這兩種方法都有一個大前提就是資源狀態必須是容易保存和恢復的,否則就啥都沒了。

3.持有和等待:可以讓進程一次申請所有需要的資源,這將不會出現持有並等待的情況。但是這是在進程能夠預測它所使用的所有資源的前提下才成立的,並且效率很低。進程會在沒有用到資源前先佔用資源。

4.形成環路:可以將各個資源類型定義成線性順序,只有佔有了前面資源的進程才能進一步申請後續資源——同樣效率是硬傷。

 

死鎖避免(avoidance

死鎖的避免是運行時發現進程的啓動或者請求會導致死鎖,從而採取不啓動或阻塞的措施。

1,如果進程的請求導致死鎖,則不啓動進程。這個比較難做到,因爲它要求進程提前預知自己要用到的所有資源。

2,如果進程請求的資源可能導致死鎖,則不分配資源給進程(塞你一會兒)。這個是更可行的辦法。

方法2的運算如下:

OS中始終維護下列數據:

1,矩陣C(claim)爲各個進程聲明的需要用到資源。

2,矩陣A(allocation)現在以分配給各個進程的情況。

3,向量R當前系統擁有的資源

當一個進程申請起源是,OS假設分配資源給它並更下上面的數據,之後查看是否會產生死鎖:

1C - A得到矩陣P描述每個進程順利完成時要得到的剩餘資源。

2,向量R - A中各個資源的合計值等到向量V當前可用的資源。

3,如果向量V中的資源不足以使P中任何一個進程得到滿足,那麼即將發生死鎖,這時候拒絕進程的請求。

4,如果存在可完成的進程,把進程的資源加入到向量V中重複3步驟直到所有進程可完成或出現死鎖。

 

R1

R2

R3

P1

3

2

2

P2

6

1

3

P3

3

1

4

P4

4

2

2

矩陣C

 

 

R1

R2

R3

P1

1

0

0

P2

6

1

2

P3

2

1

1

P4

0

0

2

矩陣A

 

R1

R2

R3

P1

2

2

2

P2

0

0

1

P3

1

0

3

P4

4

2

0

矩陣C - A

R1

R2

R3

9

3

6

系統資源向量R

R1

R2

R3

0

1

1

當前可用資源向量V

由於當前可用資源可以滿足P2,所以可以加回P2的資源並重復步驟3

死鎖的檢測和恢復

死鎖的檢測其實和上面的步驟是一樣的需要兩個矩陣:Q——進程請求資源(是排除已分配資源後)、A——進程已經分配的資源,一個向量V當前可用資源。

1,標記A中所有資源佔用都爲0的進程行。

2,初始化臨時的向量W是它等於V

3,查找Q中爲標記的i行,其中i行小於向量W。如果找不到i則種植算法。

4,如果找到i行,將i標記並把Ai行數據加回到W中。重複步驟3

當算法結束時如果存在爲標記的行則已經發生死鎖。

 

死鎖的恢復有點野蠻:

1,取消所有死鎖的進程。這是現代操作系統最常用的辦法。

2,回滾進程到之前一個檢查點(checkpoint),重新啓動。操作系統需要具備回滾和恢復的能力,這樣仍然有死鎖的風險,但是併發的不確定性能保證死鎖最終不再發生。

3,連續取消死鎖進程直到最終不再出現死鎖。取消進程的順序依賴某種成本的原則,取消後重新調用死鎖檢測,如果仍然存在死鎖繼續取消。

4,連續搶佔資源直到死鎖不再發生。同樣基於某些成本選擇的方法,資源搶佔後重新調用死鎖檢測,一個被搶佔資源的進程需要回滾到獲取該資源前的檢查點。

34步驟可以考慮一下原則:

l 目前消耗處理器時間最少。

l 目前爲止產生的輸出最少

l 預計剩下的時間最長。

l 目前位置分配的資源總量最少。

l 優先級最低。

哲學家就餐問題

一個屋子裏有5個哲學家他們一天中除了睡覺只做思考和吃飯兩件事情,屋子裏有一個桌子提供了哲學家喜歡的意大利粉,但是由於哲學家每天至思考導致身體退化他們需要用兩個叉子才能夠進食,他們坐下後會先拿起左手的叉子,然後拿起右手的叉子,之後進食吃飽以後放下兩把叉子。桌子周圍一共提供了五把椅子在每個椅子間提供了一把叉子,請爲哲學家設計吃飯的算法。

如果5個哲學家同時餓了那麼每個人都會拿到左手的叉子而死鎖。

哲學家吃飯問題可以通過信號量或者Monitor來處理。

 

 

內存管理

內存管理的目的:

l 重定位

l 保護

l 共享

l 邏輯組織

l 物理組織

內存分區

固定分區

分爲大小相等和大小不等的固定分區策略。內存預先被劃分爲固定大小的內存區域,進程可以安裝到大於等於自身的內存區域中。

存在內部碎片、大於最大內存區域的進程無法加載、內存利用不充分。

動態分區

動態的根據進程大小進行內存區域劃分,從而使得每個進程可以裝進和自己大小相等的內存區域。

存在外部碎片、需要定時壓縮外部碎片否則內存被割裂成很多小區域。

夥伴系統

採用二分法把內存等大小的兩塊區域(2^1),再將其中一塊區域繼續二分爲2^2層,逐次分配下去直到進程所需的大小M2^(N+1) < M <2^N)時保存進程。在進程釋放後再進行合併爲較大的塊。

夥伴系統彌補了固定分區和動態分區的缺點,但是分頁和分段提供了更高級的分區方式。

重定位

因爲進程換入換出後不一定仍加載到原來的內存位置,所以在程序中不可能確切的寫出實際的內存地址,而是通過偏移量來描述位置。

分頁

內存被劃分成許多等大小的幀,程序被劃分成與幀大小相等的若干頁。進程加載時需要將所有頁加載到內存中不一定連續的幀中。系統維護了頁表描述程序佔用的頁和空閒頁表。

分頁沒有外部碎片,由於每個幀很小隻有最後一幀是可能存在內部碎片的,所以只會出現很小的內部碎片。

頁的大小將直接影響性能。頁太小時:頁數多開始時頁面錯誤率很高,一段時間後由於頁面都已加入趨於平穩,但是過小的頁將使每次讀寫的區塊很小。頁增大時:每一頁所包含的單元和相關單元越來越遠,局部性被削弱錯誤率增加,不斷增大時錯誤率又減小當頁大小等於進程P時不再有也錯誤,整個進程都在內存中。由此導致的問題是主存中能存入的進程越來越少。

頁表

操作系統爲每個進程維護一個頁表描述進程中頁與幀的對應,邏輯地址分爲了頁號和偏移量兩部分。一般情況下頁表的大小位頁的大小,頁表中每條記錄稱爲頁表實體(PTEpage table entry)。

頁表可以是多級頁表,受制於頁大小的限制頁表的大小不能大於一頁(也不可能把巨大的頁表存放在主存中),因此頁表做多級處理,根頁表始終在主存中,當次級頁表不在主存中時從輔存加載對應的頁表進主存。

根據頁表尋址

l 根據虛擬地址的頁號查找根頁表對應的幀號。

l 幀號+次級頁號合成次級頁表的地址找到對應的主存中幀號(如果存在的話)。

l 幀號+偏移量獲得實地址。

l 如果頁表中頁表實體的標誌位標誌當前頁沒有加載到主存中,發生頁錯誤中斷交給操作系統加載,進程被中斷處於Block狀態。

反向頁表(Inverter Page Table

這是另一個可行的從虛地址獲取實地址的方案。

針對虛擬內存中頁表大小和虛擬地址範圍成比例的缺點(太大了),反向頁表大小是固定的取決於主存中實際幀數。反響列表對虛擬地址的頁號做Hash運算取得Hash值,每一個Hash值對應一個數據項。數據項中記錄了進程ID和主存中幀號,通過幀號和偏移量就可以得到實地址了。由於多個虛擬地址可能映射到同一個Hash值,反向頁表需要維持鏈結構(當前項連接到同值的其它項),所以進程IDHash值共同決定了虛擬地址對應的數據項。

反響的含義是指使用幀號而不是頁號來索引頁表項。

轉移後備緩衝器(TLBTranslation Lookside Buffer

這是(虛擬內存地址轉換)硬件設備的一部分,相當於高速緩存。因爲正常情況下虛擬地址的訪問要經過兩次主存——一次查找幀地址,一次取數據,轉移後備緩衝器緩存了頁號和幀地址的對應關係,只有在未命中的情況下采取訪問頁表查找幀號。

分段

簡單分段類似於簡單分頁,是將主存換分成大小不等的若干段,一個進程可以存儲在不連續的段中。分段的大小受限於分段最大長度。分段對程序員是可見的,它具有處理不斷增長的數據結構的能力以及支持共享和保護的能力。操作系統爲每個進程維護一個段表。

分段存在外部碎片。

段頁結合

段頁結構是將程序劃分成段,每段保存在主存中對應的段裏,在主存中段是由等大小的多個頁組成,當段最後不足一個頁時佔用一個頁。

段頁結合的方式結合了分段和分頁的長處。在分段系統中由於每段有長度屬性,避免了程序不經意的越界訪問。進程間存在共享時多個進程可能持有同一個段的引用,頁結構也可以是實現類似的結構。

虛擬內存

當程序太大超過主存時就需要虛擬內存了,另外多道程序設計希望同時有儘可能多的進程加載到內存中,由於局部性的原理進程不需要全部加載進內存而是加載頻繁是用的區塊(稱爲駐留集),進程的其它部分保存着專門的輔存區域中。這個機制稱爲虛擬內存。

系統抖動

當系統換出一塊內存區域後緊接着它有需要調用它,當這種情況頻繁發生的時候就導致了系統抖動。

讀取策略

分爲請求式分頁和預約式分頁。請求式分頁是指當確實需要訪問到某頁時才把它加載進主存,預約式分頁是利用局部性原理將可能訪問到的當前請求的後續頁面加載到主存中。顯然預約式分頁更可取,但是會造成一定的浪費,在首次加載頁面和發生頁錯誤時適合採取預約式分頁。

放置策略

替換策略

替換策略是在加載新的頁時主存已滿需要替換出頁時決定那些頁將被替換的算法。

最佳(OPTOptimal

最少發生頁錯誤的算法,是優先替換那些距離訪問最遠的頁面,需要預知頁的請求順序,本身是不可能實現的,但是可以作爲參考比對其它策略。

最近最少使用

實際上是性能上最接近最佳的,但是仍難以實現。一種實現方式是給每個頁定義最近訪問的時間標籤,並在每次訪問後更新標籤,即使通過硬件支持成本和開銷仍然很高。

先進先出

依賴的理論是一個在很久以前加載的頁現在很可能已經不再訪問了,但是結果往往並非如此,這種策略很容易實現。

時鐘

環形的結構,通過指針指示當前所在位置,每個頁有一個使用爲在訪問後標記其值爲1。在需要替換時移動指針找到第一個標記位等於0的頁,指針每移動過一個頁就將這個頁的使用位清零。這樣如果沒有使用位爲0的頁,當移動一圈以後最初的位置就會被清理。

一個改進是增加修改位——這也是必須的因爲被修改的內存必然要寫入輔存。現在有兩個指示位(訪問u,修改m),算法如下:

1,查找u=0,m=0的頁,如果存在替換。這一步不清零訪問位。

2,如果1失敗,查找u=0m=1的頁,並且這個過程中把訪問位清零。

3,如果2失敗,重複1,必要時重複2

這樣好處是儘量不去替換髮生數據修改的頁,少了寫回輔存的動作。

頁緩衝

也是避免系統抖動的一個策略,在主存中劃分出一定的緩存,用於保存那些被替換出的頁,根據局部性原理他們很可能近期會被訪問到。這個緩存是一個先入先出的隊列,一般頁面被訪問則直接從緩存中取回,如果一直沒有被訪問則最終會被擠出緩存。

駐留集管理(Resident Set

虛擬內存中並非一個進程的所有部分都加載到主存中,程序運行過程中常駐內存的部分稱爲駐留集。

駐留集的討論包括兩部分:駐留集分配(大小)和替換範圍。其中駐留集不可變的情況下替換算法已經在替換側路討論過了,駐留集可變的情況下將有所不同。

固定分配,局部範圍:每個進程的駐留集大小固定,每個進程一旦有一個頁換進來就要有一個頁換出去。需要根據程序的類型、優先級等預先分配固定的大小,一旦過小則會保持較高的也錯誤率,如果較大則會佔用資源,系統運行緩慢。

動態分配,全局範圍:根據進程運行的狀態調整駐留集的大小,如果頁錯誤率較高就適當加大駐留集,如果進程錯誤率一直保持較低水平說明程序的駐留集足夠大,可以適當削減一些也不會危及程序。全局範圍則可在所有進程間選擇要被替換出的頁,難點在於沒辦法確定該從哪裏換出頁(即很可能換了不該換的),解決辦法是頁緩衝。

動態分配,局部範圍:動態分配的效果同上,同時限制在進程自己的範圍內換出頁。在這個策略中要求對增加或減少駐留集大小進行評估並且要預估將來進程的情況,因此比簡單全局替換要複雜得多,但會提供更好的性能。

駐留集的替換策略

工作集策略(Working Set

Wt,r)是關於t和r的函數,t是單位時間,r是窗口的寬度定義最近的r個單位時間中用到的頁的集合。即始終有W(t, r+1) 包含 W(t, r)。

工作集如下工作:

1,監視每個進程的工作集。

2,週期性的從一個進程的駐留集中移除那些不在工作集中的頁,可以使用LRU策略。

3,只有當一個進程的工作集在主存時纔可以執行該進程(也就是駐留集包含了工作集)。

首先工作集是有效的,它利用率局部性原理,並未該原理設計了一個可以減少頁錯誤的內存管理策略。遺憾的是工作集存在很多問題:

1,現在不總是代表未來。

2,開銷太大,實現監視每個進程不現實。

3,r最優值未知。

但是工作集提供了參考,以下方案都是基於工作集思想的:

頁錯誤頻率(Page Fault FrequencyPFF

主存中每個頁都有一個使用位(和時鐘的一樣作用),操作系統記錄每個進程上一次頁錯誤的時間戳,如果發生了頁錯誤查看兩次頁錯誤的時間間隔如果小於閾值F,則加入新的頁(擴大駐留集),否則清除所有使用位爲0的頁,並把當前駐留集的頁使用位清零(縮小駐留集)。一個改進時加入使用兩個閾值——一個是駐留集增加的最高閾值,一個是駐留集減小的最低閾值(指頻率)。

頁面錯誤頻率是工作集的一個折衷,使用頁緩衝則可以達到相當好的效率。但是一個缺點是如果要轉移到新的局部性,會導致暫時的駐留集猛增。轉移到新的局部性是指,進程運行一段時間會切換到不同的邏輯指令部分,這時候局部性發生偏移,之前的駐留集不再需要。

採樣間隔可變工作集(Variable-interval Simple Working SetVSWS

針對PFF在內存高峯是來不及淘汰就得駐留集而導致進程頻繁換入換出等開銷(頻率不夠快),採用動態的採樣率以期望儘快淘汰不需要的頁。

採用三個參數:L採樣區間最長寬度、M採樣區間最短快讀、Q採樣區間允許發生的頁錯誤數。VSWSPFF一樣使用了頁的使用位,不同之處在於頻率的調整:

1,如果採樣時間超過了最長時間L,掛起進程並掃描使用位。

2,未達到最長時間,但是頁錯誤數超過了Q

2.1,如果採樣間隔超過了M則掛起進程並掃描使用位。

2.2,如果採樣間隔沒有超過M,則一直等待採樣時間到達M進行掃描。

清除策略

清除策略目的在於確定何時講一個被修改的頁寫回輔存,分爲請求式清除和預約式清除。

請求式清除採取動作的時間比較慢,影響性能。

預約式清除把需要修改的頁在需要用到它們的頁幀之前批量的寫回輔存。但是預約式清除寫回的頁在替換策略確定移除它之前仍有駐留在主存中,這期間可能再次發生修改導致清除無意義。

改進辦法是使用頁緩衝,分爲兩個表存儲替換策略淘汰的頁。一個表寸修改的頁,一個表存未修改的頁,修改表中的頁被批量的寫回輔存,然後移動到未修改表中,未修改的表準備被擠出或者拿回。

 

加載控制

加載控制是關注多道程序設計的控制,系統中多道程序的數量稱爲多道程序設計級。當多道程序數量過少時系統會比較空閒,過多時則會導致較高的頁錯誤率和抖動。

一個方案稱爲L=SL是頁錯誤間隔的平均時間,S是頁錯誤的平均處理時間,實驗表明當兩者接近時處理器使用率達到最大。

另一個方案是50%方案,即始終報紙分頁設備的使用率保持在50%左右,此時的處理器使用率也是最大。

另外策略是監視時鐘(Clock)替換策略的環形緩存區指針移動速度,當移動速度低於某個閾值時可能是以下兩種情況之一:

1,很少發生頁錯誤,指針很少移動。

2,未被使用的駐留頁太多,指針不需要移動太多就可以找到可清除頁。

這兩種情況都表明進程的駐留集分配太大,可以增加多道程序設計級。另外還可以包括一個高閾值,如果指針移動速度超過這個閾值,則表明多道程序設計級太高,導致頻繁的頁錯誤,則要掛起進程以減少多道程序設計級。掛起進程的策略可以是:

l 最低優先級

l 正在發生頁錯誤的進程(Faulting process):原因是該進程很肯能駐留集還沒有形成,因此暫停它的代價很低。

l 最後被激活的進程:同樣很可能有最小的駐留集。

l 擁有最小駐留集的進程:重新裝入的代價最小,但是不利於駐留集較小的程序。

l 最大的進程:釋放較大的空間,不用很快又去取活其它的進程。

l 具有最大剩餘執行窗口的進程:類似於最少剩餘時間策略,把已運行時間最短的掛起。

 

處理器調度

 

單處理器調度

調度類型

長程調度:決定是否將任務加入到待執行的進程池中。

中程調度:決定進程的部分或全部加入到內存中(從SuspendedReady)。

短程調度:決定哪一個就緒的進程將被執行。

I/O調度:決定哪一個掛起的I/O請求將被可用的I/O設備執行。

處理器調度關注的是短程調度。

調度準則

面向用戶

響應時間:從任務提交到開始有響應輸出的時間,一般的當處理器開始處理任務時即開始有輸出。

週轉時間:從任務提交到任務完成的時間。

最後期限:當可以指定最後期限時,操作系統降低其它目標,是滿足最後期限的作業數目的百分比達到最高。

可預測性:無論系統當前負載情況是繁重還是空閒,一個給定工作完成的總時間和總代價應該是相等的。

面向系統

吞吐量:單位時間內完成的進程數。

處理器利用率:處理器處於忙狀態的時間百分比。對於昂貴的共享系統來說這是一個重要的準則,對於個人系統則顯得不那麼重要。

公平性:沒有來自用戶或其它系統的指導時操作系統應該公平的對待所有進程,沒有一個進程會處於飢餓狀態。

強制優先級:當指定了優先級後調度策略應優先響應高優先級的進程。

平衡資源:調度策略應是系統的所有資源保持忙碌的狀態,較少使用緊缺系統資源的進程應該得到照顧。

調度算法

歸一化週轉時間:它是指進程週轉時間與服務時間的比率,最小值是1.0.該值表示進程的相對延遲,典型的進程的執行時間越長可容忍的延遲越長。

先來先服務(FCFS:沒有優先級和搶佔,所有進程按照加入的順序執行。這樣的調度偏向於執行時間長的進程。FCFS策略本身對操作系統不是很有吸引力,但是它經常和優先級系統配合使用產生有價值的調度策略。

輪轉(Round Robin:對處理器資源進行時間分片,依次分配相同的時間資源給每個就緒的進程。輪轉的時間片最好略大於一次典型交互的時間,當時間片足夠大時退化爲FCFS策略。

輪轉增加了處理時鐘中斷、進程切換和分配函數的開銷,因此時間片不應該過短。該策略對短執行時間的進程有所改善,但是一個問題是進程分爲I/O密集型和處理器密集型,由於I/O密集型進程經常被I/O中斷,所以輪轉策略傾向於處理器密集型。

一個改善的策略是虛擬輪轉法(Virtual Round Robin),它增加了一個I/O隊列,當一個進程被I/O阻塞後它加入到I/O隊列,在就緒後它I/O隊列有高於就緒隊列的優先級,該進程後續的執行時間與已執行時間的和不會超過時間片。

最短進程優先(SPNshortest process Next:具有最短執行時間的進程有更高的優先級,它依賴於系統估計進程的執行時間,在批處理系統中任務加入時程序員給出任務的估計時間,如果任務執行時間遠遠超過給出的估計時間它將被廢棄。在生產環境中有大量的重複任務,系統將監控每次任務執行的時間以估計執行時間,最簡單的公式是s=(各次時間和)/n,一個避免每次求和的優化是s=S(n-1) + Tn/n,上述公式每次執行的權值是相同的,典型情況下我們希望最近的執行情況有更大的權值Sn+1 = aTn + (1-a)Sn

最少剩餘時間(SRTshortest remain time:是SPN的改進版本增加了搶佔機制,在不斷有短進程加入的情況下長進程可能處於飢餓狀態。

最高相應比優先(HRRN,Highest Response Rapid Next:使用公式(w+s)/s,其中w是等待時間,s是服務時間。操作系統始終選擇具有最高相應比的進程,同樣需要估計和記錄進程的服務時間。該策略非常具有吸引力,當偏向短進程時,長進程由於得不到處理響應比不斷增加。

反饋:不想SPNSTRHRRN策略那樣需要估計時間,反饋策略傾向於短進程,它具備多個隊列Q1~Qn,當進程加入時處於Q1隊列中,採用FCFS的順序服務隊列中的每個進程,當進程允許超過時間閾值時中斷並加入到下一級隊列中Q2,依次類推。Q1具有最高的優先級,只有Q1中不存在進程是才執行下一級的隊列。這樣可能導致的問題是過長的隊列可能加入到Qn隊列後處於飢餓狀態,因此要見識進程的等待時間,如果超過一定長度則重新調入到Q1中。

 

多處理器調度

多處理器調度關注的類型

粒度

無約束並行性:進程之間沒有顯示的同步,每個進程都是一個單獨的程序。無約束並行可能達到每個用戶都像是使用單獨的計算機或工作站。

粗粒度和非常粗粒度並行性:進程之間存在這同步,但是在一個非常粗淺的級別上,這種情況可以簡單的處理成一組運行在多道程序單處理器的併發進程,在多處理器系統是允許的軟件進行很少或者不進行改動就可以支持。

中等粒度並行性:應用程序可以被進程中一組線程有效的實現,這種情況下程序員需要顯示的指定潛在的同步性,應用程序之間需要高程度的合作與交互。

細粒度並行性:代表着比線程間更加複雜的同步情況,迄今爲止仍是特殊的未被分割的領域。

進程調度

集中調度or對等調度:

集中調度即調度中存在主處理器,所有的任務分發由主處理器來完成,這種情況下主處理器可能成爲系統的瓶頸。

單處理器使用多道程序設計:

 

與單處理器性能的不同:

多個處理器系統中由於一個長進程在單個處理器上執行時,其它的進程可以分配到另外的處理器上因此複雜的調度策略不再顯得非常重要,調度策略的開銷可能成爲性能損失。FCFS策略變得可接受。

線程調度

負載分配:

提供全局隊列,每個處理器只要空閒就從隊列中取任務執行。

優點是:負載均勻的分配給處理器,不存在空閒的處理器;不需要集中調度;可以使用單處理的任何一種調度方案進行分配。

缺點是:中心隊列佔居了必須互斥訪問的存儲器區域,因此多處理器同時查找時會成爲瓶頸,當只有幾十個處理器時不是大問題,但是上百個處理器時就會出現瓶頸。被搶佔的線程可能在不同的處理器上執行,如果每個處理器都配有高速緩存的話那麼命中率將非常低。如果進程的所有線程都視爲在公共線程池中那麼進程的線程可能不會同時被處理,當線程間存在高度合作時則出現瓶頸。

組調度:

一組相關的線程基於一對一的原則,同時分配到一組處理器上去。

優點:如果緊密相關的進程並行執行那麼同步阻塞可能減少,從進程推廣到線程組調度把一個進程所有的線程視爲相關的;調度開銷可能減少,因爲進程內線程間可能相關如果一個線程在高速允許,而它以來的線程沒有運行就會出現阻塞和調度。

缺點:組調度同一時間調度一個進程中相關線程,某些進程的特性可能至適應單線程允許將會出現其它處理器空閒的情況,解決辦法是把若干單線程的進程視爲一組允許。

專用處理器分配:

每個程序執行時被分配給一組處理器,處理器個數與進程的線程數相等,當進程執行完後處理器返回到處理器池中等待處理其它任務。這個策略看似是極端浪費的,它會等到進程運行結束纔將處理器分配給其它的進程使用,而一旦一個線程被I/O阻塞執行它的處理器將空閒。

採用這個策略的原因:

1,高度並行的系統中有數十或者數百個處理,每個處理器只佔系統總代價的一小部分,處理器利用率不再是衡量有效性或性能的重要因素。

2,一個程序的生命週期裏避免進程切換會加快程序運行。

動態調度:

執行期間進程的線程數可以改變。某些應用程序可能提供了語言和系統工具允許動態的改變進程中的線程數目。提供了一種操作系統和應用程序共同進行調度決策的方法。

當一個作業請求一個或多個處理器時:

1,如果有空閒處理器分配滿足它們需求。

2,否則如果作業新到達,從當前已分配多個處理器的作業中分出一個處理器給它。

3,如果都不滿足那麼作業處於未完成狀態直到有空閒的處理器或者改作業廢除它的請求。

4,當釋放一個或多個處理器時爲這些處理器掃描當前未滿足的請求隊列,給每個沒有分配處理器的作業分配一個處理器,如果還有空閒處理器再次掃描隊列,按照FCFS原則分配處理器。

 

 

I/O設備調度

I/O功能的邏輯結構

邏輯I/O:邏輯I/O層將I/O設備視爲邏輯資源,不關心底層的細節。邏輯I/O代表用戶進程管理的一般I/O功能,允許它們根據設備標識符以及諸如打開、關閉、讀取等操作與設備打交道。

設備I/O:請求的操作和數據(緩衝的數據、記錄等)被轉換成適當的I/O指令序列、通道命令和控制器指令。可以使用緩存技術以提高使用率。

調度和控制:關於I/O操作的排隊、調度和控制發生在這一層,可以在這一次處理中斷,收集和報告I/O狀態。這一層是與I/O設備真正打交道的軟件層。

I/O緩衝

I/O設備劃分

I/O設備分爲面向塊(block oriented和麪向流(stream oriented)的設備,面向塊的設備將信息保存在塊中,通常是固定大小的,傳輸過程中一次傳送一塊。面向流的設備以字節流的方式傳輸數據。

單緩衝:系統在發送I/O指令後給I/O設備分配一塊位於主存中的緩衝區,傳輸數據被放在緩衝區中,當傳輸完成時立即嘗試讀取下一塊。根據局部性原理有理由期望下一塊被讀取,這種機制稱爲超前讀。

雙緩衝:單緩衝時I/O設備必須等待讀取緩衝區中數據被完全讀出才能再次寫入,雙緩衝設置兩塊緩存區域以平滑這種趨勢。設C爲進程處理塊的時間,T位讀取塊的時間,我們可以粗略估計塊的執行時間位maxCT),當C>=T是進程將不需要等待I/O,當C<T是則I/O設備可以全速運行。

循環緩衝:當爆發性的執行大量的I/O操作時,則僅有雙緩衝就不夠了,這種情況下使用多於兩個緩衝的方案來緩解,這種緩衝區域自身被當成循環區域使用。

需要指出的是緩存是一種技術旨在平緩I/O請求峯值的,當進程需求的I/O平均值大於I/O傳輸速度是再多的緩衝也不能解決問題。

磁盤調度

磁盤性能參數

尋道時間:機械臂移動到數據所在軌道的時間,現在典型磁盤的尋道時間Ts=10ms

旋轉延遲:磁盤旋轉到要讀取的數據位置的延遲,一般取平均時間即1/2r,其中r表示轉速。

傳送時間:磁頭讀取數據所花費的時間b/(Nr),b表示要讀取的字節數,N表示磁道上總字節數,r表示轉速。

磁盤調度策略

先進先出

先來的請求先服務,由於數據的請求式隨機的,會導致較高的尋址時間,效率差。

優先級

優先級是高優先級的請求先服務,一般是爲了滿足操作系統的特定目的,並沒有改善磁盤性能的能力。

後進先出(LIFO

令人驚訝的是這種選取最近請求的策略有許多優點。把設備資源提供給最近(使用系統)的用戶時會導致磁頭臂在一個順序文件中移動時移動的很少,甚至不移動。利用這種局部性原理可以提高吞吐量減少隊列長度,只要一個作業積極的使用磁盤它就能儘快得到處理。

當然如果有大量的請求就會導致最先的請求餓死。

最短服務時間優先(SSTF

總是選擇磁頭臂移動最少的請求響應,對於移動距離相等的請求可以隨機移動向一邊。同樣如果一個進程大量的請求臨近的數據會導致其它請求飢餓。

SCAN

SCAN要求磁頭臂向一個方向移動,移動過程中響應在當前磁道的請求。當磁頭臂到達最外(內)層磁道時,再反向掃描。這種算法並沒有很好的利用局部性原理(對最近橫跨過的區域不公平,不如SSTFLIFO好),由於兩側的數據被快速的掃描了兩次因此它偏向於外圍數據(局部性原理)。

C-SCAN

限定在一個方向掃描,當達到最後一個磁道時,磁頭臂返回到相反方向的磁道末端重新開始掃描。

N-step-SCANFSCAN

爲了克服進程的粘滯性,在SCANC-SCAN中一個或多個進程對一個磁道有較高的訪問速度時可能會壟斷這個磁道一段時間。N-step-SCAN設置若干個N個請求的隊列,每次掃描只響應一個隊列裏的請求,當開始掃描時新的請求需要加入到下一個隊列中。

 

RAID

RAID是一組磁盤系統把它們看爲一個單個的邏輯驅動器。

數據分佈在物理驅動器陣列中

使用冗餘的磁盤容量保存奇偶檢驗信息,保障一個磁盤失敗時,數據具有可恢復性。

磁盤高速緩衝

高速緩存是系統從主存中劃分的一塊區域,利用了局部性原理保存最近訪問的數據塊,用於提高更好的磁盤性能。

替換算法

LRU:最少訪問,將緩衝區設置爲一個棧,當一個塊被訪問後加入到棧中,如果再次得當訪問則把該塊從當前位置移動到棧頂,隨着塊的加入那些不被訪問的將會擠出棧中。

LFU:最小頻率訪問,對緩存中的塊增加計數特性,每次被訪問到時計數加1。當訪問輔存時,把計數最小的塊移除,加入最近的塊。由於局部性的問題,一個塊可能短時間內多次訪問使得計次很高,但是這之後並不意味着還會再次訪問它,所以LFU並不是一個好的算法。

基於頻率的替換算法:克服LFU的確定,在LRU的棧模型中劃分出位於棧頂的若干幀爲新區,當塊位於新區是重複訪問不增加訪問次數。

文件管理

文件系統軟件結構

基本文件系統:計算機與外部環境的接口,該層處理磁盤、磁帶的交互數據。

基本I/O管理程序:負責所有文件I/O的初始和終止。

邏輯I/O:是用戶和應用程序能夠訪問到記錄。

訪問方法層(堆、順序文件、索引順序文件、索引、散列):距離用戶和應用程序最近的層,在應用程序與保存數據的設備之間提供了標準接口。

文件結構:

域(Field):基本的數據單元,一個域包含一個值,如僱員名字、日期等。

記錄(Record):一組相關域的集合,可以看做應用程序的一個單元。

文件(File):一組相關記錄的集合,它被用戶或應用程序看做一個實體,並可以通過名字訪問。

數據庫(DB):一組相關數據的集合,它的本質特徵是數據之間存在着明確的關係,可供不同的應用程序使用。

文件組織和訪問

堆:

最簡單的文件系統。數據按它們到達的順序被組織,通過特定的分隔符或特定的域指明。每個域應該是自描述的,數據之間不一定存在聯繫或相同的格式。

當數據在處理器採集並存儲時或者當數據難以存儲時會用到堆。只能窮舉搜索,對大多數應用都不適用。

順序文件:

文件具有固定的格式,所有的記錄都有相同的格式,具有相同數目、長度固定的域按照順序組成。每條記錄第一個域稱爲關鍵域,唯一標識了這條記錄。

交互的表現較差,需要順序的搜索。一種情況下順序文件按照順序存儲在磁盤上,在發生文件修改時需要移動數據,可能的處理方式是把數據存在臨時堆上,定期的將數據批量寫回順序文件。另一種情況文件可能採用鏈式存儲,該方法帶來一些方便,但是是以額外的處理和開銷爲代價的。

索引順序文件

彌補了順序文件檢索的問題。檢索文件可以是簡單的順序文件,每條記錄包括兩個值一個關鍵域和指向文件的指針。簡單的檢索可以是一級的,也可以由多級檢索。查找文件時找到相等的域或者關鍵域值之前最大的域。

索引文件

順序文件和索引順序文件只能是順序檢索或對關鍵域檢索,索引文件對感興趣的域提供了索引,索引文件本身可以是順序的。索引文件分爲完全索引和部分索引,差別在於被索引的域是全部域還僅僅是感興趣的域。

索引文件一般只提供索引訪問的方式,不再支持順序訪問,因此記錄的組織也不必是順序的,應用程序只能通過指針訪問。

直接文件或散列文件

直接文件或散列文件開發直接訪問磁盤中任何一個地址一致的塊的能力,要求每條記錄中都有一個關鍵域,但這裏不存在順序的概念。

記錄組塊

磁盤中數據保存在塊中,塊越大每次傳輸的數據越多,效率越高。當時大的塊要求操作系統提供更大或者複雜的緩存,並且由於局部性的關係大塊中的數據可能是應用程序不需要的造成浪費。

固定組塊

使用固定長度的記錄,並且若干條完整記錄保存到一個塊中,每個塊末尾可能有未使用的空間稱爲內部碎片。

可變長度跨越式組塊

塊的長度可變,記錄可以跨越塊保存,如果一個塊的末尾空間不足一條記錄時,剩下的數據可以保存在下一個塊中,通過後繼指針指明。造成了更復雜的處理,並且當讀取跨越塊的數據時需要讀取兩次,消除了內部碎片。

可變長度非跨越式組塊

和上面相同,但是記錄不可以跨越塊保存。

二級存儲管理

文件分配

預分配:文件請求時聲明需要的空間,一次性分配。

動態分配:根據文件的增長每次分配一定的空間,或者一塊。

分配方法:

連續分配:始終給文件分配連續的空間。這種分配方式對於順序文件非常高效,並且可以簡單的檢索到需要的文件塊。但是會產生外部碎片,並且需要實時運行壓縮程序以消除外部碎片。

鏈式分配:文件不需要順序保存,每塊尾部通過指針指向下一塊數據,文件分配表中同樣只要保存一個表項。

鏈式分配的一個後果是局部性不再被利用,如果要順序的讀取一個文件時需要一連串訪問磁盤的不同部分,這對系統的影響很嚴重。一些系統週期性的的對文件進行合併。

索引分配:每個文件在文件分配表中有一個一級索引,分配給文件的每個分區在索引中都有一個表項,典型的文件索引在物理上並不保存在文件分配表上,而是保存在獨立的一個塊上,文件分配表中該文件索引指向這個塊。

可以消除外部碎片,按大小可變的分區分配可以提高局部性,任何情況下(大小可變分區、按塊保存)都需要不時的對文件進行合併。使用大小可變的分區情況下合並可以減少文件索引。索引分配支持順序和直接讀取數據,是最普遍的一種文件分配形式。

空閒空間管理

位表:使用一個向量,向量的每一位代表一塊磁盤,0表示空閒,1表示使用。優點是容易找到一塊或一組連續的空間,問題是需要窮舉來找到合適大小的區域,當磁盤剩餘很少空間時這個問題尤爲嚴重,因此需要設置特殊的數據結構輔助查找。如位表可以在邏輯上劃分爲不同的區域,建立區域彙總表統計每個區域的使用情況,查找空閒位時可以先找到合適的區域在查找位表中這部分區域的使用情況。

位表需要加載在主存中,一個位表所需要的存儲總量爲【(磁盤大小)/(8*文件系統塊大小)】(計算的是佔用的字節數),因此一個16GB的磁盤,塊大小位512字節時位表佔用4MB,如果每次去數據都從硬盤加載4MB的位表的話這個速度是難以忍受的。

鏈式空閒區

空閒表可以使用指向每個空閒區的指針和他們的長度值被連接在一起,因爲空閒表只需要一個指向第一個空閒區的指針,因此這種情況下空閒表的大小是可以忽略的。

這種分配法適合所有的文件分配方法,如果按塊分配可以移動位於頭部的指針,如果是按區域分配則可以順序的找到合適的區域並更新指針。

存在的問題:1,使用一段時間磁盤會出現很多碎片,許多區變成只有一塊大小。2,寫時需要先讀取該塊以發現下一塊的指針,如果進程請求大量的單個塊這個效率是很差的,同意刪除的時候也會導致很慢。

索引

索引是把空閒空間看做文件,使用之前介紹的索引表的方式記錄。基於效率的原因,索引適合使用在大小可變的分區分配的情況下。

空閒塊列表

每個空閒塊都有一個順序號,把順序號保存在磁盤的一個保留區中。根據磁盤的大小,存儲一個塊號需要24位或32位。這是一種令人滿意的方法,空閒塊列表部分保存在主存裏:

1,磁盤空閒塊列表佔用空間小於磁盤空間的1%

2,儘管空閒塊太大了,不能保存在主存。但是兩種有效技術把該表的一小部分保存在主存裏:

a,這個表可以是一個下推棧,棧中靠前的數千元素保存在內存中,當分配一個新塊時它從棧頂彈出,同樣當一個塊被接觸時把它壓入棧中。只有棧中部分滿了或者空了時候才需要從磁盤傳輸數據,通常情況下它是零訪問時間的。

b,這個表可以看所FIFO的隊列,分配時從頭部取走,取消分配時從隊尾入隊,只有隊空了或者滿了時才需要與磁盤傳輸。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章