自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux系統(tǒng)的架構(gòu)淺析

系統(tǒng) Linux
1991年,還在芬蘭赫爾辛基大學(xué)上學(xué)的Linus Torvalds在自己的Intel 386計算機上開發(fā)了屬于他自己的第一個程序,并利用Internet發(fā)布了他開發(fā)的源代碼,將其命名為Linux,從而創(chuàng)建了Linux操作系統(tǒng),并在同年公開了Linux的代碼,從而開啟了一個偉大的時代。

歷史

1991年,還在芬蘭赫爾辛基大學(xué)上學(xué)的Linus Torvalds在自己的Intel 386計算機上開發(fā)了屬于他自己的第一個程序,并利用Internet發(fā)布了他開發(fā)的源代碼,將其命名為Linux,從而創(chuàng)建了Linux操作系統(tǒng),并在同年公開了Linux的代碼,從而開啟了一個偉大的時代。在之后的將近30年的時間里,越來越多的工程師投入到Linux,幫助不斷完善Linux的功能。現(xiàn)在的Linux系統(tǒng)架構(gòu)憑借優(yōu)秀的分層和模塊化的設(shè)計,融合了大量的設(shè)備和不同的物理架構(gòu)。

[[277831]]

寫這篇文章,也是對Linux系統(tǒng)的一個非常簡單的介紹,主要講解Linux的進程調(diào)度、內(nèi)存管理、設(shè)備驅(qū)動、文件系統(tǒng)、網(wǎng)絡(luò)模塊。

 

Linux內(nèi)核架構(gòu)圖

上圖就是Linux內(nèi)核的架構(gòu)圖,從硬件層--->操作系統(tǒng)內(nèi)核--->應(yīng)用層,這套系統(tǒng)架構(gòu)的設(shè)計應(yīng)用于各類軟硬件結(jié)合的系統(tǒng)上,比如物聯(lián)網(wǎng)系統(tǒng),單片機系統(tǒng)、機器人等領(lǐng)域。

進程調(diào)度

進程在Linux系統(tǒng)中稱為process或task。操作系統(tǒng)中進程的數(shù)據(jù)結(jié)構(gòu)包含很多元素,諸如:地址空間、進程優(yōu)先級、進程狀態(tài)、信號量、占用的文件等,往往用鏈表鏈接。

CPU在每個系統(tǒng)滴答(Tick)中斷產(chǎn)生的時候檢查就緒隊列里邊的進程(遍歷鏈表中的進程結(jié)構(gòu)體),如有符合調(diào)度算法的新進程需要切換,保存當(dāng)前運行的進程的信息(包括棧、地址等)后掛起當(dāng)前進程,然后運行新的進程,這就是進程調(diào)度。

CPU調(diào)度的基本依據(jù)是進程的優(yōu)先級。調(diào)度的終極目標(biāo)是讓高優(yōu)先級的進程能及時得到CPU的資源,低優(yōu)先級的任務(wù)也能公平的分配到CPU資源。不過因為保存當(dāng)前進程的信息所以進程的切換本身是有成本的,調(diào)度算法同樣需要考慮效率。

在早期Linux內(nèi)核中,就是采用輪詢算法來實現(xiàn)的,內(nèi)核在就緒的進程隊列中選擇高優(yōu)先級的進程執(zhí)行,每次運行相等時間,該算法簡單直觀,但仍然會導(dǎo)致一些低優(yōu)先級的進程長時間不能執(zhí)行。為了提高調(diào)度的公平性,在后來Linux內(nèi)核(2.6)中,引入了CFS調(diào)度器算法。

CFS引入虛擬運行時間的概念,虛擬運行時間用task_struct->se.vruntime表示,通過它來記錄和度量進程應(yīng)該獲得的CPU運行時間。在理想的調(diào)度情況下,任何時候所有的進程都應(yīng)該有相同的task_struct->se.vruntime值。因為每個進程都是并發(fā)執(zhí)行,沒有進程會超過理想狀態(tài)下應(yīng)該占有的CPU時間。CFS選擇需要運行的進程的邏輯基于task_struct->se.vruntime值,它總是選擇task_struct->se.vruntime值最小的進程來運行(為了公平)。

