2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、信號量,中斷和時間.doc - - 52 第 6 章 信號量,中斷和時間 信號量,中斷和時間 信號量(Signal)是進程間通訊(IPC)的一種形式——是一個進程給另一個進程發(fā)送信息的方法。 但是信息不可能很多——一個信號量不可能攜帶詳細的信息, 即使是傳送者的身份也不能被傳遞; 唯一能夠確定的事實是信號量的確被發(fā)送了。 (然而和經(jīng)典信號量不同,POSIX 實時信號量允許傳送稍微多一點的信息。 )實際上,信號量對于雙向通

2、訊是沒有用處的。還有,根據(jù)某些限定,信號量的接受者不必以任何方式作出響應(yīng),甚至可以直接忽略大部分信號量。 雖然有這么多的限制,然而信號量仍然是一種功能強大的十分有用的機制——勿庸置疑,這是 Unix IPC 中使用最頻繁的機制。每當(dāng)進程退出或者廢棄一個空指針時,每當(dāng)使用Ctrl+C 鍵終止程序運行時,都要傳遞信號量。 第 9 章會更詳細的討論 IPC 機制。對于本章的討論來說,信號量的內(nèi)容就足夠討論了。正如在 Linux 內(nèi)核本身的代碼

3、注釋中所說明的一樣,中斷(Interrupt)對于內(nèi)核來說和信號量是類似的。 中斷一般都是從磁盤之類的硬件設(shè)備送往內(nèi)核, 用以提示內(nèi)核該設(shè)備需要加以注意。一個重要的硬件中斷源就是定時器設(shè)備,它周期性地通知內(nèi)核已經(jīng)通過的時間。如同第 5 章中闡述的一樣,中斷也可以由用戶進程通過軟件產(chǎn)生。 在本章中,我們首先討論一下 Linux 中信號量和中斷的實現(xiàn),最后再瀏覽一下 Linux 的時間處理方式。 雖然內(nèi)核對代碼的要求標(biāo)準(zhǔn)非常嚴(yán)格, 本章所涉

4、及的代碼仍然特別清晰明白。 本章使用的一般方法是首先介紹相關(guān)的數(shù)據(jù)結(jié)構(gòu)和它們之間的關(guān)系, 接下來討論操縱和查詢它們的函數(shù)。 鎖的概述 鎖的概述 鎖的基本思想是限制對共享資源的訪問——共享資源包括共享的文件,共享的內(nèi)存片,以及在一次只能由一個 CPU 執(zhí)行的代碼段。概括的說,在單處理器上運行的 Linux 內(nèi)核并不需要鎖,這是因為在編寫 Linux 內(nèi)核時就已經(jīng)注意到要盡量避免各種可能需要鎖的情況了。但是,在多處理器機器上,一個處理器有時

5、需要防止其它處理器對它的有害的介入。 include/asm-i386/spinlock.h 文件(從 12582 行開始)并不使用難看的#ifdef 把所有對鎖函數(shù)的調(diào)用封裝起來,它包含一系列對單處理器平臺(UP)基本為空的宏,然而在多處理器平臺(SMP)上這些宏將展開成為實際代碼。因而內(nèi)核的其它代碼對 UP 和 SMP(當(dāng)涉及到這種特性時)都是相同的,但是它們兩個的效果卻是迥然不同的。 第 10 章中涉及 SMP 的部分會對鎖做深入

6、的介紹。 但是, 由于你在代碼中將到處都能夠看到對鎖宏的調(diào)用, 特別是在本章所討論到的代碼中這一點尤為明顯, 所以你應(yīng)該首先對宏的用途有初步了解——以及為什么現(xiàn)在在大多數(shù)情況下我們都可以安全地將其忽略 (我們將在討論的過程中對其中的異常情況進行說明) 。 信號量 信號量 Linux 內(nèi)核將信號量分為兩類: ? 非實時的 (Nonrealtime) ——大部分是些傳統(tǒng)的信號量, 例如 SIGSEGV, SIGHUP信號量,中斷和時間.d

7、oc - - 54 12167:sa_flags 進一步調(diào)整信號量處理代碼所完成的工作??赡艿臉?biāo)志集合從 12108 行開始定義。這些標(biāo)志允許用戶代碼在信號量實例發(fā)送以后(或者保留用戶定制的操作時)請求恢復(fù)缺省操作,等等。這一點在宏定義塊前面的標(biāo)簽注釋中已經(jīng)說明了。 12168:sa_restorer 是本書中所沒有涉及的一些信號量處理代碼細節(jié)所使用的。 12169:sa_mask 是一系列其它信號量的集合,進程在處理這

8、些信號量的過程中可能需要進行鎖定。例如,如果一個進程在處理 SIGCHLD 的時候希望鎖定 SIGHUP 和SIGINT,進程的第 SIGCHLD 個 sa_mask 就會對與 SIGHUP 和 SIGINT 相關(guān)的位進行置位。 siginfo_t 11851:struct siginfo(也稱為 siginfo_t)是伴隨著信號量,特別是在實時信號量,所傳遞的額外信息。 11852:勿庸置疑,si_signo 是信號量的數(shù)目。 118

9、53:si_errno 應(yīng)該是信號量傳遞時傳送者的 errno 的值,這樣接收者就可以對它進行檢測。內(nèi)核本身并不關(guān)心這個值;當(dāng)在某些情況下需要設(shè)置這個值時,內(nèi)核將其設(shè)置為 0。我推測如果這樣,即使調(diào)用者沒有設(shè)置這個值,它們?nèi)匀粫l(fā)現(xiàn) si_error 的值被設(shè)為已知狀態(tài)。 11854:si_code 記錄了信號量的來源(不是發(fā)送者的進程 ID 號,也就是 PID——它在別處記錄) 。有效的信號量來源在 11915 行及其隨后部分使用宏進

10、行了定義。 11856:該結(jié)構(gòu)的最后一部分是 union 類型的;該 union 類型依賴于 si_code 的值。 11857:union 的第一部分是_pad,它將 siginfo_t 的長度擴展填充為 128*sizeof(int)字節(jié)(在 x86 平臺上一共是 512 個字節(jié)) 。留意一下這個數(shù)組的大小,也就是SI_PAD_SIZE (11849 行) , 代表了該結(jié)構(gòu)的前三個成員——如果增加了更多的成員,SI_PAD_SIZE

11、 就需要進行相應(yīng)修改。 struct signal_queue 17132:struct signal_queue 結(jié)構(gòu)用來確保所有的實時信號量都被正確傳送了,如果可能,每一個都包含著額外信息(siginfo_t) 。如同后面你將會看到的一樣,內(nèi)核會為每個進程都設(shè)置一個隊列,用來存放該進程的掛起的實時信號量。這個隊列類型本身很小,僅僅由一個指向下一個節(jié)點的指針和 siginfo_t 本身組成。 應(yīng)用函數(shù) 應(yīng)用函數(shù) 有關(guān)信號量的一個最重要

12、的數(shù)據(jù)結(jié)構(gòu)是 sigset_t,它是由一系列在 include/linux/signal.h文件中定義的簡單函數(shù)所操縱的, 這些函數(shù)的定義從 17123 行開始。 在 x86 平臺上, 這些相同的函數(shù)可以——而且已經(jīng)——使用匯編語言更加有效的實現(xiàn)了;這些更高效的版本從12204 行開始。 (m68k 端口是唯一一個例外的端口,它使用體系結(jié)構(gòu)特有的代碼實現(xiàn)。 )由于平臺無關(guān)的版本和 x86 特有的版本都很重要,我們會對兩者都加以介紹。 平

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論