(零)操作系統基礎

目錄

進程管理  

(1)應用程序如何運行與OS上的

(2)什麼是進程

(3)進程控制

1)爲什麼要進行進程控制

2)控制做些啥事情

3)多進程併發運行

4)進程控制信息(PCB)

5)進程的運行狀態

6)有關進程調度

8)進程通信 

9)進程間的關係

10)輕量級的進程 — 線程

內存管理

1)虛擬內存

1)虛擬內存的基本原理

2)虛擬內存機制的具體實現 

3)動態庫的實現原理

4)共享內存

2)虛擬內存總結

 設備管理

(1)回顧計算機結構 

(2)常見的外部設備

(3)設備驅動程序

1)爲什麼叫要驅動程序

2)驅動程序到底是如何驅動外部設備

(4)驅動程序的種類

文件管理

(1)文件在磁盤上存儲形態

(2)文件系統

1)作用:文件管理軟件,計算機文件的管理者

2)文件大致分類

3)文件系統的管理結構:樹形管理結構

4)文件系統與OS,與磁盤關係

5)以ext文件系統的管理格式爲例

3)訪問文件的過程

4)文件系統 與 磁盤驅動

5)文件系統簡單總結


 

進程管理  

(1)應用程序如何運行與OS上的

 ·Os代碼和應用程序代碼都在內存中

          ·運行應用程序的代碼時,PC取應用程序的指令,CPU運行應用程序代碼

         ·應用程序調用OS提供的函數接口,讓OS幫忙提供支持時,這是PC取OS得指令並運行,並去控制外設(硬件)工作,這樣就是取得OS支持,總之OS充當了應用程序控制硬件設備的中間人。

 

(2)什麼是進程

進程是由程序變換而來,介紹進程時,需要先從程序說起。

1)當程序沒有運行時
                    
      當程序沒有被運行時,該程序(可執行文件)只是存放在硬盤上的靜態數據,與你寫的word文件中的數據沒有本質區別

                        
                        
2)進程就是運行中的程序
                            
      當程序運行起來後,進程是所有與“程序運行”有關的代碼和數據的集合體,簡單的理解就是“進程”就是行進中的程序。
                        
                       

                        
3)進程也有生有死
                    
            (a)開始運行爲生,運行結束即爲死。
            (b)程序好比人,進程好比人生,人活着時的一切就是人生,程序活着時所涉及的一切就是進程。

                        
      

4)進程應包含三部分內容
                    
             (a)應用程序本身的代碼和數據,這一部分稱爲應用代碼部分,習慣稱爲應用空間

             (b)應用程序調用OS函數時,所涉及的OS中的代碼和數據,這一部分稱爲內核代碼部分,習慣稱爲內核空間

             (c)OS記錄的進程在運行時的各種管理信息 專門進行進程管理的叫PCB進程控制塊

   

(3)進程控制

1)爲什麼要進行進程控制

       在有OS的計算機上,應用程序必須在OS的支持下才能運行,換句話說,必須在OS的控制之下才能運行。

 

2)控制做些啥事情

      (a)分配內存空間,然後將程序調入內存並啓動運行,運行起來後就變成了一個進程。

      (b)OS調度器對其進行調度

      (c)OS進行進程控制時,會負責記錄進程各個方面的管理信息,這些控制(管理)信息都記錄在了PCB中。

      (d)意外事件處理

      (e)當進程運行結束之後,回收內存空間、記錄有各方面進程信息的PCB,

 

3)多進程併發運行

       在計算機上運行的絕不是隻有一個進程,而是很多進程同時併發運行,進程在併發運行時
                    1)所有進程都是交替運行的,每個進程只運行一個ms級的時間片。                 
                    2)調度器會根據調度優先級算法,決定下一個時間片運行哪一個進程
                    3)從宏觀上看,所有進程是同時併發運行的,但在微觀上,在每個時刻,CPU只運行一個進程。

 

4)進程控制信息(PCB)

      我們說進程是在OS控制下運行的,OS會使用PCB管理各種進程信息,以Linux系統爲例,PCB就是一個C結構體,該結構體名叫 task_struct,該結構體非常大,成員項達300個左右,用於記錄該進程被OS控制運行時的各種管理信息。

     1)Linux系統的tasck_struct結構體 

           

     2)task_struct中的各種進程管理信息

            (a)進程信息

                    · 進程ID:用於唯一標識進程的編號,好比人的身份證號

                    · 程序名稱:就是可執行文件的名字

                    · 可執行文件的格式:

                    · 進程時間:進程什麼時候開始運行的

           (b)進程調度信息

                  · 進程運行狀態:就緒態,執行態,等待態等

                  · 優先級:進程被調度的優先級,優先級高的會被優先被調度

                  · 調度標誌:標記該進程是否被調度

                  · 時間片:運行時間片大小

            (c)文件信息:記錄正在被進程操作文件的各種信息

            (d)內存信息:進程運行時所需內存的管理信息

            (e)休眠時間:比如當進程調用sleep函數,進程就會進入休眠。

 

 

