嵌入式Linux學(xué)習(xí)之--多進(jìn)程編程_第1頁(yè)
嵌入式Linux學(xué)習(xí)之--多進(jìn)程編程_第2頁(yè)
嵌入式Linux學(xué)習(xí)之--多進(jìn)程編程_第3頁(yè)
嵌入式Linux學(xué)習(xí)之--多進(jìn)程編程_第4頁(yè)
嵌入式Linux學(xué)習(xí)之--多進(jìn)程編程_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、嵌入式Linux學(xué)習(xí)之-多進(jìn)程編程1.多進(jìn)程控制理論進(jìn)程:進(jìn)程是一個(gè)具有一定獨(dú)立功能的程序的一次運(yùn)行活動(dòng)。進(jìn)程的特點(diǎn):動(dòng)態(tài)性、并發(fā)性、異步性,獨(dú)立性動(dòng)態(tài)性:進(jìn)程的實(shí)質(zhì)是程序的一次執(zhí)行過(guò)程,進(jìn)程是動(dòng)態(tài)產(chǎn)生,動(dòng)態(tài)消亡的.并發(fā)性:任何進(jìn)程都可以同其他進(jìn)程一起并發(fā)執(zhí)行獨(dú)立性:進(jìn)程是一個(gè)能獨(dú)立運(yùn)行的基本單位,同時(shí)也是系統(tǒng)分配資源和調(diào)度的獨(dú)立單位;異步性:由于進(jìn)程間的相互制約,使進(jìn)程具有執(zhí)行的間斷性,即進(jìn)程按各自獨(dú)立的、不可預(yù)知的速度向前推進(jìn) 。進(jìn)程四要素:程序塊、數(shù)據(jù)塊、進(jìn)程控制塊、獨(dú)立用戶空間.進(jìn)程的狀態(tài):就緒態(tài)、執(zhí)行態(tài)、阻塞態(tài)進(jìn)程ID(PID):標(biāo)識(shí)進(jìn)程的唯一數(shù)字。父進(jìn)程的ID(PPID),啟動(dòng)進(jìn)程

2、的用戶ID(UID)進(jìn)程互斥:進(jìn)程互斥是指當(dāng)有若干個(gè)進(jìn)程都要使用某一資源時(shí),但該資源在同一時(shí)刻最多只允許一個(gè)進(jìn)程使用,這時(shí)其它進(jìn)程必須等待,直到占用該資源的進(jìn)程釋放資源為止。臨界資源:操作系統(tǒng)中將同一時(shí)刻只允許一個(gè)進(jìn)程訪問(wèn)的資源稱為臨界資源。臨界區(qū):進(jìn)程中訪問(wèn)臨界資源的那段程序代碼就稱為臨界區(qū)。為了實(shí)現(xiàn)對(duì)臨界資源的互斥訪問(wèn),應(yīng)保證諸進(jìn)程互斥地進(jìn)入各自的臨界區(qū)。進(jìn)程同步:一組進(jìn)程按一定的順序執(zhí)行的過(guò)程稱為進(jìn)程間的同步。具有同步關(guān)系的這組進(jìn)程稱為合作進(jìn)程。最為有名的是生產(chǎn)者與消費(fèi)者進(jìn)程。進(jìn)程調(diào)度:按一定的算法,從一組待運(yùn)行的程序中選出一個(gè)來(lái)占有CPU運(yùn)行。調(diào)度算法:先來(lái)先服務(wù)(FIFO),短進(jìn)程優(yōu)

