1. 程式人生 > >Java粗淺認識-網路程式設計(一)

Java粗淺認識-網路程式設計(一)

網路通訊

網路通訊,就是程序間的一種通訊方式,網路通訊都採用客戶端-服務端模型,當然與之相對的就是程序內部的通訊(就是後面要講的多執行緒程式設計裡面的東西,包括同步,訊號量)。

client-server模型

unix網路通訊關於網路通訊

I/O多路複用select(基於輪詢,支援少數檔案描述符)、poll(基於輪詢,支撐大量檔案描述符)、epoll(系統計算檔案描述數量,基於回撥)

select 在初始化時,指定描述符容量大小,FD_SETSIZE的值上限在不同平臺上執行是不一致的windows上是64(WINSOCK.H檔案中定義)和linux(ulimit -a 查詢open files 項)上受限於每個程序開啟的最大檔案個數(預設1024)

winsock.h檔案中定義

winsock.h

linux fd限制

linux fd限制
linux open files限制


這裡的select 函式 後來有pselect函式支援納秒級別超時等待

poll 在初始化時,傳入的第一個引數是一個連結串列,表示支援的檔案描述,意味著受限於記憶體大小

select和poll都是在每次呼叫監聽檔案描述符時,是通過輪詢來遍歷,隨著連線數量的增加,效能會下降

epoll,基於select和poll的缺點在2.6核心中引入,epoll中epoll_create(int size)中的size不是最大值,是一個估算值,系統會動態計算出真正的值,甚至在之後的更新中,只要是個整數就行
epoll_ctl(),控制檔案描述的新增、刪除,檔案描述符感興趣的事件註冊和更改,就是一個回撥機制。在epoll_ctl中傳入的事件event.events是一個列舉型別,通過|符號來新增監聽事件,其中如果添加了EPOLLET,設定關聯的fd為ET的工作方式(水平觸發事件立即返回結果)預設工作方式是LT(邊緣觸發事件,等待處理完畢後返回結果)。

I/O複用,理解I/O複用,就要理解,I/O沒有複用的情況,多個連線同時請求一個服務,服務就排隊一個一個處理,為了解決這個問題,就提出了I/O複用,通過上面講解的select,poll,epoll 來統一接收請求,分發任務(select、poll)或主動處理,任務結束後通知(epoll回撥)來解決。

網路通訊模型

單程序模式

父程序接收到請求,fork子程序來處理,處理完畢了關閉子程序,缺點是,每次都要fork新的子程序出來,開銷大

preforking改進

提前fork一個子程序池,父程序接收到請求,直接使用閒置的子程序

單執行緒模式

程序接收到請求,直接建立一個執行緒,就是每個請求,對應一個執行緒

prethreading改進

伺服器啟動時,預先建立一個執行緒池,伺服器接收到請求,使用閒置的執行緒處理,不用臨時建立新執行緒

Reactor,反應堆(I/O多路複用+執行緒池)

一個執行緒(程序)或執行緒池(程序池)每當Reactor(s)接受到一個請求時,就分配任務給其他執行緒或執行緒池處理,其中Netty採用多Reactor(接受)多執行緒(處理)模式

Proactor(非同步網路模型)

每個請求來時,Proactor構造器負責建立Proactor時,同時也會建立對應的Handler回撥,非同步處理器(核心中)把Proactor和Handler同時註冊到核心當中,非同步處理器完成I/O後就會通知Proactor,proactor就會回撥相應的Handler
說來比較拗口,簡單點講就是核心非同步處理I/O操作,通知Proactor,proacor回撥handler,linux下的非同步網路模型就通過Reactor+epoll模擬出來的。

總結,網路程式設計模型講解到此結束,接下里會一一通過Java程式碼展示講解單執行緒模型prethreadingreactorproactor