日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

詳解Python IO口多路復用

瀏覽:143日期: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 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
三级欧美在线一区| 亚洲日本网址| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 日韩一区二区三区在线看| 亚洲日产国产精品| 美美哒免费高清在线观看视频一区二区| 日韩中文在线播放| 欧美日韩1区| 日日摸夜夜添夜夜添国产精品| 亚洲天堂av资源在线观看| 亚洲涩涩在线| 成人片免费看| 久久精品亚洲欧美日韩精品中文字幕| 日韩激情一二三区| 鲁大师精品99久久久| 97精品一区二区| 麻豆免费精品视频| 激情黄产视频在线免费观看| 欧美日韩精品一区二区视频| 久久亚洲美女| 国产欧美日韩在线一区二区| 久久精品国产福利| 亚洲午夜视频| 亚洲a级精品| 美女视频一区在线观看| 久久久夜夜夜| 蜜臀国产一区二区三区在线播放 | 日产欧产美韩系列久久99| 欧美私人啪啪vps| 国产一二在线播放| 亚洲一区二区三区免费在线观看| 日韩国产欧美在线播放| 国产理论在线| 免费成人av在线播放| 麻豆精品在线播放| 免费久久99精品国产自在现线| 久久国产日韩欧美精品| 欧美日韩水蜜桃| 日韩va亚洲va欧美va久久| 日韩精品诱惑一区?区三区| 婷婷综合亚洲| 国产精品亚洲二区| 亚洲精品一区二区妖精| 日韩av中文字幕一区二区三区| 精品亚洲a∨| 免费国产亚洲视频| 日韩高清成人| 国产精品久久久久久妇女| 日韩一区二区久久| 精品视频国产| 三级亚洲高清视频| 日韩亚洲一区在线| 伊人精品久久| 国产专区一区| 久久精品国产成人一区二区三区 | 国产极品一区| 美女久久久久| 六月婷婷综合| 国产日韩欧美中文在线| 欧美日韩三区| 精品三级av在线导航| 亚洲激情二区| 蜜桃精品在线| 国产免费av一区二区三区| www.com.cn成人| 国产精品久久久久77777丨| 9色精品在线| 蜜臀国产一区| 另类小说一区二区三区| 欧美日韩国产一区精品一区| 在线手机中文字幕| 久久a爱视频| 青青伊人久久| 一区二区三区午夜视频| 亚洲福利久久| 日本在线啊啊| 成人在线丰满少妇av| 久久99蜜桃| 欧美精品国产| 青青草91视频| 日韩有吗在线观看| 一区二区精品| 蜜桃一区二区三区在线| 天堂va蜜桃一区二区三区| 中文一区一区三区高中清不卡免费| 国产欧美三级| 国产精品亚洲四区在线观看| 色8久久久久| 免费人成网站在线观看欧美高清| av亚洲免费| 午夜精品亚洲| 久久国产亚洲| 欧美午夜精彩| 亚洲先锋成人| 久久网站免费观看| 精品国模一区二区三区| 成人在线丰满少妇av| 美女久久精品| 国产免费av一区二区三区| 亚洲精品va| 久久激情婷婷| 韩日一区二区三区| 狠狠色狠狠色综合日日tαg| 国产99亚洲| 国产中文一区| 日韩欧美精品一区| 日韩欧美一区二区三区免费看| 久久不卡日韩美女| 91中文字幕精品永久在线| 欧美国产免费| 精品精品久久| 99久久视频| 巨乳诱惑日韩免费av| 亚洲日本在线观看视频| 亚洲精品影视| 国产午夜精品一区在线观看| 国产高清亚洲| 成人va天堂| 免费看的黄色欧美网站| 日韩av影院| 久久亚洲精品中文字幕| 日韩中文影院| 欧美中文日韩| 国产欧美日韩亚洲一区二区三区| 国产劲爆久久| 麻豆精品蜜桃| 亚洲一区日韩在线| 欧美一区久久| 国产成人精品三级高清久久91| 91精品国产成人观看| 999国产精品999久久久久久| 日韩制服丝袜先锋影音| 91欧美精品| 97国产精品| 久久亚洲电影| 久久精品二区亚洲w码| 国产综合亚洲精品一区二| 一区二区三区四区精品视频| 国产精品欧美大片| 精品成人免费一区二区在线播放| 三级亚洲高清视频| 免费亚洲婷婷| 国产亚洲亚洲| 国产精品mv在线观看| 99久久夜色精品国产亚洲1000部| 欧美精品羞羞答答| 国产精品中文字幕亚洲欧美| 日本在线精品| 91精品尤物| 亚洲特色特黄| 欧美日韩亚洲一区三区| 久久电影tv| 日本va欧美va瓶| 久久久人人人| 久久爱www成人| 国产精久久一区二区| 日韩有吗在线观看| 丝袜av一区| 亚洲一区二区三区四区五区午夜 | 精品视频国内| 午夜在线一区| 激情中国色综合| 丝袜美腿亚洲色图| 韩国久久久久久| 欧美亚洲一区二区三区| 欧美日韩免费观看一区=区三区| 美女视频免费精品| 亚洲一级大片| 久久一区二区三区喷水| 国产精品欧美日韩一区| 亚洲资源av| 国产精品国产一区| 亚洲精品在线二区| 九九久久婷婷| 福利视频一区| 国产精选一区| 最新国产精品久久久| 欧美一区二区性| 麻豆精品新av中文字幕| 亚洲精品影视| 亚洲一区免费| 亚洲特级毛片| 色欧美自拍视频| 另类欧美日韩国产在线| 在线免费观看亚洲| 影音先锋国产精品| 神马日本精品| 精品国产aⅴ| 国产精选久久| 日韩高清成人在线| 亚洲永久字幕| 激情欧美一区| 亚洲www啪成人一区二区| 精品三级av| 久久精品国产亚洲aⅴ| 国产日产精品_国产精品毛片| 亚洲精品大片| 日韩中出av| 日本成人中文字幕在线视频| 免费人成黄页网站在线一区二区|