【操做系統】《計算機的心智:操做系統之哲學管理》讀書筆記

    本書從生活哲學的視角對操做系統進行了獨到的闡述。從人類天然的行爲規範推演到操做系統的設計與實現,以一條邏輯軸線將整個操做系統的各類原理精彩呈現到讀者眼前。html

    這本書的語言風格比較獨特,做者以風趣形象的語言講解計算機系統的原理。linux

 

 

前言ios

操做系統的主要內容爲CPU管理(進程、線程)、內存管理(虛擬內存)、文件系統和輸入輸出系統。程序員

操做系統經過虛擬機界面爲用戶程序提供各類服務,各類應用程序在運行過程當中不斷使用操做系統提供的服務來完成本身的任務。算法

操做系統和各類應用程序之間能夠看作相互調用,從而造成一個很是複雜的動態系統。shell

 

 

第一篇 基礎原理篇
第1章 操做系統導論
引子:智者的挑戰編程

1.1 人造學科小程序

    人造科學特色:不許確,具備相對性<沒有對錯>;從對人類活動的觀察導出;依賴人的主觀能動性;一般符合人的直覺)windows

    神造學科特色:準確,絕對;從對天然存在的觀察導出;不依賴人的主觀能動性;一般違反人的直覺)數組

1.2 程序是如何運行的

1.3 什麼是操做系統

    一、操做系統是介於計算機與應用軟件之間的一個軟件系統。它掌控計算機上全部事情,使計算機變得好用(令人類從繁瑣的、複雜的對機器掌控的任務中解脫),使計算機運行變得有序(掌控計算機上全部事情)。

   二、主要功能

        1)替用戶及其應用管理計算機的全部軟硬件資源

        2)保證計算機資源的公平競爭和使用

        3)防止對計算機的非法侵佔與使用

        4)保證操做系統自身正常運轉

1.4 魔幻與管理

一、魔術師將計算機以一個更加容易、更加方便、更見強大的方式呈現給用戶使用。直白地說:就是把差的東西變好,把少的東西變多,把複雜的東西邊容易。

二、管理者(cpu管理、內存管理、外存管理、I/O管理——將XX分配給不一樣的應用與用戶)、(健壯性管理、安全性管理)(關鍵原則是效率和公平

1.5 用戶程序與操做系統
1.6 操做系統的範疇
1.7 爲何學習操做系統
思考題

第2章 操做系統歷史
引子:操做系統進化的推進因素
2.1 第一階段:狀態機操做系統(1940年之前)

2.2 第二階段:單一操做員、單一控制端操做系統(20世紀40年代)

  一組標準庫函數

2.3 第三階段:批處理操做系統(20世紀50年代)

批處理監控器+操做系統庫函數。分爲兩部分(一部分控制程序執行,另外一部分支持程序執行)

2.4 第四代:多道批處理操做系統(20世紀60年代)

同一時間運行多個程序(宏觀上),操做系統要在多個程序間切換而且能管理多個輸入輸出設備,保證一個進程不受另外一個進程的干擾。

既要管理進程,又要管理內存、還要管理cpu調度

2.5 第五代之一:分時操做系統(20世紀70年代)

多用戶,用戶直接和電腦交互

2.6 第五代之二:實時操做系統

軟實時系統和硬實時系統

2.7 第六代:現代操做系統(1980年之後)
2.8 操做系統的演變過程
2.9 操做系統的將來發展趨勢
思考題

 

第3章 操做系統基本概念
引子:「差很少」精神

3.1 計算機硬件基本知識

  一、總線結構->流水線結構->多流水線、超標量計算和超長指令字等多指針發射機制

  二、五級存儲架構(指令的存放單元):寄存器(訪問速度最快,容量最小,成本最高)、緩存、主存、磁盤、磁帶(訪問速度最慢、容量最大,成本最低)

  三、中斷、軟中斷

中斷的基本原理:設備在完成在的任務後向CPU發出中斷,CPU判斷優先級,而後肯定是否響應。若是響應,則執行中斷服務程序。、,並在中斷服務程序完成後執行原來的程序。

軟中斷:軟件發出的中斷

 

3.2 抽象

   一、抽象來源於現實(計算機硬件——cpu、內存、I/O設備)而又高於現實(更強大、更好用)

   二、抽象不光是操做系統提供給用戶的一個存在,它也存在與操做系統內部(操做系統內部分爲不一樣的功能塊,而不一樣的功能塊之間相互提供的也是抽象)

 

3.3 內核態和用戶態

   一、內核態(特權態、擁有/訪問資源多的狀態:運行在內核態的程序能夠訪問的資源多,可是可靠性、安全性要求高,維護管理複雜。

      例如:CPU管理,內存管理(保障計算機安全),診斷和測試程序(須要訪問計算機的全部資源),輸入和輸出管理(要訪問各類設備和底層數據結構),文件管理(一部分,文件系統自己的管理)

   二、用戶態非特權態、訪問資源將受到限制的狀態:運行在內核態的程序能夠訪問的資源受限,但可靠性、安全性要求低,維護管理較簡單

   例如:文件管理(一部分,用戶數據的管理),編譯器、網絡管理的部分功能、編輯器用戶程序

  三、用戶態和內核態是處理器的一種狀態,不是程序的狀態。能夠經過設置狀態字將CPU設置爲內核態、用戶態或其它子態。一個程序運行時,CPU是什麼態,這個程序就運行在什麼態。一個程序究竟運行在內核態仍是用戶態取決於其對資源和效率的需求。

    四、內核態和用戶態的實現

    要限制一個程序對資源的訪問,須要對程序的每個指令進行檢查(地址翻譯)才能完成。程序發出的每個指令都要通過這個地址翻譯過程,經過對翻譯的控制,就能夠限制程序對資源的訪問。內核態時,內核程序能夠繞過內存地址翻譯而直接執行特權指令,這種繞過翻譯的作法能夠突破系統對資源的控制。

 

3.4 操做系統結構

    巨大單一體的操做系統(內核態)->層次化的操做系統(內核態)->微內核的操做系統(內核態+用戶態)

3.5 進程、內存和文件

進程是一個運行中的程序。

內存是進程的存放場所。

文件是操做系統提供的外部存儲設備的抽象,是程序和數據的最終存放地址。

 

3.6 系統調用

一、操做系統一個系統程序,爲別的程序提供服務的程序。系統調用是操做系統提供的應用程序服務界面(API)。用戶程序是經過調用這些API來獲取操做系統的服務。

二、系統調用按功能能夠劃分爲六類(進程控制類、文件管理類、設備管理類、內存管理類、信息維護類、通訊類

三、系統調用分爲三個階段(參數準備階段、參數調用識別階段、系統調用識別階段

3.7 殼(shell)

    做用:負責將用戶的命令解釋爲核心所能理解的系統調用和中斷子例程;同時將核心的工做結果解釋爲用戶所能理解的可視化的字符界面或者圖形界面。
思考題

 

 

第二篇 進程原理篇

CPU是在操做系統控制(經過進程核線程)下按照必定的順序進行正確計算的。由於併發,咱們發明了進程和線程。進程出現的動機是人類渴望的併發。進程的出現也讓操做系統的複雜性大大增長:因爲須要對進程進行分離存儲而致使出現了內存管理;因爲須要讓不一樣進程有條不紊地推動而致使進程調度的出現。

三層併發

    流水線:計算機體系結構層面上的併發(指令級併發)

    進程:處理器結構層面上的併發

    線程:進程結構層面上的併發

第4章 進程
引子

4.1 進程概論

一、計算機三大核心功能(進程管理、內存管理、文件管理

二、進程:一個程序加載到內存後(正在執行)就變成了進程。進程=程序+執行

 

4.2 進程模型

物理視角:進程切換。每一個進程都佔用一塊內存空間,在任什麼時候間,CPU只執行一條指令,一個進程,至於執行哪條指令由物理程序計數器指定。也就是說,全部進程共用一個程序計數器。

邏輯視角:多道併發。進程能夠執行,也能夠掛起後先讓別的程序先執行,以後再接着執行。只需記住掛起時本身所處的位置。每一個進程都有一個程序計數器。

時序視角:持續推動。在運行一段時間後,進程都應該完成了必定的工做量,即進程每次返回,它都處於上次返回點以後。

備註:進程不必定必須結終,能夠一直運行到強制終止或關機。

 

4.3 多道編程的效率

    人們發明進程的目的是爲了支持多道編程,而進行多道編程的目的則是爲了提升計算機的CPU效率,或者說系統的吞吐量。

    多道編程的效率與每道程序的性質、多道編程的度數、進程切換消耗等都有關係,只要度數合適,利大於弊。

    多道編程對系統效率提升與度數關係的規律:隨着度數的增長,CPU利用率逐漸增長,直到一個臨界點,超過此臨界點以後呈現出逐步降低的趨勢,這時由於進程切換所帶來的系統消耗將變得很是明顯。

    多道編程的優勢:提升CPU利用率,改善系統的響應時間

 

4.4 進程的產生與消失

進程的產生(3種):系統初始化(神創造人);執行進程創立程序(人生子);用戶請求創立新進程(試管嬰兒)。

進程的消失(4種):壽終(運行完成而退出),自殺(進程因錯誤而自行退出),他殺(進程被其餘進程強行殺死),處決(進程

因異常而強行終結)

 

4.5 進程的層次結構

unix:進程樹->進程組,父進程,子進程

windows:進程樹,父進程,子進程(全部進程均地位平等

4.6 進程的狀態(記憶下圖


    進程掛起的緣由:進程在執行過程當中執行了某種阻塞操做,這種操做須要時間等待結果才能繼續執行,系統將該進程掛起,讓其餘進程執行;一個進程執行時間太長,系統爲了公平,將其掛起,讓其餘進程執行。前者是進程自身的緣由,後者是系統的緣由。

    從理論上,等待到執行是能夠發生的,只是這種狀態轉化沒有任何實際價值而被操做系統禁止。

4.7 進程創立

1)申請空白進程控制塊(PCB);

2)初始化機器寄存器;

3)初始化頁表;

4)將程序代碼從磁盤讀入內存;

5)將處理器狀態設置爲「用戶態」;

6)跳轉到程序的起始地址(設置程序計數器);

unix         fork->exec

windows   調用createprocess

 

4.8 進程與地址空間

    進程空間也稱爲地址空間,地址空間就是進程要用的全部資源。全部資源構成了狀態的劃分。不可能有兩個進程狀態徹底同樣。因此

每一個進程對應計算機的一種狀態,而計算機狀態就是全部存儲單元的內容。

4.9 進程管理

操做系統管理進程。

一、進程管理所須要的手段

    操做系統要管理進程就要維護關於進程的一些信息。操做系統用於維護進程記錄的結構就是進程表或進程控制塊(pcb,process 

control block,裏面存放該進程的信息)。不一樣操做系統維護的進程信息是不盡相同的。但應包括寄存器、程序計數器、狀態字、棧、指針、優先級、進程ID,信號、建立時間、耗用CPU時間、當前持有的各類句柄等。採納的數據結構有線性表、鏈表、和結構,也可能有樹和圖。

二、進程管理要處理的問題

    資源分配的效率與公平

4.10 進程的缺陷

(1)進程一個時間只能作一件事;

(2)進程在執行過程當中遇到阻塞,只能掛起。這樣,即便進程裏面有部分工做不依賴於輸入阻塞操做,也沒法推動。

因此,人們就發明了線程,來解決上述問題。

思考題

 
-------------------------------------------------------2015.7.6—--------------------------------------------------------

第5章 進程調度
引子

    對於掌握着衆多進程的操做系統來講,須要經過調度進程來達到維持計算機功能的目的。事實上,調度是操做系統實現進程模型的根本手段。

 

5.1 調度的目標

    單一CPU模式下,實際上任什麼時候刻只能有一個進程或線程處於執行狀態。

Q:咱們如何肯定在任意時刻哪一個程序執行,哪一個不執行呢?即咱們如何進程程序的調度呢?

    使用CPU的3種模式:

   

 CPU導向或者計算密集型程序:一種程序大部分時間在CPU上執行(大部分時間在計算,而後花少許時間輸入輸出),

 

   

 I/O導向或者輸入輸出密集型程序:一種程序大部分時間在進行輸入輸出(大部分時間在輸入輸出,而後花少許時間計算,I/O導向程序或輸入輸出密集型程序),

 

   

 平衡性程序:介於前面兩種模式之間(平衡型程序)。

 

 

總結:對於 I/O導向的程序,響應時間很是重要;對於CPU導向的程序來講,週轉時間很是重要;對於平衡性程序來講,進行某種響應和週轉之間的平衡就顯得很是重要。

 

5.2 處理器調度的整體目標

 

 CPU調度目標要達到極小化響應時間、極大化系統吞吐率、保持系統各個功能部件均處於繁忙狀態和某種貌似公平的機制。

 

 

5.3 先來先服務調度算法FCFS

 ,First Come First Serve)

 

    誰先來,就先服務誰

    先來先到的一個隱含條件是不能搶佔,一個程序一旦啓動就一直運行到結束或者受阻塞爲止。。

 

