读者-写者问题

 问题描述:

多个进程共享一个数据区,这些进程分为两组:code

  • 读者进程:只读数据区中的数据;
  • 写者进程:只往数据区中写数据

 知足的要求

  1. 容许多个读者同时执行读操做
  2. 不容许多个写者同时操做
  3. 不容许读者、写者同时操做

第一类读者写者问题: 读者优先

若是读者执行:进程

  1. 无其余读者、写者,该读者能够读
  2. 若已有写者等,但有其余读者正在读,则该读者也能够读
  3. 如有写者正在写,该读者必须等

若是写者执行:资源

  1. 无其余读者、写者,该读者能够读
  2. 如有读者正在读,该写者等
  3. 如有其余写者正在写,该写者等

伪代码:路由

void reader(void){
    while(TRUE){
        P(mutex);
        rc = rc + 1;
        //只有第一个读者须要执行P(W)
        if(rc == 1) P(w);
        v(mutex);
        //读操做
        P(mutex);
        rc = rc + 1;
        //只有最后一个读者须要V(w)
        if(rc == 0)V(w);
        V(mutex);
    }
}
void writer(void){
    while(TRUE){
        P(w);
        //写操做
        V(w);
    }
}

其余知识点

  1. 进程互斥:各进程须要使用共享资源,而这些资源须要排他性使用,各进程之间竞争使用这些资源
  2. 临界区:各个进程中对某个临界资源实施操做的程序片断。it

    • 临界资源:系统中某些资源一次只容许一个进程使用,这样的资源称为临界资源或互斥资源或共享资源
  3. 第一类读者-写者问题解决的是多个读者问题

    经过rc,保证读者能够同时读操做,而不要屡次执行PV操做。除此以外的操做都是创建在在写不可读,在读不可写的基础上的。同时不存在多个写者的问题。class

应用场景

Linux的IPX路由代码使用了读-写锁,读路由表的状况比更新路由表的状况多得多。基础

相关文章
相关标签/搜索