計算機原理 Linux 網路I O模型

2021-09-25 02:10:43 字數 2903 閱讀 6323

在開始講網路io模式之前,我們先來熟悉一下幾個概念:

所以從較低3gb(0x00000000到0xbfffffff)稱之為使用者空間,較高1gb(0xc0000000到0xffffffff)稱之為核心空間。在我的《linux記憶體管理》文章有更加詳細的說明,可自行前往參考。

在linux中存在多執行緒的情況下,肯定需要程序的切換,也就是說需要掛起正在執行的程序,然後執行正在就緒狀態的程序。這種行為我們稱之為程序切換。程序切換有哪些變化呢?

首先需要儲存暫存器現場,儲存處理機上下文

更新pcb資訊

把程序的pcb加入到某些佇列中(例如就緒佇列)

選擇需要執行的程序,並且執行,然後更新其pcb

更新記憶體管理的結構

恢復處理機上下文

雖然從這六個步驟中,無法感覺,但是真的挺繁瑣的,非常消耗cpu資源。

檔案描述符(file descriptor)是電腦科學中的乙個術語,是乙個用於表述指向檔案的引用的抽象化概念。

檔案描述符在形式上是乙個非負整數。實際上,它是乙個索引值,指向核心為每乙個程序所維護的該程序開啟檔案的記錄表。

buffer io也就是標準io,是預設的io模式。在使用者態write或者read等io操作時,核心中資料是儲存在檔案系統的頁快取中。它有個缺點:許多多次拷貝的消耗,帶來cpu和記憶體的消耗。在本人之前的《linux直接io原理》中有詳細比較兩種io的優缺點。

先直接給出五種網路模型:

阻塞i/o

非阻塞i/o

i/o多路復用

訊號驅動i/o

非同步i/o

在linux中,socket的i/o預設都是阻塞的,流程圖,如下:

當應用程式呼叫recvfrom系統呼叫,核心進入第乙個階段:等待資料。所以在使用者態這邊整個程序都會阻塞。當核心準備資料之後,還需要將資料拷貝到使用者態記憶體,然後才會return,之後使用者程序才會接觸阻塞狀態。

非阻塞i/o

設定i/o屬性可以修改socket為非阻塞模式,當進行讀操作時候,流程圖如下圖:

當使用者程序read操作時候,如果核心還沒資料,就會返回無資料狀態。在使用者程序的角度上,如果是無資料,繼續recvfrom等待。直到核心資料準備好,拷貝到使用者空間記憶體中。所以非阻塞i/o需要使用者程序一直輪詢io

i/o多路復用(i/o multiplexing)

io multiplexing就是我們說的select,poll,epoll,有些地方也稱這種io方式為event driven io。select/epoll的好處就在於單個process就可以同時處理多個網路連線的io。它的基本原理就是select,poll這個function會不斷的輪詢所負責的所有socket,當某個socket有資料到達了,就通知使用者程序。epoll的方式有所不一樣,這裡不展開。

從圖中我們可以看出,當呼叫select,整個程序都會阻塞,select可以同時監聽多個socket,一旦其中任意乙個socket準備就緒狀態,select就會立即返回,使用者程序就可以read操作了。

上圖和阻塞io的圖其實並沒有太大的不同,事實上,還更差一些。因為這裡需要使用兩個system call (select 和 recvfrom),而阻塞 io只呼叫了乙個系統呼叫(recvfrom)。但是,select的真正優勢在於它可以同時處理多個connection。

所以,如果處理的連線數不是很高的話,使用select/epoll的web server不一定比使用multi-threading + blocking io的web server效能更好,可能延遲還更大。select/epoll的優勢並不是對於單個連線能處理得更快,而是在於能處理更多的連線。)

在io multiplexing 模型中,實際中,對於所有的socket,一般都設定成為非阻塞的。但是,如上圖所示,整個使用者程序其實是一直被阻塞的。只不過程序是被select這個函式阻塞的,而不是被socket io給阻塞。

非同步i/o

linux中非同步i/o其實用的很少。下圖流程:

使用者程序發起read操作之後,這個時候就可以去幹其他事情了。而從kernel的角度,當它受到乙個非同步 read之後,首先它會立刻返回,所以不會對使用者程序產生任何阻塞。然後,核心會等待資料準備完成,然後將資料拷貝到使用者記憶體,當這一切都完成之後,核心會給使用者程序傳送乙個訊號,告訴它read操作完成了。

看下圖各i/o模型比較圖:

從圖中我們可以發現,非阻塞和非同步的區別還是很明顯的,在非阻塞中程序大部分不會阻塞的,但是需要主動check i/o。而非同步i/o就不需要,核心將資料拷貝完成後,傳送訊號通知程序就行了。

覺得不錯,記得關注,**,點讚!

計算機組成原理 IO

組成 通道指令 通道自己的指令 io硬體 io和主機之間的 裝置選址 傳送方式 聯絡方式 連線方式 io與主機資訊傳送的控制方式 dma方式 功能和組成 介面電路 當被選中和被啟動 命令線 標記d為0,表示資料未準備好,標記b為1,表示裝置被啟動 cpu開始不斷查詢d訊號 裝置準備好資料,將資料輸入...

計算機網路原理

1 物理層協議定義的一系列標準有四個方面的特性,不屬於這些特性的是 a 介面特性 b 電氣特性 c 功能特性 d 機械特性 2 下面哪乙個ip位址是a類位址 a 128.20.1.1 b 30.20.1.1 c 198.20.1.1 d 223.20.1.1 3 在tcp ip層次模型中,tcp層相...

計算機網路原理

1 網際網路主要使用的是拓樸結構 資料結構中的拓撲排序 2 工作方式 1 邊緣部分 由網際網路主機組成 使用者使用的客戶機,使用者通訊,資源的共享 2 核心部分 網路和連線網路的路由器組成,為邊緣部分提供服務。3 客戶的伺服器是通訊所涉及的兩個應用程序。客戶是服務請求方,伺服器是服務提供方。4 網際...