操作系統學習筆記


進程、線程概念

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

進程轉換:

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

1.進程為等待輸入而阻塞。

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

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

4.出現有效輸入。

線程:輕量級進程。

 

作業調度按照某種原則,從后備作業隊列中選取作業進入內存,並為作業做好運行前的准備工作以及作業完成后的善后處理工作。

主要調度算法:

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個時間片。
1、時刻0 J1到達。於是進入到隊列1 , 運行1個時間片 , 時間片還未到,此時J2到達。
2、時刻1 J2到達。 由於時間片仍然由J1掌控,於是等待。 J1在運行了1個時間片后,已經完成了在Q1中的2個時間片的限制,於是J1置於Q2等待被調度。現在處理機分配給J2。 
3、時刻2 J1進入Q2等待調度,J2獲得CPU開始運行。 
4、時刻3 J3到達,由於J2的時間片未到,故J3在Q1等待調度,J1也在Q2等待調度。 
5、時刻4 J2處理完成,由於J3,J1都在等待調度,但是J3所在的隊列比J1所在的隊列的優先級要高,於是J3被調度,J1繼續在Q2等待。
6、時刻5 J3經過1個時間片,完成。
7、時刻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操作說明互斥量,定出司機與售票員之間的同步算法,司機與售票員活動如下圖所示。

 

在汽車行駛過程中,司機活動與售票員活動之間的同步關系為:售票員關車門后向司機發開車信號,司機接到開車信號后啟動車輛,在汽車正常行駛過程中售票員售票,到站時司機停車,售票員在車停后開車門讓乘客下車。因此司機啟動車輛的動作必須與售票員關車門的動作取得同步;售票員開車門的動作也必須與司機停車取得同步。
所以在本題中,應設置兩個信號量s1、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 )最佳頁面置換算法:

1、如果頁框中的某個頁面P以后永不使用,則該頁面為淘汰頁面Pt。
2、如果每個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)訪問控制鏈表
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM