用信号量机制实现进程互斥、同步、前驱关系

2025-11-16 15:04:09

1、/*信号量机制实现进程互斥*/

semaphore mutex = 1;      //初始化信号量

P1 {} {

    ...

    P(mutex);          //使用临界资源前需要加锁

    临界区代码段...

    V(mutex);          //使用临界资源后需要解锁

    ...

}

P2 {} {

    ...

    P(mutex);          //使用临界资源前需要加锁

    临界区代码段...

    V(mutex);          //使用临界资源后需要解锁

    ...

}

2、分析并发进程的关键活动,划定临界区(如对临界资源打印机的访问就应该放在临界区)。

2、设置互斥信号量mutex,初值为1。

3、在临界区之前执行P(mutex)。

4、在临界区之后执行V(mutex)。

3、对不同的临界资源需要设置不同的互斥信号量。

P、V操作必须成对出现。缺少P(mutex)就不能保证临界资源的互斥访问。缺少V(mutex)就会导致资源永不被释放,等待进程永不被唤醒。

1、用信号量实现进程同步:

1、分析什么地方需要实现“同步关系”,即必须保证“一前一后”执行的两个操作。

2、设置同步信号量s,初始为0。

3、在“前操作”之后执行V(s)。

4、在“后操作”之前执行P(s)。

2、/*信号量机制实现同步*/

semaphore s = 0;

P1 {} {

    代码1;

    代码2;

    V(s);

    代码3;

}

P2 {} {

    P(s);

    代码4;

    代码5;

    代码6;

}

3、若先执行到V(s)操作,则 s++ 后 s = 1。之后当执行到P(s)操作时,由于 s = 1,表示有可用资源,会执行s--,s的值变回0,P2进程不会执行block原语,而胡思继续往下执行代码4。

若先执行到P(s)操作,由于 s = 0, s--后 s = -1,表示此时没有可用资源,因此P操作中会执行block原语,主动请求阻塞。之后当执行完代码2,继而执行V(s)操作,s++,是s变回0,由于此时有进程在该信号量对应的阻塞队列中,因此会在V操作中执行wakeup原语,唤醒P2进程。这样P2就可以继续执行代码4了。

1、进程P1中有句代码s1,P2中有句代码s2...P3...P6中有句代码s6.这些代码要求按如下前驱图所示的顺序来执行:

s1--->s2,s1--->s3,s2--->s4,s2--->s5,s3--->s6,s4--->s6,s5--->s6。

2、其实每一对前驱关系都是一个进程同步问题(需要保证一前一后的操作),因此:

1、要为每一对前驱关系各设置一个同步变量

2、在“前操作”之后对相应的同步变量执行V操作

3、在“后操作”之前对相应的同步变量执行P操作

3、P1() {

    ...

    S1;

    V(A);

    V(B)

    ...

}

P2() {

    ...

    P(A);

    S2;

    V(C);

    V(D);

}

P3() {

    ...

    P(B);

    S3;

    V(G);

    ...

}

...

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