互斥与同步(一)

来源:互联网 发布:玖富微理财网络借贷 编辑:程序博客网 时间:2024/04/17 06:58

一、并发的原理

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)
  • 生产者/消费者问题:



0 0
原创粉丝点击