作業系統複習

weixin_33782386發表於2019-01-10

第一章 引論

11783601-77f41e5f194395be.png
體系結構圖

1、什麼是作業系統?定義,特點,功能

定義:作業系統其實是一個軟體,是底層複雜多樣的硬體和軟體操作的抽象,同時也是資源的管理者,管理與合理利用計算機資源。即作業系統是一個控制和管理計算機硬體與軟體資源,合理地組織計算機進行工作以及方便使用者使用的大型程式。

特點:

    ①併發:指的是多個應用程式在單核CPU上執行,一段時間交替執行多個程式。

    ②共享:系統的計算機硬體和軟體資源可以給多個程式共同使用。

    ③虛擬,將一個物理的實體變成多個邏輯的對應物。

    ④非同步:也稱為不確定性,即在多道環境下(現代的作業系統基本都是多道環境),每個程式執行的時間,執行的順序是不確定的。

功能:①程式與執行緒、②記憶體管理、③檔案系統、④輸入/輸出管理

11783601-e0d1a5e763bdd190.png
作業系統功能圖

2、計算機的兩種執行狀態及特點

①核心態(也稱管態):核心態可使用所有CPU指令(類似root使用者的角色)

②使用者態(也稱目態):使用者態執行指令有範圍,即只能執行部分安全指令。通常使用者程式就是工作在使用者態,使用者程式要使用特權指令時需要向作業系統提出申請。

11783601-1bf17ef5e0f12ce8.png
兩種狀態

從使用者態切換到核心態的情況

觸發條件:系統功能呼叫(即作業系統提供給應用程式的介面)、外部中斷、異常。三者滿足其一就會發生狀態切換,其中系統功能呼叫結束後會從核心態切換回使用者態。

目態到管態這一過程的切換是由硬體來完成的,中間會產生中斷,這個中斷叫作“訪管中斷”

中斷系統一般由硬體和軟體構成

3、系統功能呼叫的概念

系統功能呼叫就是使用者在程式中使用“訪管指令”訪問作業系統提供的子功能集合,是作業系統提供給使用者程式的介面。

4、各類作業系統的特點

批處理作業系統:和使用者無互動,允許多個使用者把多個作業提交給計算機集中處理。

分時作業系統:和使用者有互動,每個處於就緒佇列的程式都會被分配一個時間片(時間片=使用者所能忍耐的時間/最大使用者數),分時作業系統的特點:多路性、互動性、獨立性、及時性。現常用於桌面系統。

實時作業系統:具有“及時性”和“可靠性”,要求作業系統能及時響應外部事件的請求,並能在規定時間內完成對事件的處理,常用於導彈系統這種。

分散式作業系統:多臺電腦通過網路連線來共同處理一件任務。

分時與多工處理的區別:分時指的是多個使用者同時訪問一臺機器,而多工處理指的是一個使用者處理多個任務。

第二章  程式與執行緒

1、併發與並行概念

併發:指的是多個事件在同一時間間隔內交替執行

並行:指的是多個事件在同一時刻發生

2、程式的5個狀態及轉換條件

11783601-b5a07e2aade9520d.png
狀態圖

3、建立程式和fork函式

在windows系統下,建立程式使用的是系統呼叫CreateProcess()函式,若建立成功則返回true,否則返回false;在linux系統下,建立程式使用的是系統呼叫fork()函式,若子程式建立失敗則返回-1,若建立成功則返回2個值,一個是子程式返回0,一個是子程式返回pid(程式id)。

fork()函式:是一個系統呼叫,程式中使用fork()函式可以建立和父程式一模一樣的子程式出來,子程式使用父程式的棧,資料段,堆以及執行文字段的拷貝。雖然虛擬空間和父程式不一樣,但是物理空間是一樣的。(是暫時的,因為剛開始建立沒什麼區別,但當父程式發生改變了,就給子程式建立一個新的物理空間)

程式控制塊PCB(Process Control Block)是程式存在的唯一標誌。一個程式由程式、資料集合、PCB構成。

引入程式:是為了處理併發;引入執行緒:是為了提高併發性

4、程式與程式的關係和區別

關係:程式是程式的執行,而程式是程式的基礎。

區別:①程式是動態的,而程式是靜態的。②程式有生命週期,而程式只是指令的集合,不具有生命週期。③一個程式可以對應多個程式,而一個程式只能對應一個程式。

5、建立執行緒