CFS使用基于時間排序的紅黑樹來為將來進程的執(zhí)行時間線。所有的進程按task_struct->se.vruntime關(guān)鍵字排序。CFS從樹中選擇最左邊的任務(wù)執(zhí)行。隨著系統(tǒng)運行,執(zhí)行過的進程會被放到樹的右側(cè),逐步讓每個任務(wù)都有機會成為最左邊的進程,從而讓每個進程都能獲取CPU資源。

總的來說,CFS算法首先選一個進程,當(dāng)進程切換時,該進程使用的CPU時間會加到該進程task_struct->se.vruntime里,當(dāng)task_struct->se.vruntime的值逐漸增大到別的進程變成了紅黑樹最左邊的進程時,最左邊的進程被選中執(zhí)行,當(dāng)前的進程被搶占。

內(nèi)存管理

內(nèi)存,一種硬件設(shè)備,操作系統(tǒng)對其尋址,找到對應(yīng)的內(nèi)存單元,然后對其操作。CPU的字節(jié)長度決定了最大的可尋址空間,32位機器最大尋址空間是4G Bytes,64位機器最大尋址空間是2^64 Bytes。

最大尋址空間和物理內(nèi)存大小無關(guān),稱之為虛擬地址空間。Linux內(nèi)核把虛擬地址空間分為內(nèi)核空間和用戶空間。每個用戶進程的虛擬地址空間范圍是0~TASK_SIZE。從TASK_SIZE~2^32或2^64的區(qū)域保留給內(nèi)核,不能被用戶進程訪問。

虛擬地址空間與物理內(nèi)存的映射

絕大多數(shù)情況下,虛擬地址空間比實際物理內(nèi)存大,操作系統(tǒng)需要考慮如何將實際可用的物理內(nèi)存映射到虛擬地址空間。

Linux內(nèi)核采用頁表(page table)將虛擬地址映射到物理地址。虛擬地址和進程使用的用戶&內(nèi)核地址有關(guān),物理地址用來尋址實際使用的內(nèi)存。

 

示例圖

上圖所示,A和B進程的虛擬地址空間被分為大小相等的等份,稱為頁(page)。物理內(nèi)存同樣被分割為大小相等的頁(page frame)。

進程A第1個內(nèi)存頁映射到物理內(nèi)存(RAM)的第4頁;進程B第1個內(nèi)存頁映射到物理內(nèi)存第5頁。進程A第5個內(nèi)存頁和進程B第1個內(nèi)存頁都映射到物理內(nèi)存的第5頁(內(nèi)核可決定哪些內(nèi)存空間被不同進程共享)。頁表將虛擬地址空間映射到物理地址空間。

文件系統(tǒng)

Linux的核心理念:everything is file。Linux系統(tǒng)存在很多文件系統(tǒng),比如EXT2,EXT3,EXT4,rootfs,proc等等,每一種文件系統(tǒng)都是獨立的,有自己的組織方式、操作方法。

為了支持不同的文件系統(tǒng),內(nèi)核在用戶態(tài)和文件系統(tǒng)之間包含了一層虛擬文件系統(tǒng)(Virtual File System)。大多數(shù)內(nèi)核提供的函數(shù)都能通過VFS定義的接口來訪問。例如內(nèi)核的子系統(tǒng):字符設(shè)備、塊設(shè)備,管道,socket等。另外,用于操作字符和塊設(shè)備的文件是在/dev目錄下真實文件,當(dāng)讀寫操作執(zhí)行的時候,其會被對應(yīng)的驅(qū)動程序創(chuàng)建。

 

VFS結(jié)構(gòu)圖

Linux的虛擬文件系統(tǒng)四大對象:

1. super block(超級塊)

2. inode(節(jié)點)

3. dentry(目錄)

4. block(具體的數(shù)據(jù)塊)

