是不是所有的同步/异步/事件通知/发布订阅等等概念都需要一个地方完成一个类似 while(1)的逻辑?

2021-01-08 20:24:00 +08:00
 zhoudaiyu
小白不太懂这些,但是感觉至少不在我的代码里写个死循环,但是肯定在某块代码或者硬件有这种逻辑,不知道是不是正确的?
1857 次点击
所在节点    问与答
21 条回复
Jirajine
2021-01-08 20:38:50 +08:00
软件代码通过 eventloop 产生的事件应该是有的,至于硬件,IO 设备在数据到达后发出通知是否需要就不清楚了。
imdong
2021-01-08 20:43:55 +08:00
假如你今天要接收一件快递,但不知道什么时间送来,你大概会有以下几种方案:

一:今天有快递要收,你去门口等快递来,快递不来你不走...
二:今天有快递要收,跑门口看一眼快递来了没,没来。等一会,再跑门口看一眼快递来了没...
三:今天有快递要收,门口装了门铃,我该干啥干啥。快递来了会按门铃的。
案例三其实是案例二的更高效方案,跑门口看快递来了没,改为一直听着门铃响了没。

好了,举了半天🌰,发现确实是始终有一个 while true 的地方...

但是,案例一属于特例,既是又不是,因为确实有一直等待而不是循环,但是把尺度拉到最小的是时候,你的人虽然在等快递,但是你的思绪可能已经放飞了...
OysterQAQ
2021-01-08 20:44:10 +08:00
计算机层面可以依赖中断来实现吧,指令周期之后有中断周期来查询响应中断
0ZXYDDu796nVCFxq
2021-01-08 20:44:21 +08:00
任何一个守护进程都可以这么理解吧
OysterQAQ
2021-01-08 20:44:43 +08:00
很多问题需要了解体系结构才好去思考
zhoudaiyu
2021-01-08 20:50:34 +08:00
@OysterQAQ #5 是的 不太理解硬件层
billlee
2021-01-08 21:12:56 +08:00
中断不需要这个逻辑,类似的,SIGNAL 可以认为软件层面对中断的模拟,也没有这个逻辑
OysterQAQ
2021-01-08 21:29:09 +08:00
@zhoudaiyu 计算机组成原理、计算机操作系统、计算机网络、数据结构与算法来一遍就行
Sanko
2021-01-08 21:31:17 +08:00
从来没有什么岁月美好,只不过有人替你不断轮训
vinceall
2021-01-08 22:18:18 +08:00
总要有一个地方替你轮询啊,不管是应用层,框架,os,还是硬件
raaaaaar
2021-01-08 22:47:13 +08:00
@OysterQAQ #8 很好,下学期就要全过一遍了。。
OysterQAQ
2021-01-08 23:17:07 +08:00
@raaaaaar 建议计组和操作系统用考研的标准来过 其他两个可以跟老师上
msg7086
2021-01-09 00:36:04 +08:00
不说硬件,软件层面的话操作系统就是在死循环分发时间片。
硬件的话,你的 CPU 也是一个死循环,不停从内存里扒指令,看看有没有事做,没事做就摸鱼。
php8
2021-01-09 00:51:28 +08:00
eventloop 就是
while(1) {
waitForEvent();
dispatchEvent();
}

如果某个东西能重复做某件事,它就得带 loop,否则就是个一次性的东西了。
LxExExl
2021-01-09 02:11:30 +08:00
之前从没有写过网站之类的服务,我真的以为就是需要手写 while(1)

后来写作业发现像 API 这种监听的 function,只要写好 annotation,框架自己就能一直监听了,至于怎么实现的依然不清楚 hhh
mumbler
2021-01-09 02:33:04 +08:00
计算机和人一样,活着就有心跳
himself65
2021-01-09 03:04:55 +08:00
你可以从汇编开始写点实模式代码,没有 hlt (暂停)的话的确是一直在跑🤔
Claar
2021-01-09 03:08:35 +08:00
不需要
这是主动和被动的问题
如果是主动控制的流程,那是需要持续轮询的
但如果是被动控制机制那就不需要了
硬件中断应该就是被动控制机制,对于 cpu 来说,某些消息是从天而降的,不是自己去内存里取的,什么是主动去取? cpu 执行指定控制流查找。怎么从天而降?某些不是用来执行汇编指令的部件在主动轮询甚至是被动持续,在消息到达的时候直接把 cpu 的执行流改了,对于 cpu 来说就是从天而降
对于一辆开动的火车,想要他改变方向怎么办?简单啊,第三方把他就要到达的那个位置的铁轨一歪,就到别的车道去了,火车啥都不知道,被动机制
这个第三方甚至不是个人,他是一块铁,消息到达时,另一边的铁轨上闪了一下火花把第三方吸过去了,顺带着铁轨也歪了
Claar
2021-01-09 03:12:05 +08:00
我猜问题的 while 1 肯定不会是问电脑能跑程序是因为上了电这种持续状态吧……
xiadong1994
2021-01-09 03:39:43 +08:00
系统 kernel 是不能退出 /return 的,在 idle 的时候你猜猜它在干什么……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/743152

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX