目錄
進程管理
(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下,對接具體文件系統的接口叫虛擬文件系統。