linux 读者/写者旗标
旗标为所有调用者进行互斥,不管每个线程可能想做什么. 然而,很多任务分为 2 种清 楚的类型: 只需要读取被保护的数据结构的类型,和必须做改变的类型. 允许多个并发读 者常常是可能的,只要没有人试图做任何改变. 这样做能够显著提高性能; 只读的任务可 以并行进行它们的工作而不必等待其他读者退出临界区. ? Linux 内核为这种情况提供一个特殊的旗标类型称为 rwsem (或者" reader/writer semaphore"). rwsem 在驱动中的使用相对较少,但是有时它们有用. ? 使用 rwsem 的代码必须包含 <linux/rwsem.h>. 读者写者旗标 的相关数据类型是 struct rw_semaphore; 一个 rwsem 必须在运行时显式初始化: ? void init_rwsem(struct rw_semaphore *sem); ? 一个新初始化的 rwsem 对出现的下一个任务( 读者或者写者 )是可用的. 对需要只读存 取的代码的接口是: ? void down_read(struct rw_semaphore *sem); int down_read_trylock(struct rw_semaphore *sem); void up_read(struct rw_semaphore *sem); ? 对 down_read 的调用提供了对被保护资源的只读存取,与其他读者可能地并发地存取. 注意 down_read 可能将调用进程置为不可中断的睡眠. down_read_trylock 如果读存取 是不可用时不会等待; 如果被准予存取它返回非零,否则是 0. 注意 down_read_trylock 的惯例不同于大部分的内核函数,返回值 0 指示成功. 一个使用 down_read 获取的 rwsem 必须最终使用 up_read 释放. ? ? 读者的接口类似: ? void down_write(struct rw_semaphore *sem); int down_write_trylock(struct rw_semaphore *sem); void up_write(struct rw_semaphore *sem); void downgrade_write(struct rw_semaphore *sem); ? down_write,down_write_trylock,和 up_write 全部就像它们的读者对应部分,除了,当然,它们提供写存取. 如果你处于这样的情况,需要一个写者锁来做一个快速改变,接 着一个长时间的只读存取,你可以使用 downgrade_write 在一旦你已完成改变后允许其 他读者进入. ? 一个 rwsem 允许一个读者或者不限数目的读者来持有旗标. 写者有优先权; 当一个写者 试图进入临界区,就不会允许读者进入直到所有的写者完成了它们的工作. 这个实现可能 导致读者饥饿 -- 读者被长时间拒绝存取 -- 如果你有大量的写者来竞争旗标. 由于这个 原因,rwsem 最好用在很少请求写的时候,并且写者只占用短时间. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 基于Linux的PHP安装连接到MsSQL Server
- 为什么`zfs list -t snapshot`的数量级比`ls .zfs / snapsh
- 使用cygwin中的awk工具进行mysql binlog日志查看[利刃篇]
- [转帖]RedHat 如何更改网卡名 从ens192 改为eth0的问题
- system libzip must be upgraded to version >= 0.11
- Linux:将UDP侦听套接字绑定到特定接口(或找出数据报来自的
- 我可以让LVM检查我的镜像是否一致吗?
- magento-1.7 – 致命错误:调用未定义的函数curl_setopt()
- linux – 如何调整初始TCP重新传输超时?
- 获取类型为“bind”的无效mount配置:docker中不存在绑定源