Linux實驗總結分析報告


 

SA20225405  蘇俊傑

作業要求:

1、請您根據本課程所學內容總結梳理出一個精簡的Linux系統概念模型,最大程度統攝整頓本課程及相關的知識信息,模型應該是邏輯上可以運轉的、自洽的,並舉例某一兩個具體例子(比如讀寫文件、分配內存、使用I/O驅動某個硬件等)納入模型中驗證模型。

2、然后將一個應用程序放入該系統模型中系統性的梳理影響應用程序性能表現的因素,並說明原因。

3、產出要求是發表一篇博客文章,長度不限,1要簡略,2是重點,只談自己的思考和梳理。

 

1.精簡的Linux系統概念模型

       Linux操作系統:通俗的操作系統主要是包含軟件和硬件兩部分統一運行的,並由操作系統來統一管理硬件的軟件系統,而linux是一個基於POSIX的多用戶、多任務、支持多線程和多CPU的操作系統。Linux系統主要包含4個主要部分:內核、shell、文件系統和應用程序。其中內核、shell和文件系統一起形成了基本的操作系統結構,它們使得用戶可以運行程序、管理文件並使用系統。Linux操作系統相對於其他操作系統的特點是萬物皆可看做文件,無論是軟件資源還是硬件資源都看做文件進行操作。Linux操作系統被抽象為不同的層級和模塊,如下圖所示。

               

      如果讓我們把Linux系統再精簡些,就是下圖所示的模樣:                                                         

         如圖中所示,我們可以看到,內核直接與硬件打交道,並給上層應用提供系統調用,讓他們間接的使用硬件資源。shell似乎Linux系統中方便人機交互的界面軟件,庫函數不屬於Linux內核,但是它封裝了基本的功能供人使用,提高了編程效率。

 

2.進程管理

      進程管理是linux系統的核心部分,在Linux內核中⽤⼀個數據結構struct task_struct來描述進程,直接或間接提供了進程相關的所有信息。struct task_struct的結構包括了進程的狀態、進程雙向鏈表的管理,以及控制台tty、⽂件系統fs的描述、進程打開⽂件的⽂件描述符files、內存管理的描述mm,還有進程間通信的信號signal的描述等內容。

       init_task為第⼀個進程(0號進程)的進程描述符結構體變量,它的初始化是通過硬編碼⽅式固定下來的。除此之外,所有其他進程的初始化都是通過do_fork復制⽗進程的⽅式初始化的。1號和2號進程的創建是start_kernel初始化到最后由rest_ init通kernel_thread創建了兩個內核線程:⼀個是kernel_init,最終把⽤戶態的進程init給啟動起來,是所有⽤戶進程的祖先;另⼀個是kthreadd內核線程,kthreadd內核線程是所有內核線程的祖先,負責管理所有內核線程。

       操作系統原理中的進程有就緒態、運⾏態、阻塞態這3種基本狀態,而實際的Linux內核管理的進程狀態有些不同,就緒態和運行態,在linux中都是TASK_RUNNING態。各種狀態和轉換見下圖:

3.中斷管理

      中斷有很多種,都是程序執行過程中的強制性轉移,轉移到操作系統內核相應的處理程序。中斷在本質上都是軟件或者硬件發生了某種情形而通知處理器的行為,處理器進而停止正在運行的當前進程,對這些通知做出相應反應,即轉去執行預定義的中斷處理程序(內核代碼入口),這就需要從進程的指令流里切換出來。

      中斷能起到暫停當前進程指令流(Linux內核中稱為thread)轉去執行中斷處理程序的作用,中斷處理程序是與當前進程指令流獨立的內核代碼指令流。從用戶程序的角度看進程調度的時機一般都是中斷處理后和中斷返回前的時機點進行,只有內核線程可以直接調用schedule函數主動發起進程調度和進程切換。

中斷處理后,會檢查一下是否需要進程調度。需要則切換進程(本質上是切換兩個進程的內核堆棧和thread),不需要則一路順着函數調用堆棧正常中斷返回iret,這樣就自然回到原進程繼續運行了。

      硬件中斷(Interrupt),也稱為外部中斷,就是CPU的兩根引腳(可屏蔽中斷和不可屏蔽中斷)的電平信號。CPU在執行每條指令后檢測這兩根引腳的電平,如果是高電平,說明有中斷請求,CPU就會中斷當前程序的執行去處理中斷。一般外設都是以這種方式通知CPU的,如時鍾、鍵盤、硬盤等。

      軟件中斷/異常(Exception),也稱為內部中斷,包括除零錯誤、系統調用、調試斷點等,在CPU執行指令過程中發生的各種特殊情況統稱為異常。異常會導致程序無法繼續執行,而跳轉到CPU預設的處理函數。異常分為如下3種:

      故障(Fault):故障就是有問題了,但可以恢復到當前指令。例如除0錯誤、缺頁異常等。

      退出(Abort):簡單說是不可恢復的嚴重故障,導致程序無法繼續運行,只能退出了。例如連續發生故障(double fault)。

      陷阱(Trap):程序主動產生的異常,在執行當前指令后發生。前面研究的系統調用(int 0x80)以及調試程序時設置斷點的指令(int 3)都屬於這類。簡單說就是程序自己要借用中斷這種機制進行跳轉,所以在有些書中也稱為“自陷”。從CPU的視角看,其處理機制與其他中斷處理方式並無區別,我們可以以系統調用為例以此類推到一般的中斷機制。

                                    

 

