版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、進(jìn)程同步與互斥進(jìn)程同步與互斥Linux提供以下提供以下3個(gè)有關(guān)信號(hào)量的系統(tǒng)調(diào)用函數(shù):個(gè)有關(guān)信號(hào)量的系統(tǒng)調(diào)用函數(shù):semget()semop()semctl()下面分別予以引見。下面分別予以引見。1.創(chuàng)建一個(gè)新的信號(hào)量集或獲取一個(gè)曾經(jīng)存在的信號(hào)量集創(chuàng)建一個(gè)新的信號(hào)量集或獲取一個(gè)曾經(jīng)存在的信號(hào)量集命令格式:命令格式:int semget(key_t key, int nsems, int semflg);前往值:前往值:正確前往:信號(hào)量集的標(biāo)識(shí)符正確前往:信號(hào)量集的標(biāo)識(shí)符錯(cuò)誤前往:錯(cuò)誤前往:-11.創(chuàng)建一個(gè)新的信號(hào)量集或獲取一個(gè)曾經(jīng)存在的信號(hào)量集創(chuàng)建一個(gè)新的信號(hào)量集或獲取一個(gè)曾經(jīng)存在的信號(hào)量集參數(shù)
2、闡明:參數(shù)闡明:keykey信號(hào)量集的信號(hào)量集的keykey值:值:運(yùn)用運(yùn)用IPC_PRIVATEIPC_PRIVATE,由系統(tǒng)產(chǎn)生,由系統(tǒng)產(chǎn)生keykey值并前往標(biāo)識(shí)符,或者前往值并前往標(biāo)識(shí)符,或者前往keykey值已存在的信值已存在的信號(hào)量集的標(biāo)識(shí)符。號(hào)量集的標(biāo)識(shí)符。 key key值不為值不為IPC_PRIVATEIPC_PRIVATE而是由用戶指定一個(gè)非而是由用戶指定一個(gè)非0 0整型數(shù)值,那么對(duì)信號(hào)量集的翻整型數(shù)值,那么對(duì)信號(hào)量集的翻開或存取操作依賴于開或存取操作依賴于semflagsemflag參數(shù)的取值。參數(shù)的取值。nsemsnsems指定翻開或者新創(chuàng)建的信號(hào)量集將包含的信號(hào)量的數(shù)
3、目;假設(shè)該指定翻開或者新創(chuàng)建的信號(hào)量集將包含的信號(hào)量的數(shù)目;假設(shè)該keykey值的信值的信號(hào)量集已存在,而號(hào)量集已存在,而semflgsemflg只指定了只指定了IPC_CREATIPC_CREAT標(biāo)志,那么參數(shù)標(biāo)志,那么參數(shù)nsemsnsems必需與原來(lái)的必需與原來(lái)的值一致,否那么也會(huì)前往錯(cuò)誤信息。該參數(shù)最大值在值一致,否那么也會(huì)前往錯(cuò)誤信息。該參數(shù)最大值在linux/sem.hlinux/sem.h中被定義:中被定義:#define SEMMSL 250 /#define SEMMSL 250 /* * = 8 000 = 8 000 * */ /semflgsemflg當(dāng)當(dāng)keykey值
4、不為值不為IPC_PRIVATEIPC_PRIVATE:假設(shè)只設(shè)置假設(shè)只設(shè)置semflagsemflag的的IPC_CREATIPC_CREAT位,那么創(chuàng)建一個(gè)信號(hào)量集,假設(shè)該信號(hào)量集曾位,那么創(chuàng)建一個(gè)信號(hào)量集,假設(shè)該信號(hào)量集曾經(jīng)存在,那么前往其標(biāo)識(shí)符經(jīng)存在,那么前往其標(biāo)識(shí)符假設(shè)設(shè)置假設(shè)設(shè)置semflagsemflag的的IPC_CREAT|IPC_EXCLIPC_CREAT|IPC_EXCL位,那么創(chuàng)建一個(gè)新的信號(hào)量集,假設(shè)位,那么創(chuàng)建一個(gè)新的信號(hào)量集,假設(shè)該該keykey值的信號(hào)量集曾經(jīng)存在那么前往錯(cuò)誤信息值的信號(hào)量集曾經(jīng)存在那么前往錯(cuò)誤信息只設(shè)置只設(shè)置IPC_EXCLIPC_EXCL位而
5、不設(shè)置位而不設(shè)置IPC_CREATIPC_CREAT位沒(méi)有任何意義。位沒(méi)有任何意義。1.創(chuàng)建一個(gè)新的信號(hào)量集或獲取一個(gè)曾經(jīng)存在的信號(hào)量集創(chuàng)建一個(gè)新的信號(hào)量集或獲取一個(gè)曾經(jīng)存在的信號(hào)量集實(shí)驗(yàn)中,運(yùn)用該調(diào)用創(chuàng)建一個(gè)只含一個(gè)信號(hào)量的信號(hào)量集,格式為:semid=semget(IPC_PRIVATE,1, IPC_CREAT|0666);其中的IPC_PRIVATE可以運(yùn)用詳細(xì)的整型數(shù)值取代。2.對(duì)信號(hào)量的對(duì)信號(hào)量的P、V操作操作命令格式:命令格式:int semop(int semid, struct sembuf * sops, unsigned nsops);前往值:前往值:正確前往:正確前往:
6、0錯(cuò)誤前往:錯(cuò)誤前往:-1參數(shù)闡明:參數(shù)闡明:semid信號(hào)量集的標(biāo)識(shí)符,由信號(hào)量集的標(biāo)識(shí)符,由semget得到。得到。sops指向一個(gè)指向一個(gè)sembuf構(gòu)造數(shù)組,該數(shù)組的每個(gè)元素對(duì)應(yīng)一次信構(gòu)造數(shù)組,該數(shù)組的每個(gè)元素對(duì)應(yīng)一次信號(hào)量操作。號(hào)量操作。2.對(duì)信號(hào)量的對(duì)信號(hào)量的P、V操作操作其其sembufsembuf數(shù)據(jù)構(gòu)造如下:數(shù)據(jù)構(gòu)造如下:struct sembuf struct sembuf unsigned short sem_num; /unsigned short sem_num; /* * semaphore index in array semaphore index in arr
7、ay * */ /shortshortsem_op;sem_op;/ /* * semaphore operation semaphore operation * */ /shortshortsem_flg;sem_flg;/ /* * operation flags operation flags * */ /;其中的參數(shù)含義如下所示:其中的參數(shù)含義如下所示:2.對(duì)信號(hào)量的對(duì)信號(hào)量的P、V操作操作信號(hào)量的信號(hào)量的sem_numsem_num值標(biāo)明它是信號(hào)量集的第幾個(gè)元素,第一個(gè)信號(hào)量為值標(biāo)明它是信號(hào)量集的第幾個(gè)元素,第一個(gè)信號(hào)量為0 0,第二個(gè)為,第二個(gè)為1 1,依次類推。,依次類推。sem
8、opsemop確定對(duì)確定對(duì)sem_numsem_num指定的信號(hào)量采取何種操作,它可以為負(fù)數(shù)、正數(shù)和零。指定的信號(hào)量采取何種操作,它可以為負(fù)數(shù)、正數(shù)和零。假設(shè)假設(shè)sem_opsem_op為負(fù)數(shù):那么相當(dāng)于為負(fù)數(shù):那么相當(dāng)于P P操作,從信號(hào)量的值中減去操作,從信號(hào)量的值中減去sem_opsem_op的絕對(duì)值:的絕對(duì)值: 其差假設(shè)大于其差假設(shè)大于0 0,那么表示該進(jìn)程可以運(yùn)用臨界資源進(jìn)入臨界區(qū);,那么表示該進(jìn)程可以運(yùn)用臨界資源進(jìn)入臨界區(qū); 其差假設(shè)小于其差假設(shè)小于0 0,在沒(méi)有指定,在沒(méi)有指定IPC_NOWAITIPC_NOWAIT的情況下,該進(jìn)程睡眠,并插入的情況下,該進(jìn)程睡眠,并插入sem_
9、queuessem_queues等待隊(duì)列尾部,直到懇求的條件得到滿足;假設(shè)指定了等待隊(duì)列尾部,直到懇求的條件得到滿足;假設(shè)指定了IPC_NOWAITIPC_NOWAIT,那,那么出錯(cuò)前往。么出錯(cuò)前往。假設(shè)假設(shè)sem_opsem_op為正數(shù):此時(shí)相當(dāng)于為正數(shù):此時(shí)相當(dāng)于V V操作,把它的值加到信號(hào)量中,這也意味著該進(jìn)操作,把它的值加到信號(hào)量中,這也意味著該進(jìn)程釋放資源。假設(shè)是互斥那么出臨界區(qū),釋放臨界資源。程釋放資源。假設(shè)是互斥那么出臨界區(qū),釋放臨界資源。假設(shè)假設(shè)sem_opsem_op為為0 0:那么該進(jìn)程將睡眠直到信號(hào)量的值也為:那么該進(jìn)程將睡眠直到信號(hào)量的值也為0 0。系統(tǒng)會(huì)按順序檢查信號(hào)
10、量等待隊(duì)列系統(tǒng)會(huì)按順序檢查信號(hào)量等待隊(duì)列(sem_pending)(sem_pending)中的每一個(gè)成員,查看在當(dāng)前信號(hào)量中的每一個(gè)成員,查看在當(dāng)前信號(hào)量的形狀下,其懇求的操作能否可以勝利,假設(shè)可以,那么將它從等待隊(duì)列中喚醒,的形狀下,其懇求的操作能否可以勝利,假設(shè)可以,那么將它從等待隊(duì)列中喚醒,并插入到就緒隊(duì)列中等待調(diào)度運(yùn)轉(zhuǎn)。并插入到就緒隊(duì)列中等待調(diào)度運(yùn)轉(zhuǎn)。sem_flgsem_flg指明操作的執(zhí)行方式,它有兩個(gè)標(biāo)志位:指明操作的執(zhí)行方式,它有兩個(gè)標(biāo)志位: IPC_NOWAIT IPC_NOWAIT:指明以非阻塞方式:指明以非阻塞方式操作信號(hào)量。操作信號(hào)量。 SEM_UNDO SEM_UN
11、DO: 指明內(nèi)核為信號(hào)量操作保管恢復(fù)值指明內(nèi)核為信號(hào)量操作保管恢復(fù)值nsopsnsops是第二個(gè)參數(shù)所指向的是第二個(gè)參數(shù)所指向的sembufsembuf構(gòu)造數(shù)組中元素的個(gè)數(shù),假設(shè)只需一個(gè)信號(hào)量構(gòu)造數(shù)組中元素的個(gè)數(shù),假設(shè)只需一個(gè)信號(hào)量nsopsnsops值為值為1 1。 2.對(duì)信號(hào)量的對(duì)信號(hào)量的P、V操作操作在實(shí)驗(yàn)中,運(yùn)用該系統(tǒng)調(diào)用實(shí)現(xiàn)在實(shí)驗(yàn)中,運(yùn)用該系統(tǒng)調(diào)用實(shí)現(xiàn)P、V操作,運(yùn)用格式為:操作,運(yùn)用格式為:struct sembuf P,V;semop(semid, &P, 1); /對(duì)信號(hào)量對(duì)信號(hào)量semid執(zhí)行執(zhí)行P操作操作semop(semid, &V, 1); /對(duì)信號(hào)量對(duì)
12、信號(hào)量semid執(zhí)行執(zhí)行V操作操作3信號(hào)量集的控制函數(shù)信號(hào)量集的控制函數(shù)命令格式:命令格式:int semctl(int semid, int semnum, int cmd, union semun arg);前往值:前往值: 操作勝利前往:根據(jù)操作勝利前往:根據(jù)cmd的不同前往需求的值或的不同前往需求的值或0 錯(cuò)誤前往:錯(cuò)誤前往:-13信號(hào)量集的控制函數(shù)信號(hào)量集的控制函數(shù)參數(shù)闡明:參數(shù)闡明:semidsemid信號(hào)量集的標(biāo)識(shí)符,由信號(hào)量集的標(biāo)識(shí)符,由semgetsemget得到;得到;semnumsemnum指定指定semidsemid信號(hào)量集的第幾個(gè)信號(hào)量,在吊銷信信號(hào)量集的第幾個(gè)信號(hào)量
13、,在吊銷信號(hào)量集時(shí),此參數(shù)可以缺??;號(hào)量集時(shí),此參數(shù)可以缺省;cmdcmd用于指定操作類別:用于指定操作類別: SETVAL SETVAL:置信號(hào)量:置信號(hào)量semvalsemval域值為域值為arg.valarg.val。 IPC_RMID IPC_RMID:刪除指定信號(hào)量集??梢赃M(jìn)展此項(xiàng)操作:刪除指定信號(hào)量集。可以進(jìn)展此項(xiàng)操作的進(jìn)程限于超級(jí)用戶、的進(jìn)程限于超級(jí)用戶、 sem_perm.cuid sem_perm.cuid或或sem_perm.uidsem_perm.uid。3信號(hào)量集的控制函數(shù)信號(hào)量集的控制函數(shù)實(shí)驗(yàn)中運(yùn)用該系統(tǒng)調(diào)用實(shí)現(xiàn)以下功能:實(shí)驗(yàn)中運(yùn)用該系統(tǒng)調(diào)用實(shí)現(xiàn)以下功能:為信號(hào)量賦初
14、值,格式為:為信號(hào)量賦初值,格式為:union semun arg;union semun arg;arg.val=arg.val=初值初值; ; semctl(semid,0semctl(semid,0,SETVAL,arg);SETVAL,arg);其中其中0 0表示第表示第0 0個(gè)信號(hào)量,個(gè)信號(hào)量,argarg的值由的值由arg.valarg.val決議,所以必需事先為決議,所以必需事先為arg.valarg.val賦值。賦值。吊銷信號(hào)量集,格式為:吊銷信號(hào)量集,格式為:semctl(semid,IPC_RMID,0);semctl(semid,IPC_RMID,0);上述系統(tǒng)調(diào)用運(yùn)用以
15、下頭函數(shù):上述系統(tǒng)調(diào)用運(yùn)用以下頭函數(shù):#include#include#include#include信號(hào)量及其信號(hào)量及其P P、V V操作的實(shí)現(xiàn)操作的實(shí)現(xiàn)信號(hào)量及其信號(hào)量及其P、V操作的實(shí)現(xiàn)方式歸納如下:操作的實(shí)現(xiàn)方式歸納如下:1 定義信號(hào)量標(biāo)識(shí)符:定義信號(hào)量標(biāo)識(shí)符:int semid;假設(shè)有假設(shè)有n個(gè)信號(hào)量,那么需求分別定義個(gè)信號(hào)量,那么需求分別定義n個(gè)不同的信號(hào)量標(biāo)識(shí)符。個(gè)不同的信號(hào)量標(biāo)識(shí)符。2 定義信號(hào)量數(shù)據(jù)構(gòu)造定義信號(hào)量數(shù)據(jù)構(gòu)造定義定義P、V操作所用的數(shù)據(jù)構(gòu)造:操作所用的數(shù)據(jù)構(gòu)造:struct sembuf P,V; 定義給信號(hào)量賦初值的參數(shù)數(shù)據(jù)構(gòu)造:定義給信號(hào)量賦初值的參數(shù)數(shù)據(jù)構(gòu)造
16、:union semun arg;3 懇求只需一個(gè)信號(hào)量的信號(hào)量集懇求只需一個(gè)信號(hào)量的信號(hào)量集semid=semget(IPC_PRIVITE,1,IPC_0666);其中,第一個(gè)參數(shù):其中,第一個(gè)參數(shù):IPC_PRIVATE由系統(tǒng)產(chǎn)生由系統(tǒng)產(chǎn)生key值,也可以由用值,也可以由用戶運(yùn)用詳細(xì)的整型數(shù)值作為戶運(yùn)用詳細(xì)的整型數(shù)值作為key值指定;第二個(gè)參數(shù)表示信號(hào)量值指定;第二個(gè)參數(shù)表示信號(hào)量集中只需一個(gè)信號(hào)量;操作權(quán)限取決于最后一個(gè)參數(shù),集中只需一個(gè)信號(hào)量;操作權(quán)限取決于最后一個(gè)參數(shù),0666表示表示恣意用戶可讀可寫,只設(shè)置恣意用戶可讀可寫,只設(shè)置semflag的的IPC_CREAT位,那么創(chuàng)建位
17、,那么創(chuàng)建一個(gè)信號(hào)量集,假設(shè)該信號(hào)量集曾經(jīng)存在,那么前往其標(biāo)識(shí)符。一個(gè)信號(hào)量集,假設(shè)該信號(hào)量集曾經(jīng)存在,那么前往其標(biāo)識(shí)符。4 分別對(duì)每個(gè)信號(hào)量分別對(duì)每個(gè)信號(hào)量semid賦初值賦初值arg.val=初值初值;semctl(semid,0,SETVAL,arg);信號(hào)量及其信號(hào)量及其P P、V V操作的實(shí)現(xiàn)操作的實(shí)現(xiàn)5. 定義信號(hào)量的定義信號(hào)量的P操作供一切信號(hào)量的操作供一切信號(hào)量的P操作運(yùn)用操作運(yùn)用P.sem_num=0;P.sem_op=-1;/*-1表示表示P操作時(shí)對(duì)信號(hào)量減操作時(shí)對(duì)信號(hào)量減1*/P.sem_flg=SEM_UNDO;6. 定義信號(hào)量的定義信號(hào)量的V操作供一切信號(hào)量的操作供一
18、切信號(hào)量的V操作運(yùn)用操作運(yùn)用V.sem_num=0;V.sem_op=1;/*1表示表示V操作時(shí)對(duì)信號(hào)量加操作時(shí)對(duì)信號(hào)量加1*/V.sem_flg=SEM_UNDO;7. 對(duì)信號(hào)量對(duì)信號(hào)量semid執(zhí)行執(zhí)行P操作:操作:semop(semid,&P,1);8. 對(duì)信號(hào)量對(duì)信號(hào)量semid執(zhí)行執(zhí)行V操作:操作:semop(semid,&V,1);9. 吊銷信號(hào)量:吊銷信號(hào)量:semctl(semid,IPC_RMID,0);由 于 信 號(hào) 量 不 是 普 通 變 量 , 對(duì) 它 賦 初 值 只 能 經(jīng) 過(guò) 系 統(tǒng) 調(diào) 用 函 數(shù)由 于 信 號(hào) 量 不 是 普 通 變 量 , 對(duì)
19、它 賦 初 值 只 能 經(jīng) 過(guò) 系 統(tǒng) 調(diào) 用 函 數(shù)semctl(semid,0,SETVAL,arg)進(jìn)展,其值的修正只能經(jīng)過(guò)進(jìn)展,其值的修正只能經(jīng)過(guò)P、V操作,而不能操作,而不能運(yùn)用普通的賦值語(yǔ)句。運(yùn)用普通的賦值語(yǔ)句。因此其初值和信號(hào)量的因此其初值和信號(hào)量的P、V操作需求事先定義好以后,然后才干在進(jìn)程中執(zhí)行操作需求事先定義好以后,然后才干在進(jìn)程中執(zhí)行P、V操作。操作。 運(yùn)用舉例運(yùn)用舉例1.利用信號(hào)量實(shí)現(xiàn)進(jìn)程互斥利用信號(hào)量實(shí)現(xiàn)進(jìn)程互斥例例4-9 設(shè)有父子設(shè)有父子2個(gè)進(jìn)程共享一個(gè)臨界資源,每個(gè)進(jìn)程循環(huán)個(gè)進(jìn)程共享一個(gè)臨界資源,每個(gè)進(jìn)程循環(huán)進(jìn)入該臨界區(qū)進(jìn)入該臨界區(qū)3次:父進(jìn)程每次進(jìn)入臨界區(qū)后顯示
20、次:父進(jìn)程每次進(jìn)入臨界區(qū)后顯示“prnt in,出臨界區(qū)那么顯示,出臨界區(qū)那么顯示“prnt out;子進(jìn)程每次進(jìn)入臨;子進(jìn)程每次進(jìn)入臨界區(qū)后顯示界區(qū)后顯示“chld in出臨界區(qū)那么顯示出臨界區(qū)那么顯示“chld out。察。察看運(yùn)轉(zhuǎn)結(jié)果,應(yīng)該是一個(gè)進(jìn)程出來(lái)后另一個(gè)才干進(jìn)去??催\(yùn)轉(zhuǎn)結(jié)果,應(yīng)該是一個(gè)進(jìn)程出來(lái)后另一個(gè)才干進(jìn)去。分析:分析:對(duì)臨界區(qū)設(shè)置互斥信號(hào)量對(duì)臨界區(qū)設(shè)置互斥信號(hào)量mutex,其內(nèi)部標(biāo)識(shí)為,其內(nèi)部標(biāo)識(shí)為mutexid,初值為初值為1。程序中運(yùn)用睡眠延時(shí)程序中運(yùn)用睡眠延時(shí)1秒來(lái)模擬進(jìn)入臨界區(qū)前和進(jìn)入后所執(zhí)秒來(lái)模擬進(jìn)入臨界區(qū)前和進(jìn)入后所執(zhí)行的程序。行的程序。程序清單:文件名程序清單:
21、文件名sem.c#include#include#include#include#includeint mutexid;/定義信號(hào)量標(biāo)識(shí)定義信號(hào)量標(biāo)識(shí)int main()int chld,i,j;/*定義數(shù)據(jù)構(gòu)造定義數(shù)據(jù)構(gòu)造*/struct sembuf P,V;union semun arg;/*創(chuàng)建只含有一個(gè)互斥信號(hào)量元素的信號(hào)量集創(chuàng)建只含有一個(gè)互斥信號(hào)量元素的信號(hào)量集*/mutexid=semget(IPC_PRIVATE,1,0666|IPC_CREAT);/*為信號(hào)量賦初值為信號(hào)量賦初值*/arg.val=1;if(semctl(mutexid,0,SETVAL,arg)=-1)pe
22、rror(semctl setval error); /*定義定義P、V操作操作*/P.sem_num=0;P.sem_op=-1;P.sem_flg=SEM_UNDO;V.sem_num=0;V.sem_op=1;V.sem_flg=SEM_UNDO;while(chld=fork()=-1); /創(chuàng)建子進(jìn)程創(chuàng)建子進(jìn)程if(chld0) /父進(jìn)程前往父進(jìn)程前往i=1;while(i=3)/循環(huán)循環(huán)3次次sleep(1);semop(mutexid,&P,1); /進(jìn)入臨界區(qū)前執(zhí)行進(jìn)入臨界區(qū)前執(zhí)行P操作操作printf(prnt inn);sleep(1);printf(prnt ou
23、tn);semop(mutexid,&V,1); /出臨界區(qū)執(zhí)行出臨界區(qū)執(zhí)行V操作操作i+;wait(0);/等待子進(jìn)程終止等待子進(jìn)程終止semctl(mutexid,IPC_RMID,0);/吊銷信號(hào)量吊銷信號(hào)量exit(0);else/子進(jìn)程前往子進(jìn)程前往j=1;while(j=3)/循環(huán)循環(huán)3次次sleep(1);semop(mutexid,&P,1); /進(jìn)入臨界區(qū)前執(zhí)行進(jìn)入臨界區(qū)前執(zhí)行P操作操作printf(chld inn);sleep(1);printf(chld outn);semop(mutexid,&V,1); /出臨界區(qū)執(zhí)行出臨界區(qū)執(zhí)行V操作操作j
24、+;exit(0);/子進(jìn)程終止子進(jìn)程終止編譯銜接及運(yùn)轉(zhuǎn)結(jié)果:編譯銜接及運(yùn)轉(zhuǎn)結(jié)果:利用信號(hào)量實(shí)現(xiàn)進(jìn)程同步利用信號(hào)量實(shí)現(xiàn)進(jìn)程同步例例4-10 父進(jìn)程創(chuàng)建一個(gè)子進(jìn)程,父子進(jìn)程共享一個(gè)存儲(chǔ)區(qū),子進(jìn)程向共享存儲(chǔ)父進(jìn)程創(chuàng)建一個(gè)子進(jìn)程,父子進(jìn)程共享一個(gè)存儲(chǔ)區(qū),子進(jìn)程向共享存儲(chǔ)區(qū)中以覆蓋方式寫信息,父進(jìn)程從該共享存儲(chǔ)區(qū)中讀信息并顯示信息。父子區(qū)中以覆蓋方式寫信息,父進(jìn)程從該共享存儲(chǔ)區(qū)中讀信息并顯示信息。父子進(jìn)程輪番讀寫,即子進(jìn)程寫一個(gè)信息到共享內(nèi)存中,父進(jìn)程從中讀該信息輸進(jìn)程輪番讀寫,即子進(jìn)程寫一個(gè)信息到共享內(nèi)存中,父進(jìn)程從中讀該信息輸出;然后子進(jìn)程再寫第出;然后子進(jìn)程再寫第2個(gè)信息,父進(jìn)程再讀出第個(gè)信息,
25、父進(jìn)程再讀出第2個(gè)信息輸出,如圖個(gè)信息輸出,如圖4 6所所示。當(dāng)信息為示。當(dāng)信息為“end時(shí)讀寫進(jìn)程終了。時(shí)讀寫進(jìn)程終了。父進(jìn)程父進(jìn)程子進(jìn)程子進(jìn)程單緩沖區(qū)單緩沖區(qū)圖圖4 6 單緩沖區(qū)同步問(wèn)題單緩沖區(qū)同步問(wèn)題利用信號(hào)量實(shí)現(xiàn)進(jìn)程同步利用信號(hào)量實(shí)現(xiàn)進(jìn)程同步同步分析:同步分析:這是一個(gè)單緩沖區(qū)同步問(wèn)題,在第這是一個(gè)單緩沖區(qū)同步問(wèn)題,在第3章中曾經(jīng)討論過(guò)這類問(wèn)題的同步算章中曾經(jīng)討論過(guò)這類問(wèn)題的同步算法,讀寫緩沖區(qū)的兩個(gè)進(jìn)程之間只需求同步不需求互斥,請(qǐng)參閱法,讀寫緩沖區(qū)的兩個(gè)進(jìn)程之間只需求同步不需求互斥,請(qǐng)參閱3.3.6節(jié)中的單緩沖區(qū)同步問(wèn)題。節(jié)中的單緩沖區(qū)同步問(wèn)題。同步算法:同步算法:子進(jìn)程執(zhí)行條件為單
26、緩沖區(qū)有空,設(shè)信號(hào)量子進(jìn)程執(zhí)行條件為單緩沖區(qū)有空,設(shè)信號(hào)量empty,初值為,初值為1;父進(jìn)程執(zhí)行條件為單緩沖區(qū)有數(shù),設(shè)信號(hào)量父進(jìn)程執(zhí)行條件為單緩沖區(qū)有數(shù),設(shè)信號(hào)量full,初值為,初值為0;上述信號(hào)量可以由父進(jìn)程定義、懇求、初始化,然后由父子進(jìn)程共享運(yùn)上述信號(hào)量可以由父進(jìn)程定義、懇求、初始化,然后由父子進(jìn)程共享運(yùn)用,子進(jìn)程終了后由父進(jìn)程吊銷。用,子進(jìn)程終了后由父進(jìn)程吊銷。共享內(nèi)存設(shè)計(jì):共享內(nèi)存設(shè)計(jì):父子進(jìn)程共享一個(gè)內(nèi)存區(qū),可以由父進(jìn)程懇求、附接,然后由父子進(jìn)程父子進(jìn)程共享一個(gè)內(nèi)存區(qū),可以由父進(jìn)程懇求、附接,然后由父子進(jìn)程共享運(yùn)用,子進(jìn)程終了后由父進(jìn)程吊銷。共享運(yùn)用,子進(jìn)程終了后由父進(jìn)程吊銷。
27、程序清單,文件名為程序清單,文件名為sem2.c:#include#include#include#include#include#include#include/*定義信號(hào)量?jī)?nèi)部標(biāo)識(shí)定義信號(hào)量?jī)?nèi)部標(biāo)識(shí)*/int emptyid;int fullid;main()int chld,i,j;/*定義信號(hào)量數(shù)據(jù)構(gòu)造定義信號(hào)量數(shù)據(jù)構(gòu)造*/struct sembuf P,V;union semun arg;/*定義共享內(nèi)存定義共享內(nèi)存*/int shmid;char *viraddr;char bufferBUFSIZ; /*創(chuàng)建信號(hào)量并初始化創(chuàng)建信號(hào)量并初始化*/emptyid=semget(IPC
28、_PRIVATE,1,IPC_CREAT|0666);fullid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);arg.val=1;if(semctl(emptyid,0,SETVAL,arg)=-1)perror(semctl setval error);arg.val=0;if(semctl(fullid,0,SETVAL,arg)=-1)perror(semctl setval error);/*定義定義P、V操作操作*/P.sem_num=0;P.sem_op=-1;P.sem_flg=SEM_UNDO;V.sem_num=0;V.sem_op=1;V.s
29、em_flg=SEM_UNDO;/*創(chuàng)建并附接共享內(nèi)存創(chuàng)建并附接共享內(nèi)存*/shmid=shmget(IPC_PRIVATE,BUFSIZ,0666|IPC_CREAT);viraddr=(char*)shmat(shmid,0,0);while(chld=fork()=-1);/創(chuàng)建子進(jìn)程創(chuàng)建子進(jìn)程if(chld0)/父進(jìn)程前往讀信息并輸出父進(jìn)程前往讀信息并輸出 while(1) semop(fullid,&P,1);/對(duì)對(duì)fullid執(zhí)行執(zhí)行P操作操作printf(Your message is:n%s,viraddr);semop(emptyid,&V,1);/對(duì)對(duì)emp
30、tyid執(zhí)行執(zhí)行V操作操作if(strncmp(viraddr,end,3)=0)break; wait(0);/等待子進(jìn)程終止等待子進(jìn)程終止shmdt(viraddr);/斷開附接的共享內(nèi)存斷開附接的共享內(nèi)存shmctl(shmid,IPC_RMID,0);/吊銷共享內(nèi)存和信號(hào)量集吊銷共享內(nèi)存和信號(hào)量集semctl(emptyid,IPC_RMID,0);semctl(fullid,IPC_RMID,0);printf(Parent ok!n);exit(0);else/子進(jìn)程前往寫信息到共享內(nèi)存子進(jìn)程前往寫信息到共享內(nèi)存while(1)semop(emptyid,&P,1);/對(duì)對(duì)
31、emptyid執(zhí)行執(zhí)行P操作操作puts(Enter your text:);fgets(buffer,BUFSIZ,stdin);/鍵盤輸入信息鍵盤輸入信息strcpy(viraddr,buffer); /寫信息到共享內(nèi)存中覆蓋方式寫信息到共享內(nèi)存中覆蓋方式semop(fullid,&V,1);/對(duì)對(duì)fullid執(zhí)行執(zhí)行V操作操作if(strncmp(viraddr,end,3)=0)sleep(1); /睡眠睡眠1秒,等待父進(jìn)程將秒,等待父進(jìn)程將end取走取走break;printf(Child ok!n);exit(0);運(yùn)轉(zhuǎn)結(jié)果:運(yùn)轉(zhuǎn)結(jié)果:由結(jié)果可以看出,子進(jìn)程寫到單緩沖區(qū)中的
32、信息,父進(jìn)程都依次取出由結(jié)果可以看出,子進(jìn)程寫到單緩沖區(qū)中的信息,父進(jìn)程都依次取出并輸出了。并輸出了。利用信號(hào)量實(shí)現(xiàn)進(jìn)程同步利用信號(hào)量實(shí)現(xiàn)進(jìn)程同步例例4-11 設(shè)父進(jìn)程創(chuàng)建一個(gè)子進(jìn)程作為消費(fèi)者,創(chuàng)建兩個(gè)子進(jìn)程作為消設(shè)父進(jìn)程創(chuàng)建一個(gè)子進(jìn)程作為消費(fèi)者,創(chuàng)建兩個(gè)子進(jìn)程作為消費(fèi)者,這三個(gè)子進(jìn)程運(yùn)用一個(gè)共享內(nèi)存,該共享內(nèi)存定義為具有費(fèi)者,這三個(gè)子進(jìn)程運(yùn)用一個(gè)共享內(nèi)存,該共享內(nèi)存定義為具有5個(gè)個(gè)變量的數(shù)組,每個(gè)變量表示一個(gè)緩沖區(qū),緩沖區(qū)號(hào)為變量的數(shù)組,每個(gè)變量表示一個(gè)緩沖區(qū),緩沖區(qū)號(hào)為04。消費(fèi)者進(jìn)。消費(fèi)者進(jìn)程依次往緩沖區(qū)程依次往緩沖區(qū)04中寫中寫10個(gè)數(shù)據(jù)個(gè)數(shù)據(jù)110,兩個(gè)讀進(jìn)程依次從緩沖區(qū),兩個(gè)讀進(jìn)程
33、依次從緩沖區(qū)04中輪番取出這中輪番取出這10個(gè)數(shù)據(jù)。運(yùn)用信號(hào)量實(shí)現(xiàn)進(jìn)程讀寫緩沖區(qū)的同個(gè)數(shù)據(jù)。運(yùn)用信號(hào)量實(shí)現(xiàn)進(jìn)程讀寫緩沖區(qū)的同步和互斥。步和互斥。消費(fèi)者消費(fèi)者同步問(wèn)題消費(fèi)者消費(fèi)者同步問(wèn)題消費(fèi)者消費(fèi)者A進(jìn)程進(jìn)程消費(fèi)者消費(fèi)者B進(jìn)程進(jìn)程消費(fèi)者進(jìn)程消費(fèi)者進(jìn)程01324利用信號(hào)量實(shí)現(xiàn)進(jìn)程同步利用信號(hào)量實(shí)現(xiàn)進(jìn)程同步分析:分析:需求創(chuàng)建需求創(chuàng)建3個(gè)子進(jìn)程:消費(fèi)者、消費(fèi)者個(gè)子進(jìn)程:消費(fèi)者、消費(fèi)者A、消費(fèi)者、消費(fèi)者B;需求運(yùn)用需求運(yùn)用3個(gè)信號(hào)量:個(gè)信號(hào)量:empty、full、mutex,分別表示緩,分別表示緩沖區(qū)能否有空、能否有數(shù)和互斥信號(hào)量,其初值分別為:沖區(qū)能否有空、能否有數(shù)和互斥信號(hào)量,其初值分別為:5,0,1;需求需求2個(gè)共享內(nèi)存:個(gè)共享內(nèi)存:array和和get,分別表示多緩沖區(qū)數(shù)組
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年防火門研發(fā)生產(chǎn)與安裝銷售合同2篇
- 2025年新能源儲(chǔ)能技術(shù)研發(fā)與投資合同4篇
- 二人共營(yíng)足療店:2024年版合作合同書版B版
- 二零二五版臨時(shí)工工作場(chǎng)所安全與健康協(xié)議4篇
- 二零二五年度股權(quán)激勵(lì)與員工持股平臺(tái)設(shè)立協(xié)議3篇
- 二零二五版商業(yè)房產(chǎn)反擔(dān)保合同模板(投資合作)2篇
- 視覺(jué)氣動(dòng)Delta機(jī)器人協(xié)作甘薯抓取技術(shù)研究
- 個(gè)人二手挖掘機(jī)交易合同(2024年版)2篇
- 二手鋼鐵材料采購(gòu)協(xié)議范本(2024年版)版B版
- 跨境電商綜試區(qū)對(duì)長(zhǎng)三角產(chǎn)業(yè)結(jié)構(gòu)優(yōu)化的影響研究
- 英語(yǔ)名著閱讀老人與海教學(xué)課件(the-old-man-and-the-sea-)
- 學(xué)校食品安全知識(shí)培訓(xùn)課件
- 全國(guó)醫(yī)學(xué)博士英語(yǔ)統(tǒng)一考試詞匯表(10000詞全) - 打印版
- 最新《會(huì)計(jì)職業(yè)道德》課件
- DB64∕T 1776-2021 水土保持生態(tài)監(jiān)測(cè)站點(diǎn)建設(shè)與監(jiān)測(cè)技術(shù)規(guī)范
- ?中醫(yī)院醫(yī)院等級(jí)復(fù)評(píng)實(shí)施方案
- 數(shù)學(xué)-九宮數(shù)獨(dú)100題(附答案)
- 理正深基坑之鋼板樁受力計(jì)算
- 學(xué)校年級(jí)組管理經(jīng)驗(yàn)
- 10KV高壓環(huán)網(wǎng)柜(交接)試驗(yàn)
- 未來(lái)水電工程建設(shè)抽水蓄能電站BIM項(xiàng)目解決方案
評(píng)論
0/150
提交評(píng)論