成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

詳解Python IO口多路復用

瀏覽:93日期:2022-07-21 08:11:46

什么是IO 多路復用呢?

我一個SocketServer有500個鏈接連過來了,我想讓500個鏈接都是并發的,每一個鏈接都需要操作IO,但是單線程下IO都是串行的,我實現多路的,看起來像是并發的效果,這就是多路復用!

概念說明:

在進行解釋之前,首先要說明幾個概念:

- 用戶空間和內核空間

現在操作系統都是采用虛擬存儲器,那么對32位操作系統而言,它的尋址空間(虛擬存儲空間)為4G(2的32次方)。操作系統的核心是內核,獨立于普通的應用程序,可以訪問受保護的內存空間,也有訪問底層硬件設備的所有權限。為了保證用戶進程不能直接操作內核(kernel),保證內核的安全,操心系統將虛擬空間劃分為兩部分,一部分為內核空間,一部分為用戶空間。針對linux操作系統而言,將最高的1G字節(從虛擬地址0xC0000000到0xFFFFFFFF),供內核使用,稱為內核空間,而將較低的3G字節(從虛擬地址0x00000000到0xBFFFFFFF),供各個進程使用,稱為用戶空間。

- 進程切換(與線程切換是一樣的)

- 進程的阻塞

正在執行的進程,由于期待的某些事件未發生,如請求系統資源失敗、等待某種操作的完成、新數據尚未到達或無新工作做等,則由系統自動執行阻塞原語(Block),使自己由運行狀態變為阻塞狀態。可見,進程的阻塞是進程自身的一種主動行為,也因此只有處于運行態的進程(獲得CPU),才可能將其轉為阻塞狀態。當進程進入阻塞狀態,是不占用CPU資源的。

- 文件描述符

文件描述符(File descriptor)是計算機科學中的一個術語,是一個用于表述指向文件的引用的抽象化概念。

文件描述符在形式上是一個非負整數。實際上,它是一個索引值,指向內核為每一個進程所維護的該進程打開文件的記錄表。當程序打開一個現有文件或者創建一個新文件時,內核向進程返回一個文件描述符。在程序設計中,一些涉及底層的程序編寫往往會圍繞著文件描述符展開。但是文件描述符這一概念往往只適用于UNIX、Linux這樣的操作系統。

- 緩存 I/O

緩存 I/O 又被稱作標準 I/O,大多數文件系統的默認 I/O 操作都是緩存 I/O。在 Linux 的緩存 I/O 機制中,操作系統會將 I/O 的數據緩存在文件系統的頁緩存( page cache )中,也就是說,數據會先被拷貝到操作系統內核的緩沖區中,然后才會從操作系統內核的緩沖區拷貝到應用程序的地址空間。

緩存 I/O 的缺點:

數據在傳輸過程中需要在應用程序地址空間和內核進行多次數據拷貝操作,這些數據拷貝操作所帶來的 CPU 以及內存開銷是非常大的。

IO模式

剛才說了,對于一次IO訪問(以read舉例),數據會先被拷貝到操作系統內核的緩沖區中,然后才會從操作系統內核的緩沖區拷貝到應用程序的地址空間。所以說,當一個read操作發生時,它會經歷兩個階段:

1. 等待數據準備 (Waiting for the data to be ready)

2. 將數據從內核拷貝到進程中 (Copying the data from the kernel to the process)

正式因為這兩個階段,linux系統產生了下面五種網絡模式的方案。

- 阻塞 I/O(blocking IO)- 非阻塞 I/O(nonblocking IO)- I/O 多路復用( IO multiplexing)- 信號驅動 I/O( signal driven IO)- 異步 I/O(asynchronous IO)

注:由于signal driven IO在實際中并不常用,所以我這只提及剩下的四種IO Model。

1、阻塞 I/O(blocking IO)

在linux中,默認情況下所有的socket都是blocking,一個典型的讀操作流程大概是這樣:

詳解Python IO口多路復用

當用戶進程調用了recvfrom這個系統調用,kernel就開始了IO的第一個階段:準備數據(對于網絡IO來說,很多時候數據在一開始還沒有到達。比如,還沒有收到一個完整的UDP包。這個時候kernel就要等待足夠的數據到來)。這個過程需要等待,也就是說數據被拷貝到操作系統內核的緩沖區中是需要一個過程的。而在用戶進程這邊,整個進程會被阻塞(當然,是進程自己選擇的阻塞)。當kernel一直等到數據準備好了,它就會將數據從kernel中拷貝到用戶內存,然后kernel返回結果,用戶進程才解除block的狀態,重新運行起來。

所以,blocking IO的特點就是在IO執行的兩個階段都被block了。

2、非阻塞 I/O(nonblocking IO)

linux下,可以通過設置socket使其變為non-blocking。當對一個non-blocking socket執行讀操作時,流程是這個樣子:

詳解Python IO口多路復用

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

所以,nonblocking IO的特點是用戶進程需要不斷的主動詢問kernel數據好了沒有。

3、I/O 多路復用( IO multiplexing)

