社区
C语言
帖子详情
操作系统如何实现互斥量和信号量?
james_hw
2010-06-03 03:16:08
开发过程中一直是在使用互斥量和信号量,但是从没考虑过操作系统是如何实现这方面功能的,结果面试的时候被问到,一时无语。。。
另外多处理器(多核)下,互斥量和信号量是如何实现的(我狡辩互斥量可以用中断实现,结果被这么问了。。。)
...全文
641
12
打赏
收藏
操作系统如何实现互斥量和信号量?
开发过程中一直是在使用互斥量和信号量,但是从没考虑过操作系统是如何实现这方面功能的,结果面试的时候被问到,一时无语。。。 另外多处理器(多核)下,互斥量和信号量是如何实现的(我狡辩互斥量可以用中断实现,结果被这么问了。。。)
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
打赏
举报
回复
操作系统内核建立这些对象,然后有用到引用计数,具体内容,我也不清楚。
操作系统
——
信号
量
(理解什么是
信号
量
,
信号
量
如何解决同步
互斥
问题,
信号
量
一些注意点)
信号
量
是什么
信号
量
(semaphore)是
操作系统
用来解决并发中的
互斥
和同步问题的一种方法。
信号
量
是一个与队列有关的整型变
量
,你可以把它想象成一个数后面拖着一条排队的队列,如图: 那
信号
量
上面值n代表什么意思呢? n>0:当前有可用资源,可用资源数
量
为n n=0:资源都被占用,可用资源数
量
为0 n<0:资源都被占用,并且还有n个进程正在排队 那
信号
量
拖着的那个队列就是用来放正在排队想要使用这一资源的进程
信号
量
伪代码
信号
量
的伪代码又如何
实现
呢 在代码中我们可以看到有两个对
信号
量
的cou
互斥
量
和
信号
量
的区别
互斥
量
和
信号
量
的区别1.
互斥
量
用于线程的
互斥
,
信号
量
用于线程的同步。这是
互斥
量
和
信号
量
的根本区别,也就是
互斥
和同步之间的区别。
互斥
:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但
互斥
无法限制访问者对资源的访问顺序,即访问是无序的。同步:是指在
互斥
的基础上(大多数情况),通过其它机制
实现
访问者对资源的有序访问。在大多数情况下,同步已经
实现
了
互斥
,特别是所有写入资源的情况必定是...
信号
量
与
互斥
量
的区别
多任务间同步的方式包括关中断,调度器上锁,
互斥
量
(mutex),
信号
量
,消息队列几种, 其中
互斥
量
和
信号
量
使用使用方式相近,连概念和
实现
都有些近似, 所以没有扎实
操作系统
背景知识的同学常常分不清出他们的区别,容易混淆, 下面简单分析以下. 1.
互斥
量
互相斥
量
是管理临界资源的一种有效手段, 因为
互斥
量
是独占的, 所以在一个时刻只允许一个线程占有
互斥
量
,利用这个性质来
实现
共享资
FreeRTOS
操作系统
学习——
互斥
量
互斥
量
又称
互斥
信号
量
(本质是
信号
量
),是一种特殊的二值
信号
量
,它和
信号
量
不同的是,它支持
互斥
量
所有权、递归访问以及防止优先级翻转的特性,用于
实现
对临界资 源的独占式处理。任意时刻
互斥
量
的状态只有两种,开锁或闭锁。当
互斥
量
被任务持有时, 该
互斥
量
处于闭锁状态,这个任务获得
互斥
量
的所有权。当该任务释放这个
互斥
量
时,该
互斥
量
处于开锁状态,任务失去该
互斥
量
的所有权。当一个任务持有
互斥
量
时,其他任务 将不能再对该
互斥
量
进行开锁或持有。持有该
互斥
量
的任务也能够再次获得这个锁而不被。
FreeRTOS之
信号
量
和
互斥
量
我可以通过队列来
实现
同步和异步,为什么还需要一个
信号
量
呢?使用
信号
量
的优点在哪呢,为什么需要
互斥
量
呢?
互斥
量
的优点在哪呢?二值
信号
量
是一种基础的同步机制,它是一种特殊的
信号
量
,其计数值只能为0或1。二值
信号
量
主要用于表示一个特定的资源是否可用,或者某个条件是否满足。当二值
信号
量
的值为1时,表示资源可用或某个条件为真;当其值为0时,则表示资源不可用或条件未满足。在利用队列的时候我们通过给队列发送,当任务结束之后再释放。同样的道理。在
信号
量
中我们也要获取(Take)二值
信号
量
和给予(give)二值
信号
量
。
C语言
70,024
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章