信號
人們往往將信號稱為**“軟件中斷”**。進程收到信號,就意味著某一事件或異常情況的發(fā)生。
信號的類型很多,每一種分別標識不同的事件或情況。采用不同的整數(shù)來標識各種信號類型,并以SIGxxxx 形式的符號名加以定義。
內(nèi)核、其他進程(只要具有相應的權限)或進程自身均可向進程發(fā)送信號。例如,發(fā)生
下列情況之一時,內(nèi)核可向進程發(fā)送信號。
- 用戶鍵入中斷字符(通常為Control-C)。
- 進程的子進程之一已經(jīng)終止。
- 由進程設定的定時器(告警時鐘)已經(jīng)到期。
- 進程嘗試訪問無效的內(nèi)存地址。
在shell 中,可使用kill
命令向進程發(fā)送信號。在程序內(nèi)部,系統(tǒng)調(diào)用kill()可提供相同的功能。
收到信號時,進程會根據(jù)信號采取如下動作之一。
- 忽略信號。
- 被信號“殺死”。
- 先掛起,之后再被專用信號喚醒。
程序可選擇不采取默認的信號動作,而是忽略信號(當信號的默認處理行為并非忽略此信號時,會派上用場)
或者建立自己的信號處理器。信號處理器是由程序員定義的函數(shù),會在進程收到信號時自動調(diào)用,根據(jù)信號的產(chǎn)生條件執(zhí)行相應動作。
信號從產(chǎn)生直至送達進程期間,一直處于掛起狀態(tài)。通常,系統(tǒng)會在接收進程下次獲得調(diào)度時,將處于掛起狀態(tài)的信號同時送達。如果接收進程正在運行,則會立即將信號送達。
然而,程序可以將信號納入所謂**“信號屏蔽”**以求阻塞該信號。如果產(chǎn)生的信號處于“信號屏蔽”之列,那么此信號將一直保持掛起狀態(tài),直至解除對該信號的阻塞。(亦即從信號屏蔽中移除。)
線程
每個進程都可執(zhí)行多個線程??蓪⒕€程想象為共享同一虛擬內(nèi)存及一干其他屬性的進程。每個線程都會執(zhí)行相同的程序代碼,共享同一數(shù)據(jù)區(qū)域和堆??墒?,每個線程都擁有屬于自己的棧,用來裝載本地變量和函數(shù)調(diào)用鏈接信息。
線程之間可通過共享的全局變量進行通信。借助于線程 API 所提供的條件變量和互斥機制,進程所屬的線程之間得以相互通信并同步行為—尤其是在對共享變量的使用方面。此外,利用IPC 和同步機制,線程間也能彼此通信。
線程的主要優(yōu)點在于**協(xié)同線程之間的數(shù)據(jù)共享(通過全局變量)**更為容易,
而且就某些算法而論,以多線程來實現(xiàn)比之以多進程實現(xiàn)要更加自然。
再者,多線程應用能從多處理器硬件的并行處理中獲益匪淺。
進程組和shell任務控制
shell 執(zhí)行的每個程序都會在一個新進程內(nèi)發(fā)起。
比如shell篡改見了3個進程來執(zhí)行以下管道命令(在當前的工作目錄下,根據(jù)文件大小對文件進行排序并展示):
ls -l | sort -k5n | less
幾乎所有的主流shell 都提供了一種交互式特性,名為任務控制。該特性允許用戶同時執(zhí)行并操縱多條命令或管道。
在支持任務控制的shell 中,會將管道內(nèi)的所有進程置于一個新進程組或任務中。(如果情況很簡單,shell 命令行只包含一條命令,那么就會創(chuàng)建一個只包含單個進程的新進程組。)
進程組中的每個進程都具有相同的進程組標識符(以整數(shù)形式),其實就是進程組中某個進程(也稱為進程組組長process group leader)的進程ID。
內(nèi)核可對進程組中的所有成員執(zhí)行各種動作,尤其是信號的傳遞。支持任務控制的shell 會利用這一特性,以掛起或恢復執(zhí)行管道中的所有進程。
會話、控制終端和控制進程
會話指的是一組進程組(任務)。會話中的所有進程都具有相同的會話標識符。
**會話首進程(session leader)**是指創(chuàng)建會話的進程,其進程ID 會成為會話ID。
使用會話最多的是支持任務控制的shell,由shell 創(chuàng)建的所有進程組與shell 自身隸屬于同一會話,shell 是此會話的會話首進程。
通常,會話都會與某個控制終端相關。控制終端建立于會話首進程初次打開終端設備之時。對于由交互式shell 所創(chuàng)建的會話,這恰恰是用戶的登錄終端。一個終端至多只能成為一個會話的控制終端。
打開控制終端會致使會話首進程成為終端的控制進程。一旦斷開了與終端的連接(比如,關閉了終端窗口),控制進程將會收到SIGHUP 信號。
在任一時點,會話中總有一個前臺進程組(前臺任務),可以從終端中讀取輸入,向終端發(fā)送輸出。如果用戶在控制終端中輸入了“中斷”(通常是Control-C)或“掛起”字符(通常是Control-Z),那么終端驅(qū)動程序會發(fā)送信號以終止或掛起(亦即停止)前臺進程組。一個會話可以擁有任意數(shù)量的后臺進程組(后臺任務),由以“&”字符結(jié)尾的行命令來創(chuàng)建。
支持任務控制的shell 提供如下命令:列出所有任務,向任務發(fā)送信號,以及在前后臺任務之間來回切換。
偽終端
偽終端是一對相互連接的虛擬設備,也稱為主從設備。在這對設備之間,設有一條IPC(進程間通信)信道,可供數(shù)據(jù)進行雙向傳遞。
從設備(slave device)所提供的接口,其行為方式與終端相類似,基于這一特點,可以將某個為終端編寫的程序與從設備連接起來,然后,再利用連接到主設備的另一程序來驅(qū)動這一“面向終端”的程序,這是偽終端的一個關鍵用途。
由“驅(qū)動程序”所產(chǎn)生的輸出,在經(jīng)由終端驅(qū)動程序的常規(guī)輸入處理(例如,默認情況下,會把回車符映射為換行符)后,會作為輸入傳遞給與從設備相連的面向終端的程序。而由面向終端的程序向從設備寫入的任何數(shù)據(jù)又作為“驅(qū)動程序”的輸入來傳遞(在執(zhí)行完所有常規(guī)的終端輸入處理后)。換句話說,“驅(qū)動程序”所履行的功能,在效果上等同于用戶通常在傳統(tǒng)終端上所執(zhí)行的操作。
偽終端廣泛應用于各種應用領域,最知名的要數(shù)telnet 和ssh 之類提供網(wǎng)絡登錄服務的應用,以及X Window 系統(tǒng)所提供的終端窗口實現(xiàn)。
日期和時間
進程涉及兩種類型的時間:
- 真實時間:指的是在進程的生命期內(nèi)(所經(jīng)歷的時間或時鐘時間),以某個標準時間點(日歷時間)或固定時間點(通常是進程的啟動時間)為起點測量得出的時間。在UNIX 系統(tǒng)上,日歷時間是以國際協(xié)調(diào)時間(簡稱UTC)1970 年1 月1 日凌晨為起始點,按秒測量得出的時間,再進行時區(qū)調(diào)整。這一日期與UNIX 系統(tǒng)的生日很接近,也被稱為紀元(Epoch)。
- 進程時間:也稱CPU 時間,指的是進程自啟動起來,所占用的CPU 時間總量??蛇M一步將CPU 時間劃分為系統(tǒng)CPU 時間和用戶CPU 時間。前者是指在內(nèi)核模式中,執(zhí)行代碼所花費的時間(比如,執(zhí)行系統(tǒng)調(diào)用,或代表進程執(zhí)行其他的內(nèi)核服務)。后者是指在用戶模式中,執(zhí)行代碼所花費的時間(比如,執(zhí)行常規(guī)的程序代碼)。
time
命令會顯示出真實時間、系統(tǒng)CPU 時間,以及為執(zhí)行管道中的多個進程而花費的用戶CPU 時間。
客戶端/服務器架構(gòu)
客戶端/服務器應用由兩個組件進程組成。
- 客戶端:向服務器發(fā)送請求消息,請求服務器執(zhí)行某些服務。
- 服務器:分析客戶端的請求,執(zhí)行相應的動作,然后,向客戶端回發(fā)響應消息。
客戶端應用通常與用戶打交道,而服務器應用則提供對某些共享資源的訪問。一般說來,都是眾多客戶端進程與為數(shù)不多的一個或幾個服務器端進程進行通信。
客戶端和服務器使用IPC 機制來實現(xiàn)彼此通信。
將某項服務封裝于單獨的服務器應用中,原因舉例如下。
- 效率:較之于在本地的每臺計算上提供相同資源,在服務器應用管理之下提供資源的一份實例,則要節(jié)約許多。
- 控制、協(xié)調(diào)和安全:由于資源(尤其是信息資源)的統(tǒng)一存放,服務器既可以協(xié)調(diào)對資源的訪問(例如,兩個客戶端不能同時更新同一信息),還可以保護資源安全,令其只對特定客戶端開放。
- 在異構(gòu)環(huán)境中運行:在網(wǎng)絡中,客戶端和服務器應用所運行的硬件平臺和操作系統(tǒng)可以不同。
實時性
要提供實時響應,特別是在短時間內(nèi)加以響應,就需要底層操作系統(tǒng)的支持。由于實時響應的需求與多用戶分時操作系統(tǒng)的需求存在沖突,大多數(shù)操作系統(tǒng)“天生”并不提供這樣的支持。
/proc文件系統(tǒng)
/proc 文件系統(tǒng)是一種虛擬文件系統(tǒng),以文件系統(tǒng)目錄和文件形式,提供一個指向內(nèi)核數(shù)據(jù)結(jié)構(gòu)的接口。方便查看和改變各種系統(tǒng)屬性。
還能通過一組以/proc/PID
形式命名的目錄(PID 即進程ID)查看系統(tǒng)中運行各進程的相關信息。
通常,/proc 目錄下的文件內(nèi)容都采取人類可讀的文本形式,shell 腳本也能對其進行解析。程序可以打開、讀取和寫入/proc 目錄下的既定文件。文章來源:http://www.zghlxwxcb.cn/news/detail-480427.html
大多數(shù)情況下,只有特權級進程才能修改/proc 目錄下的文件內(nèi)容。文章來源地址http://www.zghlxwxcb.cn/news/detail-480427.html
總結(jié)
到了這里,關于第二章:基本概念(下)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!