PV操作原理和实现

PV原语

PV原语通过操作信号量来处理进程间的同步与互斥的问题。其核心就是一段不可分割不可中断的程序。 其基本思路是用一种新的变量类型(semaphore)来记录当前可用资源的数量。

semaphore有两种实现方式:

  1. semaphore的取值必须大于或等于0。0表示当前已没有空闲资源,而正数表示当前空闲资源的数量;
  2. semaphore的取值可正可负,负数的绝对值表示正在等待进入临界区的进程个数。

信号量是由操作系统来维护的,用户进程只能通过初始化和两个标准原语(P、V原语)来访问。初始化可指定一个非负整数,即空闲资源总数。

P原语:阻塞原语,负责把当前进程由运行状态转换为阻塞状态,直到另外一个进程唤醒它。操作为:申请一个空闲资源(把信号量减1),若成功,则退出;若失败,则该进程被阻塞;

V原语:唤醒原语,负责把一个被阻塞的进程唤醒,它有一个参数表,存放着等待被唤醒的进程信息。操作为:释放一个被占用的资源(把信号量加1),如果发现有被阻塞的进程,则选择一个唤醒之。

P原语操作的动作是:

  1. sem减1;
  2. 若sem减1后仍大于或等于零,则进程继续执行;
  3. 若sem减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转进程调度。

V原语操作的动作是:

  1. sem加1;
  2. 若相加结果大于零,则进程继续执行;
  3. 若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程,然后再返回原进程继续执行或转进程调度。

PV操作对于每一个进程来说,都只能进行一次,而且必须成对使用。在PV原语执行期间不允许有中断的发生。

P操作,原子减少S,然后如果S < 0,则阻塞当前线程
V操作,原子增加S,然后如果S <= 0,则唤醒一个阻塞的线程

信号量机制

(1) 整型信号量:不满足“让权等待”
(2) 记录型信号量:只可申请一类资源,该资源有n个,一次只可申请一个。将资源分光,多类资源时易产生死锁。
(3) AND型信号量:可申请n类资源,每类资源有m个,每次可申请每类资源中的一个。会将资源分光。
(4) 信号量集:可申请n类资源,每类资源有m个,每次可申请每类资源中的多个。但低于下限时,不予分配

发布了75 篇原创文章 · 获赞 39 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/s2152637/article/details/102466060
今日推荐