信号量

作者: Zh1为明天1 | 来源:发表于2018-10-08 22:18 被阅读0次

    整形信号量

    wait(s){while(s<=0)s--;

    }

    signal{s++;

    }

    记录型信号量

    typedef struct{

    int value;

    struct process_control_block*list;}semaphore;

    wait(semaphore *s){

    s->value--;

    if(s->value<0) block(s->list);}

    signal (semaphore *s){

    s->value++;

    if(s->value<0) wakeup(s->list);

    }

    AND型信号量

    swait(s1,s2……sn){

    while(ture){

    if(si>=1&&s2>=1……&&sn>=1){

    for(i=1;i<=n;i++) si--;}

    }

    else{place the process in the waiting queuque associated with the first si found with si<1,and set the program count of this process to the beginning of swait operation  // 将进程放在与si<1找到的第一个si相关联的等待队列中,并将该进程的程序计数设置为swait操作的开始}

    }

    signal(s2,s2……,sn){

    while(ture){

    for(i=1;i<=n;i++){s++; remove all the proces waiting in the queue associated with si into the ready queue}/将与si相关联的队列中等待的所有进程删除到就绪队列}

    }

    }

    信息量集

    进程对信号量si的测试值不再是1,而是该资源的分配下限ti,既要求si>=ti;

    进程对该资源的需求值为di,进行si=si-di;操作

    swait(s1,t1,d1……sn,tn,dn);

    ssignal(s1,t1,d1……sn,tn,dn);

    一般的信号量集有下面几种特殊情况

    (1)swait(s,d,d) 此时信号量集只有一个信号量s,但允许他申请d个资源,当现有资源不足d时,不予分配

    (2) swait(s,1,1) 此时的信号量集已蜕化成一般的记录型信号量(s>1)或互斥信号量(s=1时)

    (3)swait(s,1,0) 当s>=1时,允许多个进程进入某特定区;当s变成0之后,将阻止任何程序进入特定区,换言之,它相当于一个可控的开关。

    相关文章

      网友评论

        本文标题:信号量

        本文链接:https://www.haomeiwen.com/subject/yyfsaftx.html