嵌入式系統(tǒng)中線程、信號、管道_第1頁
嵌入式系統(tǒng)中線程、信號、管道_第2頁
嵌入式系統(tǒng)中線程、信號、管道_第3頁
嵌入式系統(tǒng)中線程、信號、管道_第4頁
嵌入式系統(tǒng)中線程、信號、管道_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

27.嵌入式系統(tǒng)中線程、信號、管道一、多道程序技術(shù)為了提高計算機系統(tǒng)中各種資源的利用率,現(xiàn)代操作系統(tǒng)廣泛采用多道程序技術(shù)(multi-programming),使多個程序同時在系統(tǒng)中存在并運行。CPUI/O單道程序:多道程序:CPUI/O作業(yè)甲(紅黃)作業(yè)乙(藍綠)在多道程序系統(tǒng)中,各個程序之間是并發(fā)執(zhí)行的,共享系統(tǒng)資源。CPU需要在各個運行的程序之間來回地切換,這樣的話,要想描述這些多道的并發(fā)活動過程就變得很困難。為此,操作系統(tǒng)設(shè)計者提出了進程的概念。二、進程和線程2.1什么是進程(任務(wù))?Aprocess=aprograminexecution是可并發(fā)執(zhí)行的、具有獨立功能的程序在一個數(shù)據(jù)集合上的運行過程,是操作系統(tǒng)進行資源分配和保護的基本單位。一個進程可以簡單地認為是一個程序在系統(tǒng)內(nèi)的唯一執(zhí)行。Linux中,進程具有獨立的權(quán)限與職責(zé)。如果系統(tǒng)中某個進程崩潰,它不會影響到其余的進程。每個進程運行在其各自的虛擬地址空間中,進程之間可以通過由內(nèi)核控制的機制相互通訊。一個進程應(yīng)該包括:程序的代碼;程序的數(shù)據(jù);PC中的值,用來指示下一條將運行的指令;一組通用的寄存器的當(dāng)前值,堆、棧;一組系統(tǒng)資源(如打開的文件)總之,進程包含了正在運行的一個程序的所有狀態(tài)信息。特點:動態(tài)性:程序的運行狀態(tài)在變,PC、寄

存器、堆和棧等;并發(fā)性:從宏觀上看各進程是同時獨立運行的獨立性:是一個獨立的實體,是計算機系統(tǒng)資源的使用單位。

每個進程都有“自己”的PC和內(nèi)部狀態(tài),運行時獨

立于其他的進程;異步性:多個進程的執(zhí)行次序互不相關(guān)Process≠Program程序=代碼/命令進程=程序+運行狀態(tài)main()

{…..}A()

{…..}

PROGRAMmain()

{…..}A()

{…..}

PROCESS

StackRegisters,PC2.2什么是線程?

自從60年代提出進程概念以來,在操作系統(tǒng)中一直都是以進程作為獨立運行的基本單位,直到80年代中期,人們又提出了更小的能獨立運行的基本單位線程。2.3為什么提出線程?【案例】編寫一個MP3播放軟件。核心功能模塊有三個:(1)從MP3音頻文件當(dāng)中讀取數(shù)據(jù);(2)對數(shù)據(jù)進行解壓縮;(3)把解壓縮后的音頻數(shù)據(jù)播放出來。main()

{

while(TRUE)

{Read();

Decompress();

Play();

}}Read(){…}

Decompress(){…}Play(){…}問題:播放出來的聲音能

否連貫?各個函數(shù)之間不是

并發(fā)執(zhí)行,影響資

源的使用效率;I/OCPU單進程的實現(xiàn)方法多進程的實現(xiàn)方法程序1

main()

{

while(TRUE)

{Read();

}}Read(){…}問題:進程之間如何通信,共享數(shù)據(jù)?程序3

main()

{

while(TRUE)

{Play();

}}Play(){…}程序2

main()

{

while(TRUE)

{Decompress();

}}Decompress(){…}如何解決?需要提出一種新的實體,滿足以下特性:(1)實體之間可以真正地并發(fā)執(zhí)行;(2)實體之間共享相同的地址空間及其他資源;這種實體就是:線程(Thread)從兩個方面來理解進程:從資源組合的角度:進程把一組相關(guān)的

資源組合起來,構(gòu)成了一個資源平臺

(環(huán)境),包括地址空間(代碼段、數(shù)據(jù)

段)、打開的文件等各種資源;從運行的角度:代碼在這個資源平臺上的

