版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、信號(hào)量,中斷和時(shí)間.doc - - 52 第 6 章 信號(hào)量,中斷和時(shí)間 信號(hào)量,中斷和時(shí)間 信號(hào)量(Signal)是進(jìn)程間通訊(IPC)的一種形式——是一個(gè)進(jìn)程給另一個(gè)進(jìn)程發(fā)送信息的方法。 但是信息不可能很多——一個(gè)信號(hào)量不可能攜帶詳細(xì)的信息, 即使是傳送者的身份也不能被傳遞; 唯一能夠確定的事實(shí)是信號(hào)量的確被發(fā)送了。 (然而和經(jīng)典信號(hào)量不同,POSIX 實(shí)時(shí)信號(hào)量允許傳送稍微多一點(diǎn)的信息。 )實(shí)際上,信號(hào)量對(duì)于雙向通
2、訊是沒有用處的。還有,根據(jù)某些限定,信號(hào)量的接受者不必以任何方式作出響應(yīng),甚至可以直接忽略大部分信號(hào)量。 雖然有這么多的限制,然而信號(hào)量仍然是一種功能強(qiáng)大的十分有用的機(jī)制——勿庸置疑,這是 Unix IPC 中使用最頻繁的機(jī)制。每當(dāng)進(jìn)程退出或者廢棄一個(gè)空指針時(shí),每當(dāng)使用Ctrl+C 鍵終止程序運(yùn)行時(shí),都要傳遞信號(hào)量。 第 9 章會(huì)更詳細(xì)的討論 IPC 機(jī)制。對(duì)于本章的討論來說,信號(hào)量的內(nèi)容就足夠討論了。正如在 Linux 內(nèi)核本身的代碼
3、注釋中所說明的一樣,中斷(Interrupt)對(duì)于內(nèi)核來說和信號(hào)量是類似的。 中斷一般都是從磁盤之類的硬件設(shè)備送往內(nèi)核, 用以提示內(nèi)核該設(shè)備需要加以注意。一個(gè)重要的硬件中斷源就是定時(shí)器設(shè)備,它周期性地通知內(nèi)核已經(jīng)通過的時(shí)間。如同第 5 章中闡述的一樣,中斷也可以由用戶進(jìn)程通過軟件產(chǎn)生。 在本章中,我們首先討論一下 Linux 中信號(hào)量和中斷的實(shí)現(xiàn),最后再瀏覽一下 Linux 的時(shí)間處理方式。 雖然內(nèi)核對(duì)代碼的要求標(biāo)準(zhǔn)非常嚴(yán)格, 本章所涉
4、及的代碼仍然特別清晰明白。 本章使用的一般方法是首先介紹相關(guān)的數(shù)據(jù)結(jié)構(gòu)和它們之間的關(guān)系, 接下來討論操縱和查詢它們的函數(shù)。 鎖的概述 鎖的概述 鎖的基本思想是限制對(duì)共享資源的訪問——共享資源包括共享的文件,共享的內(nèi)存片,以及在一次只能由一個(gè) CPU 執(zhí)行的代碼段。概括的說,在單處理器上運(yùn)行的 Linux 內(nèi)核并不需要鎖,這是因?yàn)樵诰帉?Linux 內(nèi)核時(shí)就已經(jīng)注意到要盡量避免各種可能需要鎖的情況了。但是,在多處理器機(jī)器上,一個(gè)處理器有時(shí)
5、需要防止其它處理器對(duì)它的有害的介入。 include/asm-i386/spinlock.h 文件(從 12582 行開始)并不使用難看的#ifdef 把所有對(duì)鎖函數(shù)的調(diào)用封裝起來,它包含一系列對(duì)單處理器平臺(tái)(UP)基本為空的宏,然而在多處理器平臺(tái)(SMP)上這些宏將展開成為實(shí)際代碼。因而內(nèi)核的其它代碼對(duì) UP 和 SMP(當(dāng)涉及到這種特性時(shí))都是相同的,但是它們兩個(gè)的效果卻是迥然不同的。 第 10 章中涉及 SMP 的部分會(huì)對(duì)鎖做深入
6、的介紹。 但是, 由于你在代碼中將到處都能夠看到對(duì)鎖宏的調(diào)用, 特別是在本章所討論到的代碼中這一點(diǎn)尤為明顯, 所以你應(yīng)該首先對(duì)宏的用途有初步了解——以及為什么現(xiàn)在在大多數(shù)情況下我們都可以安全地將其忽略 (我們將在討論的過程中對(duì)其中的異常情況進(jìn)行說明) 。 信號(hào)量 信號(hào)量 Linux 內(nèi)核將信號(hào)量分為兩類: ? 非實(shí)時(shí)的 (Nonrealtime) ——大部分是些傳統(tǒng)的信號(hào)量, 例如 SIGSEGV, SIGHUP信號(hào)量,中斷和時(shí)間.d
7、oc - - 54 12167:sa_flags 進(jìn)一步調(diào)整信號(hào)量處理代碼所完成的工作。可能的標(biāo)志集合從 12108 行開始定義。這些標(biāo)志允許用戶代碼在信號(hào)量實(shí)例發(fā)送以后(或者保留用戶定制的操作時(shí))請(qǐng)求恢復(fù)缺省操作,等等。這一點(diǎn)在宏定義塊前面的標(biāo)簽注釋中已經(jīng)說明了。 12168:sa_restorer 是本書中所沒有涉及的一些信號(hào)量處理代碼細(xì)節(jié)所使用的。 12169:sa_mask 是一系列其它信號(hào)量的集合,進(jìn)程在處理這
8、些信號(hào)量的過程中可能需要進(jìn)行鎖定。例如,如果一個(gè)進(jìn)程在處理 SIGCHLD 的時(shí)候希望鎖定 SIGHUP 和SIGINT,進(jìn)程的第 SIGCHLD 個(gè) sa_mask 就會(huì)對(duì)與 SIGHUP 和 SIGINT 相關(guān)的位進(jìn)行置位。 siginfo_t 11851:struct siginfo(也稱為 siginfo_t)是伴隨著信號(hào)量,特別是在實(shí)時(shí)信號(hào)量,所傳遞的額外信息。 11852:勿庸置疑,si_signo 是信號(hào)量的數(shù)目。 118
9、53:si_errno 應(yīng)該是信號(hào)量傳遞時(shí)傳送者的 errno 的值,這樣接收者就可以對(duì)它進(jìn)行檢測。內(nèi)核本身并不關(guān)心這個(gè)值;當(dāng)在某些情況下需要設(shè)置這個(gè)值時(shí),內(nèi)核將其設(shè)置為 0。我推測如果這樣,即使調(diào)用者沒有設(shè)置這個(gè)值,它們?nèi)匀粫?huì)發(fā)現(xiàn) si_error 的值被設(shè)為已知狀態(tài)。 11854:si_code 記錄了信號(hào)量的來源(不是發(fā)送者的進(jìn)程 ID 號(hào),也就是 PID——它在別處記錄) 。有效的信號(hào)量來源在 11915 行及其隨后部分使用宏進(jìn)
10、行了定義。 11856:該結(jié)構(gòu)的最后一部分是 union 類型的;該 union 類型依賴于 si_code 的值。 11857:union 的第一部分是_pad,它將 siginfo_t 的長度擴(kuò)展填充為 128*sizeof(int)字節(jié)(在 x86 平臺(tái)上一共是 512 個(gè)字節(jié)) 。留意一下這個(gè)數(shù)組的大小,也就是SI_PAD_SIZE (11849 行) , 代表了該結(jié)構(gòu)的前三個(gè)成員——如果增加了更多的成員,SI_PAD_SIZE
11、 就需要進(jìn)行相應(yīng)修改。 struct signal_queue 17132:struct signal_queue 結(jié)構(gòu)用來確保所有的實(shí)時(shí)信號(hào)量都被正確傳送了,如果可能,每一個(gè)都包含著額外信息(siginfo_t) 。如同后面你將會(huì)看到的一樣,內(nèi)核會(huì)為每個(gè)進(jìn)程都設(shè)置一個(gè)隊(duì)列,用來存放該進(jìn)程的掛起的實(shí)時(shí)信號(hào)量。這個(gè)隊(duì)列類型本身很小,僅僅由一個(gè)指向下一個(gè)節(jié)點(diǎn)的指針和 siginfo_t 本身組成。 應(yīng)用函數(shù) 應(yīng)用函數(shù) 有關(guān)信號(hào)量的一個(gè)最重要
12、的數(shù)據(jù)結(jié)構(gòu)是 sigset_t,它是由一系列在 include/linux/signal.h文件中定義的簡單函數(shù)所操縱的, 這些函數(shù)的定義從 17123 行開始。 在 x86 平臺(tái)上, 這些相同的函數(shù)可以——而且已經(jīng)——使用匯編語言更加有效的實(shí)現(xiàn)了;這些更高效的版本從12204 行開始。 (m68k 端口是唯一一個(gè)例外的端口,它使用體系結(jié)構(gòu)特有的代碼實(shí)現(xiàn)。 )由于平臺(tái)無關(guān)的版本和 x86 特有的版本都很重要,我們會(huì)對(duì)兩者都加以介紹。 平
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 信號(hào)量的實(shí)現(xiàn)和應(yīng)用
- 信號(hào)量實(shí)驗(yàn)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)---信號(hào)量的操作
- 基于信號(hào)量特征的模擬電路故障字典法研究.pdf
- 操作系統(tǒng)課程設(shè)計(jì)--基于linux的實(shí)現(xiàn)進(jìn)程的信號(hào)量互斥申請(qǐng)
- 基于linux的實(shí)現(xiàn)進(jìn)程的信號(hào)量互斥申請(qǐng)操作系統(tǒng)課程設(shè)計(jì)
- 基于linux的實(shí)現(xiàn)進(jìn)程的信號(hào)量互斥申請(qǐng)操作系統(tǒng)課程設(shè)計(jì)1
- 離散時(shí)間信號(hào)和離散時(shí)間系統(tǒng)..
- 實(shí)時(shí)嵌入式操作系統(tǒng)中信號(hào)量管理的硬件化設(shè)計(jì)與實(shí)現(xiàn).pdf
- 第八章中斷和信號(hào)機(jī)制
- 基于信號(hào)量化的系統(tǒng)參數(shù)辨識(shí)方法研究.pdf
- 基于linux的實(shí)現(xiàn)進(jìn)程的信號(hào)量互斥申請(qǐng)操作系統(tǒng)課程設(shè)計(jì)說明書2
- 基于信號(hào)量化和Delta算子模型的系統(tǒng)分析與優(yōu)化.pdf
- bios和dos中斷
- 《操作系統(tǒng)》課程設(shè)計(jì)--基于信號(hào)量與pv操作同步機(jī)制的讀者寫者問題的設(shè)計(jì)與實(shí)現(xiàn)
- dos和bios中斷
- 利用信號(hào)量,pv,管程等解決生產(chǎn)者消費(fèi)者問題——操作系統(tǒng)原理課程設(shè)計(jì)提優(yōu)論文
- 輪速信號(hào)中斷處理流程圖.DWG
- bios和dos中斷84543
- 輪速信號(hào)中斷處理流程圖.DWG
評(píng)論
0/150
提交評(píng)論