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

您的位置:首頁技術文章
文章詳情頁

UNIX多用戶系統下信號量操作詳解

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

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

標簽: Unix系統
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产一区福利| 欧美韩一区二区| 国产不卡一区| 欧美xxxx性| 国产精品乱战久久久| 奇米亚洲欧美| 久久精品超碰| 国产激情一区| 国产激情在线播放| 日韩天堂在线| 正在播放日韩精品| 亚洲不卡av不卡一区二区| 久久九九电影| 激情综合网五月| 亚洲成人三区| 六月丁香综合| 人人精品久久| 国产精品v一区二区三区| 美女久久99| 首页国产精品| 亚洲不卡av不卡一区二区| 欧美1区2区3区| 国产精品呻吟| 欧美亚洲自偷自偷| 国产 日韩 欧美 综合 一区| 成人国产精品一区二区免费麻豆| 午夜久久中文| 国产亚洲高清视频| 日韩精彩视频在线观看| 久久精品国产99国产| 91精品国产福利在线观看麻豆| 亚洲成人精品| 在线精品福利| 国产精品成人国产| 亚洲va在线| 中文字幕免费一区二区| 日韩av在线播放中文字幕| 精品国内亚洲2022精品成人| 激情自拍一区| 日本伊人午夜精品| 久久国产精品免费一区二区三区| 久久亚洲黄色| 亚洲香蕉网站| 日韩欧美激情电影| 9999国产精品| 久久99伊人| 捆绑调教美女网站视频一区 | 视频一区日韩| 精品一二三区| 亚洲深夜福利| 老司机精品在线| 国产精品97| 日韩高清二区| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 99精品综合| 亚洲婷婷丁香| 成人精品国产亚洲| 一区二区三区网站| 麻豆一区二区在线| 国产91久久精品一区二区| 日韩在线麻豆| 久久久国产亚洲精品| 日韩极品在线观看| 99久久激情| 国产精品一区亚洲| 黄色成人在线网址| 精品中国亚洲| 亚洲伊人精品酒店| 久久激情一区| 久久av免费看| 9色国产精品| 黄色欧美在线| 亚洲精品无播放器在线播放| 日韩国产一区二区三区| 亚洲午夜免费| 免费高潮视频95在线观看网站| 亚洲精品动态| 伊人久久大香线蕉av不卡| 国产精品99久久免费观看| 亚洲精品a级片| 91一区二区| 国产欧美69| 久久亚洲影院| 在线日韩电影| 精品中文字幕一区二区三区| 亚洲日本国产| 欧美在线资源| sm捆绑调教国产免费网站在线观看| 日韩av电影一区| 欧美/亚洲一区| 98精品视频| 麻豆精品在线观看| 欧美永久精品| 免费的成人av| 不卡在线一区| 天堂中文av在线资源库| 欧美激情视频一区二区三区免费 | 国产欧美精品| 中文在线不卡| 久久久久欧美精品| 久久国产欧美日韩精品| 日韩在线播放一区二区| 日韩精品首页| 国语精品一区| 免费在线观看一区| 亚洲91网站| 天堂成人免费av电影一区 | 国产精品v亚洲精品v日韩精品| 蜜臀久久99精品久久久久宅男| 久久三级福利| 国语精品一区| 久久中文字幕一区二区三区| 日韩二区三区在线观看| 亚洲美女久久| 亚洲永久精品唐人导航网址| 亚洲欧美日韩国产一区| 欧美网站在线| 欧美美女一区| 欧美亚洲国产激情| 99精品一区| 国产精品av久久久久久麻豆网| 欧美13videosex性极品| а√天堂8资源中文在线| 麻豆精品久久久| 美女精品久久| 国产精品综合色区在线观看| 日韩av二区在线播放| 日韩高清一区| 日韩1区2区日韩1区2区| 欧美亚洲免费| 欧美精品影院| 国产精品tv| 国产精品99一区二区三区| 国产 日韩 欧美 综合 一区| 91嫩草亚洲精品| 成人看片网站| 亚洲精品一区二区妖精| 亚洲深夜av| 一区二区国产在线观看| 亚洲69av| 欧美一区二区三区久久精品| 国产日韩欧美在线播放不卡| 欧美国产中文高清| 韩国久久久久久| 在线日韩电影| 欧美专区一区二区三区| 日韩中文av| 嫩呦国产一区二区三区av| av中文字幕在线观看第一页| 欧美日韩中文一区二区| 丝袜亚洲精品中文字幕一区| 亚洲图片久久| 久久99蜜桃| 日韩在线短视频| 亚洲作爱视频| 亚洲18在线| 麻豆精品蜜桃视频网站| 日韩在线观看一区二区| 日本不卡一区二区三区| 精品欧美视频| 亚洲在线免费| 一区二区三区四区精品视频| 国产欧美日韩在线一区二区| 精品高清久久| 国产在线不卡| 中文字幕中文字幕精品| 国产美女视频一区二区| 深夜福利视频一区二区| 99在线观看免费视频精品观看| 亚洲乱码一区| 日韩高清中文字幕一区| 精品伊人久久久| 欧美午夜不卡影院在线观看完整版免费| 亚洲免费毛片| 国产精品二区不卡| 国产精品免费看| 国产高清日韩| 欧美福利在线| 日本视频在线一区| 欧美片第1页| 亚洲精品在线国产| 成人在线视频免费| 蜜桃av一区二区| 成人亚洲一区二区| 免费人成在线不卡| 九九99久久精品在免费线bt| 国产亚洲网站| 久久亚州av| 老司机久久99久久精品播放免费| 麻豆91精品91久久久的内涵| 91精品电影| 精品日本视频| 亚洲日韩中文字幕一区| 日韩精品电影| 国产亚洲精品美女久久久久久久久久| 91精品国产91久久久久久黑人| 91九色综合| 99热精品在线| 中文字幕在线官网| 欧美亚洲tv|