处理器管理——进程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的计数
}

猜你喜欢

转载自blog.csdn.net/qq_42146775/article/details/84838541
今日推荐