作業系統與網路 13 典型IO 多路轉接模型

2021-10-06 11:16:22 字數 1557 閱讀 2299

準確表達自己的訴求並且懂得拒絕,會在很大程度上減少生活中的煩惱

13.1 典型io

13.1.1 分類

(1) 阻塞io

在核心將資料準備好之前, 系統呼叫會一直等待. 所有的套接字, 預設都是阻塞方式.

(2)非阻塞io

如果核心還未將資料準備好, 系統呼叫仍然會直接返回, 並且返回ewouldblock錯誤碼.非阻塞io往往需要程式設計師迴圈的方式反覆嘗試讀寫檔案描述符, 這個過程稱為輪詢.

(3) 訊號驅動io

核心將資料準備好的時候, 使用sigio訊號通知應用程式進行io操作.

(4) 非同步io

由核心在資料拷貝完成時, 通知應用程式(而訊號驅動是告訴應用程式何時可以開始拷貝資料).

(5) 多路轉接io

對大量的的io事件是否就緒的監控, 並且可以告訴使用者哪乙個io當前就緒,這個時候使用者可以針對就緒的id進行操作.

13.2 多路轉接模型(多路復用)

select

poll(已被淘汰)

int

poll

(struct pollfd *fds, nfds_t nfds,

int timeout)

;// pollfd結構

struct pollfd

;

使用者wie每乙個關心的描述符定義事件結構(檔案描述符/使用者所關心的事件);

將描述事件結構陣列拷貝到核心中進行監控;

輪詢遍歷事件陣列中的描述符, 判斷描述符是否就緒了某個事件:

若沒有描述符就緒使用者所關心的事件, 則每隔一會遍歷判斷一次;

若有描述符就緒使用者所關心的事件, 則會將就緒的事件放到事件結構的revents中,並呼叫返回(效能隨著描述符增多而降低);

當呼叫返回後, 使用者遍歷事件結構陣列, 判斷結構中的revents事件中是否包含使用者所關心的事件, 通過這種方式判斷哪乙個描述符就緒了, 進而對描述符進行相應操作;

epoll

struct epoll_event
通過epoll_create建立eventpoll結構, 返回操作控制代碼;

通過操作控制代碼向核心中新增描述符的監控事件epoll_ctl;

通過epoll_wait開始監控,非同步阻塞操作, 描述符的監控由作業系統完成;

作業系統: 當描述符就緒了使用者所關心的事件, 則將事件資訊新增到eventpoll的雙向鍊錶中,每隔一段時間則會看eventpoll中雙向鍊錶是否為空, 判斷是否有描述符就緒;

若沒有就緒, 則掛起等待, 隔一會繼續判斷, 若超時則返回;

若有就緒返回時, epoll_wait將就緒的事件資訊放置到事件陣列events中,返回給使用者;

使用者通過epoll_wait傳入的events獲取到就緒的事件,直接遍歷操作;

Windows作業系統網路I O模型

window 下的套接字以來兩種方式執行i o操作,阻塞io 非阻塞io,一般預設使用的是阻塞io 即執行緒會等待不會把控制權利立刻返回給程式,這就意為乙個執行緒在某乙個時候只能夠去執行乙個io操作。如果服務端想和多個客戶端同時進行通訊的話就要使用多執行緒程式設計,但是會增加開銷,如果採用非阻塞io...

作業系統系列 IO 多路復用 epoll 詳解

epoll create int epoll create int size 當建立好 epoll 控制代碼後,它會占用乙個 fd 值,在 linux 下檢視 proc 程序id fd 就能夠看到這個 fd。epoll ctl epfd 即 epoll create 返回的檔案描述符,指向乙個 ep...

作業系統典型排程演算法

在作業系統中存在多種排程演算法,其中有的排程演算法適用於作業排程,有的排程演算法適用於程序排程,有的排程演算法兩者都適用。下面介紹幾種常用的排程演算法。一 先來先服務 fcfs 排程演算法 fcfs排程演算法是一種最簡單的排程演算法,該排程演算法既可以用於作業排程也可以用於程序排程。在作業排程中,演...