super block

代表一個具體的已經(jīng)安裝的文件系統(tǒng),包含文件系統(tǒng)的類型、大小、狀態(tài)等等。

inode

代表一個具體的文件,在Linux文件管理中,一個文件除了自身的數(shù)據(jù)外,還有一個附屬信息,即文件的元數(shù)據(jù)(metadata),這個元數(shù)據(jù)用于記錄文件的許多信息比如文件大小、創(chuàng)建人、創(chuàng)建時間等,這個元數(shù)據(jù)就包含在inode中。

inode是文件從抽象--->具體的關(guān)鍵。inode存儲了一些指針,這些指針指向存儲設(shè)備的一些數(shù)據(jù)塊,文件的內(nèi)容就存儲在這些數(shù)據(jù)塊中。Linux想打開一個文件時,只需要找到文件對應(yīng)的inode,然后沿著指針,將所有的數(shù)據(jù)塊攢起來,就可以在內(nèi)存中組成一個文件的數(shù)據(jù)了。

 

inode 結(jié)構(gòu)

inode并不是組織文件的唯一方式,最簡單的組織文件的方式,是把文件依次順序的放入存儲設(shè)備,但如果有刪除操作的話,刪除造成的空余空間夾雜在正常文件之間,很難利用和管理;復(fù)雜方式可以用來鏈表來做,每個數(shù)據(jù)塊有個指針,指向?qū)儆谕晃募南乱粋€數(shù)據(jù)塊,這樣的好處是可以利用零散的空余空間,壞處是對文件的操作必須按照線性方式進行,如果隨機讀取就必須要遍歷鏈表,直到目標(biāo)位置。由于這一遍歷不是在內(nèi)存進行,所以速度很慢。

inode既可以充分利用空間,在內(nèi)存占據(jù)空間不與存儲設(shè)備相關(guān),解決了上面的問題。但inode也有自己的問題。每個inode能夠存儲的數(shù)據(jù)塊指針總數(shù)是固定的。如果一個文件需要的數(shù)據(jù)塊超過這一總數(shù),inode需要額外的空間來存儲多出來的指針。

dentry

代表一個目錄項,是路徑的一部分,比如一個路徑/home/jackycao/hello.txt,那么目錄項就有home、jackycao、hello.txt。

block

代表具體的數(shù)據(jù),一個文件由分散的多個block組成,組織的方式由inode來指向。

設(shè)備驅(qū)動

與外設(shè)的交互,說白了就是輸入(input)、操作(operate)、輸出(ouput)的操作。

內(nèi)核需要完成三件事情:

1. 針對不同的設(shè)備類型實現(xiàn)不同的方法來尋址硬件。

2. 必須為用戶空間提供操作不同硬件設(shè)備的方法,且需要一個統(tǒng)一的機制來確保盡量有限的編程工作。

3. 讓用戶空間知道在內(nèi)核中有哪些設(shè)備。

 

設(shè)備通信圖

內(nèi)核訪問外設(shè)主要有兩種方式:I/O端口和I/O內(nèi)存映射。具體不展開介紹了。

內(nèi)核動態(tài)接收外設(shè)發(fā)來的請求(數(shù)據(jù))主要通過兩種方式:輪詢和中斷。

輪詢:周期性的訪問查詢設(shè)備是否有數(shù)據(jù),如果有,便獲取數(shù)據(jù)。這種方法比較浪費CPU資源。

中斷:核心思想是外設(shè)有請求時主動通知CPU,中斷的優(yōu)先級最高,會中斷CPU的當(dāng)前進程運行,每個CPU都提供了中斷線,每個中斷由唯一的中斷號識別,內(nèi)核為每個應(yīng)用的中斷提供一個中斷處理方法。當(dāng)有數(shù)據(jù)已準(zhǔn)備好可以給內(nèi)核或者間接被一個應(yīng)用程序使用的時候,外設(shè)出發(fā)一個中斷。使用中斷確保系統(tǒng)只有在外設(shè)需要處理器介入的時候才會通知CPU,提高了效率。

