91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux網絡編程中IO模型指的是什么

發布時間:2021-11-06 09:34:51 來源:億速云 閱讀:133 作者:柒染 欄目:建站服務器

今天就跟大家聊聊有關Linux網絡編程中IO模型指的是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

基于IO訪問中存在的兩個階段詳細介紹了Linux產生的五種IO模型。

同步與異步

同步是指一個任務的完成需要依賴另外一個任務時,只有等待被依賴的任務完成后,依賴的任務才能算完成。

異步是指不需要等待被依賴的任務完成,只是通知被依賴的任務要完成什么工作,依賴的任務也立即執行,只要自己完成了整個任務就算完成了,異步一般使用狀態、通知和回調。

阻塞與非阻塞

阻塞是指調用結果返回之前,當前線程會被掛起,一直處于等待消息通知,不能夠執行其他業務。

非阻塞是指在不能立刻得到結果之前,該函數不會阻塞當前線程,而會立刻返回。

五種IO模型

對于一次IO訪問,數據會先被拷貝到內核的緩沖區中,然后才會從內核的緩沖區拷貝到應用程序的地址空間。需要經歷兩個階段:

1)準備數據

2)將數據從內核緩沖區拷貝到進程地址空間

由于存在這兩個階段,Linux產生了下面五種IO模型。

阻塞IO

當用戶進程調用了recvfrom調用時,內核進入IO的第一個階段:準備數據(內核需要等待足夠的數據再拷貝),這個過程需要等待,用戶進程會被阻塞,等內核將數據準備好,然后拷貝到用戶地址空間,內核返回結果,用戶進程才從阻塞態進入就緒態。
Linux中,默認情況下所有的socket都是阻塞的。

非阻塞IO

當用戶進程發出read操作時,如果kernel中的數據還沒有準備好,那么它并不會block用戶進程,而是立刻返回一個error。用戶進程判斷結果是一個error時,它就知道數據還沒有準備好,于是它可以再次發送read操作。一旦kernel中的數據準備好了,并且又再次收到了用戶進程的system call,那么它馬上就將數據拷貝到了用戶內存,然后返回。

非阻塞IO模式下用戶進程需要不斷地詢問內核的數據準備好了沒有。

Linux下可以通過設置socket使其變為non-blocking。

IO多路復用

通過一種機制,一個進程可以監視多個文件描述符(套接字描述符),一旦某個文件描述符就緒(一般是讀就緒或者寫就緒),能夠通知程序進行相應的讀寫操作。這樣就不需要每個用戶進程不斷的詢問內核數據準備好了沒有。

常用的IO多路復用方式有select、poll和epoll。

select

 kernel會“監視”所有select負責的socket,當任何一個socket中的數據準備好了,select就會返回。這個時候用戶進程再調用read操作,將數據從kernel拷貝到用戶進程。

int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

select 函數監視的文件描述符分3類,分別是writefds、readfds、和exceptfds。調用后select函數會阻塞,直到有描述副就緒(有數據可讀、可寫、或者有except),或者超時(timeout指定等待時間,如果立即返回設為null即可),函數返回。當select函數返回后,可以通過遍歷fdset,來找到就緒的描述符。

select的一個缺點在于單個進程能夠監視的文件描述符的數量存在最大限制,在Linux上一般為1024。

poll

poll使用一個 pollfd的指針實現。

int poll (struct pollfd *fds, unsigned int nfds, int timeout);

  pollfd結構包含了要監視的event和發生的event

struct pollfd { int fd; /* file descriptor */short events; /* requested events to watch */short revents; /* returned events witnessed */ };



和select函數一樣,poll返回后,需要遍歷pollfd來獲取就緒的描述符。poll沒有監聽最大數量限制。

epoll

epoll使用一個文件描述符管理多個描述符,將用戶關心的文件描述符的事件存放到內核的一個事件表中,采用監聽回調的機制,這樣在用戶空間和內核空間的copy只需一次,避免再次遍歷就緒的文件描述符列表。

