日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

8 操作系统第二章 进程管理 信号量 PV操作 用信号量机制实现 进程互斥、同 步、前驱关系

發布時間:2024/7/5 windows 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 8 操作系统第二章 进程管理 信号量 PV操作 用信号量机制实现 进程互斥、同 步、前驱关系 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

      • 1 信號量機制
          • 1.1 整形信號量
          • 1.2 記錄形信號量
          • 1.3 信號量機制小結
      • 2 用信號量機制實現進程互斥、同 步、前驅關系
          • 2.1 信號量機制實現進程互斥
          • 2.2 信號量機制實現進程同步
          • 2.3 信號量機制實現前驅關系
          • 2.4 信號量機制實現進程互斥、同 步、前驅關系小結

1 信號量機制

  • 用戶進程可以通過使用操作系統提供的一對原語來對信號量進行操作,從而很方便的實現了進程互斥、進程同步。
  • 信號量其實就是一個變量 ,可以用一個信號量來表示系統中某種資源的數量,比如:系統中只有一臺打印機,就可以設置一個初值為1的信號量。
  • 原語是一種特殊的程序段,其執行只能一氣呵成,不可被中斷。原語是由關中斷/開中斷指令實現的。
  • 軟件解決方案實現臨界區的互斥主要問題是由“進入區的各種操作無法一氣呵成”,因此如果能把進入區、退出區的操作都用“原語”實現,使這些操作能“一氣呵成”就能避免問題。

一對原語:wait(S)原語和signal(S) 原語,可以把原語理解為我們自己寫的函數,函數名分別為wait和signal,括號里的信號量S其實就是函數調用時傳入的一個參數。
wait、signal原語常簡稱為P、V操作。因此常把 wait(S)、signal(S)兩個操作分別寫為P(S)、V(S)

1.1 整形信號量

用一個整數型的變量作為信號量,用來表示系統中某種資源的數量。

int S = 1; //初始化整形信號量s,表示當前系統中,某種可用資源數 wait(S){ //wait原語,相當于“進入區”while(S<=0); //若資源數不夠用,則一直循環等待S=S-1; //若資源夠用,則占用一個資源} signals(S){ //signals原語,相當于“退出區”S=S+1; //使用完資源后,在退出區釋放資源}

整形信號量:

  • “檢查”和“上鎖”一氣呵成, 避免了并發、異步導致的問題
  • 存在的問題:不滿足“讓權等待” 原則,會發生“忙等”
1.2 記錄形信號量

整型信號量的缺陷是存在“忙等”問題,因此人們又提出了“記錄型信號量”,即用記錄型數據結構表示的信號量。

