Linux系統簡要

1. Linux開機啟動

  • 內核實際上是一個用來操作計算機的程序,它是計算機操作系統的內核,主要的任務是管理計算機的硬件資源,充當軟件和硬件的接口。操作系統上的任何操作都要通過內核傳達給硬件。

  • 狹義的操作系統就是指內核,廣義的操作系統包括內核以及內核之上的各種應用。

  • 內核會首先預留自己運行所需的內存空間,然后通過驅動程序(driver)檢測計算機硬件。這樣,操作系統就可以知道自己有哪些硬件可用。隨后,內核會啟動一個init進程。它是Linux系統中的1號進程(Linux系統沒有0號進程)。到此,內核就完成了在計算機啟動階段的工作,交接給init來管理。

  • 隨后,init會運行一系列的初始腳本(startup scripts),這些腳本是Linux中常見的shell scripts。這些腳本執行如下功能:
    設置計算機名稱,時區,檢測文件系統,掛載硬盤,清空臨時文件,設置網絡……
    當這些初始腳本,操作系統已經完全準備好了,只是,還沒有人可以登錄。init會給出登錄(login)對話框,或者是圖形化的登錄界面。

  • 總結:BIOS -> MBR(加載引導程序) -> 引導加載程序 -> 內核 -> init process -> login

2. Linux文件系統

  • 目錄也是一種文件,這個文件中至少包含有以下條目.和..

  • 當刪除原始文件f1后,硬連接f2不受影響,但是符號連接f1文件無效。硬連接指通過索引節點來進行連接,它們的Inode是一樣的。默認ln是硬鏈接。軟鏈接其實就是快捷方式。

  • 文件權限,umask等

3. Linux架構

linux架構.jpeg
  • 為了方便調用內核,Linux將內核的功能接口制作成系統調用(system call)。

  • Linux定義一些庫函數(library routine)來將系統調用組合成某些常用的功能。

4. Linux文件管理相關命令

  • chown 意思是change owner

  • chgrp 意思是change group

  • fork通常作為一個函數被調用。這個函數會有兩次返回,將子進程的PID返回給父進程,0返回給子進程。實際上,子進程總可以查詢自己的PPID來知道自己的父進程是誰,這樣,一對父進程和子進程就可以隨時查詢對方。

  • 盡管在UNIX中,進程與線程是有聯系但不同的兩個東西,但在Linux中,線程只是一種特殊的進程。多個線程之間可以共享內存空間和IO接口。所以,進程是Linux程序的唯一的實現方式。

  • 如果父進程早于子進程終結,子進程就會成為一個孤兒(orphand)進程。孤兒進程會被過繼給init進程,init進程也就成了該進程的父進程。init進程負責該子進程終結時調用wait函數。

5. Linux信號基礎

  • 信號所能傳遞的信息比較粗糙,只是一個整數。但正是由于傳遞的信息量少,信號也便于管理和使用。信號因此被經常地用于系統管理相關的任務,比如通知進程終結、中止或者恢復等等。

6. Linux進程關系

  • 每個進程都有父進程,而所有的進程以init進程為根

  • 每個進程都會屬于一個進程組(process group),每個進程組中可以包含多個進程。進程組會有一個進程組領導進程 (process group leader),領導進程的PID (PID見Linux進程基礎)成為進程組的ID (process group ID, PGID),以識別進程組。

  • exec 的作用,是裝載一個新的程序(可執行映像)覆蓋當前進程內存空間中的映像,從而執行不同的任務。這是對當前進程的操作。
    如果直接執行 exec 的話,當前進程就完全換掉了。所以要先 fork,然后再于子進程里執行 exec。

  • 我們將一些進程歸為進程組的一個重要原因是我們可以將信號發送給一個進程組。進程組中的所有進程都會收到該信號。

  • 會話的意義在于將多個工作囊括在一個終端,并取其中的一個工作作為前臺,來直接接收該終端的輸入輸出以及終端信號。

