读写信号量(rw_semaphore)又叫读写锁。
允许多个读者同时持有该信号量;当有一个写者持有该信号量时,其他读者跟写者不可持有该信号量;当写者写完后,可以降级为读者。读写信号量使用于读多写少的情况下使用。
DECLARE_RWSEM(name);
//声明一个读写信号量,并对其初始化
struct rw_semaphore *sem;
init_rwsem(sem);
//void init_rwsem(struct rw_semaphore *sem);
//对读写信号量进行初始化
down_read(sem);
//void down_read(struct rw_semaphore *sem);
//获取读资格,如果获取资格失败,则该线程会被挂起
down_read_trylock(sem);
//int down_read_trylock(struct rw_semaphore *sem);
//尽力获取读资格,如果获取失败,不会被挂起;成功返1,失败返0
down_write(sem);
//void down_write(struct semaphore *sem);
//获取写资格,如果获取失败也会被挂起
down_write_trylock(sem);
//int down_write_trylock(struct semaphore *sem);
//
up_read(sem);
//void up_read(struct semaphore *sem);
//释放信号量
up_write(sem);
//void up_write(struct rw_semaphore *sem);
//
downgrade_write(sem);
//void downgrade_write(struct rw_semaphore *sem);
//把写者降级为读者
读写信号量适于在读多写少的情况下使用,在linux内核中对进程的内存映像描述结构的访问就使用了读写信号量进行保护。在Linux中,每一个进程都用一个类型为task_t或struct task_struct的结构来描述,该结构的类型为struct mm_struct的字段mm描述了进程的内存映像,特别是mm_struct结构的mmap字段维护了整个进程的内存块列表,该列表将在进程生存期间被大量地遍利或修改,因此mm_struct结构就有一个字段mmap_sem来对mmap的访问进行保护,mmap_sem就是一个读写信号量,在proc文件系统里有很多进程内存使用情况的接口,通过它们能够查看某一进程的内存使用情况,命令free、ps和top都是通过proc来得到内存使用信息的,proc接口就使用down_read和up_read来读取进程的mmap信息。当进程动态地分配或释放内存时,需要修改mmap来反映分配或释放后的内存映像,因此动态内存分配或释放操作需要以写者身份获得读写信号量mmap_sem来对mmap进行更新。系统调用brk和munmap就使用了down_write和up_write来保护对mmap的访问。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)