3、先,高優(yōu)先級(jí)優(yōu)先,時(shí)間片輪轉(zhuǎn)調(diào)度分類:按調(diào)度時(shí)機(jī),調(diào)度分為搶占式調(diào)度的非搶占式調(diào)度。死鎖:多個(gè)進(jìn)程因競(jìng)爭(zhēng)資源而形成一種僵局,導(dǎo)致這些進(jìn)程都無(wú)法往前執(zhí)行。死鎖的發(fā)生必須具備以下四個(gè)必要條件。 1)互斥條件:指進(jìn)程對(duì)所分配到的資源進(jìn)行排它性使用,即在一段時(shí)間內(nèi)某資源只由一個(gè)進(jìn)程占用。如果此時(shí)還有其它進(jìn)程請(qǐng)求資源,則請(qǐng)求者只能等待,直至占有資源的進(jìn)程用畢釋放。 2)請(qǐng)求和保持條件:指進(jìn)程已經(jīng)保持至少一個(gè)資源,但又提出了新的資源請(qǐng)求,而該資源已被其它進(jìn)程占有,此時(shí)請(qǐng)求進(jìn)程阻塞,但又對(duì)自己已獲得的其它資源保持不放。 3)不剝奪條件:指進(jìn)程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時(shí)由自己釋放

4、。 4)環(huán)路等待條件:指在發(fā)生死鎖時(shí),必然存在一個(gè)進(jìn)程資源的環(huán)形鏈,即進(jìn)程集合P0,P1,P2,···,Pn中的P0正在等待一個(gè)P1占用的資源;P1正在等待P2占用的資源,Pn正在等待已被P0占用的資源。如何防止死鎖?只要打破四個(gè)必要條件之一就能有效預(yù)防死鎖的發(fā)生:打破互斥條件:改造獨(dú)占性資源為虛擬資源,大部分資源已無(wú)法改造。打破不可搶占條件:當(dāng)一進(jìn)程占有一獨(dú)占性資源后又申請(qǐng)一獨(dú)占性資源而無(wú)法滿足,則退出原占有的資源。打破占有且申請(qǐng)條件:采用資源預(yù)先分配策略,即進(jìn)程運(yùn)行前申請(qǐng)全部資源,滿足則遠(yuǎn)行,不然就等待,這樣就不會(huì)占有且申請(qǐng)。打破循環(huán)等待條件:實(shí)現(xiàn)資源有序分配

5、策略,對(duì)所有設(shè)備實(shí)現(xiàn)分類編號(hào),所有進(jìn)程只能采用按序號(hào)遞增的形式申請(qǐng)資源(1) 保證不在臨界區(qū)中進(jìn)入另一個(gè)臨界區(qū),這是最簡(jiǎn)單的(2) 即使在一個(gè)臨界區(qū)進(jìn)入另一個(gè)臨界區(qū),要為進(jìn)入臨界區(qū)的次序設(shè)置好順序,比如,只有先進(jìn)入臨界區(qū)A后才以能進(jìn)入臨界區(qū)B。但目前l(fā)inux并無(wú)這樣的措施,這也是以后可以加的一個(gè)改進(jìn)。 linux情景分析重要API函數(shù)函數(shù)原型Pid_t getpid(void)函數(shù)說(shuō)明獲取進(jìn)程的PID函數(shù)參數(shù)無(wú)返回值返回調(diào)用進(jìn)程的ID實(shí)例:#include <stdio.h>#include <unistd.h>#include <sys/types.h>

6、void main(void) pid_t id = 0; id = getpid(); printf("process id is %dn",id);2.多進(jìn)程程序設(shè)計(jì)Fork和vfork的區(qū)別(1) fork:子進(jìn)程擁有獨(dú)立的數(shù)據(jù)段、堆棧vfork:子進(jìn)程和父進(jìn)程共享數(shù)據(jù)段、堆棧(2) fork:子進(jìn)程的執(zhí)行順序不確定vfork:子進(jìn)程先運(yùn)行,父進(jìn)程后運(yùn)行3.Linux進(jìn)程通訊方式(1)無(wú)名管道(2)有名管道(3)信號(hào)量(4)信號(hào)(5)共享內(nèi)存(6)消息隊(duì)列(7)套接字(socket)3.1無(wú)名管道3.3.1無(wú)名管道相關(guān)關(guān)鍵概念無(wú)名管道是Linux支持的最初Unix I