5)進程的運行狀態

       1)進程運行狀態有哪些

                    (a)就緒態:表示進程準備就緒,隨時等待被調度運行
                    (b)執行態:被調度運行,運行時佔有CPU,運行的時間片到後讓出CPU
                    (c)阻塞態:因爲進程運行需要的某些條件的不滿足,進程阻塞處於休眠狀態
                    (d)終止態:進程結束,也就是程序運行結束,回收進程佔用的內存資源

             

       2)進程狀態間的切換

6)有關進程調度

          1)進程調度由調度器實現
          2)所有進程運行時,都包含就緒態、執行態、阻塞態、終止態這些狀態,都會在這些狀態之間來回切換           
          3)只有當進程進入執行態時,進程纔會獲得CPU的佔有權 
          4)進程運行的時間片到後就會調度其它進程運行,每個時間片平均在10ms~20ms左右。
          

8)進程通信 

   本機進程間通信

                - 本機進程間通信的第三方 OS, 

                                            

 誇機進程間通信

                 其實就是網絡通信,實現兩臺計算機上的程序之間的通信。

9)進程間的關係

   1)父子關係

   2)進程組關係

   3)會話期

10)輕量級的進程 — 線程

   1)進程存在的問題:進程切換很耗費時間

   2)進程問題的解決:線程

   3)線程由誰提供

             線程有兩種提供方式,第一種則由操作系統提供,第二種以線程庫方式提供,獨立於OS之外。

             a)Linux:兩種方式都有,不過常見的都是以獨立於OS之外的線程庫來提供。

             b)Win32:由OS提供

 

   4)與進程一樣,線程也會參與調度

                   

   5)線程能夠替代進程嗎

            a)不能   因爲線程是基於進程而存在,沒有進程也無法無法實現

 

   6)進程與線程關係

            線程基於進程資源工作

                        資源(cpu和內存)以進程爲單位進程分配的,因此進程被稱爲資源分配的最小單位

            線程的切換

                        進程內的線程切換時,不涉及進程間的切換   

            進程與線程各自的作用    

                        - 程序運行起來後就變成了進程,OS以進程爲單位分配cpu、內存等計算機資源。
                        - 線程實現進程內部的多線任務

 

   7)進程和線程關係類比

 

 

 


內存管理

1)虛擬內存

1)虛擬內存的基本原理

a)原理圖

(c)爲什麼稱爲虛擬內存

         CPU被欺騙了,它認爲使用這個虛擬地址訪問了某個內存,但是這個虛擬地址只是一個編號,這個虛擬地址對應的只是 一個虛擬的內存,實際上程序被分成兩部分放在了內存上和外存上。

(d)虛擬內存機制爲什麼節省了內存    

          因爲只加載了你要運行的那部分,其他的都在外存上,外存幫忙存了其他代碼,相當於使用外存擴展了內存空間。

(e)虛擬內存機制爲什麼能夠防止修改別人的程序空間

         自己的虛擬地址只映射了自己的物理內存空間和外存空愛,就算是程序員把地址寫錯了,但是錯的也只是虛擬地址,由於  虛擬地址只映射了自己的空間,頂多也就把自己的空間給改了,不可能把別人的空間給改了。

2)虛擬內存機制的具體實現 

(a)將內存和程序分頁

              

 

(b)加載程序,建立映射頁表

               

                所有運行的進程都有一張自己頁表  OS的虛擬內存機制就是使用每個進程的頁表來管理這些虛擬頁的。

  •                 1 加載肯定是有OS負責加載的
  •                 2 OS加載程序時候 需要一個輔助進程(該進程父進程)
  •                 3 程序被加載後成爲進程 OS就會爲該進程 開闢頁表 (從父進程的頁表複製過來 修改後得倒一張新頁表)

 

(c)CPU通過“虛擬地址”取指並執行進程

 

虛擬地址/頁大小(4K ) = 所在頁號

 

(d)缺頁異常處理

缺頁中斷: CPU取址運行 (內存沒有在外存上    把所缺頁導入內存 :(1 找空頁導入   2替換掉以前的頁))

                   CPU重新取址運行

 

3)動態庫的實現原理

