寫在前面的話
紅燭啊!
你流一滴淚,灰一分心。
灰心流淚你的果,
創造光明你的因。
紅燭啊!
「莫問收穫,但問耕耘。」
第2章 基本概念
本章講了很多基本概念,有的概念會貫穿全書,有的概念作者只簡單提了一下,後面的章節會有深入講解。對於這些概念,博主不一一介紹,而是將其中有聯絡的概念放到一起說。
一、linux系統的組成
1.linux核心
功能:程序排程:linux屬於搶占式多工作業系統。計算機只有乙個cpu(我知道有多核的,咱們這只講單核的,用大白話好理解),既然多工,那只能乙個乙個來獲得cpu的使用權,那誰先誰後呢?這就需要制定規則,這個規則就是「搶占」(有的書中叫做「迴圈時間共享(sched_rr)」)。
記憶體管理:虛擬記憶體管理機制。
提供檔案系統
建立和終止程序:要建立程序,核心給這個程序提供資源,程序結束,核心會釋放資源。
訪問裝置
網路管理
提供系統呼叫api:看這句話「程序可利用核心入口點(也稱系統呼叫)請求核心去執行各 種任務。」這句話裡有三個物件:程序、系統呼叫、核心,我們可以這麼理解,使用者程序(有系統自己啟動的程序,也有使用者**啟動的程序,我們這裡就說使用者好理解些)通過系統呼叫,訪問核心,來執行各種操作。我們可以想象三個層,使用者層、系統呼叫層、核心層,也就是說,使用者只能通過各種系統 呼叫介面請求核心來使用硬體。本書主題就是介紹各種系統呼叫介面。
2.shell
讀取使用者輸入的命令,並執行相應的程式以響應命令。所以叫做命令直譯器。
shell命令:使用者向系統核心發出的控制請求。
shell指令碼:shell命令的有序集合。
幾種重要的shell版本:主要記住sh和bash,學linux系統系統一定會用到其中的乙個。
3.檔案系統
檔案系統是指作業系統中與檔案管理有關的軟體和資料。比較兩個概念就清楚了,windows檔案系統是以驅動器的碟符為基礎的,也就是常說的硬碟分割槽;linux檔案系統是乙個檔案樹,且它的所有檔案和外部裝置都是以檔案的形式掛載在這個檔案樹上。這就提到了檔案系統的目錄結構,也就是書中2.4節所講的。
4.應用程式
經過編譯之後的可執行程式。
二、使用者和組
linux系統中可以建立多個使用者。每個使用者包含5個屬性:使用者名稱、使用者id(uid)、組id、主目錄、登入shell。
使用者組是具有相同特徵的使用者的集合體,通過使用者組可以讓多個使用者具有相同的許可權。
使用者和使用者組的對應關係:
一對一:某個使用者是某個組的唯一成員;
多對一:多個使用者是某乙個組的成員,不歸屬其他組;
一對多:某個使用者是多個組的成員;
多對多:多個使用者對應多個組。
三、i/o程序
1.檔案i/o和標準i/o
檔案i/o的操作核心是檔案描述符。
標準i/o(stdio函式庫),本書不會介紹這方面內容。
2.程式和程序
1)區別:程式是靜態的,它是一些儲存在磁碟上的指令的有序集合,沒有任何執行的概念;
程序是動態概念,它是程式執行的過程,包括建立、排程、消亡。
2)程序的記憶體布局:
文字段:程式文字
資料段:全域性變數、常數
堆區:程序從該區域額外申請的空間
棧區:存放區域性變數、函式呼叫鏈結資訊,隨函式呼叫、返回而增減的一片記憶體
3)程序建立
程序在建立的時候,核心為其分配虛擬記憶體空間(4g,其中3g屬於使用者空間,剩下的1g屬於核心空間)為程式變數分配空間,建立核心記賬資料結構(task struct),描述程序屬性(程序的使用者,程序的id,程序所屬組id,程序的狀態)。
程序可以使用fork()來建立乙個新程序。子程序從父程序繼承資料段、棧區、堆區的副本後,可以修改,而文字段由父、子程序共享。
程序id為pid,父程序id為ppid。
3.記憶體對映
建立程序時,核心為其分配虛擬記憶體空間是通過對映物理記憶體得來的。
將虛擬位址空間分割成等大小的「頁」單元(4k),將物理記憶體也分割成與虛擬位址空間相同的「頁」單元。系統為每乙個程序維護一張頁對映表,mmu(記憶體管理單元,前面講的linux核心功能之一)根據頁對映表完成位址的轉換以及保護。
頁對映表:頁對映表由頁表條目組成,每乙個頁表條目記錄虛擬位址空間中的頁單元的對應關係。
4.靜態庫和共享庫
靜態庫在程式編譯時會被鏈結到目標**中,而程式執行時將不再需要該靜態庫,因此體積較大。
共享庫在程式編譯時不會被鏈結到目標**中,而是在程式執行時才被載入,在程式執行時還需共享庫存在,因此**體積較小。
5.程序間通訊(ipc)
在本書第1章中已經回顧了程序間通訊的發展歷史,但是感覺有點亂,這裡再梳理一下:at&t公司把傳統的程序間通訊方式改進了一下,形成system v ipc;bsd跳出這個限制,單獨整了個套接字通訊機制;posix標準在擴充套件中又包含了自己的通訊機制。而linux中使用最多的程序間通訊方式主要有以下幾種:
傳統的程序間通訊方式:無名管道(pipe)、有名管道(fifo)、訊號(signal)
system v ipc:共享記憶體(share memory)、訊息佇列(message queue)、訊號燈(semaphore)
bsd:套接字(socket)
6.訊號
訊號可以直接進行使用者空間程序和核心程序之間的互動,核心程序也可以利用它來通知使用者空間程序發生了哪些系統事件。
訊號是在軟體層次上對中斷機制的一種模擬,是一種非同步通訊方式。
使用者程序對訊號的響應方式:
1)忽略訊號:對訊號不做任何操作,但是有兩個訊號不能忽略:sigkill及sigstop
2)捕捉訊號:定義訊號處理函式,當訊號發生時,執行響應的處理函式
3)執行預設操作:linux對每種訊號都規定了預設操作
7.執行緒
乙個程序可以建立多個執行緒,執行緒與執行緒之間共享程序的資料段,文字段,堆區,每乙個執行緒有屬於自己的棧區,儲存自己的區域性變數,控制函式的呼叫和返回。
執行緒之間可以通過共享的全域性變數進行通訊。
四、其他
關於其他概念,請讀者自行理解。
其實本章就像是一本教材的緒論,博主閱讀本章時經常翻看全書目錄,為了能夠使自己全書結構有個大概的認識。本章中涉及了很多概念,博主大致進行了分組,目的是為了使本章更加有條理,大部分概念在本書的後續章節中都會展開來講,在本章中博主也仍有很多地方不理解,在後續章節中再進行深入**。
讀書筆記之linux unix系統程式設計手冊 43
程序間通訊介紹 1.unix系統上各種通訊和同步工具,並根據功能將他們分成了三類 1 通訊 這些工具關注程序之間的資料交換 2 同步 這些程序關注程序和執行緒操作之間的同步 3 訊號 儘管訊號的主要作用並不在此,但在特定場景下可以將它作為一種同步技術 2.資料傳輸工具 為了通訊,乙個程序將資料寫入i...
《Linux UNIX系統程式設計手冊》第1章讀書筆記
寫在前面的話 一切偉大的行動和思想都有乙個眇乎小哉的開始。第1章 歷史和標準 看第1章題目就可以知道本章要講的是歷史和標準。我們會問,歷史是講誰的歷史?1.unix和c語言的歷史 這段歷史已經聽過很多了,要注意它是at t公司整出來的,其中c語言完全是為了實現unix核心及相關軟體而開發的。注意其中...
《Linux UNIX系統程式設計手冊》第3章讀書筆記
寫在前面的話 i was so much order then,i m younger than that now.昔日我曾如此蒼老,如今才是風華正茂。bob dylan my back pages 第3章 系統程式設計概念 本章主要講系統呼叫和庫函式的概念,以及對執行系統呼叫和庫函式之後的狀態進行...