<legend id="7k27o"><li id="7k27o"></li></legend>
        1. <span id="7k27o"><sup id="7k27o"></sup></span>
        2. 多路復用,多路復用通??梢苑譃? )

          知道關于多路復用和一些多路復用通??梢苑譃? )是怎么回事的嗎?聽小編為大家詳細的講解吧!


          如果文件句柄沒有準備好,應用程序將阻塞并放棄CPU。

          多路復用是指網絡連接,多路復用是指同一個線程。

          為什么會有IO復用機制呢?

          沒有IO復用機制,有BIO和NIO兩種實現,這兩種實現都存在一些題。

          同步阻塞

          服務器使用單線程。接受請求后,如果recv或send調用被阻塞,則無法接受其他請求。

          //nbsp;偽代碼解釋whilebsp;truenbsp;nbsp;nbsp;nbsp;nbsp;服務器使用多線程。當請求被接受時,就打開線程進行recv,可以完成并發工作,但是隨著請求的增加,系統中的線程數量必須增加。大量線程占用大量內存空間,線程切換造成大量開銷。實際讀寫線程數不超過10000個線程。20、每次accept就開一個線程,也是浪費資源。

          //nbsp;偽代碼解釋whiletruenbsp;nbsp;nbsp;nbsp;nbsp;同步非阻塞

          服務器接受請求后,加入fds集合,每次輪詢fds集合,接收非阻塞數據。如果沒有數據,則立即返回錯誤。每次輪詢每個fd都會浪費CPU。

          //nbsp;偽代碼解釋whiletruenbsp;nbsp;elsenbsp;nbsp;nbsp;nbsp;nbsp;fornbsp;fdnbsp;innbsp;fdsnbsp;nbsp;elsenbsp;nbsp;nbsp;nbsp;nbsp;IO復用

          服務器端使用單線程通過select/poll/epoll等系統調用獲取fd列表,并用事件遍歷fd進行accept/recv/send,因此更多的并發連接我可以支持您的請求。

          //nbsp;偽代碼解釋whiletruenbsp;nbsp;elseifnbsp;lennbsp;=nbsp;recvfdnbsp;nbsp;lennbsp;=nbsp;-1nbsp;nbsp;nbsp;nbsp;nbsp;IO復用的三種實現

          選擇

          輪詢

          埃波萊

          選擇

          它只告訴我發生了I/O事件,但不告訴我它是什么流。要進行操作,您只能混雜地輪詢所有流以找到可以從中讀取或寫入數據的流。所以select的混雜輪詢復雜度開啟,并發處理的流越多,混雜輪詢時間就越長。

          選擇調用流程

          使用copy_from_user將fd_set從用戶空間復制到內核空間

          回調函數__pollwait

          遍歷所有fd,調用對應的輪詢方法。

          以tcp_poll為例,它的核心實現是__pollwait,也就是上面的回調函數。

          __pollwait的主要工作是將當前掛起在設備的等待隊列中。不同的設備有不同的等待隊列。對于tcp_poll,等待隊列是sk-gt;sk_sleep。設備收到消息或輸入文件數據后,會喚醒設備等待隊列中休眠的進程,然后再喚醒當前進程。

          當polling方法返回時,會返回一個掩碼,表示是否準備好進行讀寫操作,并根據該掩碼mask給fd_set賦值。

          如果遍歷完所有的fd并且沒有返回可讀可寫的掩碼,則調用schedule_timeout并將調用select的進程置于睡眠狀態。當設備驅動程序能夠讀寫自己的資源時,它會喚醒在等待隊列中休眠的進程。如果經過一定的超間沒有人醒來,則再次喚醒調用select的進程來搶占CPU,并再次掃描fd,判斷是否有就緒的fd要做。

          將fd_set從內核空間復制到用戶空間。

          選擇功能界面

          includenbsp;lt;sys/timehgt;definenbsp;NFDBITSnbsp;8nbsp;nbsp;sizeofunsignednbsp;longincludenbsp;lt;pollhgt;//nbsp;數據結構structnbsp;pollfdnbsp;//nbsp;APIintnbsp;pollstructnbsp;pollfdnbsp;fds[],nbsp;nfds_tnbsp;nfds,nbsp;intnbsp;超時;輪詢示例

          //nbsp;第一個宏定義的長度包括nbsp;lt;sys/epollhgt;//nbsp;數據結構//nbsp;每個epoll對象都有一個獨立的事件poll結構體//nbsp;這個是用來存儲的通過epoll_ctl事件發送到epoll的數據添加到方法對象中我們只需要檢查鏈表中是否存在epitem元素即可。structnbsp;eventpollnbsp;//nbsp;APIintnbsp;epoll_createintnbsp;size;nbsp;//放入對象intnbsp;epoll_ctlintnbsp;epfd,nbsp;intnbsp;op,nbsp;intnbsp;fd,nbsp;structnbsp;epoll_eventnbsp;event;nbsp;//nbsp;epoll_ctlnbsp;負責添加和刪除;socketnbsp;epfd,nbsp;structnbsp;epoll_eventnbsp;nbsp;events;intnbsp;maxevents,nbsp;intnbsp;timeout;//epoll_waitnbsp;塊。每個epoll對象都有一個獨立的事件poll結構,用于存儲epoll_ctl方法將傳入的事件添加到epoll對象中。這些事件被掛載到紅黑樹中,以便通過紅黑樹可以高效地識別重復添加的事件。紅黑樹的插入時間效率為lgn。n是紅色和黑色的數量。木元素。

          并且epoll中添加的每個事件都會與設備網卡驅動建立回調關系。也就是說,當相應的事件發生時,就會調用這個回調方法。這個回調方法在內核中稱為ep_poll_callback,將觸發的事件添加到rdlist雙向鏈表中。

          對于每個事件,epoll都會創建一個Epiitem結構,如下所示

          structnbsp;epitem調用epoll_wait查看事件是否發生時,只需檢查eventpoll對象的rdlist雙向鏈表中是否存在epitem元素即可。如果rdlist不為空,則將已發生的事件復制到用戶狀態,并將事件數量返回給用戶。

          從上面的討論我們可以看出,由于紅黑樹和雙向鏈表數據結構以及回調機制的結合,epoll的效率非常高。解釋Epoll的工作原理可以讓您更容易理解如何使用它。用一句話來說,這是一部“三部曲”。

          第一步epoll_create系統調用。此調用返回一個句柄來標識所有后續使用。

          步驟2epoll_ctl系統調用。通過這個調用,我們添加、刪除和修改epoll對象感興趣的事件。返回0表示成功,返回-1表示失敗。

          第三部分epoll_wait系統調用。通過這個調用,我們收集epoll監視器觸發的事件。

          epoll的使用示例

          intnbsp;mainintnbsp;argc,nbsp;charnbsp;argv[]nbsp;elsenbsp;ifn


          對于多路復用的這類相關話題,和一些跟多路復用通??梢苑譃? )相關的內容,講解到這兒就結束了,希望幫助到諸位。

          除非特別注明,本站所有文字均為原創文章,作者:admin

          一级a性色生活片无码毛片|亚洲欧洲自拍拍偷午夜色|538国产精品视频一区二区|国产精品亚洲精品日韩电影

              <legend id="7k27o"><li id="7k27o"></li></legend>
              1. <span id="7k27o"><sup id="7k27o"></sup></span>