一條執(zhí)行流程(線程)。資源平臺線程進程=線程+資源平臺優(yōu)點:一個進程中可以同時存在多個線程;各個線程之間可以并發(fā)地執(zhí)行;各個線程之間可以共享地址空間。進程和線程的區(qū)別:

進程在執(zhí)行過程中擁有獨立的內(nèi)存單元,而多個線程共享內(nèi)存,從而極大地提高了程序的運行效率。每個獨立的線程有一個程序運行的入口、順序執(zhí)行序列和程序的出口。但是線程不能夠獨立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個線程執(zhí)行控制。從邏輯角度來看,多線程的意義在于一個應(yīng)用程序中,有多個執(zhí)行部分可以同時執(zhí)行。但操作系統(tǒng)并沒有將多個線程看做多個獨立的應(yīng)用,來實現(xiàn)進程的調(diào)度和管理以及資源分配。1.進程間為什么要通信

?數(shù)據(jù)傳輸(一個進程有數(shù)據(jù)要傳給另一個進程)?資源共享(多個進程相互協(xié)調(diào),共同使用臨界資源)?通知事件(一個進程要向另一個進程發(fā)送消息,通知其某個事件)?進程控制(有些進程要控制另一些進程,如Debug)三、進程間通信2.進程間通信嵌入式系統(tǒng)中進程間通信主要采用兩種形式:共享內(nèi)存和消息傳遞。二者在邏輯上沒有什么區(qū)別,進程通信采用哪種方式,主要依賴實際需要。進程間通信也可以采用信號和管道的方式。(1)共享內(nèi)存方式兩個進程通過共享內(nèi)存單元進行通信,進程P1和進程P2的軟件設(shè)計為操作已知的共享單元地址。如果P1想要給P2發(fā)送信息,它即把信息寫入共享單元中;然后P2從共享單元中讀出這些信息。(2)消息傳遞方式消息傳遞方式是共享內(nèi)存通信方式的補充,每個通信實體有自己的發(fā)送和接收單元。消息并不是存儲在通信鏈路中,而是保存在發(fā)送和接收方的端點處。3.信號信號是操作系統(tǒng)中使用最早的進程間通信機制之一,主要用于向一個或多個進程發(fā)異步事件信號,許多嵌入式操作系統(tǒng)也采用了信號機制。信號實際上是一個中斷的模擬,它不僅可以由硬件產(chǎn)生,也可以由軟件產(chǎn)生。即在進程執(zhí)行的過程中,如果系統(tǒng)發(fā)現(xiàn)某個進程接收到了信號,就暫時打斷進程的執(zhí)行,轉(zhuǎn)而去執(zhí)行該進程的信號處理程序,處理完畢后,再從進程“被打斷”之處繼續(xù)執(zhí)行。信號由一個進程產(chǎn)生,然后由操作系統(tǒng)傳遞給另一個進程。信號機制是比較簡單的,這是因為除了信號本身,它并不傳遞數(shù)據(jù)。信號機制是Unix系統(tǒng)中最為古老的進程間通信機制,有很多情況可以產(chǎn)生一個信號:

?用戶按下某個按鍵?硬件異常(如除數(shù)為0)?進程使用kill函數(shù)向另一個進程發(fā)送信號?用戶使用kill命令向其他進程發(fā)送信號3.1常見信號類型SIGHUP:系統(tǒng)對SIGHUP信號的默認處理是終止收到該信號的進程。所以若程序中沒有捕捉該信號,當(dāng)收到該信號時,進程就會退出。SIGINT:程序終止(interrupt)信號,在用戶鍵入INTR字符(通常是Ctrl-C)時發(fā)出,用于通知前臺進程組終止進程。SIGILL:執(zhí)行了非法指令。

通常是因為可執(zhí)行文件本身出現(xiàn)錯誤,

或者試圖執(zhí)行數(shù)據(jù)段。堆棧溢出時也有可能產(chǎn)生這個信號。SIGTRAP

由斷點指令或其它trap指令產(chǎn)生,由debugger使用。

3.2和信號相關(guān)的函數(shù)

a.kill函數(shù)(sys/types.h、signal.h)?原型:intkill(pid_tpid,intsigno)?功能:kill()可以用來送參數(shù)sig指定的信號給參數(shù)pid指定的進程。參數(shù)sig代表的信號編號。

