日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

UNIX多用戶系統(tǒng)下信號量操作詳解

瀏覽:40日期:2024-06-09 09:16:27

資源共享是Unix多用戶系統(tǒng)的一個重要特征,信號量(SEMAPHORE)則是防止兩個或多個進程同時訪問共享資源的一種機制。在信號量機制實現(xiàn)之前,通常采用加鎖文件的方法,其算法描述如下: ⑴加鎖算法 int lock(lockfile) /*返回值0代表成功,其它為失敗*/ char *lockfile; /*加鎖文件名*/ { intfd,ret=0; extern int errno; if((fd=open(lockfile,O_WRONLY|O_CREAT|O_EXCL,0666))==-1 &&errno==EEXIST) ret=1; return(ret); } ⑵解鎖算法 unlock(lockfile) char *lockfile; /*鎖文件名*/ { unlink(lockfile); } 這種方法對訪問共享資源次數(shù)較少的進程是可行的,但對重載的使用則開銷太大了,況且一旦加鎖失敗則進程不知何時可以再試;當系統(tǒng)崩潰或重啟動時,加鎖文件可能會被忘掉了。 Dijkstra發(fā)表的Dekker算法給出了信號量的一種實現(xiàn),為整值對象定義了兩個了原語操作:P和V。其C描述如下: void P(sem) int *sem; { while (*sem<=0); (*sem)--; } void V(sem) int *sem; { (*sem)++; } 但上述算法不能在用戶空間編程,因為①sem指向的信號量變量不能在進程間共享,它們有自己的數(shù)據(jù)段;②函數(shù)非原子執(zhí)行,內(nèi)核可在任何時候中斷一個進程;③若sem為0,進程并不釋放CPU。 所以信號量必須由內(nèi)核提供,它可在進程間共享數(shù)據(jù),可執(zhí)行原子操作(即一組操作要么全部執(zhí)行,要么都不執(zhí)行),可在一個進程阻塞時將CPU給另外一個進程。 UNIXSYSTEMV以一個長整數(shù)的鍵值作為信號量集合的唯一標識,信號量通常由下列元素組成: ①信號量的值, ②操作該信號量的最后一個進程的進程標識, ③等待增加該信號量的值的進程數(shù), ④等待該信號量的值為0的進程數(shù)。 與之有關(guān)的系統(tǒng)調(diào)用如下: #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget(key,count,flags) /*獲取信號量集合的標識符*/ key_tkey; /*信號量集合的鍵*/ intcount; /*信號量集合中元素個數(shù)*/ intflags; /*任選參數(shù)*/ /*返回信號量集合標識符,若出錯則返回-1*/ int semop(sid,ops,nops) /*信號量操作*/ int sid; /*信號量集合標識符*/ struct sembuf *ops; /*信號量操作結(jié)構(gòu)的指針*/ intnops; /*信號量操作結(jié)構(gòu)的個數(shù)*/ /*返回運算完成前該組信號量中最后一個被運算的信號量的 值,若出錯則返回-1*/ int semctl(sid,semnum,cmd,arg) /*控制信號量操作*/ intsid; /*信號量集合標識符*/ intsemnum; /*信號量元素編號*/ intcmd; /*控制命令*/ union semun{ intval; struct semid_ds *buf; ushort*array;} arg; /*命令參數(shù)*/ 系統(tǒng)調(diào)用semget用來把信號量集合的鍵值譯成代表信號量集合的標識符,該集合中有count個元素,其存取權(quán)限定義與文件相同,由flags定義。若flags的IPC_CREAT位被置位,則當該集合不存在時系統(tǒng)就創(chuàng)建之。因此各進程可都用置IPC_CREAT位的flags參數(shù)來獲取信號量集合的標識符,不需要由某一進程事先創(chuàng)建。若flags為IPC_PRIDVATE則不管同鍵值的信號量集合是否存在系統(tǒng)都建立之,并返回下一個可用的標識符。 系統(tǒng)調(diào)用semctl在一組信號量上做各種控制操作,諸如信號量集合的初始化、刪除和狀態(tài)查詢等。常用的操作及相關(guān)的命令格式如下: ①取消信號量集合 int semctl(sid,count,IPC_RMID,0) int sid; /*信號量集合標識符*/ int count; /*信號量集合中元素個數(shù)*/ ②設置信號量集合的初值(初始化) 信號量集合剛建立時,各信號量的初值不確定,需要設定初值。初值的設定可用SETALL或SETVAL命令。若用SETALL命令,其格式為: int semctl(sid,count,SETALL,arg) int sid; /*信號量集合標識符*/ int count; /*信號量集合中元素個數(shù)*/ ushort *arg; /*命令參數(shù)*/ 該命令把數(shù)組arg中的前count個值依次賦給集合中各信號量,一次可設定多個信號量的初值。 若用SETVAL命令,其格式為: int semctl(sid,semnum,SETVAL,arg) int sid; /*信號量集合標識符*/ int semnum; /*信號量元素編號*/ int arg; /*命令參數(shù)*/ 該命令將arg的值賦給集合中第semnum個信號量,一次僅能設定一個信號量的初值。 ③查詢信號量集合的當前值 查詢信號量集合的當前值可用GETALL或GETVAL命令。若用GETALL命令,其格式為: int semctl(sid,count,GETALL,arg) int sid; /*信號量集合標識符*/ int count; /*信號量集合中元素個數(shù)*/ ushort *arg; /*命令參數(shù)*/ 該命令把信號量集合中各信號量的當前值返回到數(shù)組arg中。 若用GETVAL命令,其格式為: int semctl(sid,semnum,GETVAL,0) int sid; /*信號量集合標識符*/ int semnum; /*信號量元素編號*/ 該命令把集合中第semnum個信號量的當前值作為調(diào)用的返回值。 ④查詢某個信號量的等待進程數(shù) 當一個進程要執(zhí)行信號量操作時若條件不具備則被阻塞,有關(guān)信號量的等待進程數(shù)也相應變化。 通過GETNCNT命令可查詢等待信號量增值的進程數(shù),其格式如下: int semctl(sid,semnum,GETNCNT,0) int sid; /*信號量集合標識符*/ int semnum; /*信號量元素編號*/ 該命令把等待第semnum個信號量增值的進程數(shù)作為調(diào)用的返回值。 通過GETZCNT命令可查詢等待信號量值為0的進程數(shù),其格式如下: int semctl(sid,semnum,GETZCNT,0) int sid; /*信號量集合標識符*/ int semnum; /*信號量元素編號*/ 該命令把等待第semnum個信號量值為0的進程數(shù)作為調(diào)用的返回值。 至于其它的控制命令,因不常用而不再累述。 系統(tǒng)調(diào)用semop用來對信號量集合中的一個或多個信號量進行操作,操作命令由用戶提供的操作結(jié)構(gòu)數(shù)組來定義,該結(jié)構(gòu)如下: struct sembuf{ short sem_num; /*信號量在集合中的下標*/ short sem_op; /*操作值*/ short sem_flg; /*操作標志*/ }; 系統(tǒng)從用戶地址空間讀信號量操作結(jié)構(gòu)數(shù)組,并核實信號量下標的合法性及進程是否具備讀或修改信號量所必需的權(quán)限。若權(quán)限不夠則調(diào)用失敗;若進程必須睡眠,則它將已操作過的信號量恢復為該系統(tǒng)調(diào)用開始時的值,然后它就睡眠,直到它等待的事件發(fā)生時再重新執(zhí)行該系統(tǒng)調(diào)用。由于系統(tǒng)將操作數(shù)組保存在一個全局數(shù)組中,因此若它必須重新執(zhí)行該調(diào)用的話,它必須重新從用戶空間讀該數(shù)組。這樣,操作按原語方式執(zhí)行--或一次做完或根本不做。 系統(tǒng)根據(jù)操作值來改變信號量的值:①若操作值為正,系統(tǒng)就增加信號量的值并喚醒所有等待信號量增值的進程;②若操作值是0,系統(tǒng)就檢查信號量的值:如果為0,就繼續(xù)數(shù)組中的其它操作;否則把等待信號量的值為0的睡眠進程數(shù)加1,然后睡眠;③若操作值為負且其絕對值不超過信號量的值,系統(tǒng)就把操作值(一個負數(shù))加到信號量值上,如果結(jié)果為0則系統(tǒng)就喚醒所有等待信號量的值為0的睡眠進程;④若信號量的值小于操作值的絕對值,系統(tǒng)就讓進程睡眠在'等待信號量增值'這一事件上。 當進程在信號量操作過程中睡眠時,它睡眠在可中斷級上,因此當它接收到軟中斷信號時就被喚醒了。用戶可在操作標志中設置IPC_NOWAIT標志以防止進程睡眠。 如果進程執(zhí)行了一個信號量操作,鎖住了某些資源,卻沒有恢復信號量的值就退出了(如收到kill信號),那么就可能出現(xiàn)危險情況。為了避免這類問題,用戶可在操作標志中設置SEM_UNDO標志。當進程退出時,系統(tǒng)便撤除該進程做過的每個信號量操作的影響。 值得指出的是,當你使用兩個或多個信號量時,死鎖總是可能的,系統(tǒng)并不能檢查多個信號量間的死鎖。 本文所用算法及調(diào)用格式均已在SCOUNIX3.2、SCOOpenSever3.X及5.X上運行通過。

