NAPI處理方式分析

2021-06-18 06:55:19 字數 3227 閱讀 6874

napi 的核心在於:在乙個繁忙網路,每次有網路資料報到達時,不需要都引發中斷,因為高頻率的中斷可能會影響系統的整體效率,在高流量下,網絡卡產生的中斷可能達到每秒幾千次,而如果每次中斷都需要系統來處理,是乙個很大的壓力,而napi 使用輪詢時是禁止了網絡卡的接收中斷的,這樣會減小系統處理中斷的壓力,napi 是linux 上採用的一種提高網路處理效率的技術,它的核心概念就是不採用中斷的方式讀取資料,而代之以首先採用中斷喚醒資料接收的服務程式,然後poll 的方法來輪詢資料,(類似於底半(bottom-half)處理模式);

但是napi 存在一些比較嚴重的缺陷:而對於上層的應用程式而言,系統不能在每個資料報接收到的時候都可以及時地去處理它,而且隨著傳輸速度增加,累計的資料報將會耗費大量的記憶體,經過實驗表明在linux 平台上這個問題會比在freebsd 上要嚴重一些;另外採用napi 所造成的另外乙個問題是對於大的資料報處理比較困難,原因是大的資料報傳送到網路層上的時候耗費的時間比短資料報長很多(即使是採用dma 方式),所以正如前面所說的那樣,napi 技術適用於對高速率的短長度資料報的處理,

核心api: 

1. __netif_rx_schedule(dev) 

這個函式被中斷服務程式呼叫,將裝置的poll 方法新增到網路層次的poll 處理佇列中去,

排隊並且準備接收資料報,在使用之前需要呼叫netif_rx_reschedule_prep,並且返回的數為1,

並且觸發乙個net_rx_softirq 的軟中斷通知網路層接收資料報。 

2. netif_rx_schedule_prep(dev) 

確定裝置處於執行,而且裝置還沒有被新增到網路層的poll 處理佇列中,

在呼叫netif_rx_schedule之前會呼叫這個函式。 

3. netif_rx_complete(dev) 

把當前指定的裝置從poll 佇列中清除,通常被裝置的poll 方法呼叫,

注意如果在poll 佇列處於工作狀態的時候是不能把指定裝置清除的,否則將會出錯。

static inline void __netif_rx_schedule(struct net_device *dev)

static inline void netif_rx_schedule(struct net_device *dev)

#define athr_mac_rx_sched_prep(m, d) napi_schedule_prep(&m->napi)

#define __athr_mac_rx_sched(m, d) __napi_schedule(&m->napi)

#define athr_mac_rx_sched(m)  napi_schedule(&m->napi)

二:net_rx_softirq軟終端的註冊:

os預設定義的軟終端向量如下:

enum

;在核心的linux\kernels\mips-linux-2.6.15\net\core\dev.c 檔案中有如下**:

void open_softirq(int nr, void (*action)(struct softirq_action *))

open_softirq(net_rx_softirq, net_rx_action, null);//註冊net_rx_softirq。核心軟中斷函式net_rx_action();

三:net_rx_softirq軟中斷的設定:

我們不能直接對軟終端處理函式直接進行呼叫,在呼叫之前必須對其進行中斷向量位設定。

/*** __napi_schedule - schedule for receive

* @n: entry to schedule

** the entry's receive function will be scheduled to run

*/void __napi_schedule(struct napi_struct *n)

四:net_rx_softirq軟體中斷的執行

之前看到過如下函式:

do_irq(ath_cpu_irq_ge0);其定義如下:

unsigned int do_irq(int irq, struct uml_pt_regs *regs)

由do_irq()函式可以知道,當執行完硬中斷__do_irq(irq)後,會執行irq_exit()這個函式,

* exit an interrupt context. process softirqs if needed and possible:

*/void irq_exit(void)

#ifdef config_no_hz

/* make sure that timer wheel updates are propagated */

rcu_irq_exit();

if (idle_cpu(smp_processor_id()) && !in_interrupt() && !need_resched())

tick_nohz_stop_sched_tick(0);

#endif

preempt_enable_no_resched();}

#ifdef __arch_irq_exit_irqs_disabled

# define invoke_softirq() __do_softirq()

#else

# define invoke_softirq() do_softirq()

#endif

do_softirq()定義如下:

asmlinkage void do_softirq(void)

__do_softirq()函式定義如下:

#define max_softirq_restart 10

asmlinkage void __do_softirq(void)

rcu_bh_qsctr_inc(cpu);

}h++;

pending >>= 1;

} while (pending);

local_irq_disable();

pending = local_softirq_pending();

if (pending && --max_restart)

goto restart;

if (pending)

wakeup_softirqd();

lockdep_softirq_exit();

account_system_vtime(current);

_local_bh_enable();

}

SIGCLD處理方式

apue上sigcld語義寫的有點不清楚,到底我們的系統是如何來處理sigcld訊號呢?1.sig dfl 預設的處理方式是不理會這個訊號,但是也不會丟棄子進行狀態,所以如果不用wait,waitpid 對其子進行進行狀態資訊 會產生殭屍程序。2.sig ign 忽略的處理方式,這個方式和預設的忽略...

遇事處理方式

事,慢慢地說 大事,清楚地說 小事,幽默地說 沒把握的事,謹慎地說 沒發生的事,不要胡說 做不到的事,別亂說 傷害人的事,不能說 討厭的事,對事不對人地說 開心的事,看場合說 傷心的事,不要見人就說 別人的事,小心地說 自己的事,聽聽自己的心怎麼說 現在的事,做了再說 未來的事,未來再說 知人不必言...

故障處理方式

排除故障方法 1 自頂而下法 2 自底而上法 3 分而治之法 4 跟蹤流量路徑法 5 對比配置法 6 元件替換法 大多數採用的工具 ping 測試鏈路連通性 traceroute 測試路由可達性,是否缺少路由 telnet 測試服務埠,是否被拒絕 icmp internet 控制訊息協議 icmp被...