?pid的4種取值:*pid>0表示將信號發(fā)送給PID=pid的進程*pid=0表示將信號發(fā)送給同組的進程*pid<0表示將信號發(fā)送給PID=|pid|的進程*pid=-1表示將信號發(fā)給所有進程b.raise函數(shù)(sys/types.h、signal.h)?原型:intraise(intsigno)?功能:允許進程給自身發(fā)送信號。 intraise(intsigno);

raise(signo)

等價于

kill(getpid(),signo);

c.alarm函數(shù)(unistd.h)?原型:unsignedintalarm(unsignedintseconds)?功能:設(shè)置一個鬧鐘時間,到點時產(chǎn)生SIGALRM信號給自己(如果不捕獲該信號,則默認操作為終止該進程);

?說明:*每個進程只能有一個鬧鐘時間,舊鬧鐘未超時而設(shè)置新鬧鐘時,新的替換舊的;*舊鬧鐘未超時而設(shè)置新鬧鐘,且新鬧鐘的second=0時表示取消舊鬧鐘。d.pause函數(shù)(unistd.h)?原型:intpause(void)?功能:使調(diào)用該函數(shù)的進程掛起,直到捕捉到一個信號。3.3信號處理

?當(dāng)某種信號出現(xiàn)時,通常有3種處理情形:*忽略此信號(大多數(shù)信號被這樣處理,但SIGKILL(終止某個進程)和SIGSTOP(暫停進程)不能被忽略,因為二者為超級用戶提供了一種終止進程的方法)*執(zhí)行用戶希望的動作(通知內(nèi)核在某種信號發(fā)生時,調(diào)用事先聲明的函數(shù))*執(zhí)行系統(tǒng)默認的動作(大多數(shù)信號的默認動作是終止該進程)4、

管道通信4.1什么是管道

?將一個進程的輸出和另一個進程的輸入連接在一起,是單向

的、先進先出的,是進程間通信的另一種機制。在Linux系

統(tǒng)中,管道用兩個指向同一個臨時性VFS索引結(jié)點(內(nèi)存中

的索引結(jié)點)的文件數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)。?寫進程負責(zé)在管道尾部寫入數(shù)據(jù),讀進程負責(zé)從管道頭部讀

出數(shù)據(jù);?數(shù)據(jù)被進程讀出后將被從管道中刪除;?讀空管道和寫滿管道的進程都將被阻塞;?管道分為無名管道和有名管道。?對管道的訪問必須同步,以使讀進程和寫進程步調(diào)一致。Linux使用了鎖、等待隊列和信號量三種方式來實現(xiàn)同步。4.2創(chuàng)建管道內(nèi)核是按照創(chuàng)建“管道文件”的模式創(chuàng)建“管道”的,其他類型的文件都是為“一個進程”的使用而創(chuàng)建的,而管道文件則“天然地”就是為了“兩個進程(即讀管道進程和寫管道進程)”的使用而創(chuàng)建的。步驟如下:1)為管道文件在文件管理表中申請空閑項;2)為管道文件與進程建立聯(lián)系創(chuàng)造條件;3)創(chuàng)建管道文件i結(jié)點(i節(jié)點中載入的是內(nèi)存頁面的地址);4)將管道文件i結(jié)點與文件管理表建立聯(lián)系;5)將管道文件句柄返回給用戶進程;6)讀管道進程開始操作管道文件(由于此時管道內(nèi)沒有任

何數(shù)據(jù),所以此時系統(tǒng)會將讀管道進程掛起,然后切換

到寫管道進程中去執(zhí)行);7)寫管道進程向管道中寫入數(shù)據(jù)(Linux0.11默認:每次寫

管道執(zhí)行完畢后,管道中就擁有了可以讀出的數(shù)據(jù),所

以就會喚醒讀管道進程;每次讀管道執(zhí)行完畢后,管道

中就擁有了可以寫入數(shù)據(jù)的空間,所以就會喚醒寫管道

進程,但喚醒并不等于立即執(zhí)行。);8)寫管道進程繼續(xù)向管道寫入數(shù)據(jù)(當(dāng)寫管道操作次數(shù)執(zhí)

行完后,寫管道進程的時間片還沒有完,所以還要繼續(xù)

進行寫管道操作);9)寫管道進程已將管道空間寫滿(在寫管道進程工作的過

程中,一定會發(fā)生時鐘中斷,而時鐘中斷僅僅是削減了

它的時間片,只要時間片不被削減為0,它就會繼續(xù)執(zhí)行,

直到寫管道進程把管道寫滿為止);10)寫管道進程掛起;11)讀管

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論