5.4 時間片輪轉算法

    目的:改善短程序的響應時間。

    方法:週期性的進行進程切換。
1)系統響應時間主要依賴時間片的選擇,若選擇的較長,就和FCFS類似,若選擇的較短,系統的大部分時間都花費在進程的上下文切換上,而不是執行程序上。
2)若運行的進程較多,時間片就要選擇的短一點,不然用戶體驗較差;若運行的進程較少,時間片就能夠適當長一些。

備註:時間片輪轉的系統響應時間不必定比FCFS的響應時間要短。

 

5.5 短任務優先算法

     STCF(shorted time  to completion first)優先級高的任務先運行,短任務優先級高於長任務,短任務優先比前幾個的響應時間要短。分爲非搶佔和搶佔兩種。
缺點:1)長程序可能得不到響應時間而飢餓,咱們沒法知道那個進程要運行多長時間。

 

5.6 優先級調度

賦予重要的進程以高優先級以確保重要任務獲得cpu時間。

 

5.7 混合調度算法

將全部進程分爲不一樣的大類,每一個大類一個優先級,高優先級的大類中的進程先執行,同大類的進程使用時間片輪轉來執行。

 

5.8 其餘調度算法
5.9 實時調度算法
5.1 0高級議題:調度異常之優先級
優先級倒掛:

一個低優先級任務持有一個高優先級認爲所須要的共享資源。這樣的高優先級任務因缺少資源而處於受阻狀態,一直到低優先級任務釋放資源爲止。這樣實際上形成了這兩個任務優先級的倒掛。若是此時有其餘優先級介於兩者之間的任務,而且不須要這個共享資源,則這個中優先級任務得到CPU控制,從而超越這兩個任務,致使高優先級進程被臨界區外的低優先級進程阻塞。

優先級倒掛的危害:

1)可能會致使系統故障

2)可能會形成系統性能降低


思考題

 

第6章 進程通訊
引子:孤獨爆破手的自白

    不管是對於人仍是對於進程而言,通訊的需求都很是強烈。

 

6.1 爲何要通訊

進程之間的交互稱爲:進程間通訊IPC,inter-process  communcation)、線程通訊

例如:父進程在建立子進程後,一般須要監督子進程的狀態,以便在子進程沒有完成給定的任務時,能夠再建立一個子進程來繼續。

 

6.2 線程對白:管道、記名

 

管道、套接字

 

 

管道所佔的空間既能夠是內存,也能夠是磁盤。

建立:經過系統調用建立管道。系統調用所作的事情就是在某種存儲介質上劃出一片空間,給其中一個進程寫的權利,另外一個進程讀的權利。

 

 

6.2.一、管道:管道是一個線性字節數組,相似文件,使用文件讀寫的方式進行訪問。由於經過文件系統看不到管道,因此它不是文件。

管道能夠設到內存裏,

 

建立管道在shell和程序裏是不同的:shell裏,只用「|」   $ sort < file1  |grep  zou    在兩個utility
「 sort 」和「 grep 」之間建立了一個管

道,數據從sort
流向grep。sort 的結果做爲grep的輸入。程序裏面,建立管道須要使用系統調用popen()或者pipe().

 

