发布时间:2010-11-29 阅读量:2126 来源: 发布人:
【中心议题】
【解决方案】
随着社会信息化和家庭网络化的飞速发展,越来越多的家庭建立了家庭网络。家庭网关是整个家庭网络的核心,它主要实现Internet接入、远程控制以及连接家庭内部异构子网的功能。家庭网关类似于服务器的功能,集中控制家庭网络中的家电设备,如信息家电、安防系统、报警系统等。在基于Linux网络中,通过Linux驱动程序的形式连接各个模块和操作系统,完成整个软件的构架, CPU总控模块负责初始化和协调各个模块的操作,是整个系统的大脑,事务控制模块支持并发控制,主要保证传递过程中的可靠性和高效性。
1 数据报文处理过程及其缺陷
当网络适配器正确接收到一个数据包时,会触发一个中断,其驱动程序中的中断服务程序将调用确定的接收函数来处理,将收到的网络包放到网络接收队列上,并设置相应状态寄存器,系统会在中断处理返回时,处理发生的软中断,如图1所示。根据状态寄存器就会判断是否接收到了新包、是否完成了传输或是否发生了错误。如果接收到了包,就会调用net_rx()中断处理函数,处理接收包的驱动程序方法负责请求套接字缓冲区并把接收到的包填充到包数据空间中。随后, netif_rx()可以将套接字缓冲区放入输入队列中,最后网络设备的统计信息被更新,并且中断处理程序可以继续处理下一个收到的包也可以终止中断处理。
当网络适配器驱动程序执行到netif_rx()时,将收到的网络包放到网络接收对列上,同时设置相应中断标志,系统在中断处理返回时,根据标志位信息处理发生的中断,调用对应注册过的net_rx_ac-tion()函数取下网络包,进一步调用对应的处理函数ip_rcv(),对网络包进行路由并转发,最后由dev_queue_xmit()负责将包从对应的出口设备上发送出去,或者在队列忙时将包放入设备发送队列并设置相应网络发送中断,等待中断处理机制推迟发送网络包。
基于Linux网关中转发报文流程执行比较频繁,对系统的效率影响最大。工作在中断模式下的网络适配器,在网络负载比较大的情况下,网络部分的接口会频繁地中断系统,从而造成非常大的系统负载。当网络流量非常大时,在中断级别上处理网络请求的操作系统将会陷入中断影响之中,最终导致报文吞吐率急剧下降。当带宽占用率相同,全部传输短报文的情况下,由于中断非常频繁,系统的峰值处理能力将达到最低限度。
2 基于中断和轮询自动切换的传输机制
为了解决中断驱动模式带来的负面影响,现在提出一种中断和轮询自动切换的报文处理模式。在网络负载较低的情况下,报文到达时间是不可预测的,所以由于报文到达的随机性会产生系统延迟,此时利用中断处理机制能够很好地避免大量延迟产生;但是当网络负载比较高时,报文的输入速率会达到一个基本的稳定状态,如果采用中断处理机制,由于高负荷的网络会带来频繁的中断发生,从而降低系统效率,此时采用轮询机制反而会充分发挥其优势,保证系统的高吞吐率。
具体工作过程如下(工作流程如图2所示):
(1)当报文首次到达时,系统处于开中断状态,此时通过修改标志寄存器的中断允许位使系统处于关中断状态,从而进入轮询模式,同时给滑动窗口W配置一个用于判断每次轮询所接收到的数据报文的个数n;
(2)当n
(3)当n≥W时,报文输入速率比较低,系统有可能进入空轮询状态,为了降低系统开销,修改标志寄存器相应位,使系统由关中断进入开中断状态,重新打开中断,以中断的方式处理报文;
(4)当前报文处理完毕,接收到下一个报文时,
重复(1)、(2)、(3)。如果接收队列未满但系统资源耗尽后,进入初始化状态,释放所有资源。
在轮询工作模式下,为了避免引发外部中断,需要屏蔽“接收成功”、“发送成功”等内部中断,同时不断查询这些中断状态位的情况,发现需要处理的内部中断时做以相应处理,当中断工作模式回复后,相应要重新恢复刚才屏蔽掉的“接收成功”、“发送成功”等内部中断。
当网络适配器进入轮询状态时,软件中断NET_RX_SOFTIRQ的处理例程net_rx_action()最终将调用dev_queue_xmit()发送函数, dev_queue_xmit()的调用流程是: dev_queue_xmit()-->qdisc_run()-->qdisc_restart(),调用方法qbisc_restart()以启动网络设备数据包的传输,而此时它有可能在设备发送队列繁忙时引发网络发送中断:
在数据包放入队列之后,调用qdisc_run()来发送数据包:
static inline void qdisc_run(structnet_device* dev)
{
while (! netif_queue_stopped(dev) &&
qdisc_restart(dev)<0)
/* NOTHING* /;
}
在qdisc_restart()函数中,首先调用函数pfifo_fast_dequeue()从队列中取出一个数据包,然后调用网络适配器驱动的发送函数dev->hard_start_xmit()发送数据包,如果发送失败,则需要将这个数据包重新压入队列pfifo_fast_requeue,然后启动协议栈的发送软中断进行再次的发送,从而引发软处理中断。
为了保证轮询工作正常进行,需要做以修改。linux-2. 6. 14. 1中qdisc( )函数部分源码如下。
int qdisc_restart(structnet_device* dev)
{
structQdisc* q = dev->qdisc;
struct sk_buff* skb;
┇
requeue:
q->ops->requeue(skb, q);
netif_schedule(dev);
return 1;
}
BUG_ON(( int) q->q. qlen < 0);
return q->q. qlen;
┇
}
以下是修改后的函数部分代码:
int qdisc_restart(structnet_device* dev)
{
┇
If(! config_polling_on)
netif_schedule(dev);
┇
}
其中config_polling_on指示当前是否是轮询工作模式,在/proc下保留了设置它的接口,方便动态地设置。
修改后,当打开轮询内核设置后, qdisc_restart()就不再进行网络层的发送软中断调度,从而保证了轮询正常进行。
3 总结
综上所述,通过编写简单的控制程序,对Linux内核相应报文处理函数做以修改,就可以使报文处理流程处于中断和轮询相互切换的工作模式,大大提高了系统的处理能力。
无人机系统(Unmanned Aerial Systems, UAS)作为“低空经济”的核心载体,正以前所未有的深度和广度渗透至众多产业领域,驱动效率变革与模式创新。其核心价值在于提供高灵活性、低成本和高精度的空中解决方案,显著提升了传统作业方式的效能。
市场研究权威机构Omdia最新报告揭示,智能手机显示技术格局已发生根本性转变。2025年第一季度,采用AMOLED面板的智能手机出货量在全球总市场中占比高达63%,较去年同期的57%实现大幅跨越,标志着AMOLED已成为无可争议的主流标准。与此同时,LCD面板的份额被压缩至37%,延续了长期的萎缩态势。
7月16日,第三届中国国际供应链促进博览会(链博会)在京开幕。美国科技企业英伟达公司首席执行官黄仁勋身着唐装亮相开幕式,并在现场透露重要业务进展:该公司专为中国市场设计的H20人工智能芯片已获得美国商务部出口许可,即将启动批量供货。
近日,楷登电子(Cadence Design Systems, Inc., NASDAQ: CDNS)宣布其业界领先的LPDDR6/5X内存IP系统解决方案已成功完成流片验证。该集成化子系统通过技术优化,实现了高达14.4Gbps的运行速率,相较上一代LPDDR标准内存接口,性能提升幅度达到50%。此套先进解决方案被视为扩展人工智能(AI)基础架构的关键驱动技术之一。它旨在满足日益增长的新一代AI大语言模型(LLM)、代理型AI(Agent AI)以及众多垂直应用领域对超高内存带宽和容量的迫切需求,以高效支持这些计算密集型工作负载。楷登电子当前已与AI、高性能计算(HPC)及数据中心领域的多家头部客户展开紧密合作,共同推进该技术的应用落地。
作为全球授权电子元器件代理商,贸泽电子(Mouser Electronics)持续深化与德州仪器(TI)的战略合作,确保69,000余款TI器件的高效供应,其中45,000余款保持常态库存,可实现全球快速交付。通过整合TI在电源管理、数据处理及控制系统的完整技术生态,贸泽为工业自动化、汽车电子、通信基建、企业级设备等核心领域提供端到端解决方案支持。