linux:读者写者模型

原创 2017年07月09日 01:15:36

前面我们已经介绍过生产者消费者模型,其中提到了“321”原则。而本文中的读者写者模型同样遵循“321”原则。那么,什么是读者写者模型,它和我们介绍的生产者消费者模型又有什么不同呢?

读者写者模型:

在进程中,对某些资源的访问会存在两种可能的情况:一种是写操作,它是可以独占资源的,即具有排他性。另一种是读操作,可以有多个资源并发地去访问某种资源,它的访问方式是共享的。(一般由于写端操作次数少,读端操作次数多,因此写端的优先级较高)。这种模型是从对文件的读写操作中总结出的一种模型。

读者写者模型的“321”原则:

三种关系:
(1)写者与写者之间:互斥关系
(2)读者与写者之间:既不同步也不互斥,他们之间事没有关系的
(3)读者与写者 :我们知道,对一个文件的操作不可以是既读又写的,可能睡导致二义性问题,因此读者和写者之间事同步与互斥关系。同步关系(读者优先或者写者优先),互斥关系(读者读完了写者才能写,写者写完了读者才能读,这样就保证了数据的有效性)。

二指的是:读者和写者两种身份

一指一个读写场所。

读者写者模型与生产者消费者模型的区别:

<1>.生产者与消费者模型里,只存在互斥与同步,而在读者与写着模型里出现了读者与读者之间的共享关系。
<2>.它俩之间最大的区别就是生产者与消费者模型是会将临界区里的数据取走,而读者与写者模型只是将数据只读不取。

读写锁

读写锁是一种特殊的自旋锁,一个读写锁同时只能有一个写者或者是多个读者,但是不能同时即有读者又有写者,由上述读者和写者的关系可得。读写锁相对互斥锁来说,可以允许多个线程同时占用读模式的读写锁,具有更高的试用性和并行性。

自旋锁

自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是 否该自旋锁的保持者已经释放了锁,”自旋”一词就是因此而得名。其作用是为了解决某项资源的互斥使用。因为自旋锁不会引起调用者睡眠,所以自旋锁的效率远 高于互斥锁。虽然它的效率比互斥锁高,但是它也有些不足之处:
1、自旋锁一直占用CPU,他在未获得锁的情况下,一直运行--自旋,所以占用着CPU,如果不能在很短的时 间内获得锁,这无疑会使CPU效率降低。
2、在用自旋锁时有可能造成死锁,当递归调用时有可能造成死锁,调用有些其他函数也可能造成死锁,如 copy_to_user()、copy_from_user()、kmalloc()等。
所以虽然自旋锁比较高效,但是要恰当使用,在多CPU或者是内核可抢占,SMP的情况下才需要自旋锁,自旋锁使用保持锁时间比较短的情况下.

1,初始化和销毁读写锁
这里写图片描述
成功返回0,失败返回错误码。attr表示读写锁的属性,一般设置为NULL表示默认.

2,对读者加锁
这里写图片描述
pthread_rwlock_rdlock如果加锁失败则该线程就会被挂起等待;如果某些线程在加锁失败之后不想被挂起,则可以使用pthread_rwlock_trylock

3,对写者加锁
这里写图片描述

4,解锁
这里写图片描述

读者写者模型的具体代码:

(1)读者先读
这里写图片描述
这里写图片描述
这里写图片描述
运行结果:
这里写图片描述

(2)写者先写
只需对代码稍做修改即可
这里写图片描述
这里写图片描述

运行结果:
这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

Linux---读者写者模型

一 怎么理解读者写者模型读者写者问题就是在一些程序中,对某些资源的访问会存在两种可能的情况:一种就是写操作,写操作是可以独占资源的,具有排他性;另一种情况就是读操作,在读操作中可以有多个操作并发的去访...
  • blight_888
  • blight_888
  • 2017年06月26日 21:14
  • 231

例说读者写者模型

前面我们学习了生产者和消费者模型,想了解一下的可以去看看这篇客: http://blog.csdn.net/bit_clearoff/article/details/55805884什么是读者写者模...
  • bit_clearoff
  • bit_clearoff
  • 2017年02月20日 16:22
  • 759

OS: 读者写者问题(写者优先+LINUX+多线程+互斥量+代码)

一. 引子 最近想自己写个简单的 WEB SERVER ,为了先练练手,熟悉下在LINUX系统使用基本的进程、线程、互斥等,就拿以前学过的 OS 问题开开刀啦。记得当年学读者写者问题,尤其是写者优先...
  • yaozhiyi
  • yaozhiyi
  • 2012年05月15日 02:19
  • 7711

操作系统课程设计(读者-写者问题)

  • 2010年04月30日 13:26
  • 210KB
  • 下载

Linux多线程──读者写者问题

读者写者问题 这也是一个非常经典的多线程题目,题目大意如下:有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者读时写者也不能写。 程序: /...
  • iamzhaiwei
  • iamzhaiwei
  • 2012年07月12日 21:37
  • 3790

文件读写的实验

今天在读文件读写相关的资料时,感觉很困惑,就自己做了个实验。     1.读取从标准输入中输入的ascii码,代码: #include int main() { char a; while...
  • tobacco5648
  • tobacco5648
  • 2012年04月29日 20:02
  • 18500

操作系统:设计与实现 (第二版)

  • 2010年09月06日 00:45
  • 5.93MB
  • 下载

Java并发之读者写者模型

问题描述:设想一个飞机订票系统,其中有许多竞争的进程试图读写其中的数据。多个进程同时读取是可以接受的,但如果一个进程正在更新数据库,则所有的其他进程都不能访问数据库。即便是读操作也不行。Semapho...
  • c275046758
  • c275046758
  • 2016年01月24日 21:01
  • 1174

读者写者模型与生产者消费者模型

读者写者模型 读者写者访问一块共享的数据区域,读者对共享资源进行读访问,写者对共享内存进行写操作。在多处理器系统中,运去多个读者同时访问共享内存,而写者是排他性的,每次只能有一个写者去写入数据。在使...
  • zw_1510
  • zw_1510
  • 2016年07月24日 16:55
  • 1387

Linux基础篇——线程

线程的概念:线程是操作系统调度的最小单元,在Linux平台下线程是进程的基本单位。 线程间的很多资源都是共享的,例如 文件描述符,每种信号的处理方式,当前工作目录,用户id和组id,但线程有的资源是...
  • zw_1510
  • zw_1510
  • 2016年07月14日 21:19
  • 161
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux:读者写者模型
举报原因:
原因补充:

(最多只允许输入30个字)