OS學習筆記四:同步機制

衣舞晨風發表於2017-10-06

一、 程式互斥

1、程式互斥

  • 由於各 程式 要求使用共享資源( 變數 、檔案等),而 這些 資源需要排他性使用各程式之間 競爭使用這些 資源—— 這一關係稱為 程式互斥

  • 臨界資源:critical resource
    系統中某些資源一次只允許一個程式使用,稱這樣的資源為 臨界資源 或 互斥資源 或 共享變數

  • 臨界區( ( 互斥區) ) :critical section(region)
    各個程式中對某個臨界資源(共享變數)實施操作 的程式 片段

2、臨界區(互斥區)使用原則

  • 沒有程式在臨界區時,想進入臨界區的程式可進入

  • 不允許兩個程式同時處於其臨界區 中

  • 臨界區外執行的程式不得阻塞其他程式進入臨界區

  • 不得使程式無限期等待進入臨界區

3、實現互斥的解決方法

  • 軟體方案

    • Dekker 解法、Peterson 解法
  • 硬體 方案

    • 遮蔽中斷、TSL(XCHG) 指令

二、程式同步

1、程式同步

程式同步:synchronization 指系統中多個程式中發生的事件存在某種時序關係 ,需要相互合作,共同完成一項任務

具體地說,一個程式執行到某一點時,要求另一夥伴程式為它提供訊息,在未獲得訊息之前,該程式進入阻塞態,獲得訊息後被喚醒進入就緒態

三、訊號量及PV操作

1、訊號量及PV操作

  • 一個特殊變數

  • 用於程式間傳遞 信 息 的 一個整數值

  • 定義如下:

struc semaphore
{
    int     count;
    queueType   queue;
}
  • 對訊號量可以實施的操作:初始化、P 和V (P 、V 分別是荷蘭語的test(proberen) 和increment(verhogen) )

2、p、v操作定義

P( s )
{
    s.count--;
    if ( s.count < 0 )
    {
        該進 狀 態 置 為阻 塞 狀 態 ;
        將 該進 插入相應的等待 隊
        列 s.queue 末 尾 ;
        重新 調 度 ;
    }
}
P( s )
{
    s.count--;
    if ( s.count < 0 )
    {
        該進 狀 態 置 為阻 塞 狀 態 ;
        將 該進 插入相應的等待 隊
        列 s.queue 末 尾 ;
        重新 調 度 ;
    }
}

3、有關說明

  • P 、V 操作為原語 操作(primitive or atomic action)

  • 在 訊號量上定義了三個操作:初始化( 非負數) 、P 操作、V 操作

  • 最初提出的是二元訊號量 (解決互斥 )之後, 推廣 到一般訊號量(多值)或計數訊號量(解決同步)

四、管程的基本概念

1、管程的定義

  • 是一個特殊的模組

  • 有一個名字

  • 由關於共享資源的資料結構及在其上操作的一組過程組成

2、程式與管程

程式 只能通過呼叫 管程中的過程 來間接地訪問管程中的資料結構

3、管程需要保證什麼?

  • 作為一種同步機制,管程要解決兩個問題

  • 互斥

    • 管程是 互斥 進入 的(為了保證管程中資料結構的資料完整性)
    • 管程的互斥性是由編譯器負責保證的
  • 同步

    • 管程中設定 條件 變數及等待/ 喚醒操作 以 解決同步問題
    • 可以讓一個程式或 執行緒在 條件變數上等待(此時,應先釋放管程的使用權),也可以通過傳送訊號將等待在條件變數上的程式或執行緒喚醒

五、管程小結

  • 管程 : 抽象資料型別

    • 有一個明確定義的操作集合,通過它且只有通過它才能操縱該資料型別的例項
  • 實現管程結構必須保證下面幾點:

    • (1)只能通過管程的某個過程才能訪問資源;

    • (2) 管 程是互斥的 , 某個時刻只能有一個程式或執行緒呼叫 管程中 的過程

  • 條件變數:為 提供程式與其他程式通訊或同步 而引入

    • wait/signal 或 wait/notify 或 wait/broadcast

六、程式間通訊

1、基本通訊方式

  • 訊息傳遞

  • 共享 記憶體

  • 管道

  • 套接 字

  • 遠端過程呼叫

2、原子操作

  • 不可分割,在執行完之前不會被其他任務或事件中斷

  • 常用於實現資源的引用計數

3、屏障(BARRIER)

  • 一種同步機制( ( 又稱柵欄、關卡) )

  • 用於對一組執行緒進行協調

  • 應用場景

    • 一組執行緒協同完成一項任務,需要所有執行緒都到達一個匯合點後再一起向前推進

本文整理自:《作業系統原理》北京大學_陳向群 講義
個人微信公眾號:
這裡寫圖片描述

作者:jiankunking 出處:http://blog.csdn.net/jiankunking

相關文章