操做系統學習筆記

進程、線程概念node

進程:一個進程就是一個正在執行的程序的實例。算法

進程轉換:安全

進程3個狀態:運行態,阻塞態,就緒態。多線程

1.進程爲等待輸入而阻塞。併發

2.調度程序選擇另外一個進程。app

3.調度程序選擇這個進程。函數

4.出現有效輸入。fetch

線程:輕量級進程。spa

 

做業調度按照某種原則,從後備做業隊列中選取做業進入內存,併爲做業作好運行前的準備工做以及做業完成後的善後處理工做。操作系統

主要調度算法:

First Come First Serve (FCFS)先來先服務:按到達時間前後排序。

Shorted Job First (nonpreemptive & preemptive ) 最短做業優先:按做業的運行時間排序,由短到長。

Round robin 輪轉調度:每一個進程執行一個時間片後移到隊列末尾,把CPU交給下一個進程。

Priority Scheduling  (nonpreemptive & preemptive ) 優先級調度:執行當前實時優先級最高的進程。動態優先級是在建立進程時賦予該進程一個初始優先級,而後其優先級隨着進程的執行狀況的變化而改變。

Multiple Queues 多級隊列:

1.進程在進入待調度的隊列等待時,首先進入優先級最高的Q1等待。

2.首先調度優先級高的隊列中的進程。若高優先級中隊列中已沒有調度的進程,則調度次優先級隊列中的進程。

3.對於同一個隊列中的各個進程,按照時間片輪轉法調度。

4.在低優先級的隊列中的進程在運行時,又有新到達的做業,那麼在運行完這個時間片後,CPU立刻分配給新到達的做業(搶佔式)。

 

多級隊列算法運做過程示例:

假設系統中有3個反饋隊列Q1,Q2,Q3,時間片分別爲2,4,8。 
如今有3個做業J1,J2,J3分別在時間 0 ,1,3時刻到達。而它們所須要的CPU時間分別是3,2,1個時間片。
一、時刻0 J1到達。因而進入到隊列1 , 運行1個時間片 , 時間片還未到,此時J2到達。
二、時刻1 J2到達。 因爲時間片仍然由J1掌控,因而等待。 J1在運行了1個時間片後,已經完成了在Q1中的2個時間片的限制,因而J1置於Q2等待被調度。如今處理機分配給J2。 
三、時刻2 J1進入Q2等待調度,J2得到CPU開始運行。 
四、時刻3 J3到達,因爲J2的時間片未到,故J3在Q1等待調度,J1也在Q2等待調度。 
五、時刻4 J2處理完成,因爲J3,J1都在等待調度,可是J3所在的隊列比J1所在的隊列的優先級要高,因而J3被調度,J1繼續在Q2等待。
六、時刻5 J3通過1個時間片,完成。
七、時刻6 因爲Q1已經空閒,因而開始調度Q2中的做業,則J1獲得處理器開始運行。 J1再通過一個時間片,完成了任務。因而整個調度過程結束。
 
 
週轉時間 做業完成時刻減去做業到達的時刻:做業完成時刻-做業到達時刻
平均週轉時間 用週轉時間總時間除以做業個數:全部做業的週轉時間/做業總數
甘特圖 一種做業執行狀況描述圖,以下SJF(最短做業調度)。
 
 

用戶空間創建的線程包和內核創建的線程包區別圖

 

臨界區每一個進程中訪問臨界資源的那段代碼稱爲臨界區(Critical Section)(臨界資源是一次僅容許一個進程使用的共享資源)。每次只准許一個進程進入臨界區,進入後不容許其餘進程進入。不管是硬件臨界資源,仍是軟件臨界資源,多個進程必須互斥地對它進行訪問。

信號量:在多線程環境下使用的一種設施,是能夠用來保證兩個或多個關鍵代碼段不被併發調用。在進入一個關鍵代碼段以前,線程必須獲取一個信號量;一旦該關鍵代碼段完成了,那麼該線程必須釋放信號量。其它想進入該關鍵代碼段的線程必須等待直到第一個線程釋放信號量。

信號量有兩種操做:down,up,也就是所謂的P,V操做

down:若是信號量大於0,則繼續,等於0則進程將睡眠,將信號量減1。

up:將信號量加1,若是信號量大於0,則繼續,若小於或等於0,則喚醒一阻塞在該信號量上的進程。

 

例如:Semaphore的初值爲n, m個進程使用該semaphore訪問關鍵區,那麼semaphore值的變化範圍是多少?

每一個進程進入關鍵區時都會使Semaphore減1,離開時又使Semaphore加1,因此範圍是n-m到n。

