操作系统如何实现互斥量和信号量?

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
  • 打赏
  • 举报
回复
操作系统内核建立这些对象,然后有用到引用计数,具体内容,我也不清楚。

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