【Linux系统编程】| 【01】系统编程基本概念
生活随笔
收集整理的這篇文章主要介紹了
【Linux系统编程】| 【01】系统编程基本概念
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1、內核
- 1.1 內核的職責
- 2、shell
- 3、用戶和組
- 3.1 用戶
- 3.1 組
- 3.2 超級用戶
- 4、單根目錄層級、目錄、鏈接及文件
- 4.1 文件類型
- 5、文件I/O模型
- 5.1 文件描述符
- 6、程序
- 7、進程
- 8、內存映射
- 9、靜態庫和共享庫
- 10、進程間通信及同步
- 11、信號
- 12、線程
- 13、會話、控制終端和控制進程
- 14、偽終端
- 15、/proc文件系統
1、內核
1.1 內核的職責
【進程調度】:計算機內均配備有一個或多個CPU,以執行程序指令;Linux屬于搶占式多任務系統,“多任務”即多個進程可同時駐留于內存,且每個進程都能獲得對CPU的使用權,“搶占”則控制著哪些進程獲得對CPU的使用,以及每個進程能使用多長時間,這兩者都由內核進程調度程序決定; 【內存管理】:由于物理內存(RAM)仍然屬于有限資源,內核必須以公平、高效地在進程間共享這一資源;Linux也采用了虛擬內存管理機制,該技術主要具有以下兩方面的優勢:- 進程與進程之間、進程與內核之間彼此隔離,因此一個進程無法讀取或修改內核或其他進程的內存內容;- 只需將進程的一部分保持在內存中,這降低了每個進程對內存的需求量,而且還能在RAM中同時加載更多的進程。大幅提升事件的發生概率,在任一時刻,CPU都有至少一個進程可以執行,從而使得對CPU資源的利用更加充分; 【文件系統】:允許對文件執行創建、獲取、更新以及刪除等操作; 【創建和終止進程】:內核可將新程序載入內存,為其提供運行時資源,執行完畢,內核還要確保釋放其占用資源,以供后續程序重新使用; 【對設備的訪問】:計算機外接設備(鼠標、鍵盤、磁盤和磁帶驅動器等)可實現計算機與外部世界的通信; 【API】:進程可利用內核入口點(系統調用)請求內核去執行各種任務;內核態和用戶態
參考:【操作系統】| 【01】操作系統簡介(運行機制、體系結構、中斷、系統調用)
2、shell
即命令解釋器,主要里讀取用戶輸入的命令,并執行相應的程序以響應命令;3、用戶和組
系統會對每個用戶的身份作唯一標識;3.1 用戶
系統密碼文件/etc/passwd,中記錄系統每個用戶的用戶名和用戶ID、組ID、主目錄、登錄shell;3.1 組
出于管理目的,尤其是為了控制對文件和其他資源的訪問,將多個用戶分組; 每個用戶組對應系統文件中的/etc/group中的一行記錄:- 組名;- 組ID;- 用戶列表;3.2 超級用戶
用戶ID為0,登錄名為root,享有特權;4、單根目錄層級、目錄、鏈接及文件
4.1 文件類型
普通文件[-]、目錄文件[d]、字符設備[c]、塊設備[b]、管道[p]、套接字[s]、符號鏈接[l];符號鏈接
經過特殊標記的文件,一個符號鏈接對應(引用)著目錄中內容為文件名+指針的記錄; - 只要系統調用用到路徑名,內核就會自動接觸該路徑名中符號鏈接的引用(以符號鏈接指向的文件名來替換); - 若指向的文件不存在,則為空鏈接;文件名
最長長度為255個字符,不能包含/和\0;- 建議使用[-._a-zA-Z0-9]內的字符集;- 應避免使用-為文件名開頭,容易在shell中被當作參數;路徑
【絕對路徑】:以/開始的路徑; 【相對路徑】:相對于當前工作目錄的文件路徑;文件所有權和權限
每個文件都有一個與之相關的用戶ID和組ID,分別定義文件的屬主和屬組,還要其他用戶;5、文件I/O模型
采用open、read、write、close這些系統調用程序能夠處理任何類型的文件;5.1 文件描述符
用來指代打開的文件,常用open來獲取文件描述符; - 通過shell啟動進程會繼承3個已打開的文件描述符:0(stdin) - 標準輸入,1(stdout)標準輸出,2(stderr)標準錯誤;6、程序
經過編譯和鏈接處理,將源碼轉化為語義相同的二進制機器碼; int main(int argc, char *argv[]):argc為命令行參數總個數,argv為指針數組記錄命令行參數;7、進程
進程即正在執行程序的程序實例:- 內核必須在他們之間共享各種計算機資源;- 內核會將程序代碼載入虛擬內存;- 為程序變量分配空間,建立數據結構以至于記錄與進程有關的各種信息;進程的內存布局
文本:程序的指令; 數據:程序使用的靜態變量; 堆:程序可從該區域動態分配額外內存; 棧:隨函數調用、返回而增減的一片內存,用于為局部變量和函數調用鏈接信息分配存儲空間;創建進程和執行程序
可使用fork創建一個新進程,父進程調用fork,fork創建的為子進程(復制) ;- 子進程從父進程繼承數據段、棧段以及堆段的副本后,可修改,不會影響父進程的內容;- 子進程一般去執行父進程代碼段中的另一組函數,或者使用execve去加載新程序;- execve會銷毀現有的文本段,數據段、棧段、堆段;進程ID和父進程ID
進程標識符PID,父進程標識符PPID;進程終止和終止狀態
- 使用_exit()請求退出; - 向進程傳遞信號,將其殺死;進程的用戶和組標識符
真實用戶ID和組ID:用來標識進程所述的用戶和組; 有效用戶ID和組ID:進程訪問受保護資源時,會使用這兩個ID來確定訪問權限; 補充組ID:用來標識進程所屬的額外組;init進程
系統引導時,內核會創建一個名為init的特殊進程(/sbin/init);- 進程號總為1,以超級用戶權限運行;- 只有關閉系統才能終止該進程;- init主要是創建并監控系統運行所需的一系列進程;8、內存映射
會在虛擬地址空間中創建一個新的內存映射; - 【文件映射】:將文件部分區域映射入調用進程的虛擬內存;完成后,對文件映射內容的訪問轉化為相應內存區域的字節操作; - 【匿名映射】:其頁面內容會被初始化為0;【映射共享】: - 兩個進程都針對某一文件的相同部分加以映射; - 由fork創建的子進程處繼承映射;當兩個或多個進程頁面相同時,進程之一對頁面內容的改動是否為其他進程所見呢
若傳入標志為私有,則某進程對映射內容的修改對于其他進程是不可見的,而且改動不會落實到文件; 若傳入標志為共享,修改則其他進程可見;9、靜態庫和共享庫
靜態庫
對已編譯目標模塊的一種結構化整合;- 使用該庫中的函數,需要在創建程序的鏈接命令中指定相應的庫;- 鏈接器解析后,會從庫中抽取所需的目標模塊副本,拷貝到可執行文件中,即靜態鏈接;- 使用該庫程序中都會帶有一份副本,會造成空間浪費;- 若對庫函數進行修改,則需要重新加以編譯生成新的靜態庫;共享庫
為了解決靜態庫存在的問題,不會及那個目標模塊拷貝到可執行程序中;- 會在可執行文件中寫入一條記錄,表明可執行文件在運行時需要使用該共享庫;- 一旦運行時將可執行文件載入內存;- 共享庫代碼在內存中只需保留一份,且供所有運行中的程序使用;10、進程間通信及同步
【進程間通信機制】: - 信號:用來表示事件的發生; - 管道:和FIFO,用于在進程間傳遞數據; - 套接字:供同一臺主機或是聯網的不同主機上所運行的進程之間傳遞數據; - 文件鎖定:為防止其他進程讀取或更新文件內容,允許某進程對文件的部分區域加以鎖定; - 消息隊列:用于在進程間交拖消息(數據包); - 信號量:用來同步進程動作; - 共享內存:允許兩個及兩個以上進程共享一塊內存;11、信號
信號采用不同的整數來標識各種信號類型,信號從產生直至送達進程期間,一直處于掛起狀態;- 【內核可向進程發送信號】: - 用戶鍵入中斷字符; - 進程的子進程之一已終止; - 由進程設定的定時器已到期; - 進程嘗試訪問無效的內存地址;【進程會根據信號采取的動作】: - 忽略信號; - 被信號殺死; - 先掛起,在被專用信號喚醒;12、線程
在現代UNIX 實現中,每個進程都可執行多個線程,每個線程都會執行相同的程序代碼,共享同一數據區域和堆,但每個線程都擁有屬于自己的棧,用來裝載本地變量和函數調用鏈接信息;- 線程之間可通過共享的全局變量進行通信,借助于線程API所提供的條件變量和互斥機制;- 線程的主要優點在于協同線程之間的數據共享(通過全局變量)更為容易;13、會話、控制終端和控制進程
會話指一組進程組,中所有進程都具有相同的會話標識符;- 首進程即創建會話進程;- 進程ID即會話ID;- 會話會與某個控制終端相關;控制終端建立于會話首進程初次打開終端設備之時;- 一個會話可以擁有任意數量的后臺進程組,由以&結尾的行命令來創建;14、偽終端
一對相互連接的虛擬設備 —— 主從設備;- 設備間設有IPC信道,可供數據進行雙向傳遞;15、/proc文件系統
該文件系統為一種虛擬文件系統,由一組目錄和文件組成,提供一個指向內核數據結構的接口;- 為查看和改變各種系統屬性提供便利;總結
以上是生活随笔為你收集整理的【Linux系统编程】| 【01】系统编程基本概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 点云赋值 PointCloudT::Pt
- 下一篇: Linux命令之ifconfig