互斥与同步(一)

一、并发的原理

1、竞争条件发生在当多个进程或者线程在读写数据时,其最终结果依赖于多个进程的指令执行顺序

2、临界资源:两个或更多的进程需要访问的不可共享的资源。

3、临界区:使用临界资源的那一部分代码

4、互斥

互斥产生的两个问题:死锁、饥饿(如三个进程P1、P2、P3,访问权轮流授予P1,P2,而P3无法访问资源)

二、信号量

1、基本原理:为了在进程之间发信号,定义一个称为信号量的特殊变量,进程传送信号使用 semSignal(s),进程接收信号使用semWait(s)

2、定义:信号量是一个具有整数值的变量,在它之上定义三个原子操作:

  •  一个信号量可以初始化成非负数。
  • semWait 操作使信号量减1。如果值<0,则执行semWait 的进程被阻塞,否则进程继续执行。—— 让进程进入阻塞队列
  • semSignal 操作使信号量加1。如果值 <=0(说明现在有进程正被阻塞),则被semWait 操作阻塞的进程将被解除。—— 将一个进程从阻塞队列放到就绪队列
每一个信号量对应一个阻塞队列,信号量的值的相反数是阻塞队列中的进程数

信号量原语的定义

struct semaphone{
      int count;
      queueType queue;
}
void semWait(semaphore s)
{
      s.count--;
      if(s.count < 0)
     {
            place this process in s.queue;
            block this process;
     }
}
void semSignal(semaphore s)
{
       s.count ++;
       if(s.count <= 0)
      {
          remove a process P from s.queue;
          place process P on ready list;
      }
}

3、信号量的应用

  • 互斥:每个进程在进入临界区之前执行semWait (s)
  • 生产者/消费者问题:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值