信號量能夠用來解決一些進程同步的問題,例如:

 

用P、V操做說明互斥量,定出司機與售票員之間的同步算法,司機與售票員活動以下圖所示。

 

在汽車行駛過程當中,司機活動與售票員活動之間的同步關係爲:售票員關車門後向司機發開車信號,司機接到開車信號後啓動車輛,在汽車正常行駛過程當中售票員售票,到站時司機停車,售票員在車停後開車門讓乘客下車。所以司機啓動車輛的動做必須與售票員關車門的動做取得同步;售票員開車門的動做也必須與司機停車取得同步。
因此在本題中,應設置兩個信號量s一、s2,s1表示是否容許司機啓動汽車,其初值爲0;s2表示是否容許售票員開車門,其初值爲0。

因此解答爲:(能夠將P操做當作是wait--等待信號,V操做當作是signal--發出信號)

Semaphore  s1,s2=0;  

Driver()                                                Saler()     
{                                                           {
    while(true)                                            while(true)
     {                                                             {
         p(s1);                                                     關車門;
         啓動車輛;                                             v(s1);
         正常行車;                                             售票;
         到站停車;                                             p(s2);
         v(s2);                                                      開車門; 
       }                                                            上下乘客;
 }                                                                    }
                                                                 }  

幾個利用信號量和線程解決的IPC(進程間通訊)經典問題:

1.生產者與消費者問題

在同一個進程地址空間內執行的兩個線程生產者線程生產物品,而後將物品放置在一個空緩衝區中供消費者線程消費。消費者線程從緩衝區中得到物品,而後釋放緩衝區。當生產者線程生產物品時,若是沒有空緩衝區可用,那麼生產者線程必須等待消費者線程釋放出一個空緩衝區。當消費者線程消費物品時,若是沒有滿的緩衝區,那麼消費者線程將被阻塞,直到新的物品被生產出來。

C解決此問題的源碼:

 1 #define N 100  //緩衝區的槽數目
 2 typedef int semaphore;  
 3 semaphore mutex = 1 ;  //臨界區(緩衝區)信號量,以互斥各線程的進入
 4 semaphore empty = N;   //緩衝區的空槽數目
 5 semaphore full = 0;   //緩衝區的滿槽數目
 6 void producer(void)
 7 {
 8   int item;
 9   while (TRUE) {
10     item = produce_item( );
11     down( &empty);   //空槽減1
12     down( &mutex);  //進入臨界區
13     inserUtem(item);  //加入數據
14     up( &mutex);  //離開臨界區
15     up( &full); //滿槽加1
16        }
17 }
18 void consumer(void)
19 {
20   int item;
21   while (TRUE) {
22     down( &full);
23     down( &mutex);
24     item = remove_ item( );
25     up( &mutex);
26     up( &empty);
27   consume_item(item);  //消費一個數據項
28   }
29 }

 

2.哲學家就餐問題

假設有五位哲學家圍坐在一張圓形餐桌旁,作如下兩件事情之一:吃飯,或者思考。吃東西的時候,他們就中止思考,思考的時候也中止吃東西。餐桌中間有一大碗意大利麪,每兩個哲學家之間有一隻餐叉。由於用一隻餐叉很難吃到意大利麪,因此假設哲學家必須用兩隻餐叉吃東西。他們只能使用本身左右手邊的那兩隻餐叉。哲學家就餐問題有時也用米飯和筷子而不是意大利麪和餐叉來描述,由於很明顯,吃米飯必須用兩根筷子。

C解決此問題源碼:

PS:philosopher函數未完整,應該修改成下圖:

值得注意的是,philosopher函數會有不一樣的5個進程來調,參數爲 0 到 N-1 。

 

3.讀者寫者的問題

有一個被許多進程共享的數據區,這個數據區能夠是一個文件,或者主存的一塊空間,甚至能夠是一組處理器寄存器。有一些只讀取這個數據區的進程(reader)和一些只往數據區中寫數據的進程(writer)。如下假設共享數據區是文件。這些讀者和寫者對數據區的操做必須知足如下條件:讀—讀容許;讀—寫互斥;寫—寫互斥。這些條件具體來講就是:

1)任意多的讀進程能夠同時讀這個文件;

2)一次只容許一個寫進程往文件中寫;

3)若是一個寫進程正在往文件中寫,禁止任何讀進程或寫進程訪問文件;

4)寫進程執行寫操做前,應讓已有的寫者或讀者所有退出。這說明當有讀者在讀文件時不容許寫者寫文件。

