操作系统学习笔记:PV同步原语

最近开始学习操作系统原理,里面涉及到一种进程同步技术:PV原语。

PV原语是一种操作系统底层提供的同步技术,能够有效的降低多进程并发资源竞争,类比多线程同步,也是如此。

PV原语采用了诸多原子级别的操作【原子级别指的是,该操作在CPU看来是一个基本操作,无可打断,即使是最高优先级的中断到来,在这条指令执行期间,也必须等待,基本上任何中断才做只能在这条指令开始之前或者完成之后在执行】保证CPU不会因为中断问题和切换问题而产生冲突,造成操作中断,丢失数据。

前文《操作系统运转机制核心原理》中提到,操作系统是一个事件驱动型的软件系统,他有一个显著的特点,将所有操作划分为各个基本任务,对于每个基本任务都会进行合理调度。系统在进行任务切换的时候有两种方式,一种是系统响应外部事件,进行强实时性的切换,包括外部信号,时钟信号;另一种就是软件自行放弃执行,返回调度程序进行切换。在前文中,提到系统在运行一个程序的时候是在内核空间和用户空间不断的切换的,这种切换就是程序自行放弃执行操作的实例,一般发生在对资源的请求上,俗称内陷。

PV同步原语应用的领域就是内陷操作上。当系统调用各种资源(设备资源,临界资源)的时候,他会自动(编译时候自动添加)调用PV原语保存CPU现场资源到任务块,再次回来的时候,好用来恢复现场。

PV原语的基本构造:

P(sem){
    sem = sem-1;
    if(sem < 0){
        保护当前进程CPU现场;
        当前进程状态设置为“等待”;
        将当前进程插入信号sem等待队列;
        转调度程序;
    }
}

V(sem){
    sem = sem + 1;
    if (sem < = 0){
        从sem等待队列中唤醒一个等待者;
    }
}

他们是如何调度的呢?
举个例子多个进程争抢同一个资源的时候,sem与资源数量保持一致,也就是sem=1。当sem=1的时候,多个进程并行执行。其中一个进程执行P操作,首先将sem-1【int类型的自增自减是原子操作】,之后对sem进行判断【原子操作】,如果sem<0说明资源被占用,当前进程保护CPU现场,自行挂起,保持沉默。唯一抢到执行权的也就是第一个进程继续执行,之后sem+1,表示释放了临界资源。资源释放之后肯定发现sem<=0,这时候,他就会唤起一个等待者。最妙的是,这个时候,这个进程的P操作已经执行完了,不会再判断了。也就继续执行内部代码,直到最后执行V操作。周而复始,调度的公平性有赖于系统调度算法。

PV原语与锁LOCK机制的最大不同在于。PV原语会让抢不到资源的进程沉默,而执行完成之后,又会吊起一个沉默的进程,周而复始。而锁机制并不会沉默当前进程,容易造成其他进程饿死的现象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章