1)靜態庫和動態庫

          靜態庫是在編譯程序時就決定好了的,庫代碼已經被複制到了程序中,

          但是動態庫不一樣,程序使用這個動態庫時,並沒有將動態庫代碼複製到程序中,只是在程序中留下了一片空的虛擬地址作爲接口,這些虛擬地址並不對應真實的指令。當我們的程序被加載到內存中運行時,纔會動態的去加載動態庫,因爲動態庫時共享的,因此動態庫也被稱爲共享庫。

 

2)動態庫的實現

          動態庫也叫共享庫,核心是共享,因爲動態庫的實現需要虛擬內存機制的支持,

          如果是裸機的話,是沒有OS,沒有OS就沒有虛擬內存機制,在裸機上只能使用靜態庫

 

3)程序中的動態庫接口

        程序中使用了動態庫的話,編譯程序時,會預留一片虛擬地址。
        當程序運行起來後,這片虛擬地址會被映射到物理內存上的動態庫,建立虛擬地址和動態庫物理地址的對應關係。  
          

4)共享內存

不同進程共享了同一片空間後,一個往裏方數據,另一個從裏面取數據,就實現了通信。

與共享動態庫的區別僅僅是,共享動態庫時,共享空間裏面放的是動態庫的指令,供不同進程共享執行。
而共享內存僅僅只是一片空的共享空間,只是是用來通信用的。

2)虛擬內存總結

如下這張圖是如何得到的

多進程是如何共享一個OS的:

應用空間對應的虛擬地址:用於訪問應用代碼。
內核空間對應的虛擬地址:用於映射到OS上,當應用代碼調用OS的系統函數時,就會使用內核空間虛擬地址訪問OS
使用虛擬地址,不管是訪問應用代碼,還是訪問OS,虛擬地址都需要被轉成物理地址,到實際的物理內存中去訪問

 

CPU使用虛擬的地址運行每一個進程,CPU被虛擬地址欺騙後,CPU人爲每一個進程都有一個自己的內存,這個欺騙CPU假內存,就稱爲虛擬內存。

CPU認爲整個程序(進程)運行在獨立的虛擬內存上,因此虛擬內存空間,也被稱爲進程空間。

 

虛擬內存就是通過虛擬內存機制,在物理內存和硬盤上,營造出來的一種假象


 設備管理

(1)回顧計算機結構 

(2)常見的外部設備

只要掛接在外設IO接口上的都是外部設備

按照用途分的話,大致分爲三大類。
     (a)數據的傳輸:比如網卡,負責數據的發送和接收,即是輸入也是輸出設備
     (b)數據的存儲:比如像磁盤,SSD(固態硬盤),既能讀數據也能裏寫數據,所以即是輸入也是輸出設備。
     (c)數據的翻譯:比如輸入設備MIC,將輸入的聲音翻譯爲電信號的二進制數據。

(3)設備驅動程序

1)爲什麼叫要驅動程序

外部設備絕對不是連上就能用的,必須要有專門的程序來驅動才能工作,能夠驅動外部設備工作的程序就是驅動程序。

                                                        

 

2)驅動程序到底是如何驅動外部設備

爲了能夠驅動外部設備工作,驅動程序關鍵要要兩件事情

                    第一件:配置外設的工作模式
                    第二件:通過外設輸入輸出數據

(a)第一件:配置外部設備的工作模式

爲什麼要配置

         因爲大多數外部設備都有很多種工作模式,驅動程序需要通過相應的配置,選擇讓設備工作在那種工作模式下

         如果不做配置的話,外部設備不知道該工作在什麼模式下,是混亂的。

 

驅動程序是如何配置外部設備的呢

         通過相應的配置開關進行配置,這個配置開關就是“設備的配置寄存器”。

 

設備的配置寄存器

         就是外設工作模式的配置開關,是外設專用寄存器,與CPU內部的寄存器、cache、內存(DDR)一樣,

         只是這些寄存器被做在了外部設備的內部,是專屬於外設的專用小容量內存

         驅動程序向設備的配置寄存器中寫入相應的配置數據,就可以配置好外部設備的工作模式。

 

·爲什麼向配置寄存器寫入配置數據,就能配置好外設的工作模式

               

計算機中數據已電信號存在,向設備配置寄存器寫入配置數據,其實就是將電信號導入配置寄存器,配置寄存器中
就把這個電信號鎖存起來,這個電信號承載的是一個二進制數,所以就將電信號的二進制數據寫入了配置寄存器中。

(b)第二件:輸入/輸出數據

配置好工作模式後,驅動程序就可以驅動設備工作了,此時需要用外設的“數據寄存器”。

          爲什麼需要數據寄存器呢?
          因爲輸入輸出數據時,數據需要暫時存放在數據寄存器中,存數據時,存儲的其實就是電信號。

