社区
C语言
帖子详情
操作系统如何实现互斥量和信号量?
james_hw
2010-06-03 03:16:08
开发过程中一直是在使用互斥量和信号量,但是从没考虑过操作系统是如何实现这方面功能的,结果面试的时候被问到,一时无语。。。
另外多处理器(多核)下,互斥量和信号量是如何实现的(我狡辩互斥量可以用中断实现,结果被这么问了。。。)
...全文
720
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源码详解(四)——
信号
量
、
互斥
量
、递归
互斥
量
信号
量
又分为二进制
信号
量
和计数型
信号
量
,二进制
信号
量
相当于一个长度为一的队列,其消息数取值只能为0,1;计数型
信号
量
创建时可以设置其队列长度与队列中的初始消息数,即其消息数的取值没有限制
操作系统
中的
信号
量
(sema)与
互斥
(mutex)
信号
量
:那是多线程同步用的,一个线程完成了某一个动作就通过信号告诉别的线程,别的线程再进行某些动作。
互斥
量
:这是多线程
互斥
用的,比如说,一个线程占用了某一个资源,那么别的线程就无法访问,知道这个线程离开,其他的线程才开始可以利用这个资源。
信号
量
与普通整型变
量
的区别:
信号
量
(semaphore)是非负整型变
量
,除了初始化之外,它只能通过两个标准原子操作:wait(s
RT-thread
信号
量
与
互斥
量
互斥
量
的使用比较单一,因为它是
信号
量
的一种,并且它是以锁的形式存在。线程3先持有
互斥
量
,而后线程2试图持有
互斥
量
,此时线程3的优先级被提升为和线程2的优先级相同。为了体现使用
互斥
量
来达到线程间的同步并体现优先级继承的现象,例程设计了thread1thread2、thread3三个线程,优先级分别为9、10、11,设计了一个
互斥
量
mutex。整体情况就是:线程3先持有
互斥
量
,而后线程2试图持有
互斥
量
,此时线程3的优先级应该被提升为和线程2的优先级相同,然后线程1打印线程2与线程3的优先级信息。
互斥
量
与
信号
量
2019独角兽企业重金招聘Python工程师标准>>> ...
信号
量
与
互斥
锁
信号
量
与普通整型变
量
的区别: ①
信号
量
(semaphore)是非负整型变
量
,除了初始化之外,它只能通过两个标准原子操作:wait(semap) , signal(semap) ; 来进行访问; ②操作也被成为PV原语(P来源于Dutch proberen"测试",V来源于Dutch verhogen"增加"),而普通整型变
量
则可以在任何语句块中被访问;
信号
量
与
互斥
锁之间的区别:...
C语言
70,040
社区成员
243,237
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章