管道的一個重要特色是:使用管道的兩個線程之間必須具備親緣關係(如父子進程、爺孫進程等)。

 

6.2.二、記名管道:若是在兩個不相關的線程,之間進行管道通訊,就要使用記名管道。記名管道是一個有名字的管道。記名管道與文件系統共享一個名字空間,即咱們從文件系統中看到記名管道,記名管道不能和文件系統中的任何文件重名。

 

記名管道的名稱有兩部分組成:計算機名和管道名。如\\[主機名]\管道\[管道名]\。對於同一個主機來講,容許有多個同一命名管道的實

例而且能夠由不一樣的進程打開,但不一樣的管道有屬於本身的管道緩衝區和通訊環境。

 

缺點:管道和記名管道只能在unix和linux中使用,管道的管道通訊只能在相關進程間進行,記名管道須要知道名字來打開。

 

6.2.三、套接字(蟲洞)

    使用套接字進行通訊須要雙方均建立一個套接字,一個做爲服務器方,另外一個做爲客戶方。

    套接字支持不一樣層面、不一樣應用、跨網絡間的通訊。

套接字的分類:

stream socket:提供雙向、有序、可靠、非重複的數據通訊。

datagram socket:提供雙向消息流。數據不必定按序到達。

sequential socket:提供雙向、有序、可靠鏈接,包有最大限制

raw socket:提供對下層通訊協議的訪問。

 

6.3 線程電報:信號(signal)

    管道與套接字——這兩種方式通訊的缺點:

    一、必須事先在通訊的進程間創建鏈接(建立管道和套接字),這就耗費系統資源;

    二、一方選擇使用管道與套接字發送信息,另外一方能夠選擇接收的時機,甚至能夠「充耳不聞」。

    三、創建鏈接須要時間,若是信息量小的話,效率會十分低下。

 

   使用信號的需求:

   一、迫使另外一方對咱們的通西北當即作出迴應。

    二、咱們不想事先創建任何鏈接,而是臨時的通訊需求。

    三、傳輸的信息量微小,使用管道或者套接字不划算。

 

    在計算機裏,信號就是一個內核對象/內核數據結構,發送方將數據結構的內容填好,並指明該信號的目標進程後,發出特定的軟件中斷。操做系統接收到特定的終端請求後,知道是有進程要發送信號,因而到特定的內核數據結構裏查找信號接收方,併發出通知。

 

6.4 線程旗語:信號量(semaphore)

    在計算機裏,信號量其實是一個簡單整數,一個進程在信號變爲0或1的狀況下推動,而且將信號變爲1或0來防止別的進程推動。

    當進程完成任務後,則將信號再變爲0或1,從而容許其它進程執行。

    注意:信號量不僅是一個通訊機制,更是一個同步機制。

 

6.5 線程擁抱:共享內存

    產生需求:兩個進程須要共享大量數據。

   共享內存就是這兩個線程共享一片內存,能夠訪問這片內存中的任何內容。要使用共享內存通訊,首先一個線程建立一片內存區域專門作通訊用,而其餘線程則將這片區域映射到自己的地址空間。這樣,線程本身的地址空間中對應共享內存的區域時,就是在和其餘線程通訊。

  

    共享內存與管道的區別:

1)使用共享內存的兩個內存必須在同一臺物理電腦上

2)共享內存的訪問方式是隨機的,而不是隻能從一端寫,從另外一端讀 

所以,其靈活性比管道和套接字大得多,可以傳遞的信息複雜得多。

  

   缺點:

1)管理複雜,使用共享內存的兩個線程必須在同一臺物理電腦上才能使用的通訊方式;

2)安全性脆弱,因爲兩個線程存在一片共享的內存,一箇中病毒,就很容易傳到另外一個線程。

 另:使用全局變量在同一個線程的線程間實現通訊不稱爲共享內存。

 

6.6 信件發送:消息隊列

    消息隊列是一列具備頭和尾的消息排列。新來的消息在隊尾,讀取消息則是從隊列頭部開始。消息隊列與管道的區別(記憶)

 

1)管道對讀寫有要求:讀的只能讀,寫的只能寫,不可既讀又寫;而消息隊列無需固定的讀寫進程,任何有權限的進程均可以讀寫,

2)管道只支持一對一的兩個進程,而消息隊列能夠支持多個進程,多個進程能夠讀寫消息隊列,多對多

3)管道在內存和磁盤上均可以實現,而消息隊只是在內存中實現

4)管道只在UNIX和lunux操做系統中實現,而消息隊列在幾乎全部的主流操做系統中均有實現。

 

 

 

6.7 其餘通訊機制

思考題

 

 

第7章 線程
引子

    每一個人在人生的某個時候,都但願本身可以分身,從而完成某件不可能完成的任務。而進程也是同樣,它但願在某些時候可以分身,從而完成更加複雜的實名,預示便有了線程。

 

7.1 進程的分身術——線程

   進程是運轉的程序,是爲了在CPU上實現多道編程而發明的一個概念,可是進程在一個時間只能幹一個事情,爲了讓進程同時幹多件事情咱們就發明了線程。線程是進程的分身,是進程的不一樣執行序列。線程是咱們爲了讓一個進程可以同時幹多件事情而發明的」分身術「。每一個線程本質是同樣的,即擁有一樣的程序文本,可是執行時的上下文不一致。 

    在線程模式下,一個進程至少有一個線程,但也能夠有多個線程。

    將進程費解爲線程還能夠有效利用多處理器和多核計算機。(在沒有線程的狀況下,增長一個處理器並不能提升進程的執行速度,但若是分解爲多個線程,則可讓不一樣的線程同時運轉在不一樣的處理器上,從而提升進程的執行速度。)

    設計線程的目的就是共享資源,提升資源利用率。

 

7.2 線程管理

    一、進程管理就是要維持線程的各類信息,存放這些信息的數據結構稱爲線程控制表線程控制塊

        能夠共享的資源放在進程控制塊中,不能夠共享的資源放在線程控制塊中。

 

   二、原則:

1)共享的資源越多越好——這是咱們發明線程的主要動機之一。

2)若是某個資源不獨享會致使線程運行錯誤,則該資源就是有線程獨享;而其餘資源則有進程裏的全部線程共享。

   

 三、線程共享資源:地址空間、全局變量、打開的文件、子進程、鬧鐘、信號及信息服務程序,定時器、佔用cpu的時間。

     線程獨享資源:程序計數器、寄存器、棧、狀態字。

 

7.3 線程的實現方式

    線程的實現方式有兩種:

    a) 進程本身來管理線程,用戶態編程實現;

    b) 操做系統來管理線程,內核態編程實現。

    進程的實現方式:因爲進程是在cpu上實現併發(多道編程),而cpu是由操做系統管理的,因此進程的實現只能是由操做系統內核來進行,

而不是由用戶態實現的狀況。
  

  一、內核態線程的實現

      線程是進程的分身,是進程的不一樣執行序列,線程應該是cpu調度的基本單位,又由於cpu調度是由操做系統實現的,因此操做系統管理進程是天經地義的。

  

     與操做系統管理進程同樣。操做系統管理線程,就要保護維護線程的各類資料,即進程控制塊存放在操做系統內存空間中。這樣,操做系統內核就能夠保有進程控制塊和線程控制塊。而根據進程控制塊和線程控制塊提供的信息,操做系統就能夠對線程進行各類相似進程的管理線程調度,線程的資源分配,各類安全措施的實現

   

 優勢

1)用戶編程保持簡單,由於線程的複雜度由操做系統承擔,用戶編程時無需管理線程的調度(線程執行和掛起)

2)因爲操做系統可以監測全部的線程,當一個線程執行阻塞操做時,操做系統就能夠調用另外一個線程。

    

缺點:

1)效率低,從用戶態到內核態的切換耗費時間;

2)內核態佔用內核稀缺的內存資源,由於操做系統要維護線性表,操做系統所佔內存空間是固定的,因爲線程數量較多(與進程相比),內存空間很容易就佔滿,這樣最後會致使系統「死掉」。

 

二、用戶態線程實現

   用戶本身寫一個執行系統作調度器,即除了正常執行任務的線程外,還有一個專門負責線程調度的線程。一個線程在執行一段時間後就主動把資源釋放給別人使用。