在windows系統下,建立執行緒使用的是系統呼叫CreateThread()函式,而linux系統下,建立執行緒使用的是系統呼叫pthread_create()函式。

6、程式與執行緒的關係和區別

關係:一個程式包含多個執行緒,程式就相當於一個容器,執行緒無法脫離程式獨立存在。

區別:程式是計算機資源分配的基本單位,而執行緒是CPU排程的基本單位。

7、多道程式設計概念以及CPU利用率

多道程式支援一段時間內多個程式交替執行,即併發。多道程式設計提高了CPU的利用率。

8、臨界區及競爭條件

臨界區:對共享資源進行訪問的程式碼程式片段

競爭條件:多個程式同時讀寫某些共享資源,而最後的結果取決於精確時序。

互斥:指的是程式之間的間接制約關係,當一個程式進入臨界區使用臨界資源時,另一個程式必須等待。只有當使用臨界資源的程式退出臨界區後,這個程式才會解除阻塞狀態。(比如程式B需要訪問印表機,但此時程式A佔有了印表機,程式B會被阻塞,直到程式A釋放了印表機資源,程式B才可以繼續執行)

9、互斥的解決方案

有忙等待、睡眠與喚醒(訊號量Semaphore)、互斥量(Mutex)、生產者與消費者問題 這幾類解決方案

忙等待

    ①鎖變數:首先設定一個全域性變數用於所有執行緒共享(int turn=0),在進入臨界區之前用while(turn)不斷測試turn的值,當turn=0時表示此時沒有執行緒使用臨界區,所以把turn設定為1,之後進入臨界區。對於其他程式而言,此時while(turn)這一行是成立的,所以其他執行緒會一直卡在這裡忙等待直到測試到turn=0的時候才可以進入臨界區。當處於臨界區的執行緒完成臨界區的資源訪問時就把turn設定為0,表示當前臨界區沒有執行緒訪問了,此時while(turn)這個條件不成立,其他執行緒當中就可以任意一個進入臨界區,之後再進行同樣的操作驗證全域性變數turn。  不過這個方法並不能完全解決臨界區訪問的問題(比如第一個執行緒在turn的值為0時跳過了while(turn)的驗證進入臨界區,當訪問完臨界區資源後,此時在把turn設定為1之前,執行緒切換為第二個執行緒,而這時turn的值還沒修改過來(仍然為0),於是第二個執行緒會跳過while(turn)的驗證進入臨界區,這個時候就達不到對臨界區的訪問控制了。這個turn也變成了競爭條件,但凡是共享的資料都可能成為競爭條件。)

    ②嚴格輪換法(也稱為自旋鎖):同樣需要設定一個變數用來識別當前該哪個執行緒執行了,我們假設有3個執行緒,他們的執行緒id我們用tid = 0;和tid = 1;和tid = 2;表示,並設定一個排隊號turn(可以這樣想,現在有一個浴室(臨界區),一次只能進一個人(一個人即一個執行緒),當浴室中有人在使用的時候其他人需要在外面排隊,每個人都有一個排隊序號(共享變數)),一開始turn為0,表示執行緒0可以先進入臨界區,其他兩個執行緒只能卡在while迴圈那裡,當執行緒0完成臨界區的訪問之後就把turn改成下一個排隊號(理解為執行緒0已經用完浴室了,他出來之後就該輪到執行緒1進入浴室),而此時執行緒2依然卡在while迴圈那裡,因為執行緒1要進入臨界區了。嚴格輪換法按字面意思理解就是嚴格按順序輪著來,執行緒0執行完就輪到執行緒1,然後執行緒2,執行緒3,……  這種演算法也有一個問題,那就是如果執行緒0訪問完臨界區之後把turn改成1,這時候臨界區只有執行緒1有資格訪問,而執行緒2只能卡在while迴圈那裡,但是執行緒1目前還不打算進入臨界區,他還在執行其他的程式碼,那麼執行緒2就只能在那裡一直等待了,這樣就造成了一個效率的問題。(或者說演算法的效能問題)

    ③Peterson演算法這個演算法就很巧妙地解決了互斥問題,它設定了一個鎖turn,當turn==process時表示程式process對訪問臨界區感興趣,同時把陣列元素interested[process]設定為true,具體的過程看下圖程式碼。巧妙在於while的判斷上(while(turn==process && interested[other]=TURE);),比如程式0先執行到while前一行程式碼,程式0切換到程式1,此時程式1在執行過程中會把turn修改為1,而當前process還是0,於是while(turn==process)就不成立了,則直接讓程式0訪問臨界區,反觀程式1的while判斷,目前turn==process是成立了,而此時程式0仍在訪問臨界區資源,則iinterested0]為TRUE也是成立的,於是程式1就一直被卡在while這裡忙等待了,知道程式0完成臨界區的訪問把interested[1]設定為FALSE,程式1才能臨界區。

