V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
main1234
V2EX  ›  程序员

网卡收到数据包时候,每次都要触发硬软中断么?

  •  
  •   main1234 · 270 天前 · 1294 次点击
    这是一个创建于 270 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前我以为每次有数据包到达网卡,都要触发软硬中断

    但是我看了一票文章,有点疑问,请大大解答 https://xiaolincoding.com/network/1_base/how_os_deal_network_package.html#linux-%E6%8E%A5%E6%94%B6%E7%BD%91%E7%BB%9C%E5%8C%85%E7%9A%84%E6%B5%81%E7%A8%8B

    里面说:

    " 所以为了解决频繁中断带来的性能开销,Linux 内核在 2.6 版本中引入了 NAPI 机制,它是混合「中断和轮询」的方式来接收网络包,它的核心概念就是不采用中断的方式读取数据,而是首先采用中断唤醒数据接收的服务程序,然后 poll 的方法来轮询数据。

    因此,当有网络包到达时,会通过 DMA 技术,将网络包写入到指定的内存地址,接着网卡向 CPU 发起硬件中断,当 CPU 收到硬件中断请求后,根据中断表,调用已经注册的中断处理函数。

    硬件中断处理函数会做如下的事情:

    需要先「暂时屏蔽中断」,表示已经知道内存中有数据了,告诉网卡下次再收到数据包直接写内存就可以了,不要再通知 CPU 了,这样可以提高效率,避免 CPU 不停的被中断。 接着,发起「软中断」,然后恢复刚才屏蔽的中断。 至此,硬件中断处理函数的工作就已经完成

    内核中的 ksoftirqd 线程专门负责软中断的处理,当 ksoftirqd 内核线程收到软中断后,就会来轮询处理数据。 "

    1.第一次收到数据包后,触发硬中断,第二次收到数据包还会触发硬中断么??

    2.既然软中断 ksoftirqd 是一个轮询,那么第二次收到数据包为啥还要触发软中断?

    3.还是不能理解为啥有硬中断,然后触发软中断就能避免频繁中断带来的开销,要做的事情并没有减少,一次性做完和分两步做完,还不如一次性在做完呢

    求大大解答

    3 条回复    2024-03-01 17:50:13 +08:00
    zhoudaiyu
        1
    zhoudaiyu  
       270 天前
    个人理解:第三点:中断分中断上半部和下半部吧,上半部是硬件做,下半部是软件做,这样上半部能尽量处理完后就将后续的事情给操作系统异步地去做(相对慢)
    leonshaw
        2
    leonshaw  
       270 天前
    1. 在软中断处理完之前是屏蔽的
    2. 看时间间隔,能一次轮询到就不会
    3. 简单来说就是网络忙的时候轮询,闲的时候等中断,中断来了再轮询
    yolee599
        3
    yolee599  
       270 天前
    1. 第一包数据到了,会触发硬中断,这时候关闭硬件中断并开始轮循。一直到网卡 RING BUFFER 为空,结束轮询,并开启硬中断。
    2. 如果在轮询中收到第二包数据,不会触发硬中断,会被轮询读取。
    3. 频繁触发硬中断会影响系统的实时性,硬中断的代码需要简短,尽快结束。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1495 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:17 · PVG 01:17 · LAX 09:17 · JFK 12:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.