優勢:靈活;線程切換快;切換線程無需到內核態。

缺點:因爲沒法肯定何時出讓cpu使用權最合適,編程有點困難;用戶態編程沒法達到線程多道編程的目的,一個線程受阻,整個進程都沒法繼續。(解決辦法:不讓進程阻塞;阻塞後想辦法激活同一進程的其它線程)。第一種行不通,

 

7.4 現代操做系統的線程實現模型

     用戶態的操做系統負責進程內部線程非阻塞線程的切換,內核態的操做系統負責阻塞線程的切換,這樣咱們就能夠同時實現用戶態和內核態管理,內核態的線程較少,用戶態線程多,每個內核態的線程能夠服務一個或多個用戶態的線程,也就是用戶態的線程被複用了內核態。用戶態幾個線程使用一個內核態的線程,若是一個線程阻塞了,那就換另外一個執行。

 

7.5 多線程的關係

    線程的通訊與同步

 

7.6 討論:從用戶態進入內核態

有兩種狀況或形成一個線程從用戶態進入內核態

(1)程序運行期間發生中斷或異常,系統會自動切換到中斷或異常處理機制上來。

(2)程序系統調用也會形成一個線程從用戶態進入內核態。

 

7.7 討論:線程的困惑——肯定性與非肯定性

(1)線程的優點

線程提供了程序層面上的併發性能,併發既提升了系統的效率(吞吐率),有改善了用戶的響應時間。

       線程的劣勢

系統運行的不肯定性。相對於單一進程,多進程的執行效率和執行正確率均存在不肯定性。

(2)相似於硬件的流水線機制(提供指令級的併發),

(3)在多流水線多梯度的狀況下,許多指令同時在不一樣的流水線和梯度上執行,其之間存在的數據和指令依賴關係十分複雜。線程和流水線的管理十分複雜,從某種程度上說,線程和流水線分別是軟件層和硬件層不肯定的根源(高度歸納)

思考題

 

 

 

——————————————————————————2015.7.7——————————————————————————————

第8章 線程同步
引子

 

8.1 爲何要同步

設計線程的目的:共享資源,提升資源利用率。

線程之間的關係是合做關係,但多線程帶來的是執行過程的不肯定性和執行結果的不肯定性。

 

8.2 線程同步的目的

目的一:無論線程之間的執行如何穿插,其結果都是正確的(要保證多線程執行下結果的正確性)。
目的二:保證執行效率。


同步就是讓全部的進程按照必定的規則執行,其正確性和效率都有跡可循。

手段:對線程之間的穿插進行控制。

 

8.3 鎖的進化:金魚生存

   

 兩個進程爭相執行同一段代碼或訪問同一個資源的現象叫競爭。這個可能形成競爭的共享代碼段或資源叫臨界區

 

   

(1)爲了不競爭,就須要某種協調手段,防止兩個或以上的線程同時就進入到臨界區。協調的目的就是在任什麼時候刻只能有一個線程訪問臨界區,這叫互斥。正確互斥的四個條件:

1)不能同時有兩個線程同時在臨界區裏面

2)可以在任何數量和速度的CPU上正確執行,

3)在互斥區域外不能阻止另外一個線程的執行,

4)進程不能無限制的等待進入臨界區。

 

(2)鎖

鎖有兩個基本操做:閉鎖開鎖

閉鎖:等待鎖達到打開狀態,得到鎖並鎖上。(原子操做)

開鎖:事情完成,將鎖打開,別的人就能夠進去了。

鎖的特性:

1)初始狀態是打開狀態

2)進臨界區前必須得到鎖

3)出臨界區前打開鎖

4)若是別人持有鎖則必須等待

 

所謂原子操做,就是該操做毫不會在執行完畢前被任何其餘任務或事件打斷,也就說,它是最小的執行單位,不可能有比它更小的執行單位,所以這裏的原子實際是使用了物理學裏的物質微粒的概念。

 

8.4 睡覺與叫醒:生產者與消費者問題

    緩衝區的存在使得生產者和消費者可以相對獨立地運行。

    計算機模擬:一個進程表明生產者,一個進程表明消費者,一片內存緩衝區做爲交換的中介。生產者生產的物品從一端放入緩衝區,消費者從另外一端獲取物品。

    睡覺與叫醒:若是鎖被對方持有,你不用等待鎖變爲打開狀態,而是回去睡覺,鎖打開後再把你叫醒。

8.5 信號量

  信號量不只是一個同步原語,更是一個通訊原語,還能做爲鎖來使用。

原語,來源於原子不可分的傳說。操做系統的原語,由若干多機器指令構成的完成某種特定功能的一段程序,具備不可分割性.即原語的執行必須是連續的,在執行過程當中不容許被中斷 。

 

信號量能夠理解爲一個睡眠鎖,持有鎖者能夠執行,非持有鎖者只能被動等待。

信號量能夠理解爲一個計數器,其取值爲當前累積的信號數量。支持兩種操做P操做(減法操做down)和V操做(加法操做up)

P操做:

1)判斷信號量的取值是否大於等於1

2)若是是,將信號量的值減去1,繼續往下執行

3)不然在該信號量上等待(線程被掛起)

V操做:

1)將信號量的值加1(此操做將喚醒一個在該信號量上面等待的線程)

2)線程繼續往下執行

缺點:程序編寫困難和程序執行效率低下,執行順序的差別有可能形成死鎖。

 

8.6 鎖、睡覺與叫醒、信號量


8.7 管程(監視器 monitor)

管程:做爲監視器,監視全部進程和線程的同步操做。

在管程中使用兩種同步機制:鎖來互斥,條件變量來控制執行順序。
8.8 消息傳遞

用途:在多計算機環境下進行同步。

實現:經過同步雙方通過互相收發信息來實現。它有兩個基本的操做:發送send和接收receive。同步須要的是阻塞調用。(含義:?)

過程:生產者每生產出一件商品,就須要從消費者那裏得到一個空的盒子,而後把產品裝進盒子裏,再把裝有產品的盒子發送給消費者;消費者先發送N個空盒子給生產者,而後等待生產者將生產的產品發送過來,消費以後。將空盒子發送過去。只要當前當既有空盒子,又有滿盒子,生產者和消費者就能夠分別獨立地運行。

缺點:效率低下

1)存在系統消耗

2)依賴網絡環境
8.9 柵欄(barrier)

含義:到達柵欄的線程必須中止下來,直到出去柵欄後才能往前推動。

用途:對一組線程進行協調。

產生緣由:有時候一組進程協同完成同一個問題,因此須要全部進程到達同一個地方匯合以後才能一塊兒向前推動。
思考題

 

 

 

第9章 死鎖應對的哲學原理
引子

 

9.1 發生死鎖的緣由

    在一個多道編程的環境裏,一個系統裏存在多個進程或線程,這些進程和線程公享計算機裏的資源,資源就是一個一個程序工做時所需的東西,如磁盤驅動器、鎖、信號量、數據表格等。既能夠是硬件:cpu、內存、磁盤等,也能夠是軟件:鎖、信號量等看不見摸不着的東西。

    資源是否能夠搶佔又能夠分爲:可搶佔資源和非可搶佔資源(若是被搶,將形成系統運行錯誤)。

9.2 死鎖的描述

    線程使用資源的順序是:請求資源,使用資源,釋放資源。

    若是請求沒被批准,則會發生:(a)阻塞等待,(b)當即返回,(c)失敗退出,結束線程。

第一種結果可能會致使死鎖

若是有一組線程,每一個線程都在等待一個事情(資源的釋放)的發生,而這個事情只能有該組內的另外一線程發出,咱們就稱這組線程發生了死鎖。在死鎖狀態下,沒有線程能夠執行、釋放資源或被叫醒。

百度百科上的定義:集合中的每個進程都在等待只能由本集合中的其餘進程才能引起的事件,那麼該組進程是死鎖的。

9.3 死鎖的4個必要條件

(1)必要條件:資源有限。指進程對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個進程佔用。若是此時還有其它進程請求資源,則請求者只能等待,直至佔有資源的進程用畢釋放。

(2)必要條件:持有等待。一個線程在請求新的資源時,其已經得到的資源並不釋放,而是繼續佔有。