標簽: Unix系統(tǒng)
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产999精品在线观看| 亚洲深夜福利| 日韩综合小视频| 天堂久久一区| 亚洲三级国产| 国产精品v一区二区三区| 麻豆精品少妇| 日韩av一级| 久久亚洲国产| 蜜桃视频在线观看一区| 7777精品| 天堂а√在线最新版中文在线| 亚洲成人不卡| 香蕉成人久久| 免费一级欧美在线观看视频| 亚洲一级少妇| 五月亚洲婷婷 | 亚洲国内精品| 亚洲精品三级| 国精品产品一区| 91成人精品| 国产亚洲一卡2卡3卡4卡新区| 9999国产精品| 丝袜诱惑制服诱惑色一区在线观看 | 免费不卡中文字幕在线| 亚洲乱码一区| 精品国产乱码久久久久久1区2匹 | 韩国久久久久久| 国产一区久久| 国产免费播放一区二区| 免费污视频在线一区| 日韩在线黄色| 九九精品调教| 久久国产精品色av免费看| 伊人久久国产| 亚洲精品日本| 午夜精品久久久久久久久久蜜桃| 亚洲开心激情| 四虎影视精品| 国产精品视频一区视频二区| 欧美 日韩 国产一区二区在线视频| 日韩高清在线不卡| 精品一区在线| 美女在线视频一区| 水野朝阳av一区二区三区| 黄色欧美在线| 亚洲乱码视频| 亚洲国产不卡| 97精品97| 国产视频一区二| 欧美午夜不卡| 欧美丰满日韩| 欧美性www| 久久av在线| 视频福利一区| 国产一区二区三区成人欧美日韩在线观看 | 狠狠操综合网| 激情不卡一区二区三区视频在线| 亚洲一级淫片| 欧美99久久| 四虎国产精品免费观看| 日韩精品视频一区二区三区| 亚洲欧美伊人| 成人精品高清在线视频| 97久久超碰| 综合一区在线| 先锋影音久久久| 国产一区二区中文| 精品国产美女a久久9999| 97成人超碰| 蜜桃免费网站一区二区三区| 久久视频精品| 久久久久99| 亚洲欧洲高清| 精品资源在线| 国产精品视频一区二区三区| 日韩专区欧美专区| 欧美日韩国产一区精品一区| 五月激情久久| 国产成年精品| 久久精品国产免费| 欧美a在线观看| 国产精久久一区二区| 国产乱码精品一区二区三区亚洲人| 亚洲ww精品| 日韩三区四区| 亚洲人成网77777色在线播放| 视频在线观看91| 蜜桃伊人久久| 蜜臀久久99精品久久久画质超高清| 91精品高清| 日韩视频一区二区三区在线播放免费观看 | 在线视频免费在线观看一区二区| 久久精品系列| 国产精品久久久久久久久久齐齐| 成人一二三区| 日韩精品一区二区三区中文 | 免费成人在线观看| 亚洲专区视频| 日本aⅴ精品一区二区三区| 日韩精品久久久久久久软件91| 亚洲日本免费电影| 日韩av不卡在线观看| 国产欧美一区二区精品久久久| 国产精品一区二区av交换| 日韩成人在线看| 日韩激情网站| 国产精成人品2018| 国产一区不卡| 日韩国产在线| 亚洲精品2区| 蜜臀国产一区二区三区在线播放| 亚洲欧洲美洲国产香蕉| 日韩不卡免费视频| 久久不见久久见中文字幕免费| 精品视频99| 91精品在线观看国产| 好吊日精品视频| 日韩成人午夜精品| 激情中国色综合| 91精品一区国产高清在线gif| 国产日韩综合| 欧美久久香蕉| 国产aⅴ精品一区二区三区久久| 日韩成人a**站| 国产韩日影视精品| 婷婷综合一区| 欧美国产美女| 日韩专区一卡二卡| 国内精品美女在线观看| 尤物在线精品| 国产精品久久久免费| av资源亚洲| 热久久国产精品| 麻豆中文一区二区| 国产午夜精品一区二区三区欧美| 日韩高清中文字幕一区| 色爱综合网欧美| 免费人成黄页网站在线一区二区| 欧美日韩一区二区三区四区在线观看 | 日韩1区2区日韩1区2区| 荡女精品导航| 9色精品在线| 久久黄色影视| 亚洲黑丝一区二区| 国产欧美高清| 久久婷婷丁香| 黄色在线观看www| 午夜日韩av| 美女久久久精品| av不卡免费看| 91免费精品| 日本不卡视频在线观看| se01亚洲视频| 国产午夜久久av| 免费av一区| 国产精品久久久久久久久久10秀| 亚洲精品无吗| 亚洲精品午夜av福利久久蜜桃| 国产精品sss在线观看av| 在线亚洲精品| 日韩中文首页| 麻豆精品蜜桃视频网站| 一区在线观看| 成人国产精选| 欧美日韩亚洲一区三区| 午夜久久福利| 日韩精品1区| 国产精品中文| 久久免费福利| 天堂av一区| 亚洲作爱视频| 99精品视频在线| 久久久91麻豆精品国产一区| 蜜桃一区二区三区在线观看| 日韩精品免费一区二区在线观看| 国产精品多人| 日韩激情中文字幕| 亚洲一区成人| 亚洲v在线看| 丁香婷婷久久| 久久av偷拍| 国产亚洲欧美日韩在线观看一区二区| 亚洲欧美日韩一区在线观看| 99久久99久久精品国产片果冰| 国产一区二区三区黄网站| 国产麻豆一区二区三区精品视频| 亚洲欧美成人综合| 久久一级电影| 亚洲h色精品| 久久久精品日韩| 成人精品亚洲| 精品捆绑调教一区二区三区| 久久99蜜桃| 国产精品亚洲欧美日韩一区在线| 日本免费新一区视频| 亚洲精品中文字幕99999| 噜噜噜躁狠狠躁狠狠精品视频| 久久精品国语| 国产99久久|