4.文件管理

       Linux中一切都是文件,包括硬件設備,這樣用戶可以采用讀寫文件的方式實現訪問硬件。

       文件是具有符號名的、在邏輯上具有完整意義的一組相關信息項的有序序列。文件系統,就是操作系統中實現文件統一管理的一組軟件、被管理的文件以及為實施文件管理所需要的一些數據結構的總稱。要實現操作系統對其他各種不同文件系統的支持,就要將對各種不同文件系統的操作和管理納入到一個統一的框架中。對用戶程序隱去各種不同文件系統的實現細節,為用戶程序提供一個統一的、抽象的、虛擬的文件系統界面,這就是所謂的虛擬文件系統VFS。為各類文件系統提供了一個統一的操作界面和應用編程接口。

      原理也很簡單,用戶態下有幾個系統調用函數,包括read()、write()、open()、close()等,作用類似於字面意義,就是讀寫打開關閉文件。 然后調用內核中sys_open()、sys_read()等函數,對包括FAT、設備文件等在內的文件系統操作。可以說VFS是一個軟件層,用來處理與Unix標准文件系統相關的所有系統調用。

      通常,虛擬文件系統分為三個層次:

第一層為文件系統接口層,如open/write/close等系統調用接口。

第二層為VFS接口層。該層有兩個接口:一個是與用戶的接口;一個是與特定文件系統的接口。VFS與用戶的接口將所有對文件的操作定向到相應的特定文件系統函數上。VFS與特定文件系統的接口主要是通過VFS-operations實現。

第三層是具體文件系統層,提供具體文件系統的結構和實現,包括網絡文件系統,如NFS。

 

5.實例說明

 

     這里以打開文件說明。打開文件即使用 open 函數,它首先通過按名查找,看在高速緩存中有沒有查找的 inode,如果有那么對其進行引用並加 1。如果沒有將創建新的 vfs的 inode 對象和目錄項對象等。 Open 函數調用的系統服務例程是 sys_open 函數,其接受的參數為文件目錄和訪問的模式。如果文件存在則返回一個文件描述符fd,如果不存在則返回-1. Read 函數調用的服務例程是 sys_read ,接受三個參數。分別是一個文件描述符 fd,一個對數據緩存的地方buf,和需要傳輸的數據的多少 count。Read 對將文件讀入緩存區。

 影響性能的因素:

 1.硬件的速度:程序的運行需要將磁盤中靜態的程序加載到CPU中,而硬盤的速度相對CPU是程序運行的下限。同樣Cpu性能至關重要。

 2.緩存的命中:現代計算機的構造中,有多級緩存,在緩存都命中的情況下,程序的運行速度是更快的。但是相反就會影響速度,如矩陣冪,利用緩存命中的特性寫程序會使程序性能更優化。

 3.網絡性能:Linux 下的各種應用,一般都是基於網絡的,因此網絡帶寬也是影響性能的一個重要因素,低速的、不穩定的網絡將導致網絡應用程序的訪問阻塞;而穩定、高速的帶寬,可以保證應用程序在網絡上暢通無阻地運行。

 4.內存限制:Linux系統采用了物理內存和虛擬內存兩種方式,虛擬內存雖然可以緩解物理內存的不足,但是占用過多的虛擬內存,應用程序的性能將明顯下降,要保證應用程序的高性能運行,要保證足夠的物理內存,避免占用虛擬內存過多的情況。

 5.文件系統性能:Linux標准文件系統呈現出多種風格。如果我們沒有特殊的需要,就可以直接使用普通的Ext2文件系統。如果我們想避免系統崩潰后冗長的文件系統檢測,就可以切換到Ext3文件系統。如果我們不得不處理許多的小文件,ReiserFS是最好的選擇。不同的文件系統同樣會影響程序的性能。

 

6.心得與致謝

      結果這段時間的學習,我對Linux內核的工作機制和工作原理有了更加深入的理解,原來只是簡單學習了《操作系統》,對一般操作系統中進程、中斷、文件系統等概念了解皮毛,而現在經過了老師的諄諄教導,我初步將Linux操作系統與一般操作系統中相關的知識點進行了比較和融合。老師們對我們的動手實踐能力也十分重視,為同學們量身打造了數個實驗,讓我們把所學與所做真正的融為一體。

    最后,萬分感謝孟寧老師和李春傑老師這一學期的辛勤教學。

 

 

 


免責聲明!

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



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