互斥量的工作原理:當乙個執行緒訪問臨界資源時,對臨界資源加鎖,阻止另乙個執行緒訪問臨界資源,使用完之後再進行解鎖。
當兩個執行緒的指令交叉執行,會導致執行緒同步的問題。互斥量可以保證先後執行,先執行完乙個執行緒的相關指令,再執行另乙個的相關指令。(原子性)
原子性:一系列操作不可被中斷,要麼全部執行完成,要麼全部沒有執行。
互斥量是最簡單的執行緒同步的方法。
互斥量,處於兩態之一的變數:解鎖和加鎖。兩個狀態可以保證資源訪問的序列。
作業系統直接提供了互斥量的api,開發者可以直接使用api完成資源的加鎖、解鎖操作。c的api為:pthread_mutex_t。
// 互斥鎖的例子
#include
#include
#include
#include
#include
pthread_mutex_t mutex = pthread_mutex_initializer;
//臨界資源
int num=0;
//生產者
void
*producer
(void*)
}//消費者
void
*consumer
(void*)
}int
main()
自旋鎖的工作原理:與互斥量相同,也是在使用臨界資源時加鎖,完成之後解鎖釋放,保證臨界資源序列訪問。
自旋鎖也是一種多執行緒同步的變數。
使用自旋鎖的執行緒會反覆檢查鎖變數是否可用。
自旋鎖不會讓出cpu,是一種忙等待狀態。
自旋鎖是一種 死迴圈等待鎖被釋放 的鎖。
自旋鎖避免了程序或執行緒上下文切換的開銷。
作業系統內部很多地方使用的是自旋鎖。
自旋鎖不適合在單核cpu使用。
c的api為:pthread_spinlock_t
// 自旋鎖的例子
#include
#include
#include
#include
#include
pthread_spinlock_t spin_lock;
//臨界資源
int num=0;
//生產者
void
*producer
(void*)
}//消費者
void
*consumer
(void*)
}int
main()
當執行緒對臨界資源多讀少寫時(例如對歷史訂單資料庫,一般只會進行檢視,而不會更改),讀取的時候並不會改變臨界資源的值,使用讀寫鎖可以提高效率。
讀寫鎖是一種特殊的自旋鎖。
允許多個讀者同時訪問資源以提高讀效能。
讀和寫之間是互斥的,讀和讀之間不互斥。
c的api為:pthread_rwlock_t
// 讀寫鎖的例子
#include
#include
#include
#include
#include
pthread_rwlock_t rwlock=pthread_rwlock_initializer;
//臨界資源
int num=0;
//讀操作
void
*reader
(void*)
pthread_rwlock_unlock
(&rwlock);}
}//寫操作
void
*writer
(void*)
}int
main()
條件變數是一種相對複雜的執行緒同步方法。
條件變數允許執行緒睡眠,直到滿足某種條件。
當滿足條件時,可以向該執行緒訊號,通知喚醒。
在生產者—消費者模型中,
緩衝區小於等於0時,不允許消費者消費,消費者必須等待;
緩衝區滿時,不允許生產者往緩衝區生產,生產者必須等待。
當生產者生產乙個產品時,喚醒可能等待的消費者;
當消費者消費乙個產品時,喚醒可能等待的生產者。
條件變數就是實現喚醒操作
c的api為:pthread_cond_t,需要配合互斥量使用。
// 條件變數的例子
#include
#include
#include
#include
#include
pthread_cond_t cond = pthread_cond_initializer;
pthread_mutex_t mutex = pthread_mutex_initializer;
//臨界資源
int max_buf=
100;
int num=0;
//生產者
void
*producer
(void*)
num+=1
;printf
("生產乙個產品,當前產品數量為:%d\n"
,num)
;sleep(1
);pthread_cond_signal
(&cond)
;printf
("通知消費者...\n");
pthread_mutex_unlock
(&mutex);}
}//消費者
void
*consumer
(void*)
num-=1
;printf
("消費乙個產品,當前產品數量為:%d\n"
,num)
;sleep(1
);pthread_cond_signal
(&cond)
;printf
("通知生產者...\n");
pthread_mutex_unlock
(&mutex);}
}int
main()
互斥鎖、自旋鎖、讀寫鎖
條件變數
作業系統學習
看了幾天的資料,今天終於有時間把測試環境搭建起來。模擬機bochs nasm ultraiso 模擬機bochs的設定不難,在網上搜了些資料和參考了bochs的說明檔案,基本上就可以組建並執行起來。在網上下了個dos的映象,執行bochs從a盤啟動,之後把硬碟分割槽格式化,乙個最基礎的測試環境就完成...
作業系統學習
1 處理器硬體故障中斷事件 由處理器,記憶體儲器,匯流排等故障引起 程式性中斷事件 2 處理器執行機器指令引起 1.1 除數為零,運算元溢位等算術異常 1.3 終止程序指令 終止程序 3 自願性中斷事件 1.1 處理器執行陷入指令請求os服務引起 1.2 請求分配外設,請求io等 1.3 處理流程是...
作業系統學習 5 程序同步
這一篇部落格主要學習程序同步的知識。程序同步的主要任務是對多個相關程序在執行次序上進行協調,以使併發執行的諸程序之間能有效地共享資源和相互合作,從而使程式的執行具有可再現性。在多道程式環境下,當程式併發執行時,由於資源共享和程序合作,使同處於乙個系統中的諸程序之間可能存在著以下兩種形式的制約關係 間...