信號量是什么,大神全方位交給你
時間:2018-04-19作者:華清遠見
一.首先我們必須知道什么是信號量 信號量的本質(zhì)是數(shù)據(jù)操作鎖,它本身不具備數(shù)據(jù)交換功能,而只是用于保護進程線程之間共享的資源,實現(xiàn)對共享資源的同步與互斥操作。 信號量相當于一把鎖,例如小黑上廁所,需要檢查是否有鎖,有鎖獲取鎖,占用廁所坑位資源,其他人無法進此坑位,當小黑上完廁所,需要釋放鎖,其他人都可以獲取鎖。 小黑 ------》 進程 門鎖 --------》 信號量 坑位 ------》 共享資源(信號量保護對象) 二.為什么要使用信號量 為了防止出現(xiàn)因多個程序同時訪問一個共享資源而引發(fā)的一系列問題,我們需要一種方法,在任一時刻只能有一個執(zhí)行進程訪問代碼的臨界區(qū)域;臨界區(qū)域是指執(zhí)行數(shù)據(jù)更新的代碼需獨占式地執(zhí)行。而信號量就可以提供這樣的一種訪問機制,讓一個臨界區(qū)同一時間只有一個進程在訪問它,也就是說信號量是用來調(diào)協(xié)進程對共享資源的訪問的。其中共享內(nèi)存的使用就要用到信號量。 臨界資源:一次只允許一個進程(一個線程)使用的資源叫做臨界資源。 臨界區(qū):訪問臨界資源的代碼稱為臨界區(qū)。 三.信號量分類: 1.System V信號燈(IPC對象),也叫經(jīng)典ipc對象,一般用于進程通信。 2.posix基于內(nèi)存的信號燈(無名信號燈),一般線程通信。 功能分類: 1.二值信號量:信號量的值為0或1。與互斥鎖類似,資源可用時值為1,不可用時值為0。 2.計數(shù)信號量:值在0到n之間。用來統(tǒng)計資源,其值代表可用資源數(shù)。 注意:system v信號量對象不是一個信號量,是一個或者多個信號量的集合。對應(yīng)內(nèi)核中一個結(jié)構(gòu)體:struct semid_ds 有一個成員sem_base指向第0個信號量結(jié)構(gòu)體起始地址。
四.System v信號量實現(xiàn)步驟 -----》1、創(chuàng)建信號量對象 int semget(key_t key, int nsems, int semflg); Key:創(chuàng)建信號量對象的唯一鍵值 nsems表示的就是創(chuàng)建的信號量集中信號量的個數(shù) Semflg: 權(quán)限 IPC_CREAT:存在則打開,否則創(chuàng)建; IPC_CREAT | IPC_EXCL存在則出錯返回,否則創(chuàng)建,這 樣保證了 打開的是一個全新的信號量集 成功:信號量集ID 失敗-1 ----》2.初始化具體信號量的值。 int semctl(int semid, int semnum, int cmd, union set); semid:信號燈集ID semnum: 要修改的信號燈編號 Cmd: GETVAL:獲取信號燈的值 SETVAL:設(shè)置信號燈的值 IPC_RMID:從系統(tǒng)中刪除信號燈集合 -----》3.執(zhí)行p操作:獲取資源,信號量值減1不阻塞,可以操作資源;如果無資源可用,信號量值為0,阻塞等待資源。 int semop(int semid, struct sembuf *sops, unsigned nsops); semid:信號量集ID struct sembuf { short sem_num; // 要操作的信號燈的編號 short sem_op; // 0 : 等待,直到信號燈的值變成0 // 1 : 釋放資源,V操作 // -1 : 分配資源,P操作 short sem_flg; // 0, IPC_NOWAIT, SEM_UNDO }; nops: 要操作的信號燈的個數(shù) ----》 操作資源: 共享內(nèi)存 -----》4.執(zhí)行v操作:釋放資源,信號量值加1. int semop(int semid, struct sembuf *sops, unsigned nsops); -----》5.刪除對象 int semctl(int semid, int semnum, int cmd, ...); 相關(guān)資訊
發(fā)表評論
|
全國咨詢電話:400-611-6270,雙休日及節(jié)假日請致電值班手機:15010390966
在線咨詢: 曹老師QQ(3337544669), 徐老師QQ(1462495461), 劉老師 QQ(3108687497)
企業(yè)培訓洽談專線:010-82600901,院校合作洽談專線:010-82600350,在線咨詢:QQ(248856300)
Copyright 2004-2018 華清遠見教育科技集團 版權(quán)所有 ,京ICP備16055225號,京公海網(wǎng)安備11010802025203號