PS:塊和扇區(qū)的概念:塊是一個指定大小的字節(jié)序列,用于保存在內(nèi)核和設(shè)備間傳輸?shù)臄?shù)據(jù),塊的大小可以被設(shè)置,默認(rèn)是4096 bytes,扇區(qū)是存儲設(shè)備操作的最小單元,默認(rèn)是512 Bytes,塊是一段連續(xù)的扇區(qū)。

網(wǎng)絡(luò)

Linux的網(wǎng)絡(luò)子系統(tǒng)的模型基于ISO的OSI模型,Linux內(nèi)核中會簡化相應(yīng)層級。下圖為Linux使用的TCP/IP參考模型。

 

網(wǎng)絡(luò)模型

Host-to-Host層:相當(dāng)于OSI模型的物理層和數(shù)據(jù)鏈路層,負(fù)責(zé)將數(shù)據(jù)從一個計算機傳輸?shù)搅硪粋€計算機。在Linux內(nèi)核的角度來看,這一層是通過網(wǎng)卡的設(shè)備驅(qū)動程序?qū)崿F(xiàn)的。

Internet層:相當(dāng)于OSI模型的網(wǎng)絡(luò)層,負(fù)責(zé)讓網(wǎng)絡(luò)中的計算機可以交換數(shù)據(jù)(這些計算機并不一定是直連的)。該層同時負(fù)責(zé)傳輸?shù)陌殖芍付ǖ拇笮。驗榘趥鬏斅窂缴厦總€計算機支持的最大網(wǎng)絡(luò)包的大小不一樣,在傳輸時數(shù)據(jù)被分割成不同的包,在接收端再組合。該層為網(wǎng)絡(luò)中的計算機分配唯一的網(wǎng)絡(luò)地址。

Transport層:相當(dāng)于OSI模型的傳輸層,負(fù)責(zé)讓兩個連接的計算機上運行的應(yīng)用程序之間的數(shù)據(jù)傳輸。比如,兩臺計算機上的客戶端和服務(wù)端程序,通過端口號來識別通信的應(yīng)用程序。

App層:相當(dāng)于OSI模型的會話層、表示層、應(yīng)用層,網(wǎng)絡(luò)中不同計算機的兩個應(yīng)用程序建立連接后,這一層負(fù)責(zé)實際內(nèi)容的傳輸。

Linux內(nèi)核子系統(tǒng)的實現(xiàn)通過C代碼實現(xiàn),每個層只能和它上下層通信。

 

Linux網(wǎng)絡(luò)分層圖

 

責(zé)任編輯:武曉燕 來源: 騰訊技術(shù)工程
相關(guān)推薦

2009-12-17 16:28:07

Linux圖形系統(tǒng)

2010-10-28 09:05:10

ASP.NET

2017-02-27 09:21:23

Kubernetes架構(gòu)service

2017-08-14 13:35:36

Linux共享內(nèi)存tmpfs文件系統(tǒng)

2011-03-03 15:21:11

2020-03-16 08:55:34

云架構(gòu)SLA云服務(wù)

2009-06-10 16:25:43

J2EE架構(gòu)架構(gòu)

2014-08-13 10:41:08

linux線程

2016-11-04 21:46:46

UnderscoreJavascript

2009-09-21 12:50:34

Hibernate架構(gòu)

2021-03-17 21:34:44

Linux內(nèi)存管理

2016-08-16 00:13:14

2012-06-20 09:58:23

Android 4.0通知系統(tǒng)

2010-03-10 17:52:30

Linux認(rèn)證淺析

2017-02-27 09:03:37

Mesos架構(gòu)源碼

2024-07-26 10:28:51

2020-07-23 15:40:54

Linux零拷貝文件

2020-07-06 15:10:05

Linux拷貝代碼

2013-05-03 10:21:53

CentOSRedHat Linu

2009-12-01 18:50:20

Suse Linux
點贊
收藏

51CTO技術(shù)棧公眾號