(3)條件:不能搶佔。指進程已得到的資源,在未使用完以前,不能被剝奪,只能在使用完時由本身釋放。

(4)條件:循環等待條件:你等我,我等你

9.4 哲學家就餐問題

哲學家圍坐在一個圓桌邊,每一個人的左右兩邊分別放着一根筷子。若是想要吃飯,就須要得到左右兩邊的筷子(不能用一根筷子吃飯)。

顯然,每一個哲學家穿插着進行,將出現每一個哲學家拿起左邊的筷子,而等待右邊的筷子的狀況。

9.5 死鎖的應對

有四種應對策略:

(1)容許死鎖存在

    (a)順其天然,不予理睬:爲了尋求方便,解決死鎖有可能比死鎖自己帶來的代價更高,直接重啓就好,犯不着跟死鎖較勁

評價:省時省力,但不受用戶歡迎,也不是一個負責的研究者應該採起的態度。

    (b)死鎖檢測與修復:

           

 死鎖檢測:將資源可用矩陣和資源等待矩陣中的每個行相減,若是每一個線程都有負數,那就是發生了死鎖。

 

           

 死鎖修復:能夠搶佔,殺死某個線程,上翻(將整個操做系統翻轉到過去的某個狀態)

 

備註:死鎖的檢測與修復僅僅存在理論上的可行性,實際中根本行不通。

評價:容許死鎖的發生,死鎖的偵測存在種種困難,也不是咱們追求完美者應該採起的態度。

(2)不容許死鎖存在

(c)死鎖的動態避免,

含義:在死鎖有可能發生時採起先發制人的措施,斷然拒絕可能致使系統進入潛在死鎖狀態的資源請求。因爲系統歷來不進入死鎖狀態,死鎖帶來的各類問題天然不復存在了。

原則:防止系統進入不安全狀態

手段:每次須要進行資源分配時,就計算一下該分配方案是否會將系統代入不安全的狀態。若是是,就否決相關的資源請求;不然,就批准。

缺點:計算一個狀態是否安全不是一件容易的事情。

評價:存在實現上的困難,設計實現和時間成本都不理想。

(d)死鎖的靜態防止

方法:消除死鎖發生的四個必要條件中的任何一個。

 

 

9.6 消除死鎖的必要條件

(1)消除資源的獨佔條件:使盡量多的獨佔資源變得能夠共享。e.g將任務或資源請求發送給一個精靈程序deamon,由這個deamon將統一處理請求。

(2)消除保持和請求條件:一個進程必須得到全部須要的資源後才能順利進行;另外一種是一個進程必須得到全部須要的資源後才能順利進行,可是若不能知足,那就把全部已得到的資源全釋放。

(3)消除非搶佔條件:容許對資源的搶佔,例cpu和內存等,但有些資源被搶後會形成嚴重後果,例鎖。

(4)消除循環等待條件:一個進程須要多個資源,1,2。它可能先申請1,再申請2;也可能先申請2,再申請1。則可能會形成死鎖。若規定申請的順序就能夠避免死鎖。

 

9.7 銀行家算法:冒險的代價
9.8 哲學家就餐問題之解

9.9 討論:死鎖的思考——綜合治理

    死鎖的四種應對策略:不予理睬,死鎖檢測與修復,死鎖的動態避免,死鎖的靜態防止。

    不予理睬和靜態防止較合理,另外兩種成本太高。經過對這兩種策略的組合,例如對cpu和內存實施可搶佔的靜態防止策略,對磁盤、打印機等實施假脫機的共享,咱們有效防止了死鎖的可能,對鎖等一些軟件資源,咱們就按照規定順序請求,從而防止在這些資源上出現死鎖,在剩下的其它資源上出現死鎖,咱們就不予理睬了。

9.1 0討論:死鎖、活鎖與飢餓

    除了死鎖之外,多道編程或多線程編程還要面對資源飢餓,某個進程或線程一直等不到它須要的資源。

思考題



 

 

第10章 鎖的實現
引子:鎖的實現哲學

  

    操做系統之因此可以構建鎖之類的同步原語,緣由就是硬件已經爲咱們提供了一些原子操做:中斷禁止和啓用(interrupt enable/disable)、內存加載和存入(load/store)、測試和設置指令(set/test)。


10.1 以中斷啓用與禁止來實現鎖

        經過禁止中斷,而且不自動調用讓出CPU的系統調用(如yield之類),就能夠防止進程切換,就能將一組操做變爲原子操做。

 

    發生上下文切換隻有兩種可能:

1)一個線程自願放棄CPU而將控制權交給操做系統調度器,從而發生上下文切換;

2)一個線程被強制放棄CPU而失去控制權;

 

lock的操做:

lock(){

    disable interrupts;

    while(value!=FREE){

        enable interrupts;

        disable interrupts;

    }    

    value=BUSY;(why?)

    enable interrupts;

}

unlock的操做:首先禁止中斷,而後將value的值設置爲FREE,再啓用中斷。

unlock()
{
    disable interrupts;
    value=FREE;
     enable interrupts;
}
 

 


10.2 以測試與設置指令來實現鎖


10.3 以非繁忙等待、中斷啓用與禁止來實現鎖


10.4 以最少繁忙等待、測試與設置來實現鎖


10.5 中斷禁止、測試與設置

    
思考題

 

 

 

 

 

第三篇 內存原理篇
第11章 基本內存管理
引子

11.1 內存管理的環境

    理想狀態下,程序員對內存的要求:大容量、高速度和持久性

 

    現實內存架構:緩存+主存+磁盤+磁帶。緩存(低容量、高速度、高價格)、主存(中容量、中速度、中價格)、磁盤(大容量、低速度、低價格)。這樣的架構就須要一個有效的管理機制——內存管理。

 
   內存管理,就是對內存架構進行管理,使程序在內存架構的每個層次上對於用戶來講都是同樣的,虛擬內存是操做系統提供給用戶的另外一個「幻想」。

11.2 內存管理的目標

(1)地址保護:在內存中運行的多道程序互不干擾。一個進程不能進另外一個進程的地址空間。

(2)地址獨立:程序發出的地址應與物理主存地址無關。指針裏的地址是程序空間(虛擬空間)的虛擬地址(程序地址)。

 

11.3 虛擬內存的概念

   虛擬內存的中心思想是將物理主存擴大到便宜的、大容量的磁盤上,即把磁盤空間看作是主存空間的一部分。程序能夠徹底放在主存裏,也能夠徹底放在磁盤空間裏,能夠部分放在主存裏,能夠部分放在磁盤空間裏。這樣就給人一種內存空間增大的假象。

 

11.4 操做系統在內存的位置

    計算機中存在着兩種程序:管理計算機的程序(操做系統)和使用計算機的程序(用戶程序)。管理者自己也使用資源(內存空間)。

(1)最簡單的辦法就是把內存分爲兩部分,操做系統和用戶程序各佔一部分。分有兩種狀況,以下圖,操做系統是爲用戶服務的,在邏輯上應處於用戶程序的下面,左邊的較符合人們的思惟習慣,且在復位、中斷、陷入等操做時,控制移交給操做系統更方便。

 


(2)現代計算機除了RAM外,還有ROM。操做系統能夠所有放在ROM內,也能夠部分放在ROM內。因爲ROM比較貴,因此多采起後者。

(3)使用ROM的另外一個好處是,把輸出輸入和內存訪問統一塊兒來。把輸入輸出設備裏的寄存器或其餘存儲媒介編入內存地址,使得訪問輸出輸入設備和訪問內存同樣。這種輸出輸入叫作內存映射的輸出輸入。若是訪問的地址高於RAM的最高地址,就屬於I/O操做,否者就是正常內存操做。

a)沒有內存映射的輸出輸入,ROM裏面全是操做系統。

b)使用了內存映射的輸出輸入,ROM的一部分是操做系統,另外一部分屬於I/0設備。

c)使用了內存映射的輸出輸入,ROM裏面全屬於I/0設備,如上圖的右邊的條形柱所示。(不是很明白?)

 

11.5 單道編程的內存管理

    最簡單的內存管理就是單道編程的內存管理每次程序都會加載在固定的內存地址。

 

11.6 多道編程的內存管理

    因爲是多道編程,就沒法把程序加載在固定的內存地址。

