1. 程式人生 > >處理器管理——程序PV操作與經典問題

處理器管理——程序PV操作與經典問題

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的計數
}