网卡收到数据包时候,每次都要触发硬软中断么? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
main1234
V2EX    程序员

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

  •  
  •   main1234 2024-03-01 17:19:51 +08:00 1675 次点击
    这是一个创建于 656 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    但是我看了一票文章,有点疑问,请大大解答 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  
    PRO
       2024-03-01 17:24:00 +08:00
    个人理解:第三点:中断分中断上半部和下半部吧,上半部是硬件做,下半部是软件做,这样上半部能尽量处理完后就将后续的事情给操作系统异步地去做(相对慢)
    leonshaw
        2
    leonshaw  
       2024-03-01 17:39:40 +08:00
    1. 在软中断处理完之前是屏蔽的
    2. 看时间间隔,能一次轮询到就不会
    3. 简单来说就是网络忙的时候轮询,闲的时候等中断,中断来了再轮询
    yolee599
        3
    yolee599  
       2024-03-01 17:50:13 +08:00
    1. 第一包数据到了,会触发硬中断,这时候关闭硬件中断并开始轮循。一直到网卡 RING BUFFER 为空,结束轮询,并开启硬中断。
    2. 如果在轮询中收到第二包数据,不会触发硬中断,会被轮询读取。
    3. 频繁触发硬中断会影响系统的实时性,硬中断的代码需要简短,尽快结束。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3002 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 554ms UTC 12:36 PVG 20:36 LAX 04:36 JFK 07:36
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86