處理器管理——程序PV操作與經典問題
阿新 • • 發佈:2018-12-08
P V
struct Semaphore
{
int count; //計數變數
struct PCB *queue; //程序等待佇列(等待這個資源處於阻塞的程序佇列)
};
void P(Semaphore S)
{
--S.count;
if (S.count < 0)
{
//進S.queue末尾
//阻塞他
//OSSched
}
}
void V(Semaphore S)
{
++S.count;
if (S.count > 0)
{
//S.queue取出一個
//使他就緒
}
}
AB 互斥
AB同步且A先於B
三個問題
生產者與消費者
互斥模型:Mutex都需要是個臨界資源 每個程序需要去P V
同步模型:生產者有了ProductNum才能 消費者 去拿 所以 生產者程序 V(ProductNum)
消費者有了BufferNum才能 生產者 去生成 所以 消費者程序 V(BufferNum)
先去看能不能拿 才能是否進入臨界區
Semaphore BufferNum, ProductNum, Mutex;
void Producer()
{
while (true)
{
//製造產品
P(BufferNum); //是否能放
P(Mutex); //是否能進
//Insert 放入
V(Mutex); //釋放
V(ProductNum); //新增產品
}
}
void Consumer()
{
while (true)
{
//製造產品
P(ProductNum); //是否能拿
P(Mutex); //是否能進
//Remove 拿走
V(Mutex); //釋放
V(BufferNum); //少了產品
}
}
哲學家就餐問題
Semaphore Mutex; //初值為1
Semaphore chopstick[5] = { 1 };
void Philosopher(int i)
{
while (true)
{
//思考
P(Mutex); //有沒有人在拿筷子
P(chopstick[i]); //拿左邊筷子 沒有阻塞等到可以拿
P(chopstick[(i + 1)mod5]);//拿右邊筷子 沒有阻塞等到可以拿
V(Mutex); //拿完
//吃
V(chopstick[i]); //放筷子
V(chopstick[(i + 1)mod5]);//放筷子
}
}
讀者寫者問題
int ReaderNum=0; //當前有多少讀者 這個資料只能一個給一個讀者所以需要加Mutex來保護
Semaphore Mutex; //初值為1
Semaphore DataBase; //初值為1
void Writer()
{
//資料
P(DataBase);
//寫入
V(DataBase);
}
void Reader()
{
//①第一個過程 進入
P(Mutex); //有沒有人在進行ReaderNum的計數
ReaderNum++;
if (ReaderNum == 0) P(DataBase); //如果是第一個讀者
V(Mutex); //釋放ReaderNum的計數
//①第二個過程 出去
P(Mutex); //有沒有人在進行ReaderNum的計數
ReaderNum--;
if (ReaderNum == 0) V(DataBase); //如果是最後一個讀者
V(Mutex); //釋放ReaderNum的計數
}