11783601-d33e326d69015d28.png
自旋鎖方法圖
11783601-09b84f69de5ca978.png
Peterson方法圖

睡眠與喚醒(訊號量Semaphore):睡眠與喚醒可以使用系統呼叫來做,系統為我們開發者提供了互斥問題的解決方案,也就是P、V操作P、V操作之間的就是臨界區程式碼。

P操作:也稱為down操作,執行P操作則訊號量-1,如果此時訊號量>=0時,則繼續往下執行,否則就一直卡在P操作等待一個V操作來喚醒。

V操作:也稱為up操作,執行V操作則訊號量+1,如果此時訊號量>0時,則繼續往下執行,否則就一直卡在V操作;若<0則喚醒被訊號量阻塞的程式。

注意:執行P操作後如果訊號量>=0不成立,則會卡在P操作。當有V操作喚醒的時候就不會在P操作再做判斷了,而是直接往下執行。

在Windows中訊號量初始化semaphore = CreateSemaphore(0,1,1,0);【第二個參數列示訊號量初值,第三個引數比表示訊號量的最大值】,P操作使用WaitForSingleObject(semaphore,-1);,而V操作使用ReleaseSemaphore(semaphore,1,0);。在Linux中訊號量初始化sem_init(&semaphore,0,1);【第三個參數列示訊號量初值】,P操作使用sem_wait(&semphore);,而V操作使用sem_post(&semphore);。

訊號量使用的三要素:初值、P操作、V操作。

互斥量(Mutex):互斥量是專門用來控制互斥事件的,與上面訊號量的流程是完全一樣的,因為mutex就是訊號量的一種特殊情況。比如有2個執行緒要進入臨界區,這時候我們需要控制一次只能有一個執行緒訪問臨界區,使用mutex,當有一個執行緒先訪問到mutex的P操作之後,另一個執行緒會被卡在P操作那裡,因此只有臨界區的執行緒結束對臨界區的訪問並執行了V操作,卡在P操作的另一個執行緒才會有機會進入臨界區。

mutex是專門用來做互斥事件控制的,雖然semaphore也可以做互斥,但未免有點小題大做,semaphore一般做同步控制比較多。

在Windows中互斥量的初始化mutex = createMutex(0,0,0);,P操作使用WaitForSingleObject(mutex,-1);,而V操作使用ReleaseMutex(mutex);。在Linux中互斥量的初始化pthread_mutex_init(&mutex,0);,P操作使用pthread_mutex_lock(&mutex);,V操作使用pthread_mutex_unlock(&mutex);。

生產者與消費者問題生產者與消費者有一個共同的緩衝區,生產者負責往裡面放資料,消費者負責往裡面取資料。生產者一旦生產了資料就可以讓消費者取,當緩衝區滿了,生產者就不能往裡面放東西了,就睡眠(sleep()),直到消費者從緩衝區中取出資料才喚醒生產者(只要緩衝區沒有滿生產者就可以往裡面放)。同樣的當緩衝區中空了,消費者就不能取資料了,就睡眠(sleep()),直到生產者往緩衝區中放了資料才喚醒消費者(只要緩衝區有東西就可以在裡面取)。

11783601-fc2d19d4cba92a29.png
生產者與消費者

10、程式排程演算法(只考慮非搶佔式)、週轉時間、平均週轉時間

先來先服務:先到達的程式優先執行。

短作業優先:在某時刻若有多個程式都已經到達了,則讓服務時間最短的優先執行。

高響應比優先:在某時刻若有多個程式都已經到達了,則計算這些程式的響應比【響應比 = (等待時間 + 服務時間)/服務時間】,響應比大的先執行。

計算週轉時間、平均週轉時間上。(週轉時間=結束時間-到達時間。平均週轉時間=所有程式的週轉時間/所有程式個數。)

11783601-27b21545806f8cd1.jpg
圖片發自簡書App

相關文章