(1)固定分區的多道編程的內存管理

    把用戶程序的內存空間部分分爲幾個區域,能夠大小同樣,也能夠不同。當加載用戶程序時,選擇一個當前空閒且容量夠大的分區加載。在此模式下,一個新程序可能要在一個隊列中等待。當有合適分區出現時,才進行加載。但會出現小程序佔用大分區、小空間閒置的現象。

    若是程序按照空間大小排在相應的隊列裏就能夠解決上述問題,但也會出現有空閒空間但不能運行程序的尷尬。

(2)地址翻譯

   

 物理地址=虛擬地址+(程序)基址(程序所在區域的起始地址)

 

    程序所在區域的起始地址<有效地址<程序所在區域的起始地址+程序長度

    設置兩個端值:基址和極限,存放在基址寄存器和極限寄存器。只有內核能夠改變基址和極限。

(3)動態地址翻譯的優勢

     靈活、利於地址保護、能夠使虛擬空間的概念得以實施。

(4)非固定分區的多道編程的內存管理


    固定分區的多道編程的內存管理的缺點有:程序大小與分區大小不匹配、僵化、地址空間沒法增加。

    非固定分區的多道編程的內存管理的思想很簡單,用戶程序的空間做爲一個總體存在,來一個程序,就分一塊空間,用完了,就退出來,讓其它程序用,如上圖。

    同「固定分區的多道編程的內存管理」同樣,設置兩個端值:基址和極限,存放在基址寄存器和極限寄存器。

一個空間的增加

    可是程序增加一般有兩個來源,數據和棧。這兩個空間的增加方式對整個程序的擴展性產生影響。


a)、向同一個方向增加,可是這種方式空間利用率低。

b)、unix,相向的方向增加;windows,是給棧劃定了邊界,超出了邊界就報錯。

c)還有第三種,交換。

(5)交換

    交換就是將一個進程從內存倒出到磁盤上,再將其從磁盤上加載到內存中來的過程。

    交換的目的:給程序騰出一個大的空間;實現進程切換(代價高,通常不這樣作)。

(6)重疊

    將程序按照功能分爲一段一段功能相對完整的單元,一個單元執行完後,再執行另外一個單元,前面的單元就不會再執行,能夠就能夠把後面的程序單            元覆蓋到當前的程序單元上,這樣就能夠執行一個比物理內存還要大的程序了。

(7)雙基址

      若是咱們運行兩個同樣的程序,只要設定兩組基址和極限,就可讓它們共享部份內存空間。

 

11.7 閒置空間管理

    位圖表示法:給每一個分配單元賦予一個字位,用於記錄該單元是否閒置。成本空間是固定的,但沒有容錯能力,以下圖。

    鏈表表示法:將分配單元按是否閒置連接起來,以下圖。

思考題

 

 

 

第12章 頁式內存管理
引子

12.1 基址極限管理模式的問題

  內存管理的方法:

(1)單道編程:固定加載地址的內存管理;

(2)多道編程:固定分區的內存管理;非固定分區的內存管理;交換內存管理。這三種多道編程均使用了一種實現機制:基址+變址。(物理地址=虛擬地址+(程序)基址)

12.2 分頁內存管理
12.3 分頁系統的優缺點
12.4 翻譯速度
12.5 缺頁中斷處理
12.6 鎖住頁面
12.7 頁面足寸
12.8 內存抖動
思考題

 

 

第13章 頁面更換算法
引子
13.1 頁面須要更換
13.2 頁面更換的目標
13.3 隨機更換算法
13.4 先進先出算法
13.5 第二次機會算法
13.6 時鐘算法
13.7 最優更換算法
13.8 NRU算法
13.9 IRU算法
13.10 工做集算法
13.11 工做集時鐘算法
13.12 頁面替換策略
思考題

 

第14章 段式內存管理
引子
14.1 分頁系統的缺點
14.2 分段管理系統
14.3 分段的優缺點
14.4 段頁式內存管理
14.5 段號是否佔用尋址字住
14.6 討論:否認之否認的嵌套一純粹
分段與邏輯分段、分頁與段頁
思考題

 

第四篇 文件原理篇
第15章 磁盤操做

引子

    現代的計算機系統所處理的數據多存放在磁盤中。

   

 文件系統就是磁盤的抽象,或者說操做系統爲磁盤所提供的抽象就是:文件及文件系統。

 

15.1 磁盤組織與管理

    磁盤就是形狀像盤子的磁性存儲介質。特性:數據存放持久,圓形,磁性,成本低廉。

 

15.2 磁盤的結構

    一塊磁盤是有多塊盤片(正反)組成,每一個盤面配有一個磁頭,磁頭公用一個磁臂。

 

15.3 盤面的結構

磁道和扇面,磁道是一個一個的同心圓,每一個磁道又被分爲扇面(扇區),數據以扇面進行存儲,扇面是磁盤的最小I/O單元。

扇面有三部分組成:標題、數據和糾錯信息。

 

15.4 磁盤驅動器的訪問速度

影響磁盤讀寫速度的三個因素:尋道時間、旋轉延遲、數據傳輸時間

 

15.5 操做系統界面

15.6 磁盤調度算法

算法:先來先服務、短任務優先、短服務優先、電梯梯度、提早查看電梯梯度、單向電梯梯度。

思考題

 

 

第16章 文件基礎
引子

16.1 爲何須要文件系統

     全部應用程序都要對數據進行處理,輸入和輸出數據,這些數據要找個地方存放。內存容量有限,不持久,且難以共享,進程結束或斷電,數據就會消失。磁盤容量大,低成本,持久,且能夠共享,進程結束或斷電,數據也不會消失。可是通常用戶不知道怎樣驅動磁盤,計算數據在磁盤的什麼位置
        

     操做系統是個魔術師,提供給用戶的是各類幻象——抽象,進程->cpu,虛擬內存->內存,磁盤->文件系統。文件系統是操做系統提供的另外一個抽象,他是一個看不見,摸不着,可是卻能夠使用的一個介於磁盤與用戶之間的界面,它使磁盤變得更容易使用

 

16.2 什麼是文件系統

     

  文件系統將其接觸的磁盤物理特性轉換爲用戶看獲得的路徑名和文件名。用戶對磁盤進行訪問只須要路徑名和文件名便可,無需磁盤的具體信息。

 

 

16.3 文件系統的目標

  一、地址獨立(文件數據的產生和未來磁盤地址相對獨立)

  二、地址保護(文件訪用權限)

 

16.4 文件的基本知識

16.5 從用戶角度看文件系統

  一、文件命名(操做系統將文件名翻譯成其數據塊在磁盤上存放的地址)

  二、擴展名(一般表示文件類型,.c,.cpp,.exe)

四、文件存儲組織

    a、關係導向型組織,將數據之間的關係記錄在文件裏面,文件按照你的構建與數據之間的關係存在着某種對應關係

     1>記錄流存放方式下,數據以一個記錄一個記錄的方式,順序排列

     2>樹形存放方式下,數據不光是按記錄排列,記錄之間的關係也能夠被捕捉,層次關係排列,但不造成環

     3>網狀存放方式下,能夠成環

    b、非關係導向型組織,其組織形式不考慮數據裏面的任何結構。數據就是一個數據流(多是字位流,字節流,數據塊流,它們之間的區別也就是「流」的單位不一樣),沒有記錄,沒有關係。

   c、兩種組織方式比較:

   關係導向型組織:文件系統須要知道不少細節(記錄自己的細節,還要記錄文件之間的細節),增長了文件系統的複雜性。後果是:文件系統自己的設計更加費時費力;因爲文件系統的記錄格式可能不一樣,一個文件不能再另一個文件系統下訪問,這樣會照成文件的可靠性與兼容性問題。

 
 非關係導向型組織:因爲操做系統辨認的是數據塊。字節或字位,數據的語義並無包括在組織方式裏,任何操做系統均可以讀寫這些文件。

 
 字節流的文件系統更加方便,操做系統的代碼更加可靠,更加靈活、用戶編寫也更加方便。