IO multiplexing就是我們說的select,poll,epoll,有些地方也稱這種IO方式為event driven IO。select/epoll的好處就在于單個process就可以同時處理多個網絡連接的IO。它的基本原理就是select,poll,epoll這個function會不斷的輪詢所負責的所有socket,當某個socket有數據到達了,就通知用戶進程。

詳解Python IO口多路復用

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

所以,I/O 多路復用的特點是通過一種機制一個進程能同時等待多個文件描述符,而這些文件描述符(套接字描述符)其中的任意一個進入讀就緒狀態,select()函數就可以返回。這個圖和blocking IO的圖其實并沒有太大的不同,事實上,還更差一些。因為這里需要使用兩個system call (select 和 recvfrom),而blocking IO只調用了一個system call (recvfrom)。但是,用select的優勢在于它可以同時處理多個connection。

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

在IO multiplexing Model中,實際中,對于每一個socket,一般都設置成為non-blocking,但是,如上圖所示,整個用戶的process其實是一直被block的。只不過process是被select這個函數block,而不是被socket IO給block。

4、異步 I/O(asynchronous IO)

Linux下的asynchronous IO其實用得很少。先看一下它的流程:

詳解Python IO口多路復用

用戶進程發起read操作之后,立刻就可以開始去做其它的事。而另一方面,從kernel的角度,當它受到一個asynchronous read之后,首先它會立刻返回,所以不會對用戶進程產生任何block。然后,kernel會等待數據準備完成,然后將數據拷貝到用戶內存,當這一切都完成之后,kernel會給用戶進程發送一個signal,告訴它read操作完成了。

總結

1、blocking和non-blocking的區別:

調用blocking IO會一直block住對應的進程直到操作完成,而non-blocking IO在kernel還準備數據的情況下會立刻返回。

2、synchronous IO和asynchronous IO的區別:

在說明synchronous IO和asynchronous IO的區別之前,需要先給出兩者的定義。POSIX的定義是這樣子的:- A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes;- An asynchronous I/O operation does not cause the requesting process to be blocked;

兩者的區別就在于synchronous IO做”IO operation”的時候會將process阻塞。按照這個定義,之前所述的blocking IO,non-blocking IO,IO multiplexing都屬于synchronous IO。

有人會說,non-blocking IO并沒有被block啊。這里有個非常“狡猾”的地方,定義中所指的”IO operation”是指真實的IO操作,就是例子中的recvfrom這個system call。non-blocking IO在執行recvfrom這個system call的時候,如果kernel的數據沒有準備好,這時候不會block進程。但是,當kernel中數據準備好的時候,recvfrom會將數據從kernel拷貝到用戶內存中,這個時候進程是被block了,在這段時間內,進程是被block的。

而asynchronous IO則不一樣,當進程發起IO 操作之后,就直接返回再也不理睬了,直到kernel發送一個信號,告訴進程說IO完成。在這整個過程中,進程完全沒有被block。

各個IO Model的比較如圖所示:

詳解Python IO口多路復用

通過上面的圖片,可以發現non-blocking IO和asynchronous IO的區別還是很明顯的。在non-blocking IO中,雖然進程大部分時間都不會被block,但是它仍然要求進程去主動的check,并且當數據準備完成以后,也需要進程主動的再次調用recvfrom來將數據拷貝到用戶內存。而asynchronous IO則完全不同。它就像是用戶進程將整個IO操作交給了他人(kernel)完成,然后他人做完后發信號通知。在此期間,用戶進程不需要去檢查IO操作的狀態,也不需要主動的去拷貝數據。