/*記錄型信號量的定義*/ typedef struct {int value; //剩余資源數struct process *L; //等待隊列 } semaphore

若某個進程需要使用資源時,通過wait原語申請:

void wait( semaphore S){ //相當于申請資源S.value--;if(S.value<0){bolck(S.L) //如果剩余資源數不夠,使用block原語使進程從運行態進入阻塞態,并把掛到信號量S的等待隊列(即阻塞隊列)中} }

進程使用完資源后,通過signal原語釋放:

void signal ( semaphore S ){ //相當于釋放資源s.value++;if(S.value<=0){wakeup(S.L);//釋放資源后,若還有別的進程在等待資源,則使用wakeup原語喚醒等待隊列中的一個進程,該進程從阻塞態變為就緒態} }

說明:

  • S.value的初值表示系統中某種資源的數目。
  • 對信號量S的一次P操作意味著進程請求一個單位的該類資源,因此需要執行S.value--,表示資源數減1,當S.value<0時表示該類資源已分配完畢,因此進程應調用block原語進行自我阻塞(當前運行的進程從運行態變成阻塞態),主動放棄處理機,并插入該類資源的等待隊列S.L中。可見,該機制遵循了“讓權等待”原則, 不會出現“忙等”現象。
  • 對信號量S的一次V操作意味著進程釋放一個單位的該類資源,因此需要執行S.value++,表示資源數加1, 若加1后仍是S.value<=0,表示依然有進程在等待該類資源,因此應調用wakeup原語喚醒等待隊列中的第一個進程(被喚醒進程從阻塞態變成就緒態)。
1.3 信號量機制小結

信號量的值=這種資源的剩余數量(信號量的值如果小于0,說明此時有進程在等待這種資源)
P(S)——申請一個資源S,如果資源不夠就阻塞等待
V(S)——釋放一個資源S,如果有進程在等待該資源,則喚醒一個進程

2 用信號量機制實現進程互斥、同 步、前驅關系

2.1 信號量機制實現進程互斥

思想步驟:

  • 分析并發進程的關鍵活動,劃定臨界區(如:對臨界資源打印機的訪問就應放在臨界區)
  • 設置互斥信號量mutex,初值為1
  • 在進入區P(mutex)——申請資源
  • 在退出區V(mutex)——釋放資源
  • 代碼實現:

    /*記錄型信號量定義*/ typedef struct {int value; //剩余資源數struct process *L; //等待隊列 } semaphore;/*信號量機制實現互斥*/semaphore mutex=1; //初始化信號量P1(){...P(mutex); //使用臨界資源前需要加鎖臨界區代碼段...V(mutex); //使用臨界資源后需要解鎖... }P2(){...P(mutex); //使用臨界資源前需要加鎖臨界區代碼段...V(mutex); //使用臨界資源后需要解鎖... }

    注意問題:

  • 要會自己定義記錄型信號量,但 如果題目中沒特別說明,可以把信號量的聲明簡寫成“semaphore mutex=1;”這種形式
  • 對不同的臨界資源需要設置不同的互斥信號量。
  • P、V操作必須成對出現。缺少P(mutex)就不能保證臨界資源的互斥訪問。缺少V(mutex)會導致資源永不被釋放,等待進程永不被喚醒。
  • 2.2 信號量機制實現進程同步

    進程同步:要讓各并發進程按要求有序地推進。

    比如,P1、P2并發執行,由于存在異步性,因此二者交替推進的次序是不確定的。

    若P2的“代碼4”要基于P1的“代碼1”和“代碼2”的運行結果才能執行,那么我們就必須保證“代碼4”一定是在“代碼2”之后才會執行。
    這就是進程同步問題,讓本來異步并發的進程互相配合,有序推進。

    思想步驟:

  • 分析什么地方需要實現“同步關系”,即必須保證“一前一后”執行的兩個操作(或兩句代碼)
  • 設置同步信號量S,初始為0
  • 在“前操作”之后執行V(S)
  • 在“后操作”之前執行P(S)
  • 技巧口訣:前V后P

    代碼實現:
    以下代碼保證了P2進程中代碼4一定是在P1進程中代碼2之后執行:

    /*信號量機制實現同步*/ semaphore S=0; //初始化同步信號量,初始值為0P1(){代碼1;代碼2;V(S);代碼3} P2(){P(S);代碼4;代碼5;代碼6}

    注意問題:

  • semaphore S=0理解:信號量S代表“某種資源”,剛開始是沒有這種資源的。P2需要使用這種資源, 而又只能由P1產生這種資源
  • 若先執行到V(S)操作,則S++后S=1。之后當執行到P(S)操作 時,由于S=1,表示有可用資源,會執行S--,S的值變回0,P2進程不會執行block原語,而是繼續往下執行代碼4
  • 若先執行到P(S)操作,由于S=0,S--后S=-1,表示此時沒有 可用資源,因此P操作中會執行block原語,主動請求阻塞。 之后當執行完代碼2,繼而執行V(S)操作,S++,使S變回0, 由于此時有進程在該信號量對應的阻塞隊列中,因此會在V 操作中執行wakeup原語,喚醒P2進程。這樣P2就可以繼續執行代碼4了
  • 2.3 信號量機制實現前驅關系

    思想步驟:
    其實每一對前驅關系都是一個進程同步問題(需要保證一前一后的操作) :

  • 要為每一對前驅關系各設置一個同步信號量
  • 在“前操作”之后對相應的同步信號量執行V操作
  • 在“后操作”之前對相應的同步信號量執行P操作
  • 進程P1中有句代碼S1,P2中有句代碼S2,P3中有句代碼S3……P6中有句代碼S6。這些代碼要求按如下前驅圖所示的順序來執行:

  • 要為每一對前驅關系各設置一個同步信號量
  • 在“前操作”之后對相應的同步信號量執行V操作,在“后操作”之前對相應的同步信號量執行P操作
    前V后P V→P

  • 2.4 信號量機制實現進程互斥、同 步、前驅關系小結


    總結

    以上是生活随笔為你收集整理的8 操作系统第二章 进程管理 信号量 PV操作 用信号量机制实现 进程互斥、同 步、前驱关系的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。