7、PC形式之一,具有以下特點(diǎn):l 管道是半雙工的,數(shù)據(jù)只能向一個(gè)方向流動(dòng),需要雙方通信時(shí),需要建立兩個(gè)管道;l 只能用于父子進(jìn)程或者兄弟進(jìn)程之間(具有親緣關(guān)系的進(jìn)程)l 單獨(dú)構(gòu)成一種獨(dú)立的文件系統(tǒng),對(duì)于管道兩端的進(jìn)程而言,管道就是一個(gè)文件。但它不是普通的文件,不屬于某種文件系統(tǒng)。l 數(shù)據(jù)的讀出和寫入:管道中的數(shù)據(jù)被讀出后,數(shù)據(jù)就不存在了。去讀取空管道時(shí)會(huì)阻塞或出錯(cuò),向滿管道寫數(shù)據(jù)會(huì)阻塞或出錯(cuò)。l 管道容量為64k.3.3.2管道通信特點(diǎn)1). 管道通訊是單向的,有固定的讀端和寫端。2). 數(shù)據(jù)被進(jìn)程從管道讀出后,在管道中該數(shù)據(jù)就不存在了2). 數(shù)據(jù)被進(jìn)程從管道讀出后,在管道中該數(shù)據(jù)就不存在了3)

8、. 當(dāng)進(jìn)程去讀取空管道的時(shí)候,進(jìn)程阻塞。4). 當(dāng)進(jìn)程往滿管道寫數(shù)據(jù)時(shí),進(jìn)程阻塞。5). 管道容量為64KB(#define PIPE_BUFFERS 16 include/linux/pipe_fs_i.h)3.3.3管道的讀寫規(guī)則管道兩端可分別用描述字fd0以及fd1來(lái)描述,需要注意的是,管道的兩端是固定了任務(wù)的。即一端只能用于讀,由描述字fd0表示,稱其為管道讀端;另一端則只能用于寫,由描述字fd1來(lái)表示,稱其為管道寫端。如果試圖從管道寫端讀取數(shù)據(jù),或者向管道讀端寫入數(shù)據(jù)都將導(dǎo)致錯(cuò)誤發(fā)生。一般文件的I/O函數(shù)都可以用于管道,如close、read、write等等。從管道中讀取數(shù)據(jù):

9、60;如果管道的寫端不存在,則認(rèn)為已經(jīng)讀到了數(shù)據(jù)的末尾,讀函數(shù)返回的讀出字節(jié)數(shù)為0;  · 當(dāng)管道的寫端存在時(shí),如果請(qǐng)求的字節(jié)數(shù)目大于PIPE_BUF,則返回管道中現(xiàn)有的數(shù)據(jù)字節(jié)數(shù),如果請(qǐng)求的字節(jié)數(shù)目不大于PIPE_BUF,則返回管道中現(xiàn)有數(shù)據(jù)字節(jié)數(shù)(此時(shí),管道中數(shù)據(jù)量小于請(qǐng)求的數(shù)據(jù)量);或者返回請(qǐng)求的字節(jié)數(shù)(此時(shí),管道中數(shù)據(jù)量不小于請(qǐng)求的數(shù)據(jù)量)。注:(PIPE_BUF在include/linux/limits.h中定義,不同的內(nèi)核版本可能會(huì)有所不同。Posix.1要求PIPE_BUF至少為512字節(jié),red hat 7.2中為40

10、96)3.3.4函數(shù)學(xué)習(xí)l 創(chuàng)建管道3.3.5綜合實(shí)例-父子進(jìn)程利用管道通訊=pipe_rw.c=3.2有名管道3.2.1基本概念有名管道又稱為FIFO文件,因此我們對(duì)名管道的操作可以采用操作文件的方法,如使用open,read,write等.l FIFO文件對(duì)比普通文件FIFO文件在使用上和普通文件有相似之處,但是也有不同之處:1). 讀取Fifo文件的進(jìn)程只能以”RDONLY”方式打開(kāi)fifo文件。2). 寫Fifo文件的進(jìn)程只能以”WRONLY”方式打開(kāi)fifo3). Fifo文件里面的內(nèi)容被讀取后,就消失了。但是普通文件里面的內(nèi)容讀取后還存在。l3.2.2函數(shù)學(xué)習(xí)l 創(chuàng)建有名管道3.2

