电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

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

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

標(biāo)簽: Unix系統(tǒng)
主站蜘蛛池模板: 爆炸冲击传感器-无线遥测传感器-航天星百科 | 深圳宣传片制作-企业宣传视频制作-产品视频拍摄-产品动画制作-短视频拍摄制作公司 | 天命文免费算命堂_自助算命_自由算命系统_长文周易 | 香港新时代国际美容美发化妆美甲培训学校-26年培训经验,值得信赖! | 【德信自动化】点胶机_全自动点胶机_自动点胶机厂家_塑料热压机_自动螺丝机-深圳市德信自动化设备有限公司 | 香港新时代国际美容美发化妆美甲培训学校-26年培训经验,值得信赖! | 合肥升降机-合肥升降货梯-安徽升降平台「厂家直销」-安徽鼎升自动化科技有限公司 | 南京办公用品网-办公文具用品批发-打印机耗材采购 | 沈阳网站建设_沈阳网站制作_沈阳网页设计-做网站就找示剑新零售 沈阳缠绕膜价格_沈阳拉伸膜厂家_沈阳缠绕膜厂家直销 | 铣床|万能铣床|立式铣床|数控铣床|山东滕州万友机床有限公司 | 北京晚会活动策划|北京节目录制后期剪辑|北京演播厅出租租赁-北京龙视星光文化传媒有限公司 | 搪瓷反应釜厂家,淄博搪瓷反应釜-淄博卓耀 | 高博医疗集团上海阿特蒙医院| 辐射仪|辐射检测仪|辐射巡测仪|个人剂量报警仪|表面污染检测仪|辐射报警仪|辐射防护网 | 不锈钢列管式冷凝器,换热器厂家-无锡飞尔诺环境工程有限公司 | 中细软知识产权_专业知识产权解决方案提供商 | 合肥网络推广_合肥SEO网站优化-安徽沃龙First | 双杰天平-国产双杰电子天平-美国双杰-常熟双杰仪器 | 贵州成人高考网_贵州成考网 | 政府园区专业委托招商平台_助力企业选址项目快速落地_东方龙商务集团 | 广东恩亿梯电源有限公司【官网】_UPS不间断电源|EPS应急电源|模块化机房|电动汽车充电桩_UPS电源厂家(恩亿梯UPS电源,UPS不间断电源,不间断电源UPS) | 金属波纹补偿器厂家_不锈钢膨胀节价格_非金属伸缩节定制-庆达补偿器 | 杭州营业执照代办-公司变更价格-许可证办理流程_杭州福道财务管理咨询有限公司 | 杭州代理记账费用-公司注销需要多久-公司变更监事_杭州福道财务管理咨询有限公司 | 滚塑PE壳体-PE塑料浮球-警示PE浮筒-宁波君益塑业有限公司 | 对夹式止回阀_对夹式蝶形止回阀_对夹式软密封止回阀_超薄型止回阀_不锈钢底阀-温州上炬阀门科技有限公司 | 飞扬动力官网-广告公司管理软件,广告公司管理系统,喷绘写真条幅制作管理软件,广告公司ERP系统 | 春腾云财 - 为企业提供专业财税咨询、代理记账服务 | 窖井盖锯圆机_锯圆机金刚石锯片-无锡茂达金刚石有限公司 | 水上浮桥-游艇码头-浮动码头-游船码头-码瑞纳游艇码头工程 | [品牌官网]贵州遵义双宁口腔连锁_贵州遵义牙科医院哪家好_种植牙_牙齿矫正_原华美口腔 | 蜘蛛车-登高车-高空作业平台-高空作业车-曲臂剪叉式升降机租赁-重庆海克斯公司 | 小型UV打印机-UV平板打印机-大型uv打印机-UV打印机源头厂家 |松普集团 | 3d可视化建模_三维展示_产品3d互动数字营销_三维动画制作_3D虚拟商城 【商迪3D】三维展示服务商 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 | 湖南自考_湖南自学考试网 | 杜甫仪器官网|实验室平行反应器|升降水浴锅|台式低温循环泵 | 2025世界机器人大会_IC China_半导体展_集成电路博览会_智能制造展览网 | 深圳市东信高科自动化设备有限公司 | 生鲜配送系统-蔬菜食材配送管理系统-连锁餐饮订货配送软件-挪挪生鲜供应链管理软件 | 岩棉板|岩棉复合板|聚氨酯夹芯板|岩棉夹芯板|彩钢夹芯板-江苏恒海钢结构 | 安徽免检低氮锅炉_合肥燃油锅炉_安徽蒸汽发生器_合肥燃气锅炉-合肥扬诺锅炉有限公司 |