zhoudaiyu
V2EX  ›  问与答

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

  •  1
     
  •   zhoudaiyu ·
    PRO
    · Jan 8, 2021 · 2358 views
    This topic created in 1960 days ago, the information mentioned may be changed or developed.
    小白不太懂这些,但是感觉至少不在我的代码里写个死循环,但是肯定在某块代码或者硬件有这种逻辑,不知道是不是正确的?
    21 replies    2021-01-09 10:24:19 +08:00
    Jirajine
        1
    Jirajine  
       Jan 8, 2021 via Android
    软件代码通过 eventloop 产生的事件应该是有的,至于硬件,IO 设备在数据到达后发出通知是否需要就不清楚了。
    imdong
        2
    imdong  
       Jan 8, 2021
    假如你今天要接收一件快递,但不知道什么时间送来,你大概会有以下几种方案:

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

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

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

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

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