11、.3綜合實(shí)例-任意兩個(gè)進(jìn)程利用名管道通訊=fifo_write.c=fifo_read.c=3.3信號(hào)3.3.1基本概念l 信號(hào):在古老的戰(zhàn)場(chǎng)上,信號(hào)是最有效,最直接的通訊方式;在Linux系統(tǒng)中,信號(hào)(signal)同樣也是最為古老的進(jìn)程間通信機(jī)制。l 信號(hào)處理流程:l 信號(hào)類型Linux系統(tǒng)支持的所有信號(hào)均定義在/usr/include/asm/signal.h(展示),其中常見(jiàn)的信號(hào)有:SIGKILL: 殺死進(jìn)程SIGSTOP:暫停進(jìn)程SIGSTOP:暫停進(jìn)程SIGCHLD:子進(jìn)程停止或結(jié)束時(shí)用來(lái)通知父進(jìn)程3.3.2函數(shù)學(xué)習(xí)l 發(fā)送信號(hào)l 處理信號(hào)3.3.3綜合實(shí)例-AB進(jìn)程利用信號(hào)通訊

12、=aprocess.c=bprocess.c=3.4信號(hào)量信號(hào)量(又名:信號(hào)燈)與其他進(jìn)程間通信方式不大相同,主要用途是保護(hù)臨界資源(進(jìn)程互斥)。進(jìn)程可以根據(jù)它判定是否能夠訪問(wèn)某些共享資源。除了用于訪問(wèn)控制外,還可用于進(jìn)程同步。分類:二值信號(hào)燈:信號(hào)燈的值只能取0或1計(jì)數(shù)信號(hào)燈:信號(hào)燈的值可以取任意非負(fù)值。3.4.1信號(hào)量互斥3.4.1.1公標(biāo)欄問(wèn)題數(shù)學(xué)與英語(yǔ)科代表都要在公告欄寫一些信息,分別是“數(shù)學(xué)課考試”,“英語(yǔ)課取消”。但數(shù)學(xué)科代表在寫完“數(shù)學(xué)課”后因有事走開(kāi)了一會(huì),此時(shí)英語(yǔ)科代表進(jìn)來(lái)在公告欄上寫“英語(yǔ)課”,此時(shí),英語(yǔ)科代表有高空槽走開(kāi)了一會(huì),數(shù)學(xué)科代表回來(lái)了,繼續(xù)寫“考試”,然后完成離

13、開(kāi)了。英語(yǔ)科代表回來(lái)了,接著寫“取消”。最后,公告欄的內(nèi)容是“數(shù)學(xué)課英語(yǔ)課考試取消”。顯示,從公告欄上獲取的信息不是想要的。信號(hào)量互斥就是解決這種資源的共享問(wèn)題。3.4.1.2函數(shù)學(xué)習(xí)l 創(chuàng)建/打開(kāi)信號(hào)量l 操作信號(hào)量l 釋放信號(hào)量 3.4.1.3綜合實(shí)例-公告欄問(wèn)題=student1.c=student2.c=Board.txt3.4.2信號(hào)量同步3.4.2.1基本概念一組并發(fā)進(jìn)程進(jìn)行互相合作、互相等待,使得各進(jìn)程按一定的順序執(zhí)行的過(guò)程稱為進(jìn)程間的同步。3.4.2.2綜合實(shí)例-生產(chǎn)者消費(fèi)者實(shí)驗(yàn)=productor.c=customer.c=3.5共享內(nèi)存3.5.1基本概念共享內(nèi)存是IPC機(jī)制中的一種. 顧名思義,它允許兩個(gè)不相關(guān)的進(jìn)程訪問(wèn)同一段內(nèi)存,這是傳遞數(shù)據(jù)的一種非常有效的方式。3.5.2函數(shù)學(xué)習(xí)l 創(chuàng)建打開(kāi)共享內(nèi)存l 映射共享內(nèi)存l 解除共享內(nèi)存l 刪除共享內(nèi)存3.5.3綜合實(shí)例-共享內(nèi)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論