C語言解決此問題源碼:寫者優先算法

 

死鎖

資源死鎖的4個條件:

1)互斥條件:在一段時間內某資源只由一個進程佔用,若是此時還有其它進程請求資源,則請求者只能等待,直至佔有資源的進程用畢釋放。
2)佔有和等待條件:已經獲得了某個資源的進程能夠再請求新的資源。
3)不可搶佔條件:指進程已得到的資源,在未使用完以前,不能被剝奪,只能在使用完時由本身釋放。
4)環路等待條件:指在發生死鎖時,必然存在一個進程——資源的環形鏈,即進程集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1佔用的資源;P1正在等待P2佔用的資源,……,Pn正在等待已被P0佔用的資源。
 
不發生死鎖的判斷:
m個資源,n個進程,每一個進程最大需求w。
知足 (w-1)*n+1<m 則不會發生死鎖。
 
避免死鎖的方法:經過設置某些限制條件,去破壞產生死鎖的四個必要條件中的一個或者幾個,來預防發生死鎖。
 
銀行家算法:。一種避免死鎖的算法。
銀行家算法基本思想:分配資源以前,判斷系統是不是安全的;如果,才分配。
安全狀態:若是沒有死鎖發生,而且即便全部進程忽然請求對資源的最大需求,也仍然存在某種調度次序可以使每個進程運行完畢。
例如:

如今有5個進程ABCDE,有4種類型的資源R1R2R3R4。在T0時刻系統狀態以下。R1R2R3R4的剩餘資源數依次爲3303

回答下面問題:

1T0時刻是否爲安全狀態?

2)若這時D提出申請(1,2,0,3),是否能實施資源分配?

 

虛地址到實地址的翻譯過程

幾種主要的頁面置換算法:

FIFO(First In First Out)先進先出:按照先進先出順序淘汰頁面。(ps:頁面替換時,出現重複頁面,此頁面的順序按照以前的頁面順序算)

LRU( Least Recently Used ) 最近最少使用:將前一段時間內沒使用的頁面置換。

OPT( Optimal )最佳頁面置換算法:

一、若是頁框中的某個頁面P之後永不使用,則該頁面爲淘汰頁面Pt。
二、若是每一個P都會再次被訪問,那麼其中最長將來時間內再也不被訪問的頁面爲淘汰頁面Pt。
(ps:此算法不可能實現,由於當缺頁中斷髮生時,操做系統接下來頁面的訪問順序。)
 
例如:
其實LRU在置換某頁面時就是向前看,距離這個置換頁面最遠的頁面被置換。
FIFO就是按照最早放入的頁面或者說順序在前的頁面置換掉。
OPT只須要看置換頁面位置後面的頁面,按照出現順序,不出現或者最晚出現的被置換掉。若是都沒出現就職意置換,通常置換第一個。
 

磁盤調度算法

FCFS (First Come First Served) 先來先服務:和進程調度同樣。

最短尋道優先算法(Shortest Seek First):以磁頭位置尋找下一個距離最近的磁道。

SCAN(掃描算法 又稱 電梯算法):第一個磁道選擇離磁頭最近的磁道,而後按照磁頭移動方向依次選擇最近磁道,當此方向上磁道都選擇完畢時,反向選擇最近磁道。

例如:

 

Inode

文件儲存在硬盤上,硬盤的最小存儲單位叫作"扇區"(Sector)。每一個扇區儲存512字節(至關於0.5KB)。
操做系統讀取硬盤的時候,不會一個個扇區地讀取,這樣效率過低,而是一次性連續讀取多個扇區,即一次性讀取一個"塊"(block)。這種由多個扇區組成的"塊",是文件存取的最小單位。"塊"的大小,最多見的是4KB,即連續八個 sector組成一個 block。
文件數據都儲存在"塊"中,那麼很顯然,咱們還必須找到一個地方儲存文件的元信息,好比文件的建立者、文件的建立日期、文件的大小等等。這種儲存文件元信息的區域就叫作inode,中文譯名爲"索引節點"。
Directory
記錄了一個文件/目錄名稱對應的Inode number。
PS:
1.目錄文件的讀權限(r)和寫權限(w),都是針對目錄文件自己。因爲目錄文件內只有文件名和inode號碼,因此若是隻有讀權限,只能獲取文件名,沒法獲取其餘信息,由於其餘信息都儲存在inode節點中,而讀取inode節點內的信息須要目錄文件的執行權限(x)。
2.每一個inode都有一個號碼,操做系統用inode號碼來識別不一樣的文件。Unix/Linux系統內部不使用文件名,而使用inode號碼來識別文件。對於系統來講,文件名只是inode號碼便於識別的別稱或者綽號。
3.Unix/Linux系統容許多個文件名指向同一個inode號碼。
 
