标签:write crash 读写 linux list 信号量 rwsem 进程
内核版本:5.14
代码路径:
- kernel/locking/rwsem.c
- include/linux/rwsem.h
概述
读写信号量具有如下特点:
- 可以有多个read持有读信号量
- 只允许一个write持有持有写信号量
- read和write之间互斥
- write和write之间互斥
- 以严格的FIFO顺序处理等待读/写信号量的所有进程。如果read或write进程发现信号量关闭,这些进程就被插入到信号量等待队列链表的末尾。
- 当信号量被释放时,检查处于等待队列链表第一个位置的进程。第一个进程被唤醒。如果时一个写者进程,等待队列上的其他的进程就继续睡眠。如果是一个读者进程,那么紧跟第一个进程的其他所有读者进程也被唤醒并获得信号量。不过,在写者进程之后排队的读者进程继续睡眠
数据结构
struct rw_semaphore {
atomic_long_t count;
atomic_long_t owner;
#ifdef CONFIG_RWSEM_SPIN_ON_OWNER
struct optimistic_spin_queue osq; /* spinner MCS lock */
#endif
raw_spinlock_t wait_lock;
struct list_head wait_list;
};
实验
实现一个申请和释放读写信号量rwsem_test的内核模块,然后通过应用来控制申请或者释放,期间使用crash工具查看rwsem_test信号量的内部状态。
root@ubuntu-vm:~# crash /mnt/linux-5.14/vmlinux
KERNEL: /mnt/linux-5.14/vmlinux
DUMPFILE: /dev/mem
CPUS: 12
DATE: Sat Mar 26 09:34:29 CST 2022
UPTIME: 00:29:52
LOAD AVERAGE: 0.72, 0.23, 0.08
TASKS: 176
NODENAME: ubuntu-vm
RELEASE: 5.14.0+
VERSION: #3 SMP Fri Mar 25 08:57:39 PDT 2022
MACHINE: x86_64 (3599 Mhz)
MEMORY: 16 GB
PID: 578
COMMAND: "crash"
TASK: ffff8de0c595ec80 [THREAD_INFO: ffff8de0c595ec80]
CPU: 2
STATE: TASK_RUNNING (ACTIVE)
crash> sym rwsem_test
ffffffffa5645b00 (d) rwsem_test
crash> rw_semaphore.count,owner,wait_list -x ffffffffa5645b00
count = {
counter = 0x0
},
owner = {
counter = 0x0
},
wait_list = {
next = 0xffffffffa5645b18 <rwsem_test+24>,
prev = 0xffffffffa5645b18 <rwsem_test+24>
}
标签:write,crash,读写,linux,list,信号量,rwsem,进程 来源: https://www.cnblogs.com/pengdonglin137/p/16057702.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。