社区
C语言
帖子详情
操作系统如何实现互斥量和信号量?
james_hw
2010-06-03 03:16:08
开发过程中一直是在使用互斥量和信号量,但是从没考虑过操作系统是如何实现这方面功能的,结果面试的时候被问到,一时无语。。。
另外多处理器(多核)下,互斥量和信号量是如何实现的(我狡辩互斥量可以用中断实现,结果被这么问了。。。)
...全文
696
12
打赏
收藏
操作系统如何实现互斥量和信号量?
开发过程中一直是在使用互斥量和信号量,但是从没考虑过操作系统是如何实现这方面功能的,结果面试的时候被问到,一时无语。。。 另外多处理器(多核)下,互斥量和信号量是如何实现的(我狡辩互斥量可以用中断实现,结果被这么问了。。。)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xinzaiyiqi
2010-06-04
打赏
举报
回复
不懂,帮顶
赵4老师
2010-06-04
打赏
举报
回复
比如两个线程ID分别为1、2
有一个锁变量LOCK,初值为0
线程1加锁的过程:
int ID=1;//线程2此处应为2
volatile int LOCK;
if (LOCK==0) LOCK=ID;
if (LOCK==ID) {
//线程1加锁成功
} else {
//线程1加锁失败,即另一个线程(其ID即现在LOCK的值)刚加锁成功
}
线程1解锁的过程:
if (LOCK==ID) LOCK=0;
else {
//此锁之前不是被此线程加的锁
}
zenny_chen
2010-06-04
打赏
举报
回复
[Quote=引用 4 楼 mlee79 的回复:]
多核CPU会提供某种机制实现最基本的同步原语比如 atomic_incl , atomic_decl , atomic_swap , atomic_cas 等, 比如 x86 指令的 lock 前缀, arm 的 swap 指令, armV6+ 上 ldrex/strex , sparc 的ldstub 等....
内核中最基本的同步方式是自旋锁, 在某些情况下是通过 关/开 中断实现, 更多……
[/Quote]
不过话说,那么长时间没见mLee,现在已经升星星啦,呵呵。
偶对上次基于ARM的CAS2的探讨还记忆犹新啊,呵呵。
zenny_chen
2010-06-04
打赏
举报
回复
呵呵呵,楼主可以去看看Linux内核代码就知道了。
现成的代码都有啊。呵呵。
Pslly_001
2010-06-04
打赏
举报
回复
在操作系统中,使用p操作和v操作控制同步和互斥的信号量,p操作可以是信号量加一,v操作使信号量减一,通过p v操作控制进程的同步与互斥,详见操作系统教材,关于进程的同步与互斥章节
james_hw
2010-06-04
打赏
举报
回复
继续顶一下
james_hw
2010-06-04
打赏
举报
回复
[Quote=引用 4 楼 mlee79 的回复:]
多核CPU会提供某种机制实现最基本的同步原语比如 atomic_incl , atomic_decl , atomic_swap , atomic_cas 等, 比如 x86 指令的 lock 前缀, arm 的 swap 指令, armV6+ 上 ldrex/strex , sparc 的ldstub 等....
内核中最基本的同步方式是自旋锁, 在某些情况下是通过 关/开 中断实现, 更多的……
[/Quote]
说实话,看到这些,我还是没明白互斥量和信号量是如何实现的。。。
softman11
2010-06-04
打赏
举报
回复
这种东西说到本质就是要原语支持,也就是做PV操作的语句不可能被打断。
因此从硬件上说,必须要用原语指令支持。
实现其实很简单,就是大家说的加一,减一,至于信号量实现,从硬件上,肯定就是中断。
但是操作系统不一定非要用中断,也可以用消息机制搞定,windows就是这么搞的。
mLee79
2010-06-03
打赏
举报
回复
多核CPU会提供某种机制实现最基本的同步原语比如 atomic_incl , atomic_decl , atomic_swap , atomic_cas 等, 比如 x86 指令的 lock 前缀, arm 的 swap 指令, armV6+ 上 ldrex/strex , sparc 的ldstub 等....
内核中最基本的同步方式是自旋锁, 在某些情况下是通过 关/开 中断实现, 更多的是用 atomic_swap 或类似的原语实现...
理解了自旋锁, 其他的也就不麻烦了...
充电宝111
2010-06-03
打赏
举报
回复
很简单的,加一减一的问题,PV操作
但是这些是要和进程或线程的上下文联系起来的。
cattycat
2010-06-03
打赏
举报
回复
信号量有一个在这个信号上等待的队列,如果信号可用,从队列中取一个,否则阻塞。
互斥量好像是自旋锁还是什么的。
多核的就不知道了。linux也是用spinlock自旋锁的,不同cpu中断不一样。
说的比较浅,自己也没深入过。
pengzhixi
2010-06-03
打赏
举报
回复
操作系统内核建立这些对象,然后有用到引用计数,具体内容,我也不清楚。
手把手教你FreeRTOS源码详解(四)——
信号
量
、
互斥
量
、递归
互斥
量
本文详细解析了FreeRTOS
操作系统
中
信号
量
和
互斥
量
的源码,包括二进制
信号
量
、计数型
信号
量
的创建与释放,以及
互斥
量
的创建、获取和释放过程。重点介绍了
信号
量
和
互斥
量
如何利用队列
实现
,并讨论了优先级继承在
互斥
量
中的应用。
操作系统
中的
信号
量
(sema)与
互斥
(mutex)
本文详细介绍了
操作系统
中的
信号
量
和
互斥
量
,它们都是多线程同步的重要工具。
信号
量
通过PV操作进行访问,可用于多资源的同步与
互斥
,而
互斥
量
仅用于单一资源的
互斥
访问。两者的主要区别在于同步与
互斥
的场景,以及值域范围。
信号
量
可
实现
多个线程间的有序访问,
互斥
量
则确保资源在同一时刻只被一个线程占用。
RT-thread
信号
量
与
互斥
量
本文介绍了RT-thread
操作系统
中
信号
量
和
互斥
量
的概念及其应用场景。通过生产者-消费者示例解释了
信号
量
如何
实现
线程同步和资源计数,强调了
信号
量
在线程速度不匹配时的重要性。同时,对比了
信号
量
与
互斥
量
的区别,如
互斥
量
支持递归访问和防止优先级反转。通过线程优先级继承的例子展示了
互斥
量
在解决优先级反转问题上的作用。
互斥
量
与
信号
量
本文详细介绍了
互斥
量
和
信号
量
的概念及其在多线程环境中的应用。
互斥
量
用于
实现
线程间的
互斥
访问,而
信号
量
用于同步线程对资源的访问。文章还比较了两者之间的区别,并提供了不同
操作系统
中的
实现
方法。
信号
量
与
互斥
锁
本文详细解析了
信号
量
和
互斥
量
的概念及其在多线程环境中的应用。
信号
量
用于线程间的同步,包括二进制
信号
量
、整型
信号
量
和记录型
信号
量
。
互斥
量
用于线程的
互斥
,确保资源的独占访问。文章对比了两者在资源管理上的差异,并介绍了在不同
操作系统
中的
实现
。
C语言
70,038
社区成员
243,247
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章