7. Linux從程序到進程

  • 每次執行程序時

  • Text區域用來儲存指令(instruction),說明每一步的操作。Global Data用于存放全局變量,棧(Stack)用于存放局部變量,堆(heap)用于存放動態變量 (dynamic variable. 程序利用malloc系統調用,直接從內存中為dynamic variable開辟空間)。Text和Global data在進程一開始的時候就確定了,并在整個進程中保持固定大小。

  • 棧(Stack)以幀(stack frame)為單位。當程序調用函數的時候,比如main()函數中調用inner()函數,stack會向下增長一幀。幀中存儲該函數的參數和局部變量,以及該函數的返回地址(return address)。

  • 當程序中使用malloc的時候,堆(heap)會向上增長,其增長的部分就成為malloc從內存中分配的空間。malloc開辟的空間會一直存在,直到我們用free系統調用來釋放,或者進程結束。一個經典的錯誤是內存泄漏(memory leakage), 就是指我們沒有釋放不再使用的堆空間,導致堆不斷增長,而內存可用空間不斷減少。

8. Linux多線程和同步

  • 多線程就是允許一個進程內存在多個控制權,以便讓多個函數同時處于激活狀態,從而讓多個函數的操作同時運行。即使是單CPU的計算機,也可以通過不停地在不同線程的指令間切換,從而造成多線程同時運行的效果。

  • 創建一個新的線程時,我們為這個線程建一個新的棧。每個棧對應一個線程。

  • 最常見的解決競爭條件的方法是將原先分離的兩個指令構成不可分隔的一個原子操作(atomic operation)

多線程同步

  • 互斥鎖是一個特殊的變量,它有鎖上(lock)和打開(unlock)兩個狀態。互斥鎖一般被設置成全局變量。打開的互斥鎖可以由某個線程獲得。一旦獲得,這個互斥鎖會鎖上,此后只有該線程有權打開。

  • 如果一個鎖被一個線程獲得W鎖,那么其它線程,無論是想要獲取R鎖還是W鎖,都必須等待該線程釋放W鎖。
    這樣,多個線程就可以同時讀取共享資源。而具有危險性的寫入操作則得到了互斥鎖的保護。

9. Linux進程間通信

  • PIPE(管道)

消息隊列(message queue),信號量(semaphore),共享內存(shared memory)。這些IPC的特點是允許多進程之間共享資源,這與多線程共享heap和global data相類似。

10. Linux文件系統的實現

  • Linux的分區是掛載在同一個文件系統樹上。

  • 分區的第一個部分是啟動區(Boot block),它主要是為計算機開機服務的。Linux開機啟動后,會首先載入MBR,隨后MBR從某個硬盤的啟動區加載程序。該程序負責進一步的操作系統的加載和啟動。為了方便管理,即使某個分區中沒有安裝操作系統,Linux也會在該分區預留啟動區。

  • 啟動區之后的是超級區(Super block)。它存儲有文件系統的相關信息,包括文件系統的類型,inode的數目,數據塊的數目。

  • 隨后是多個inodes,它們是實現文件存儲的關鍵。在Linux系統中,一個文件可以分成幾個數據塊存儲,就好像是分散在各地的龍珠一樣。為了順利的收集齊龍珠,我們需要一個“雷達”的指引:該文件對應的inode。每個文件對應一個inode。這個inode中包含多個指針,指向屬于該文件各個數據塊。當操作系統需要讀取文件時,只需要對應inode的"地圖",收集起分散的數據塊,就可以收獲我們的文件了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Linux系統一般有4個主要部分: 內核、shell、文件系統和應用程序。內核、shell和文件系統一起形成了基本...
    偷風箏的人_閱讀 3,270評論 1 17
  • 轉載自:http://blog.csdn.net/hguisu/article/details/6122513原作...
    miaoiao閱讀 1,542評論 0 7
  • Linux系統一般有4個主要部分:內核、shell、文件系統和應用程序。 內核、shell和文件系統一起形成了基本...
    請愛護小動物閱讀 2,617評論 0 22
  • 白鴿,教堂,玫瑰花; 禮炮,掌聲,唱詩班; 花童,鉆戒,老神父。 公主卻沒有出嫁喜悅,因為她是在昨天的晚宴上第一次...
    會飛的咖啡閱讀 830評論 7 16
  • 閑暇時光匆匆,一覺醒來便是大中午了。盡管有著微微的太陽光,可還是抵不住寒風肆虐,蜷縮在被窩里才能感受到溫暖還與我同...
    辰北閱讀 198評論 0 0