以上就是詳解Python IO口多路復用的詳細內容,更多關于Python IO口多路復用的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
精品视频在线免费观看| 国内精品在线播放| 免费在线日韩av| 国内精品亚洲| 国产三区二区一区久久| 色噜噜狠狠成人中文综合| 欧美情侣在线播放| 中文无字幕一区二区三区| 久久亚洲精品小早川怜子| 亚洲男同1069视频| 久久99精品久久久久久久久久久久| 99视频精品全部免费在线| 国产一区再线| 欧美高清在线一区| 91色九色蝌蚪| 欧美淫片网站| 日本韩国视频一区二区| 天堂蜜桃一区二区三区| 成人听书哪个软件好| 国产一区二区三区免费不卡| 亚洲男人天堂一区| 一区二区三区高清视频在线观看| 91精品国产综合久久香蕉的特点| 中文在线免费一区三区高中清不卡| 94-欧美-setu| 欧美日韩一区二区三区在线| 麻豆freexxxx性91精品| 欧美日韩大片一区二区三区| 欧美男生操女生| 国产综合色精品一区二区三区| 欧美日韩国产经典色站一区二区三区| 久久精品国产亚洲一区二区三区| 欧美午夜在线| 91精品国产美女浴室洗澡无遮挡| 亚洲一区二区3| 波多野结衣在线aⅴ中文字幕不卡| 午夜亚洲一区| 日韩高清国产一区在线| 国产自产在线视频一区| 国产精品电影院| 成人黄色在线视频| 久久午夜色播影院免费高清| 99re66热这里只有精品3直播| 久久精品免视看| 精品一区二区三区欧美| 这里只有精品免费| av爱爱亚洲一区| 欧美国产成人精品| 99在线观看免费视频精品观看| 精品久久久三级丝袜| 蜜乳av一区二区| 91精品国产手机| 91视频xxxx| 亚洲视频免费观看| 欧美精品黄色| 自拍偷自拍亚洲精品播放| 国产精品老牛| 亚洲成人免费影院| 国产精品v欧美精品v日韩| 综合欧美亚洲日本| 性久久久久久| 国产一区二区电影| 日本精品裸体写真集在线观看| 国产精品夜夜嗨| 91成人看片片| 国产ts人妖一区二区| 日本高清成人免费播放| 国产二区国产一区在线观看| 色成年激情久久综合| 国产成人在线视频播放| 欧美激情一区不卡| 亚洲另类自拍| 午夜影视日本亚洲欧洲精品| 欧美色欧美亚洲另类二区| 亚洲午夜激情在线| 欧美激情一区在线| 午夜在线视频观看日韩17c| 极品美女销魂一区二区三区免费 | 亚洲欧洲精品一区二区三区波多野1战4| 欧美成人三级电影在线| 国内精品**久久毛片app| 三级成人在线视频| 欧美成人一区二区三区片免费| 亚洲人体一区| 乱中年女人伦av一区二区| 久久久另类综合| 99re热视频精品| 亚洲国产精品天堂| 久久精品在线| 日韩精品电影在线观看| 欧美大尺度电影在线| 懂色av一区二区三区免费观看| 中文字幕在线观看不卡| 精品1区2区| 久久精品999| 国产精品久久精品日日| 欧美视频中文字幕| 日韩电影在线免费看| 久久网站热最新地址| 亚洲欧美日韩国产| yourporn久久国产精品| 亚洲高清不卡在线观看| 日韩视频免费观看高清在线视频| 亚洲欧美日韩一区| 欧美日本高清视频在线观看| 欧美日韩网站| 狠狠狠色丁香婷婷综合激情| 成人免费在线播放视频| 制服丝袜成人动漫| 亚洲伊人网站| 男男成人高潮片免费网站| 欧美在线不卡视频| 精品亚洲免费视频| 最新久久zyz资源站| 欧美一区二区三区日韩| 国产精品女主播一区二区三区| 岛国一区二区三区| 五月天中文字幕一区二区| 久久综合中文| 激情五月激情综合网| 亚洲另类春色校园小说| 欧美亚洲一区| 91免费在线视频观看| 免费国产亚洲视频| 亚洲青青青在线视频| 精品国产免费人成电影在线观看四季| 91麻豆产精品久久久久久| 麻豆精品新av中文字幕| 亚洲青青青在线视频| 26uuu亚洲| 欧美日韩黄色影视| aa级大片欧美三级| jvid福利写真一区二区三区| 久久精品国产在热久久| 亚洲高清中文字幕| 综合欧美亚洲日本| 国产欧美日本一区视频| 国产精品永久| 农村妇女精品| 国产成人av电影在线播放| 免费成人结看片| 亚洲成a天堂v人片| 亚洲精品视频在线观看免费| 亚洲国产高清在线观看视频| 精品乱人伦小说| 欧美日韩一区小说| 久久精品盗摄| 国产欧美一区二区视频| 亚洲午夜极品| 欧美日韩中文| 欧美福利专区| 93久久精品日日躁夜夜躁欧美| 美脚の诱脚舐め脚责91| 亚洲一二三区不卡| 亚洲男女一区二区三区| 国产精品理伦片| 国产日产欧美精品一区二区三区| 欧美一区二区三区在| 欧美日韩一级二级| 欧美在线免费观看视频| 91极品美女在线| 久久大逼视频| 午夜一级久久| 免播放器亚洲| 国产欧美一区二区色老头| 亚洲茄子视频| 尤物网精品视频| 国内成人精品2018免费看| 日韩经典中文字幕一区| 午夜久久久久久久久| 亚洲成a人v欧美综合天堂| 亚洲国产视频一区| 亚洲国产精品久久久久婷婷884 | 国产999精品久久久久久| 极品美女销魂一区二区三区免费| 美国精品在线观看| 精品在线一区二区三区| 狠狠色2019综合网| 国产成人一区在线| 成人免费视频播放| 99久久99久久精品免费观看| 97se亚洲国产综合在线| 91一区一区三区| 91一区在线观看| 女人天堂亚洲aⅴ在线观看| 91猫先生在线| 欧美日韩网站| 日韩午夜av在线| 香蕉免费一区二区三区在线观看| 久久久久国内| 欧美午夜精品久久久久久孕妇| 欧美在线高清视频| 欧美精品自拍偷拍| 国产欧美午夜| 亚洲影院在线| 欧亚一区二区三区| 777xxx欧美| 久久女同性恋中文字幕| 中文字幕欧美区| 精品国产一区二区国模嫣然|