原子操作真的无法被中断吗

why_coder 2018-06-18 06:12:58
书上说原子操作无法被中断,但在分时系统中一个程序的时间片用完就会被中断,若一个原子操作的时间片用完了会被中断吗?
如果不会中断的话会有那下面这个问题怎么解决
一个信号量的wait原子操作:
wait(S){
while(S<0)
;
S--
}
在一个单处理器计算机中,当一个线程在等待某个信号量时,会在函数中循环,又因为这是个原子操作,不会被其他进程打断,那此时它不就会无限循环了吗,因为其他任何进程都无法运行
...全文
1594 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_40201711 2019-08-26
  • 打赏
  • 举报
回复
原子操作是有硬件支持的,cpu会对存储器中的变量进行锁定。 只要确定硬件支持,那么调用atomic_read,atomic_set,atomic_add,atomic_sub等原生的接口时,可以认为是绝对无法中断的。 如果出了问题,甩锅给硬件工程师呗。 可以参考:https://blog.csdn.net/holandstone/article/details/8596871
feedbacker05 2019-08-20
  • 打赏
  • 举报
回复
引用 6 楼 Newd 的回复:
[quote=引用 4 楼 feedbacker05 的回复:] 根据《java并发编程艺术》的话,原子操作是不可被中断的。根据百度百科,你这里的pv操作的p,伪代码写错了。
4楼的答疑者,你说这里的伪代码写错了,这个具体正确的情况是怎么写,烦请告知下。[/quote]

procedure P(var s:semaphore);
{
s.value=s.value-1;
if (s.value<0) asleep(s.queue);
}
[引用]https://baike.baidu.com/item/PV%E6%93%8D%E4%BD%9C
Newd 2019-08-09
  • 打赏
  • 举报
回复
引用 4 楼 feedbacker05 的回复:
根据《java并发编程艺术》的话,原子操作是不可被中断的。根据百度百科,你这里的pv操作的p,伪代码写错了。


4楼的答疑者,你说这里的伪代码写错了,这个具体正确的情况是怎么写,烦请告知下。
Newd 2019-08-09
  • 打赏
  • 举报
回复
楼主的这个问题,我也困惑了很久,一直没有得到妥善合理的解决,在中国大学MOOC操作系统专栏发过留言贴一直没有得到老师们的回复,根据我的理解,由于wait函数实现原子操作(运行的过程中不能被打断)是通过设置寄存器IF的值也就是关闭了CPU的中断处理,让CPU不接受任何的中断请求,直至wait函数运行完毕后,自行的将寄存器IF的值设置为开启状态,让CPU可以继续的处理外界中断请求,可是如果wait函数里面死循环了,由于此时中断状态被关闭了,CPU又不处理外界的I/O硬件发来的中断,那么操作系统就这样一直干等着下去无穷无尽的while空循环,
--------------------------------------------------------------------------------------------------------------------------------------
以下为个人理解
原子操作实现的原理,这里是单CPU的情况下,由于每个进程是按照CPU来分的一些时间片,当时间片运行结束后而进程没有结束,那么该进程先保存下现场环境,等待下一个CPU时间片的到来,直至整个进程被多次的CPU时间片运行完毕为止,在这个过程中一个进程被分割了多次运行,也就是在多个不连续的CPU时间片下运行完毕的,可是原子操作是想通过一次性完成,这里可以理解为一个时间片来完成,其实操作系统是不知道你的进程需要多长时间才能完成,他唯一能做的就是当你的时间片完成了,哪怕你的进程没有结束完毕,他还要继续调度其他进程来下,这个是由操作系统的调度程序来实现,可是我们再深入的想一下调度程序是如何知道一个进程的某次时间片是否快要结束了呢,其实进程调度程序是不知道的,在每个进程都有一个PCB数据结构用来描述自己的运行环境信息,里面会存储着自己的运行记账信息,同时在CPU的周边还有几个和CPU一起并行工作的硬件定时器,这些定时器每过一段时间就会给CPU发去中断请求,告诉CPU已经过去了多长时间,CPU收到中断后运行对应的中断处理程序,在该程序中判断当前正在执行的进程PCB中的时间记账信息是否等于0如果等于就将它停止运行,这个时候运行进程调度程序,由进程调度程序来选取下一个获得CPU的进程,一切的一切都是由中断控制的,如果我们让CPU不接受外界的中断,那么定时器发来的中断通知,CPU假装不知道,那么这个时候进程调度程序也不会进行进程调度选取下一个该运行的进程,那么之前的那个进程将会一直独占CPU运行,如果他规规矩矩的运行完毕后,然后打开中断处理也罢,就担心这个院子操作里面死循环了,如果死循环了,那岂不是操作系统就卡着不动弹了。。。。。。
feedbacker05 2019-07-21
  • 打赏
  • 举报
回复
根据《java并发编程艺术》的话,原子操作是不可被中断的。根据百度百科,你这里的pv操作的p,伪代码写错了。
17420 2019-05-10
  • 打赏
  • 举报
回复
查了些资料,感觉确实是,如果s<=0,就会无线循环,其他进程又无法获得cpu更改s的值,死锁... 如果理解不正确,欢迎知道的大神给与解答。
17420 2019-05-09
  • 打赏
  • 举报
回复
同问,求解答呀
逗泥丸的平方 2018-06-19
  • 打赏
  • 举报
回复
描述没明白 代码也没看懂

23,405

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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