TCP IP frame的接收方式之中斷方式

2021-06-19 14:28:58 字數 1321 閱讀 2777

在學習tcp/ip時,不可避免地要理解接收frame的中斷方式和輪詢方式,以及兩者的結合。為什麼不堅持中斷方式?因為在負載高時效率低,為什麼低?因為中斷頻繁...等等。其實,如果我們理解了中斷的過程,那麼就很好理解了。

首先,我們來看看中斷方式相對於輪詢方式的優點。

由於我們不知道資料報什麼時候會來,因此,為了能否在資料報來後及時的處理,所以要不停的去讀狀態看看資料來了沒。顯然,如果資料報不多,稀稀拉拉地來幾個,那麼我們就浪費了很多時間去檢查這個狀態。

但是,對於中斷方式來說,就不會存在浪費很多時間去檢查狀態。因為,核心完全可以做其他事情,當資料報來時就會觸發乙個硬體中斷,然後核心轉去處理中斷,也就是接收資料。從這看來,中斷方式似乎比輪詢方式好很多。不過,這裡其實是有個前提,就是前面說到的資料報是「稀稀拉拉」地來。如果資料報來的非常頻繁,那麼中斷方式就有缺點了,為什麼,請看下面的解釋。

linux處理中斷的流程,以arm平台為例。

這裡我只講軟體部分,硬體部分我不清楚,猶記得是觸發各種電平...

根據我的理解:中斷處理過程與函式呼叫很像,尤其是入口和出口的地方。以彙編的方式理解c語言,這句話忘記在哪看的,感覺很經典。我們反彙編乙個c程式,可以看到在函式入口處要建立棧幀,壓暫存器,為區域性變數分配棧空間;在函式返回處要恢復棧頂指標sp以及恢復暫存器。為什麼要這麼做?我覺得這個是軟體工程的乙個思想:keep it ******。為了減少麻煩,我把後面要用到的暫存器的值備份起來,後面隨便用這個暫存器,完全不用擔心會汙染這個暫存器,用完後再恢復這個暫存器,非常簡單。中斷處理也是一樣。中斷來了,我去處理中斷的一些事宜,處理完呢?處理完後我要再回來幹中斷來之前的事情,也就是要恢復到之前的上下文。那麼什麼是上下文?暫存器!所以,在中斷處理中乙個重要的環節就是把暫存器壓到棧中,在做這件事時是不能再來中斷的,所以要關掉本地中斷。關掉中斷以為著不會再響應後面的中斷,中斷是沒有排隊之說的。儲存完暫存器後根據中斷號去呼叫響應的中斷處理程式,處理完後再把前面儲存的中斷前的暫存器恢復,同時開啟中斷,回到以前的上下文。在處理中斷時,會開中斷以及喚醒相應的軟中斷(這裡會去處理資料報),然後再關中斷去恢復暫存器。

所以,採用中斷方式時,如果資料報來得非常頻繁,那麼,軟中斷(處理資料報的地方)會頻繁地被中斷打斷。打個比喻,在處理第乙個包時,連續來了n個中斷,這些中斷毫不客氣地打斷了資料報處理。不巧的是,這n+1把接收佇列塞滿了,直接導致一方面接收佇列一直保持滿的狀態(沒有時間去處理資料報),另一方面後面來的資料報也無法接收。

那麼,怎麼解決上面的問題呢?對,關網路裝置的中斷,這樣,在處理資料報時就不會有中斷來打斷了。這個就是napi的乙個思路。當然,napi的另外乙個思路是加入輪詢。這個後面再分享。

由於本人正在學習,技術水平有限,如若有錯誤之處請不吝賜教。

vue emit 傳參接收方式

子元件 this.emit test this.param 父元件 test test event,userdefined 其中 event是子元件傳遞的引數,第二個引數為父元件傳的引數,如果沒有可以不傳。子元件 this.emit test this.param1,this.param2,this...

SpringBoot請求引數接收方式

application json接收 引數不可為空,可為 userdto中的屬性 非必填 requestmapping hello5 public string hello5 requestbody userdto userdto x www form urlencoded 拼接 form data...

063 SparkStream資料接收方式

1.兩種方式 由streamingcontext可以提供的api 上面做的wordcount中的方式就算是第一種方式。3.advanced source 使用資料接收器 執行緒負責轉換接受資料,資料產生方主動將資料傳送給sparkstreaming應用程式 receiver接收到資料後,就儲存下來 ...