作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题
代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等
联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。码炫课堂的个人空间-码炫码哥个人主页-面试,源码等
释放21集全网最深ConcurrentHashMap的vip视频,复现每一行源码
说明:
- Kernel版本:4.14
- ARM64处理器,Contex-A53,双核
- 使用工具:Source Insight 3.5, Visio
1. 概述
- 信号量
semaphore,是操作系统中一种常用的同步与互斥的机制; - 信号量允许多个进程(计数值>1)同时进入临界区;
- 如果信号量的计数值为1,一次只允许一个进程进入临界区,这种信号量叫二值信号量;
- 信号量可能会引起进程睡眠,开销较大,适用于保护较长的临界区;
- 与读写自旋锁类似,linux内核也提供了读写信号量的机制;
本文将分析信号量与读写信号量的机制,开始吧。
2. 信号量
2.1 流程分析
- 可以将信号量比喻成一个盒子,初始化时在盒子里放入N把钥匙,钥匙先到先得,当N把钥匙都被拿走完后,再来拿钥匙的人就需要等待了,只有等到有人将钥匙归还了,等待的人才能拿到钥匙;
信号量的实现很简单,先看一下数据结构:
struct semaphore {
raw_spinlock_t lock; //自旋锁,用于count值的互斥访问
unsigned int count; //计数值,能同时允许访问的数量,也就是上文中的N把锁
struct list_head wait_list; //不能立即获取到信号量的访问者,都会加入到等待列表中
};
struct semaphore_waiter {
struct list_head list; //用于添加到信号量的等待列表中
struct task_struct *task; //用于指向等待的进程,在实际实现中,指向current
bool up; //用于标识是否已经释放
};
流程如下:

down接口用于获取信号量,up用于释放信号量;- 调用
down时,如果sem->count > 0时,也就是盒子里边还有多余的锁,直接自减并返回了,当sem->count == 0时,

最低0.47元/天 解锁文章
630

被折叠的 条评论
为什么被折叠?