五、文件類型

   a、目錄,記錄文件的文件,它的內容是關於別的文件

   b、通常文件,用來保存數據,根據內容的組織方式可分爲文本文件和二進制文件

     1>文本文件,存放的是沒有通過處理的文件,ASCII碼錶示的文件,任何編輯器均可以打開

     2>二進制文件,存放的是通過處理的文件,普通編輯器打不開,特定軟件能夠打開,加密文件也是二進制文件

   c、塊文件,關於輸入輸出設備的。,塊文件模擬的是輸入輸出。對於每個輸入輸出設備的,咱們都以一個塊文件來表示。須要與輸入輸出設備發生數據交換時,就以該文件替換。

六、文件格式

七、文件訪問

 
 a、順序訪問,從開頭訪問,按先來後到的順序讀取數據,不能在中間隨便跳轉,但能夠快進快退。

 
 b、隨機訪問,能夠按照任何順序讀取數據記錄,現對文件進行選點(seek),到達位置後開始讀寫。

八、文件屬性

九、文件操做

16.6 地址獨立的實現機制:文件夾

      操做系統須要一個數據結構(文件夾)來記錄每一個文件在磁盤上的位置,文件夾,也稱爲目錄價(folder),存放的不是用戶數據,而是關於文件和文件系統的信息。文件夾是用來追蹤問價的,裏面存放的是文件到文件地址的映射(文件
->文件在磁盤上的地址),

    一、文件夾結構

   因爲文件夾裏面有文件夾,這就造成了一個層次結構,這個層次結構的頂端是根文件夾,也就是根目錄。根目錄受損,整個文件夾都會崩潰(能夠經過技術部分恢復)。

   二、相對路徑與絕對路徑

   文件名"/zou/cs307/file.pdf"

    相對路徑:

    絕對路徑:從根目錄開始的一個完整路徑

   三、共享與連接

 

16.7 文件系統調甩
16.8 內存映射的文件訪問
思考題

 

 

 

第17章 文件系統實現

引子

存在分區的理由:

一、不一樣的分區能夠創建不一樣文件系統,這樣能夠方便咱們對文件的管理。

二、分區具備安全上的優點,一個分區壞了,不影響其餘分區的使用。

三、分區具備可靠性上的優點,一個分區有故障,不影響其餘分區的運行。

必須分區的理由:

    對磁盤空間的管理,計算機內存的長度一般有限,而磁盤地址須要存放在內存字中,這樣操做系統能夠訪問的磁盤地址數量就是有限的,這個上限數就限制了操做系統能夠訪問的磁盤空間大小。

 

17.1 文件系統的佈局

    一個磁盤分爲若干個三面,扇面從0開始遞增,第0扇面存放的是主引導記錄(MBR),該記錄的內容是一個小程序,用於啓動計算機,若該扇面損壞,磁盤者沒法使用。


大體佈局與上圖相似,整個磁盤的佈局如上圖:從左到右依次爲,主引導記錄,磁盤分區表,分區1(主分區),分區2,。。分區n。

                         主分區又分爲引導記錄,超級數據塊,閒置空間管理,I-NODE區,根目錄區,文件與目錄區。

磁盤分區表裏面給出的是磁盤的全部分區及其開始地址和終結地址。

操做系統放在主分區裏面,計算機啓動時,處於主板ROM裏面的bios程序首先運行,BIOS在進行一些基本的系統配置掃描後對磁盤的0扇區進行讀操做,將MBR裏面的程序讀到內存並運行,MBR程序接下來找到系統主分區,並將系統主分區裏面的引導記錄(boot
 Recode)加載並運行,boot  Recode裏面內容是個小程序,負責找到操做系統映像,並加載到內存,從而啓動操做系統。引導記錄(boot  Recode)後面的內容因狀況而異,通常來講,在該記錄塊後面的磁盤內容因文件系統的不一樣而不一樣。

 
 上述敘述是其中的一種,具體佈局可能不一樣。

17.2 文件的實現

文件的實現要解決如下幾個問題:給文件分配磁盤空間,記錄這些磁盤空間的位置,將文件內容存放到這些空間。

存放的方式:連續方式,非連續方式(鏈表、索引)

一、連續存放方式,優勢是讀寫效率高,缺點是空間浪費,文件擴展不易。

二、非連續方式:鏈表,每一個數據塊裏面留出一個指針的空間,用來存放下一個數據塊的位置。

缺點,

1)數度慢,特別是隨機訪問時,須要一個一個找下去;

2)指針佔空間;

3)計算機裏面的尺寸都是2的n次方,若是數據塊中的一部分空間來存指針,另外一部分存數據的就極可能不是2的m次方了,這樣數據處理的效率就會降低。

  文件分配表(FST,file  allocation  table),全部指針從數據塊裏抽出來,放在一塊兒造成一張表,存放在內存裏。

三、FAT文件系統,使用FAT機制的文件系統,有FAT12,FAT16,FAT32三種,磁盤內存字節數爲12,16,28(不是32個)。FAT表的大小與物理磁盤大小和磁盤數據塊大小有關,物理磁盤越大,磁盤數據塊越小,FAT表越大。

四、索引文件系統,

拓展閱讀:FAT文件系統原理http://blog.chinaunix.net/uid-23215128-id-2521273.html

17.3 目錄實現:地址獨立的實現
17.4 閒置空間管理
思考題

 

 

第18章 文件系統
引子
18.1 文件系統訪問控制
18.2 主動控制:訪問控制表
18.3 能力表
18.4 訪問控制的實施
18.5 文件系統性能
18.6 提升系統性能的方法
18.7 文件系統設計分析:日誌結構的文件系統
18.8 海量數據文件系統
思考題

 

 

第五篇 I/O原理篇
第19章 輸入輸出
引子

19.1 什麼是輸入輸出

19.2 輸入輸出的目的

   一、輸入輸出的目的有兩個:

      a、屏蔽輸入輸出設備之間的差別。

      b、在不一樣的設計之間進行數據表示的轉換。

   二、爲達到上述目的,咱們要保持下列機制:

      a、設備獨立:無論輸入輸出設備是否是更好、更新,咱們進行輸入輸出的模式和方法保持不變。

      b、設備保護:一個輸入輸出設備的操做不會影響對另外一個輸入輸出設備的操做。

19.3 輸入輸出硬件

   一、輸入輸出硬件以設備存儲和傳輸數據的方式能夠劃分爲塊設備和字符設備。

        塊設備:以數據塊爲單位存儲和傳輸數據的輸入輸出設備,磁盤、光盤、U盤、磁帶等。

        字符設備:數據以字節(字符)爲單位存儲和傳輸數據的輸入輸出設備,鼠標,鍵盤,打印機、網絡界面等。

 
      另,網絡界面,有時候能夠和內存進行DMA,看起來更像塊設備。時鐘既不屬於塊設備,也不屬於字符設備。

 
  二、塊設備和字符設備最大的區別是在尋址。塊設備的數據按照數據塊爲單位進行尋址,每一個數據塊都有惟一的磁盤地址,數據塊是能夠尋址的,字符設備的字符是不能夠尋址的(?)。

 
    設備控制器做用:1)控制設備的物理運行;2)將序列字位流轉化爲字節塊流;3)進行糾錯操做。
一、根據cpu與設備控制器溝通方式以及與內存的不一樣關係,物理I/O模式分爲如下三種:
    a)專有通道的I/O:I/O和內存是徹底脫離的。每一個控制寄存器被賦予一個I/O端口(一個8位或16位的整數,這個整數與內存地址無關係,操做系統必須使用專門的輸入輸出特殊指令來進行數據的讀寫)
優勢:與內存分開,輸入輸出操做不會影響內存選擇
缺點:也是「與內存分開」,程序員必須使用IN/OUT低級指令,增長程序設計的難度,這是早期的計算機使用的。
    b)內存映射的I/O:將I/O映射到內存中,從而使I/O和內存管理獲得統一。I/O設備的每一個控制寄存器和設備緩衝區被賦予一個惟一的內存地址對這些地址的訪問,也就是對輸入輸出設備的訪問,從這些地址的訪問邏輯上看,就是內存地址。
優勢:I/O和內存管理獲得統一
缺點:1)緩存使用引發的問題。
      2)總線競爭
    c)混合I/O:前兩種方式的組合