·輸入設備

輸入設備有兩種情況,
              第一種:直接得到就是二進制數據,比如像網卡和存儲器,能夠直接輸入數據    
              第二種:需要經過傳感器的翻譯,比如像麥克風、攝像頭,需要轉爲二進制電信號形式的數據。

         CPU執行輸入設備驅動程序時,從輸入設備的數據寄存器中取出數據,並將數據保存起來,專門進行數據處理的程序就可以處理這些輸入的數據了。

          

本質就是數據的搬移(在指令的控制下 把電信號從一個地方搗鼓到另一個地方)

從設備數據寄存器搬移到---->驅動程序緩存裏面搬移---->OS內核緩存---->C庫緩存----->應用緩存

·輸出設備

輸入設備有兩種情況(同上)

CPU執行輸出設備的驅動程序時,會將電信號形式的數據寫到設備的數據寄存器中,輸出設備的

              

(4)驅動程序的種類

分爲兩種,第一種是裸機驅動程序,第二種是基於OS的驅動程序。

(a)裸機驅動程序的特點

裸機程序大致分爲兩部分,第一部分爲業務邏輯代碼,第二部分爲驅動代碼

            - 業務邏輯代碼:專門負責數據的處理,比如計算1+2結果

            - 驅動代碼:專門負責驅動外設,實現數據的輸入輸出,比如控制鍵盤輸入1和2,控制顯示屏顯示3

                        

            

(b)基於OS的驅動程序 

                                


文件管理

(1)文件在磁盤上存儲形態

文件存儲在磁盤上時,分別要存儲兩部分的內容,第一部分是文件屬性信息,第二部分是文件中存放的數據,屬性信息和數據是分開存放的.

我們看見的圖形化的文件,只是圖形化給人看的一個文件符號而已,存儲在磁盤上的文件信息纔是真實的文件存在形態。

 

1)第一部分,文件屬性信息 

表現文件的獨特性質,是區別文件用的身份信息,文件的屬性信息有文件名、文件類型、文件輸在位置等信息,任何計算機上的文件的屬性,80%都是相同

文件屬性都包含,文件名稱、文件類型、文件大小、文件位置、創建/修改時間、文件讀寫權限、打開方式等。

 

2)第二部分,文件數據:就是存放在文件中的數據。

 

3)文件屬性與文件數據 

(a)並不是所有的文件都有數據

                       第一個:所有的文件一定都有屬性信息  

                       第二個:但是不是所有的文件都有數據

(b)文件屬性與文件數據如何發生關係

          文件屬性中保存了文件數據在磁盤上存儲地址,操作文件時,首先找到文件屬性,然後再通過地址找到數據空間,調用磁盤驅動就可以操作文件數據所在磁盤空間,對文件數據進行相應的讀寫操作。  

                                 

(c)只有文件屬性才能代表文件的存在性

        

(2)文件系統

1)作用:文件管理軟件,計算機文件的管理者

                    書架:文件系統
                    書:文件
                    書中的內容:數據

數據是以文件爲單元存儲在磁盤上的,磁盤上會存儲非常多的文件,因此需要文件系統這個軟件來管理這些磁盤文件,文件系統被圖形化呈現後,我們看見的就是各種的文件圖標。
                    
那麼文件系統管理文件時,文件系統是通過管理文件的屬性信息來管理文件的,就好比公安局使用每個人的檔案(人屬性)來管 理人一樣。

2)文件大致分類

(a)目錄文件

              文件夾,用於歸類和組織其它文件,是文件系統管理文件時很重要的組織節點。    
              目錄文件在磁盤上存儲時,會存儲自己屬性和數據兩部分內容
              目錄的數據空間只用與存放被管理文件的簡略信息(文件的名字等)目錄使用這些簡略信息來組織管理文件

     文件的屬性和數據並不放在目錄文件空間裏面,而是存放在文件自己的屬性和數據空間。

 

(b)非目錄文件

    ·有數據:由於存儲和管理數據用的,有數據的文件又分成了兩種

                    - 字符編碼文件    - 非字符編碼文件

    ·沒有數據:這類文件很特殊,只有屬性沒有數據,屬於特殊用途的文

3)文件系統的管理結構:樹形管理結構

(a)組織結構都是以樹形結構管理的

(b)文件系統的樹形結構

                                 

4)文件系統與OS,與磁盤關係

(a)文件系統屬於OS的一部分

 文件系統分爲兩部分,第一部分是“虛擬文件系統”,第二部分是“具體的文件系統”

