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