epoll的操作過程需要三個接口:

int epoll_create(int size); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);


int epoll_create(int size):

創建一個epoll的句柄,size用來告訴內核這個監聽的數目一共有多大。

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event):

對指定描述符fd執行op操作。

- epfd:是epoll_create()的返回值。

- op:表示op操作,用三個宏來表示:添加EPOLL_CTL_ADD,刪除EPOLL_CTL_DEL,修改EPOLL_CTL_MOD。分別添加、刪除和修改對fd的監聽事件。

- fd:是需要監聽的fd(文件描述符)

- epoll_event:是告訴內核需要監聽什么事,struct epoll_event結構如下:

struct epoll_event { __uint32_t events; /* Epoll events */ epoll_data_t data; /* User data variable */ }; //events可以是以下幾個宏的集合:EPOLLIN :表示對應的文件描述符可以讀(包括對端SOCKET正常關閉); EPOLLOUT:表示對應的文件描述符可以寫; EPOLLPRI:表示對應的文件描述符有緊急的數據可讀(這里應該表示有帶外數據到來); EPOLLERR:表示對應的文件描述符發生錯誤; EPOLLHUP:表示對應的文件描述符被掛斷; EPOLLET: 將EPOLL設為邊緣觸發(Edge Triggered)模式,這是相對于水平觸發(Level Triggered)來說的。 EPOLLONESHOT:只監聽一次事件,當監聽完這次事件之后,如果還需要繼續監聽這個socket的話,需要再次把這個socket加入到EPOLL隊列里

int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout):

等待epfd上的io事件,最多返回maxevents個事件。

參數events用來從內核得到事件的集合,maxevents告之內核這個events有多大,這個maxevents的值不能大于創建epoll_create()時的size,參數timeout是超時時間(毫秒,0會立即返回,-1將不確定,也有說法說是永久阻塞)。該函數返回需要處理的事件數目,如返回0表示已超時。

epoll的兩種工作模式

LT(level trigger,水平觸發)模式:當epoll_wait檢測到描述符就緒,將此事件通知應用程序,應用程序可以不立即處理該事件。下次調用epoll_wait時,會再次響應應用程序并通知此事件。LT模式是默認的工作模式。

LT模式同時支持阻塞和非阻塞socket。

ET(edge trigger,邊緣觸發)模式:當epoll_wait檢測到描述符就緒,將此事件通知應用程序,應用程序必須立即處理該事件。如果不處理,下次調用epoll_wait時,不會再次響應應用程序并通知此事件。

ET是高速工作方式,只支持非阻塞socket。ET模式減少了epoll事件被重復觸發的次數,因此效率要比LT模式高。

異步IO

用戶進程發起read操作之后,立刻就可以開始去做其它的事。內核收到一個異步IO read之后,會立刻返回,不會阻塞用戶進程。內核會等待數據準備完成,然后將數據拷貝到用戶內存,當這一切都完成之后,內核會給用戶進程發送一個signal,告訴它read操作完成了。

    Linux網絡編程中IO模型指的是什么


信號驅動IO

內核文件描述符就緒后,通過信號通知用戶進程,用戶進程再通過系統調用讀取數據。此方式屬于同步IO,因為實際讀取數據到用戶進程緩存的工作仍然是由用戶進程自己負責的。

看完上述內容,你們對Linux網絡編程中IO模型指的是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东平县| 藁城市| 榆树市| 沙洋县| 新和县| 阜新市| 绍兴市| 田阳县| 绥宁县| 临清市| 玉山县| 寿光市| 孟津县| 纳雍县| 淳安县| 炉霍县| 视频| 拜泉县| 石泉县| 临汾市| 安远县| 中江县| 绿春县| 伊宁市| 赤峰市| 融水| 邯郸市| 凤城市| 靖州| 云浮市| 通山县| 乌海市| 若羌县| 卫辉市| 清徐县| 鲁甸县| 怀集县| 广平县| 巨野县| 城市| 芜湖县|