学习记录2

来源:互联网 发布:n9软件下载 编辑:程序博客网 时间:2024/06/05 11:13

pv操作同步过程

对信号灯状态进行改变,P调用一次-1,V调用一次+1。


P操作: 
p(s)是一个原语操作,p操作执行 s– ,若s为负数,调用p(s)的进程被阻塞,放到等待队列q中。


p(s)
{
    s- -;
    if (s < 0)
    {
        保留调用进程的CPU现场;
        将进程的pcb插入到s的等待队列;
        把进程变为“等待状态”;
        转到进程调度;
    }
}


V操作 
v(s)刚好与p(s)操作相反,v操作执行 s++ ,若s为大于0,继续执行;s <=0,从信号灯等待队列移出一个进程,解除等待状态,返回本程序继续执行。


v(s)
{
    s++;
    if (s <= 0)
    {
        移出s等待队列首元素;
        将该进程的pcb插入就绪队列;
        设置该进程为“就绪状态”;
    }
进程互斥的实现


上锁原语顺利通过可进入临界区CSa或者CSb。


1、使用上锁原语与开锁原语解决并发进程互斥问题:


main()
{
    int w = 0;    //互斥锁
    cobegin
        ppa();
        ppb();
    coend
}
使用信号灯实现进程互斥:


  用与互斥信号灯初值mutex = 1 ;表示该资源未被占用。任何想要进入临界区的进程,必须先进行p操作(mutex为1时才能通过),访问临界资源完成后再v操作。。。


mutex =1 : 表示没有进程进入临界区
mutex =0 : 表示有一个进程进入临界区,前方没有其他进程。
mutex =-1 :表示一个进程已经进入,另一个进程的等待进入。
main()
{
    int mutex = 0;    //互斥信号灯
    cobegin
        Pa();
        Pb();
    coend
进程同步实现:


生产中消费者问题:


这里写图片描述


消费者:消耗系统资源。
生产者:释放系统资源。
缓冲区未空:消费者就可以一直取资源。 
缓冲区未满:生产者就可以一直生产资源。 
因此,同步关系保证了上面两点的实现。


方法:用两个信号灯,分别说明缓冲区数目(full和empty)


main()
{
    int w = 0;        //满缓冲区的数目
    int empty = n;    //空缓冲区的数目
    int mutex = 1;    //对有界缓冲区进行操作的互斥信号灯
    cobegin
        P1();P2()……Pm();
        C1();C2()……Cn();
    coend
}


producer()                          consumer()         
{                                   {
    while(生产未完成)                    while(还要继续消费)       
    {                                   {
        .                                   p(full);
        .                                   p(mutex);       
        .                                   从有界缓冲区取产品;
        生产一个产品;                     v(mutex);
        p(empty);                           v(empty);
        p(mutex);                           .
        送一个产品到有界缓冲区;                .
        v(mutex);                           .
        v(full);                            消费一个产品;
                                        }
    }                               }


}     

原创粉丝点击