二、根據cpu在I/O過程當中的涉入程度進行分類
   a)繁忙等待訪問:無論內存映射的輸入輸出,處理器均須要與I/O控制器與數據緩存區進行數據交換(按字節/數據塊交換)。
   b)直接內存訪問(DMA,Direct Memory Acess):若是是按數據塊交換,即須要大量數據傳輸,就無需CPU的介入,I/O設備直接與內存交換,數據傳輸有DMA控制器進行管理。
    DMA輸入輸出的過程以下:
CPU對DMA進行設置,高暑期I/O的起始地址和數據長度;啓動DMA過程;DMA進行數據傳輸;DMA結束後發出中斷;CPU響應中斷並處理結束事宜。
DMA模式須要考慮:如何訪問總線(DMA與CPU造成內存總線競爭——解決方案:週期盜用或爆發模式);數據存放何處(直接放入內存、或先放入DMA緩衝區,而後經過中斷讓CPU一次性將DMA的數據考入內存);內存尋址模式(虛擬地址或物理地址)

19.4 輸入輸出軟件

I/O軟件的目的是魔幻和管理:魔幻將不一樣I/O設備的不一樣屏蔽,使它們看起來是同樣的,管理師對這些設備進行管理,該獨享的獨享,該共用的共用,該緩衝的緩衝,並對設備進行實際的驅動(發出讀寫命令)。
一、I/O軟件的目的:
設備獨立:程序對I/O設備的訪問不依賴於設備的物理特性,且在輸入輸出程序的編寫時無需事先指定指定I/O設備。
統一命名:設備與文件的命名不依賴於具體的計算機,這樣使用名字將使程序能夠在任何機器上運行。
錯誤處理:對輸入輸出過程當中產生的數據錯誤進行偵測與糾正,而且糾錯應該是在最靠近硬件的層面上進行。
數據傳輸:實際操控數據在主機與外設之間的傳遞。
緩衝:爲數據傳輸提供一個臨時存放地,而後在方便的時候將數據拷貝到最後的目的地。
共用與獨享:將設備儘可能變爲共享,以增大資源利用率和下降死鎖發生的機率。
二、邏輯I/O模式

從CPU的涉入程度來分,能夠分爲可編程I/O和中斷驅動I/O,這兩種分別對應硬件原理的繁忙等待I/O和直接內存訪問.
a)可編程I/O:在可編程模式下,CPU等待I/的完成,即CPU涉入很深,這種模式叫輪詢,或繁忙等待。在等待的時間裏,CPU不能幹任何事情。
b)中斷驅動I/O:中斷驅動是將CPU從繁忙中解脫出來,在發送完一批數據後,CPU就去忙其餘事情。I/O設備處理完這批數據後,就向CPU發出中斷,CPU再發送另一批數據。
中斷驅動過程:1)CPU初始化I/O並啓動第一次I/O操做,2)CPU去忙別的事情,3)I/O處理完數據時,向CPU發出中斷請求,4)CPU處理中斷,5)CPU恢復被中斷的程序。
三、直接內存訪問I/O原理(DMA)
中斷驅動的I/O須要週期性的中斷來發射或接受後續的數據,會下降系統的效率。

19.5 I/O軟件分層

輸入輸出是個極爲繁瑣的事情。它牽涉到用戶空間和內核空間的數據交換,I/O設備的設置與啓動,中斷響應與返回,並且整個過程須要提供一個與I/O設備無關的統一界面.
一、中斷服務程序,

思者題

第六篇 多核原理篇

多核對操做系統的影響:

(1)多核對操做系統的進程和線程調度產生了直接影響。

(2)在多核條件下,一條指令再多的核上執行,對單核環境下的同步機制有影響。

(3)能耗的管理。

本篇最重要的內容是多核的協調。

 

 

第20章 多核結構與內存
引子

20.1 以量取勝

多核:同一個芯片(cpu)上多個核(core)

多處理器:一個體繫上放置多個cpu。

20.2 多核基本概念

在x86體系結構下,多處理功能芯片通過了對稱多處理器結構、超線程結構、多核結構、多核超線程結構的4個演變階段。

(1)多處理器結構

除了提高CPU主頻和增長1、二級緩存容量外,提高計算機性能最直截了當的的辦法就是在一個電腦裏面安裝多個cpu。

又分爲對稱多處理器結構(SMP)和非對稱多處理器結構(AMP)。

(2)超線程結構

Inter提出了超線程技術讓一個cpu同時執行多重線程,從而提升cpu效率和用戶滿意度。

超線程技術是一個cpu上同時執行多個程序共同分享該cpu內的資源。可讓應用程序在同一時間裏使用芯片的不一樣部分。同一個物理cpu能夠外化爲多個邏輯cpu,這樣一個物理cpu能夠同時執行多個線程。但兩個線程同時須要一個資源時,其中一個要暫停。

(3)多核結構

多cpu成本高、功耗大,超線程技術又不等同與兩個cpu的性能,常常碰到兩個線程同時須要一個資源其中一個要暫停的狀況。

多核技術能夠克服上述的缺點。

多核結構就是在一個cpu裏面佈置兩個執行核,兩套執行單元(ALU、FPU、L2緩存等),其餘部分則是兩個核共享。

(4)多核超線程結構

多核狀況下,咱們也能夠使用超線程技術,從而造成多核超線程。即同一個物理執行核裏面能夠分解爲多個邏輯邏輯執行單元。

20.3 多核的內存結構

UMA:將內存做爲與執行核獨立的單元構建在覈以外,全部的核均經過同一總線對內存進行訪問。因爲每一個內核使用相同的方式訪問內存,器到內存的延時也相同。

優勢是設計簡單、易實現。缺點是難以針對單個程序進行訪問優化,擴展困難,多核對共享內存的競爭會使系統效率降低。

NUMA:使用多個分開的獨立共享內存,每一個執行核或cpu到達不一樣共享內存的距離不一樣,延時也不一樣,這種延時不一樣的內存共享模式稱爲非均勻內存訪問。

優勢是靈活、易擴展。缺點是對調度要求高。

COMA:

在每一個執行核裏面配備緩存,其執行所須要的數據均緩存在該緩存裏面。這種徹底由緩存知足數據訪問的模式稱爲全緩存內存訪問。每一個執行核配備的緩存共同組成了全局地址空間。

NORMA:非遠程內存訪問模式

若內存單元爲每一個執行核私有,且每一個執行核只能訪問本身的私有內存,對其它內存的訪問經過消息傳遞進行。

優勢:設計比numa簡單。缺點是執行核間的通訊成本高。此模式在多核體系結構下使用較少。

20.4 對稱多處理器計算機的啓動過程

20.5 多處理器之間的通訊
20.6 SMP緩存一致性

20.7 多處理器、超線程和多核的比較

多處理器、超線程和多核都是爲了提高計算機性能,都可以同時執行多個指令序列。

思考題

 

 

第21章 多核環境下的進程同步與調度
引子
21.1 多核環境下操做系統的修正
21.2 多核環境下的進程同步與調度
21.3 多核進程同步
21.4 硬件原子操做
21.5 總線鎖
21.6 多核環境下的軟件同步原語
21.7 旋鎖
21.8 其餘同步原語
21.9 核環境下的進程調度
21.10 多核環境下的能耗管理
21.11 討論:多核系統的性能
思考題

 

 

第七篇 操做系統設計原理篇
第22章 操做系統設計之原理
引子
22.1 操做系統設計的追求
22.2

 操做系統設計的第1條哲學原理:層次架構
22.3

 操做系統設計的第2條哲學原理:沒有時錯
22.4

 操做系統設計的第3條哲學原理:懶人哲學
22.5

 操做系統設計的第4條哲學原理:讓困於人
22.6

 操做系統設計的第5條哲學原理:留有餘地
22.7

 操做系統設計的第6條哲學原理:子虛鳥有——海市蜃樓之美
22.8

 操做系統設計的第7條哲學原理:時空轉換——滄海桑田之變
22.9

 操做系統設計的第8務哲學原理:策機分離與權利分離
22.10

 操做系統設計的第9條哲學原理:簡單爲美——求於至簡、歸於永恆
22.11

 操做系統設計的第10條哲學原理:適可而止
思考題
結語
參考文獻

相關文章
相關標籤/搜索