HardLink 硬連接
能夠用不一樣的文件名訪問一樣的內容;對文件內容進行修改,會影響到全部文件名;可是,刪除一個文件名,不影響另外一個文件名的訪問。這種狀況就被稱爲"硬連接"(hard link)。
 
SoftLink 軟連接

文件A和文件B的inode號碼雖然不同,可是文件A的內容是文件B的路徑。讀取文件A時,系統會自動將訪問者導向文件B。所以,不管打開哪個文件,最終讀取的都是文件B。這時,文件A就稱爲文件B的"軟連接"(soft link)或者"符號連接"(symbolic link)。

這意味着,文件A依賴於文件B而存在,若是刪除了文件B,打開文件A就會報錯:"No such file or directory"。這是軟連接與硬連接最大的不一樣:文件A指向文件B的文件名,而不是文件B的inode號碼,文件B的inode"連接數"不會所以發生變化。

 
Block devices & Character devices 塊設備&字符設備
I/O設備大體分爲兩類:塊設備和字符設備。塊設備將信息存儲在固定大小的塊中,每一個塊都有本身的地址。數據塊的大小一般在512字節到32768字節之間。塊設備的基本特徵是每一個塊都能獨立於其它塊而讀寫。磁盤是最多見的塊設備。
 
FAT (File Allocation Table 文件配置表)

一個分區分紅同等大小的簇,也就是連續空間的小塊。簇的大小隨着FAT文件系統的類型以及分區大小而不一樣,典型的簇大小介於2KB到32KB之間。每一個文件根據它的大小可能佔有一個或者多個簇;這樣,一個文件就由這些這些(稱爲單鏈表)簇鏈所表示。然而,這些鏈並不必定一個接着一個在磁盤上存儲,它們常常是在整個數據區域零散的儲存。 
文件分配表(FAT)是映射到分區每一個簇的條目列表。每一個條目記錄下面五種信息中的一種: 
1.鏈中下一個簇的地址  
2.一個特殊的文件結束符(EOF)

3.符號指示鏈的結束   

4.一個特殊的符號標示壞簇    

5.一個特殊的符號標示保留簇 ( 0來表示空閒簇 )

 

Memory mapped I/O : 就是把磁盤上的file映射到內存上,當咱們從內存上fetch byte時,對應的file就被讀取。一樣的,當咱們在內存上存儲字節的時候,對應的file就被寫入。這就讓咱們不需經過read和write系統調用而去操做I/O。

 

設備獨立性: 操做系統 把全部 外部設備 統一看成成文件來看待,只要安裝它們的 驅動程序 ,任何用戶均可以像使用文件同樣,操縱、使用這些設備,而沒必要知道它們的具體存在形式。
 
三種I/O實現方式:
1.Programmed I/O (程序控制I/O)是指用特定的IO指令實現從設備到CPU的數據傳輸,CPU須要作所有操做。
 
2.DMA (Direct Memory Access  直接存儲器訪問)
DMA傳輸將數據從一個地址空間複製到另一個地址空間。CPU 初始化這個傳輸動做,傳輸動做自己是由 DMA 控制器來實行和完成。典型的例子就是移動一個外部內存的區塊到芯片內部更快的內存區。像是這樣的操做並無讓處理器工做拖延,反而能夠被從新排程去處理其餘的工做。
 
3.Interrupt-Driven I/O ( 中斷驅動I/O ):當某進程要啓動某個I/O設備工做時,便由CPU向相應的設備控制器發出一條I/O命令,而後當即返回繼續執行原來的任務,設備控制器則按照該命令的要求去控制指定I/O設備。此時,CPU與I/O設備並行操做。
 
Disk Formatting ( 磁盤格式化 )
磁盤格式化是在物理驅動器(磁盤)的全部數據區上寫零的操做過程,格式化是一種純物理操做,同時對硬盤介質作一致性檢測,而且標記出不可讀和壞的扇區。
 
Domain(保護域/域):一對(對象、權限)組合。
 
每一個文件能夠在不一樣的域中有不一樣的權限,每一個域也能切換到其餘域,此時文件的權限改變,例如UNIX的進程有2個部分,用戶部分和核心部分,當執行系統調用時,進程從用戶部分切換到核心部分,核心部分能夠訪問與用戶部分不一樣的對象集。
 
ACL(Access Control List)訪問控制鏈表
相關文章
相關標籤/搜索