V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zhoudaiyu
V2EX  ›  问与答

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

  •  1
     
  •   zhoudaiyu · 2021-01-08 20:24:00 +08:00 · 1863 次点击
    这是一个创建于 1416 天前的主题,其中的信息可能已经有所发展或是发生改变。
    小白不太懂这些,但是感觉至少不在我的代码里写个死循环,但是肯定在某块代码或者硬件有这种逻辑,不知道是不是正确的?
    21 条回复    2021-01-09 10:24:19 +08:00
    Jirajine
        1
    Jirajine  
       2021-01-08 20:38:50 +08:00 via Android
    软件代码通过 eventloop 产生的事件应该是有的,至于硬件,IO 设备在数据到达后发出通知是否需要就不清楚了。
    imdong
        2
    imdong  
       2021-01-08 20:43:55 +08:00
    假如你今天要接收一件快递,但不知道什么时间送来,你大概会有以下几种方案:

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

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

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

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

    后来写作业发现像 API 这种监听的 function,只要写好 annotation,框架自己就能一直监听了,至于怎么实现的依然不清楚 hhh
    mumbler
        16
    mumbler  
       2021-01-09 02:33:04 +08:00 via Android
    计算机和人一样,活着就有心跳
    himself65
        17
    himself65  
       2021-01-09 03:04:55 +08:00 via iPhone
    你可以从汇编开始写点实模式代码,没有 hlt (暂停)的话的确是一直在跑🤔
    Claar
        18
    Claar  
       2021-01-09 03:08:35 +08:00 via iPhone
    不需要
    这是主动和被动的问题
    如果是主动控制的流程,那是需要持续轮询的
    但如果是被动控制机制那就不需要了
    硬件中断应该就是被动控制机制,对于 cpu 来说,某些消息是从天而降的,不是自己去内存里取的,什么是主动去取? cpu 执行指定控制流查找。怎么从天而降?某些不是用来执行汇编指令的部件在主动轮询甚至是被动持续,在消息到达的时候直接把 cpu 的执行流改了,对于 cpu 来说就是从天而降
    对于一辆开动的火车,想要他改变方向怎么办?简单啊,第三方把他就要到达的那个位置的铁轨一歪,就到别的车道去了,火车啥都不知道,被动机制
    这个第三方甚至不是个人,他是一块铁,消息到达时,另一边的铁轨上闪了一下火花把第三方吸过去了,顺带着铁轨也歪了
    Claar
        19
    Claar  
       2021-01-09 03:12:05 +08:00 via iPhone
    我猜问题的 while 1 肯定不会是问电脑能跑程序是因为上了电这种持续状态吧……
    xiadong1994
        20
    xiadong1994  
       2021-01-09 03:39:43 +08:00 via iPhone
    系统 kernel 是不能退出 /return 的,在 idle 的时候你猜猜它在干什么……
    zhuzhibin
        21
    zhuzhibin  
       2021-01-09 10:24:19 +08:00 via iPhone
    阻塞监听消费
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5691 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 09:01 · PVG 17:01 · LAX 01:01 · JFK 04:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.