· 虛擬文件系統:也叫VFS,OS內核與各種“具體文件系統”對接的統一接口。

· 具體的文件系統:文件分爲了很多種

                                

 “虛擬文件系統”與“具體文件系統”的關係 

         

· 文件系統與“文件系統的管理格式”

        不同的文件系統會用不同的管理格式去管理我們的磁盤空間,從而實現對磁盤上所放文件的管理

        不同的文件系統的管理格式是不一樣的。

        OS使用不同文件系統去管理磁盤、SSD、U盤、移動硬盤,我們需要設置不同管理格式。

 

- 如何設置磁盤、SSD、U盤、移動硬盤的管理格式呢?

         比如我們格式化磁盤、SSD、U盤、移動硬盤時,選擇文件類型時,就是在選擇該種文件系統對應的管理格式。

- 我們在格式化時做了什麼事?

          

                                

一般,OS中會包含很多種文件系統

5)以ext文件系統的管理格式爲例

1)文件系統管理格式概述

(a)ext文件系統爲了很好的管理磁盤上存放的文件,ext對應的管理格式,將磁盤大致分爲了四大存儲區域

       

2)各大區域介紹

(a)自舉區

     ·存儲內容:存放“自舉程序”

           

(b)超級區

           存儲內容:存放對於磁盤(屬性和數據存儲區)的管理信息,其中有兩個很重要的表(鏈表)

                    

(c)文件屬性存儲區

· 存儲內容

           - 該區域專門用於存放所有文件的屬性信息。

           - 該存儲區域被分成了一個個的inode節點

             

             - 如何通過i節點編號訪問i節點空間

               

                            

·存儲文件屬性信息的作用

                    (1)代表了文件的存在
                    (2)用於管理文件文件系統這個管理軟件,讓它去管理我們的文件系統。

(d)文件數據存儲區

-存儲內容

           - 存儲文件數據,文件屬性和數據分開存放的 

- 訪問文件數據的過程

         

                            

      文件的數據並不是完全一整塊存儲在“文件數據存儲區的”,而是分一塊一塊存儲的,每一塊之間不一定是連續的,各塊之間通過相互保存對方地址連接起來。

     磁盤是以塊作爲空間分配和管理的最小單元,一塊大約4KB左右,當向文件中輸入數據,當前塊滿了後,“超級區”會給文件再分配一塊空間,數據一點點的寫入這個空間,當再次寫滿這個空間後,再分配一個塊。

·普通文件和目錄文件的數據內容

- 普通文件
                 對於普通文件來說,在數據空間放的就是文件中的數據。 

- 目錄文件

                

 

3)訪問文件的過程

                                     

(a)第一步:搜索,找到xxx.txt文件

              

               

               - /位置是固定的,先找到/的i節點空間

               - 通過/的i節點空間,找到/數據空間

               - 在/目錄的數據空間,搜索/下的目錄項,看看有沒有叫xxx.txt的文件

                         + 如果有:xxx.txt名字 —> xxx.txt目錄項—>i節點編號—>i節點空間

                         + 如果沒有:OS返回一個錯誤信息給程序,提示操作的文件不存在。

 

(b)第二步:打開文件

(c)第三步:調用磁盤驅動程序,讀寫文件的數據

4)文件系統 與 磁盤驅動

1)文件系統

     使用目錄項、文件屬性等信息來管理文件,搜索文件時,必須通過文件系統才能找到被管理的文件。

2)磁盤驅動

     專門負責對磁盤上文件的讀寫操作:數據空間的讀寫操作 屬性空間的讀寫操作(文件i節點空間)

3)需要注意的是

  對文件進行讀寫數據時,數據並不是一下子就寫到文件中的,數據要經一系列緩存之後,驅動程序然後再將數寫入文件

                              

int main(void)
{
	char buf[100];
	int a;//a也是緩存,用於臨時存放整形數
	struct student stu;//也是一個緩存,用於臨時存放某個學生的信息
	
	
	scanf("%s", buf);//從鍵盤輸入數據,並暫時緩存到Buf中去,
	//緩存是什麼:緩存其實就是程序開闢出來的,用於臨時存放數據的內存空間
	//我們程序中開闢出來的,一切的變量空間,統統都是用於存放數據的緩存
	
	int fd;
	fd = open("/xxx.txt", 只寫);
	write(fd, "hello world", 11);//調用系統函數write,將應用程序buf(緩存)中的數據,搗騰到內核中緩存中去
	
	
	return 0;
}

 

5)文件系統簡單總結

· OS是藉助文件系統來管理文件的。    
· OS會提供接口來對接具體的文件系統,在Linux下,對接具體文件系統的接口叫虛擬文件系統。

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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