• <output id="aynwq"><form id="aynwq"><code id="aynwq"></code></form></output>

    <mark id="aynwq"><option id="aynwq"></option></mark>
  • <mark id="aynwq"><option id="aynwq"></option></mark><label id="aynwq"><dl id="aynwq"></dl></label>
  • 學習啦 > 學習電腦 > 操作系統 > 操作系統基礎知識 > Linux操作系統的信號量詳細解釋

    Linux操作系統的信號量詳細解釋

    時間: 佳洲1085 分享

    Linux操作系統的信號量詳細解釋

      Linux操作系統信號量是進程間通信的方法之一。下面由學習啦小編為大家整理了Linux操作系統的信號量詳細解釋的相關知識,希望對大家有幫助!

      Linux操作系統的信號量詳細解釋一、什么是信號量

      為了防止出現因多個程序同時訪問一個共享資源而引發的一系列問題,我們需要一種方法,它可以通過生成并使用令牌來授權,在任一時刻只能有一個執行線程訪問代碼的臨界區域。臨界區域是指執行數據更新的代碼需要獨占式地執行。而信號量就可以提供這樣的一種訪問機制,讓一個臨界區同一時間只有一個線程在訪問它,也就是說信號量是用來調協進程對共享資源的訪問的。

      信號量是一個特殊的變量,程序對其訪問都是原子操作,且只允許對它進行等待(即P(信號變量))和發送(即V(信號變量))信息操作。最簡單的信號量是只能取0和1的變量,這也是信號量最常見的一種形式,叫做二進制信號量。而可以取多個正整數的信號量被稱為通用信號量。這里主要討論二進制信號量。

      Linux操作系統的信號量詳細解釋二、信號量的工作原理

      由于信號量只能進行兩種操作等待和發送信號,即P(sv)和V(sv),他們的行為是這樣的:

      P(sv):如果sv的值大于零,就給它減1;如果它的值為零,就掛起該進程的執行

      V(sv):如果有其他進程因等待sv而被掛起,就讓它恢復運行,如果沒有進程因等待sv而掛起,就給它加1.

      舉個例子,就是兩個進程共享信號量sv,一旦其中一個進程執行了P(sv)操作,它將得到信號量,并可以進入臨界區,使sv減1。而第二個進程將被阻止進入臨界區,因為當它試圖執行P(sv)時,sv為0,它會被掛起以等待第一個進程離開臨界區域并執行V(sv)釋放信號量,這時第二個進程就可以恢復執行。

      Linux操作系統的信號量詳細解釋三、Linux的信號量機制

      Linux提供了一組精心設計的信號量接口來對信號進行操作,它們不只是針對二進制信號量,下面將會對這些函數進行介紹,但請注意,這些函數都是用來對成組的信號量值進行操作的。它們聲明在頭文件sys/sem.h中。

      1、semget函數

      它的作用是創建一個新信號量或取得一個已有信號量,原型為:

      [cpp] view plain copy print?

      int semget(key_t key, int num_sems, int sem_flags);

      第一個參數key是整數值(唯一非零),不相關的進程可以通過它訪問一個信號量,它代表程序可能要使用的某個資源,程序對所有信號量的訪問都是間接的,程序先通過調用semget函數并提供一個鍵,再由系統生成一個相應的信號標識符(semget函數的返回值),只有semget函數才直接使用信號量鍵,所有其他的信號量函數使用由semget函數返回的信號量標識符。如果多個程序使用相同的key值,key將負責協調工作。

      第二個參數num_sems指定需要的信號量數目,它的值幾乎總是1。

      第三個參數sem_flags是一組標志,當想要當信號量不存在時創建一個新的信號量,可以和值IPC_CREAT做按位或操作。設置了IPC_CREAT標志后,即使給出的鍵是一個已有信號量的鍵,也不會產生錯誤。而IPC_CREAT | IPC_EXCL則可以創建一個新的,唯一的信號量,如果信號量已存在,返回一個錯誤。

      semget函數成功返回一個相應信號標識符(非零),失敗返回-1.

      2、semop函數

      它的作用是改變信號量的值,原型為:

      [cpp] view plain copy print?

      int semop(int sem_id, struct sembuf *sem_opa, size_t num_sem_ops);

      sem_id是由semget返回的信號量標識符,sembuf結構的定義如下:

      [cpp] view plain copy print?

      struct sembuf{

      short sem_num;//除非使用一組信號量,否則它為0

      short sem_op;//信號量在一次操作中需要改變的數據,通常是兩個數,一個是-1,即P(等待)操作,

      //一個是+1,即V(發送信號)操作。

      short sem_flg;//通常為SEM_UNDO,使操作系統跟蹤信號,

      //并在進程沒有釋放該信號量而終止時,操作系統釋放信號量

      };

      3、semctl函數

      該函數用來直接控制信號量信息,它的原型為:

      [cpp] view plain copy print?

      int semctl(int sem_id, int sem_num, int command, ...);

      如果有第四個參數,它通常是一個union semum結構,定義如下:

      [cpp] view plain copy print?

      union semun{

      int val;

      struct semid_ds *buf;

      unsigned short *arry;

      };

      前兩個參數與前面一個函數中的一樣,command通常是下面兩個值中的其中一個

      SETVAL:用來把信號量初始化為一個已知的值。p 這個值通過union semun中的val成員設置,其作用是在信號量第一次使用前對它進行設置。

      IPC_RMID:用于刪除一個已經無需繼續使用的信號量標識符。

    3637944 主站蜘蛛池模板: 伊人久久大香线蕉综合电影 | 国产精品国产三级国产专播下| 小镇姑娘hd电影在线观看| 日本成人免费在线| 日韩欧美一区二区三区在线播放 | 美国式禁忌矿桥矿17集| 被公侵幕岬奈奈美中文字幕| 黄床大片免费30分钟国产精品| 天天综合天天色| 大尺度视频网站久久久久久久久| 99久久精品费精品国产| 乱色美www女麻豆| 亚洲va久久久噜噜噜久久狠狠| 亚洲春色第一页| 亚洲国产精品网站久久| 亚洲国产成人精品女人久久久| 亚洲午夜电影在线观看| 亚洲免费小视频| 久草免费在线观看视频| 久久精品免费大片国产大片| 久久国产精品二国产精品| 久久99国产这里有精品视| 中文字幕亚洲激情| 一区二区三区四区在线视频| bt天堂网www天堂在线观看| 999zyz色资源站在线观看| 中国高清xvideossex| 成人免费视频69| 美女把屁屁扒开让男人玩| 精品久久久久久久免费加勒比| 特级毛片A级毛片免费播放| 欧美日韩一品道| 日韩大片免费观看视频播放| 挺进男同的屁股眼o漫画| 夫妇交换性2国语在线观看| 国产综合免费视频| 国产在线拍揄自揄拍无码| 冻千秋的堕落h污文冬妃| 亚洲精品免费在线| 久久精品国产亚洲av电影| 七次郎成人免费线路视频|