|   信號量是什么,大神全方位交給你  時間:2018-04-19作者:華清遠見 一(yi).首先我們必須知道什(shen)么是信號量 信號量的本(ben)質是數據操(cao)作(zuo)鎖,它本(ben)身不具備數據交換功能,而(er)只是用于保護進程線程之間共享的資源(yuan),實現對共享資源(yuan)的同步與(yu)互斥(chi)操(cao)作(zuo)。 信號量相當于一把鎖(suo),例如小(xiao)黑(hei)上廁所,需要檢查是(shi)否有鎖(suo),有鎖(suo)獲取鎖(suo),占用(yong)廁所坑(keng)位資源,其(qi)他(ta)人無法進此坑(keng)位,當小(xiao)黑(hei)上完廁所,需要釋放鎖(suo),其(qi)他(ta)人都可以獲取鎖(suo)。 小黑 ------》 進(jin)程 門鎖 --------》 信號量 坑位 ------》 共享資源(信(xin)號(hao)量(liang)保(bao)護對(dui)象) 二.為什么要使(shi)用(yong)信號(hao)量 為了防(fang)止出現因多個(ge)(ge)程序同時(shi)訪問(wen)(wen)一(yi)個(ge)(ge)共享資源而引發的(de)(de)一(yi)系(xi)列(lie)問(wen)(wen)題,我(wo)們需(xu)(xu)要(yao)一(yi)種(zhong)方法(fa),在任一(yi)時(shi)刻(ke)只能有一(yi)個(ge)(ge)執行進(jin)程訪問(wen)(wen)代碼的(de)(de)臨界(jie)區域;臨界(jie)區域是指執行數據(ju)更新的(de)(de)代碼需(xu)(xu)獨占式地執行。而信號量(liang)(liang)就可以提(ti)供這樣(yang)的(de)(de)一(yi)種(zhong)訪問(wen)(wen)機制,讓一(yi)個(ge)(ge)臨界(jie)區同一(yi)時(shi)間只有一(yi)個(ge)(ge)進(jin)程在訪問(wen)(wen)它,也就是說信號量(liang)(liang)是用來調協進(jin)程對共享資源的(de)(de)訪問(wen)(wen)的(de)(de)。其(qi)中(zhong)共享內存的(de)(de)使用就要(yao)用到信號量(liang)(liang)。 臨(lin)界(jie)資源(yuan)(yuan):一次(ci)只允許一個(ge)(ge)進程(一個(ge)(ge)線程)使用的資源(yuan)(yuan)叫做臨(lin)界(jie)資源(yuan)(yuan)。 臨(lin)界(jie)區:訪問臨(lin)界(jie)資(zi)源(yuan)的代碼稱為臨(lin)界(jie)區。 三.信號量分(fen)類(lei): 1.System V信(xin)號(hao)燈(IPC對象(xiang)),也叫經典(dian)ipc對象(xiang),一般用于(yu)進(jin)程通信(xin)。 2.posix基(ji)于內(nei)存的信(xin)(xin)號燈(deng)(無名信(xin)(xin)號燈(deng)),一(yi)般線程通信(xin)(xin)。 功能分類: 1.二(er)值信號量(liang):信號量(liang)的值為0或1。與互斥鎖類似,資源可用(yong)時值為1,不可用(yong)時值為0。 2.計數信號量:值在0到n之間。用(yong)來(lai)統計資(zi)源,其值代表可用(yong)資(zi)源數。 注意:system v信(xin)(xin)號(hao)(hao)量對象不(bu)是(shi)一個(ge)信(xin)(xin)號(hao)(hao)量,是(shi)一個(ge)或者多個(ge)信(xin)(xin)號(hao)(hao)量的集合(he)。對應內核中一個(ge)結構(gou)體:struct semid_ds 有一個(ge)成(cheng)員sem_base指(zhi)向(xiang)第0個(ge)信(xin)(xin)號(hao)(hao)量結構(gou)體起始(shi)地址。 
	 四.System v信號量實現(xian)步驟 -----》1、創建信號(hao)量對(dui)象 int semget(key_t key, int nsems, int semflg); Key:創建信號量對(dui)象的唯(wei)一鍵(jian)值 nsems表示(shi)的就是(shi)創建的信(xin)(xin)號(hao)量(liang)(liang)集中信(xin)(xin)號(hao)量(liang)(liang)的個數 Semflg: 權限 IPC_CREAT:存在則(ze)(ze)打開,否(fou)(fou)則(ze)(ze)創建(jian); IPC_CREAT | IPC_EXCL存在則(ze)(ze)出錯返回(hui),否(fou)(fou)則(ze)(ze)創建(jian),這 樣保證了(le) 打開的(de)是一個全新(xin)的(de)信號(hao)量集 成功:信號量集ID 失敗-1 ----》2.初始化具體信號量的值。 int semctl(int semid, int semnum, int cmd, union set); semid:信號(hao)燈(deng)集(ji)ID semnum: 要修改的信號燈編(bian)號 Cmd: GETVAL:獲取信號燈(deng)的值 SETVAL:設置信號燈的值(zhi) IPC_RMID:從系統中刪除信號燈(deng)集合 -----》3.執行p操作(zuo):獲取資源(yuan)(yuan)(yuan),信號量(liang)值減1不(bu)阻塞,可以操作(zuo)資源(yuan)(yuan)(yuan);如果無資源(yuan)(yuan)(yuan)可用(yong),信號量(liang)值為0,阻塞等待資源(yuan)(yuan)(yuan)。 int semop(int semid, struct sembuf *sops, unsigned nsops); semid:信(xin)號量集(ji)ID struct sembuf { short sem_num; // 要(yao)操作的(de)信號燈的(de)編(bian)號 short sem_op; // 0 : 等待,直到信號燈的值(zhi)變成(cheng)0 // 1 : 釋放資源,V操(cao)作 // -1 : 分配資源,P操作 short sem_flg; // 0, IPC_NOWAIT, SEM_UNDO }; nops: 要操作的(de)信號(hao)燈(deng)的(de)個數 ----》 操作資源: 共享(xiang)內存 -----》4.執行(xing)v操作:釋(shi)放資源(yuan),信(xin)號量值加1. int semop(int semid, struct sembuf *sops, unsigned nsops); -----》5.刪除對(dui)象 int semctl(int semid, int semnum, int cmd, ...); 相關資訊 發表評論 | 
全國咨詢(xun)電話:400-611-6270,雙(shuang)休日及節(jie)假日請致電值班手機:15010390966
在線咨詢: 曹老(lao)師QQ(3337544669), 徐老(lao)師QQ(1462495461), 劉老(lao)師 QQ(3108687497)
企(qi)業培訓(xun)洽談專線:010-82600901,院(yuan)校合作洽談專線:010-82600350,在線咨詢:QQ(248856300)
Copyright 2004-2018 華(hua)清(qing)遠見教育科技集團 版權所有 ,京(jing)ICP備16055225號,京(jing)公(gong)海(hai)網(wang)安備11010802025203號