TCP receive_queue prequeue backlog

接收到數據包時struct sock *sk 可能被進程下上文或者中斷上下文佔用:

1、如果被進程上下文使佔用時,軟中斷暫時拿不到鎖,所以數據只能暫存在後備隊列中(backlog),當進程上下文邏輯處理完成後會回調tcp_v4_do_rcv處理backlog隊列作爲補償,具體看tcp_sendmsg 函數 release_sock的實現。

2、如果sk被軟中斷佔用時,那麼數據可能被放置到receive_queue或者prequeue,數據優先放置到prequeue中,如果prequeue滿了則會放置到receive_queue中,理論上這裏有一個隊列就行了,但是TCP協議棧爲什麼要設計兩個呢?其實是爲了快點結束軟中斷數據處理流程,軟中斷處理函數中禁止了進程搶佔和其他軟中斷髮生,效率應該是很低下的,如果數據被放置到prequeue中,那麼軟中斷流程很快就結束了,如果放置到receive_queue那麼會有很複雜的邏輯需要處理。receive_queue隊列的處理在軟中斷中,prequeue隊列的處理則是在進程上下文中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章