- 內核:管理和分配計算機資源(即CPU、RAM和設備)的核心軟件層
- Linux內核可執行文件采用/boot/vmlinuz或類似的路徑名,“z”表明內核是經過壓縮的可執行文件。
- 內核主要任務:
? ? (1)進程調度:Linux屬于搶占式多任務系統,多個進程(即運行中的程序)可同時駐留于內存,都能獲得對CPU的使用權
? ? (2)內存管理:以高效、公平地方式在進程之間共享這一資源,Linux采用了虛擬內存管理機制。
?? ? ? ? ? ? ? ? ? ? ? ? ? 虛擬內存管理機制優勢:
?? ? ? ? ? ? ? ? ? ? ? ? ? a. 進程與進程之間、進程與內核之間彼此隔離;一個進程無法讀取或修改內核或掐他進程的內存內容
?? ? ? ? ? ? ? ? ? ? ? ? ? b. 只需將進程的一部分保持在內存中,降低了每個進程對內存的需求量,使得可以在內存中加載更多的進程。
? ? (3)提供了文件系統:內核在磁盤上提供有文件系統,允許對文件執行創建、獲取、更新、刪除等操作
? ? (4)創建和終止進程:內核可以將新進程載入內存,為其提供運行所需的資源(CPU、RAM以及對文件的訪問)。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 一旦進程執行完畢,內核需要確保釋放其占用的資源,以供或許進程使用
? ? (5)對設備的訪問:計算機外接設備(鼠標、鍵盤、磁盤等),可實現計算機與外部世界的通信。
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 內核為進程提供了訪問設備的標準接口,同時還仲裁多個進程對同一個設備的訪問。
? ? (6)聯網:內核以用戶進程的名義收發網絡消息(數據包),同時將該數據包路由至目標系統。
? ? (7)提供系統調用API:進程可以利用系統調用API,請求內核去執行各種任務。
- 用戶態和核心態
? ? ? (1)CPU一般在這兩種不同狀態下運行,執行硬件指令可使CPU在兩種狀態來回切換
? ? ? (2)虛擬內存區域劃分為:用戶空間部分、內核空間部分
? ? ? (3)用戶態下運行時,CPU只能訪問被標記為用戶空間的內存,試圖訪問內核空間的內存,將會引發硬件錯誤
? ? ? (4)核心態下運行時,CPU既能訪問用戶空間的內存,又能訪問內核空間的內存。
? ? ? (5)CPU在核心態下運行時,可以執行特殊操作。如宕機(halt)、訪問內存管理硬件、設備I/O操作的初始化
- 交換區:磁盤空間中的保留區域,作為RAM的補充---進程可被保存至交換區
- 內核維護的底層數據結構,可將進程使用的文件名稱轉換為磁盤的物理位置
- 內核維護每個進程的虛擬內存與計算機物理內存及磁盤交換區之間的映射關系。
- 某進程可創建另一個進程---真正含義:某進程可以請求內核創建另一個進程。(因進程間所有通信都需要內核提供的通信機制完成)
- shell(命令解釋器):用于讀取用戶輸入的命令,并執行相應的程序以響應命令。
? ? (1)登陸shell:用戶剛登陸系統時,由系統創建,用以運行shell的進程。
? ? (2)對于UNIX系統而言,shell只是一個用戶進程。
? ? (3)登陸同一臺計算機的不同用戶同時可以使用不同的shell(就單個用戶來說,情況也一樣)
? ? (4)shell設計兩個目的:a. 人機交互; b. 解釋shell腳本(包含shell命令的文本文件)
? ? (5)shell內置有許多通常與編程語言相關的功能:包括變量、循環、條件語句、I/O命令、函數等
? ? (6)幾種重要的shell:
? ? ? ? ? ? a. Bourne shell(sh):歷史最為悠久,曾是UNIX第七版標配的shell,包含許多常見特性:I/O重定向、管道、文件名生成(通配符)、
?? ? ? ? ? ? ? 變量、環境變量處理、命令替換、后臺命令執行、函數等。
? ? ? ? ? ? b. C shell(csh):曾經時BSD系統的標配,但與Bourne shell并不兼容,為了保證在UNIX系統的移植性,人們更傾向使用Bourne shell。
? ? ? ? ? ? c. Korn shell(ksh):AT&T貝爾實驗室編寫,是Bourne shell的繼任者,同時吸收了C shell的很多交互特性
? ? ? ? ? ? d. Bourne again shell(bash):GNU項目對于Bourne shell的重新實現,同時提供了與Korn shell和C shell類似的交互特性。
?? ? ? ? ? ? ? 在Linux上Bourne shell正是由Bourne again shell仿真提供的
- 超級用戶:用戶ID為0,通常登錄名為root
- 用戶密碼文件/etc/passwd:包含用戶名、用戶ID(UID)、組ID、主目錄、登陸shell
- 用戶組文件/etc/group:組名、組ID(GID)、用戶列表(隸屬于該組的用戶登錄名列表)
- 為了訪問文件,用戶分為3類:文件(屬主)的用戶;文件用戶同一組的用戶;其他用戶
- 由Shell啟動的進程會繼承3個已打開的文件描述符:描述符0為標準輸入;描述符1為標準輸出;描述符2為標準錯誤。
- 在stdio函數庫中,這幾種描述符分別與文件流stdin,stdout,stderr相對應
- C語言標準庫的I/O函數(stdio函數庫):fopen,fclose,scanf,printf,fgets,fputs ? ? stdio函數位于I/O系統調用層(open,close,read,write 等)之上。
- 過濾器:從stdin讀取輸入,加以轉換,再將轉換后的數據輸出到stdout,常將擁有上述行為的程序稱為過濾器,如cat、grep、tr、sort、wc、sed、awk
- 邏輯上將一個進程劃分為以下幾個部分(也稱為段)
? ? (1)文本:程序的指令
? ? (2)數據:程序使用的靜態變量
? ? (3)堆:程序可以從該區域動態分配額外內存
? ? (4)棧:隨函數調用、返回而增減的一片內存,用于為局部變量和函數調用鏈接信息分配存儲空間。
19.子進程從父進程處繼承數據段、棧段、堆段的副本后,可以修改這些內容,不影響父進程的“原版”內容。
- 有兩種方式可以終止一個進程:其一,進程使用_exit()系統調用(或相關的exit()庫函數),請求退出;其二,向進程傳遞信號,將其“殺死”。
- 進程的“終止狀態”,一個非負小整數,可供父進程的wait()系統調用檢測。
- 終止狀態為0表示進程“功成身退”,非0表示有錯誤發生。
- 大多數shell會將前一執行程序的終止狀態保存于shell變量$?中。
- init進程:系統引導時,內核創建,是“所有進程之父”,該進程相應的程序文件為“/sbin/init”,init的進程號為1,總以超級用戶權限運行。誰(哪怕是超級用戶)都不能“殺死”init進程,只有關閉系統才能終止該進程。init的主要任務是創建并監控系統運行所需的一系列進程。
- 進程間通信(IPC)機制:
? ? (1)信號(signal),用來表示事件的發生
? ? (2)管道(亦即shell用戶所熟悉的“|”操作符)和FIFO,用于在進程間傳遞數據
? ? (3)套接字,供同一臺主機或是聯網的不同主機上所運行的進程之間傳遞數據。
? ? (4)文件鎖定,為防止其他進程讀取或更新文件內容,允許某進程對文件的部分區域加以鎖定
? ? (5)消息隊列:用于在進程間交換消息
? ? (6)信號量(semaphore):用來同步進程動作
? ? (7)共享內存:允許兩個及兩個以上進程共享一塊內存。當某進程改變了共享內存的內容時,其他所有進程會立即了解到這一變化。
26.內核、其他進程(只要有相應的權限)或進程自身均可向進程發送信號。
- 發生下列情況之一時,內核可以向進程發送信號:
? ? (1)用戶鍵入中斷字符(通常為Ctrl+C)
? ? (2)進程的子進程之一已經終止
? ? (3)由進程設定的定時器(告警時鐘)已經到期。
? ? (4)進程嘗試訪問無效的內存地址。
28.在shell中,可使用kill命令向進程發送信號;在程序內部,系統調用kill()可提供相同的功能。
- 收到信號時,進程會根據信號采取如下動作之一:忽略信號;? ? ? 被信號“”殺死; ? ? 先掛起,之后再被專用信號喚醒。
- 多個線程之間,共享同一數據區域和堆,每個線程擁有屬于自己的棧。線程之間可以通過共享的全局變量進行通信。
- shell執行的每個程序都會在一個新進程內發起。比如,shell創建了3個進程來執行以下管道命令(在當前的工作目錄下,根據文件大小對文件進行排序并顯示):ls -l | sort -k5n | less
- 偽終端:是一對相互連接的虛擬設備,也稱為主從設備。在這對設備之間,設有一條IPC信道,可供數據進行雙向傳遞。telnet和ssh都屬于偽終端。