【操作系统并发进程】信号量与PV操作例题讲解——读者写者问题

分为读者优先、写者优先和读写者公平竞争三种情况。

1.读者优先

  • 变量定义

    • 文件写操作信号量:wrt,解决读写互斥和写写互斥问题

    • 读者数目计数器:readcount,记录读者数,若 readcount == 0,以 V 操作释放在 wrt 上等待的写进程

    • 读者数目计数器信号量:s_readcount,因存在多个读者进程对 readcount 进行操作,使用 s_readcount 控制并发

  • 代码

    semaphore wrt;
    int readcount;
    semaphore s_readcount;
    wrt = 1;  readcount = 0;  s_readcount = 1;
    ​
    process Reader() {
        while (true) {
            P(s_readcount);
                if (readcount == 0)  P(wrt);
                readcount++;
            V(s_readcount);
            读文件;
            P(s_readcount);
                readcount--;
                if (readcount == 0)  V(wrt);
            V(s_readcount);
        }
    }
    ​
    process Writer() {
        while (true) {
            P(wrt);
            写文件;
            V(wrt);
        }
    }

2.写者优先

  • 变量定义——在读者优先的基础上增加了:

    • 信号量:r,当至少有一个写进程准备访问数据区时用于阻止所有读进程

    • 写者数目计数器:writecount,记录写者数,若 writecount == 0,以 V 操作释放在 r 上等待的读进程

    • 写者数目计数器信号量:s_writecount,控制并发访问 writecount

    • 信号量:mutex,在信号量 r 上不允许建造长队列,否则阻塞的写者进程将无法跳过此队列,因此,只允许一个读者在 r 上排队,其余阻塞读者在 mutex 上排队

  • 代码

    semaphore wrt;
    int readcount, writecount;
    semaphore s_readcount, s_writecount;
    semaphore r, mutex;
    wrt = 1;  readcount = writecount = 0;  s_readcount = s_writecount = 0;
    r = 1;  mutex = 1;
    ​
    process Reader() {
        while (true) {
            P(mutex);
                P(r);
                    P(s_readcount);
                        if (readcount == 0)  P(wrt);
                        readcount++;
                    V(s_readcount);
                V(r);
            V(mutex);
            读文件;
            P(s_readcount);
                readcount--;
                if (readcount == 0)  V(wrt);
            V(s_readcount);
        }
    }
    ​
    process Writer() {
        while (true) {
            P(s_writecount);
                if (writecount == 0)  P(r);
                writecount++;
            V(s_writecount);
            P(wrt);
                写文件;
            V(wrt);
            P(s_writecount);
                writecount--;
                if (writecount == 0)  V(r);
            V(s_writecount);
        }
    }

3.读写公平

  • 变量定义——在读者优先的基础上增加了:

    • 信号量:s,用于互斥地进行读写操作

  • 代码

    semaphore wrt;
    int readcount;
    semaphore s_readcount;
    semaphore s;
    wrt = 1;  readcount = 0;  s_readcount = 1;  s = 1;
    ​
    process Reader() {
        while (true) {
            P(s);
                P(s_readcount);
                    if (readcount == 0)  P(wrt);
                    readcount++;
                V(s_readcount);
            V(s);
            读文件;
            P(s_readcount);
                readcount--;
                if (readcount == 0)  V(wrt);
            V(s_readcount);
        }
    }
    ​
    process Writer() {
        while (true) {
            P(s);
                P(wrt);
                    读文件;
                V(wrt);
            V(s);
        }
    }

你可能感兴趣的:(操作系统,并发,多进程)