Python教程:精簡概述I/O模型與I/O操作
Python教程:精簡概述I/O模型與I/O操作
一. I/O 模型
1. 特指 Linux 下的網路 IO,一般分類:
- 阻塞IO(blocking IO)
- 非阻塞IO(non-blocking IO)
- IO多路複用(IO multiplexing)
- 訊號驅動IO(signal driven IO)
- 非同步IO(asynchronous IO)
2. 一個網路 I/O 涉及兩個系統物件:
- 應用程式(Process/Thread)
- 系統核心(Kernel)
3. 一個 read 操作會經歷兩個階段:
- 等待資料就緒(Kernel Waiting for the data to be ready)
- 複製資料到程式(Copying the data from the kernel to the process)
4. 一個 I/O read 操作的執行流程:
1. Process 呼叫 Kernel 發出請求
1.1 Kernel 等待資料準備就緒(Waiting)
1.2 Kernel 複製資料到使用者空間(Copying)
3. Kernel 通知 Process 複製完成
4. Process 接收資料,並進行處理
5. 對應 Python 中 TCP 通訊過程:
1. server 端透過 recv() 呼叫 Kernel
1.1 Kernel 等待接收 client 端 send() 資料並加入緩衝區
1.2 Kernel 將緩衝區資料 copy 到 server 的使用者記憶體空間
2. Kernel copy 完畢之後通知 server
3. server 接收並處理資料
6. 主要四種 I/O 模型的對比及演化:
a. 預設情況下,所有 Socket 介面都是阻塞型IO(blocking IO)
問題:Waiting 階段、Copying 階段處於阻塞狀態,程式只能處理一個網路連線
解決方案:開啟多執行緒/多程式
效果:
每個連線都擁有獨立的執行緒/程式,任一連線阻塞都不會影響其他連線
問題:
遇到需要同時響應大量的連線請求,多執行緒/多程式會嚴重佔據系統資源
改進方案:連線池、執行緒池
效果:
連線池可減少建立/關閉連線的頻率,重用已有連線
執行緒池可減少建立/銷燬執行緒的頻率,維持一定合理數量的執行緒
問題:
“池”始終有上限,當請求數量大大超過上限時,系統響應效率未必更高
b. 輪詢檢測 Kernel 資料是否就緒,實現非阻塞IO(non-blocking IO)
效果:
程式能夠在等待資料就緒的時間裡,去執行其他工作
問題:
不斷迴圈往復地呼叫系統將,大幅度推高 CPU 佔用率
人為加入延遲降低迴圈速度,又會導致資料吞吐量降低
c. 系統提供單一執行緒即可處理多連線的 select 介面(IO multiplexing)
效果:佔用資源少,不會消耗過多 CPU,能夠同時為多客戶端提供服務
問題:對於單一客戶端的連線請求並不能處理得更快,不適用於單個連線
d. Python 透過 asyncio 模組實現了非同步IO模型(asynchronous IO)
非同步IO下的執行流程:
1. Process 呼叫 Kernel 發出請求,立刻去做其他事務
2. Kernel 先立刻返回應答給 Process
3. Kernel 再準備資料(Waiting)
4. Kernel 複製到資料到使用者空間(Copying)
5. Kernel 完成資料複製,發 Signal 到 Process
6. Process 回來繼續該 IO 操作
7. 主要四種 IO 模型總結
- blocking IO:在 Waiting 階段、Copying 階段都會阻塞
- non-blocking IO:在 Waiting 階段不阻塞,但是監聽由應用程式發起,必須不斷呼叫作業系統
- IO multiplexing:應用程式本身不阻塞,但 select 會阻塞,應用程式仍需定期查詢 select
- asynchronous IO:在 Waiting 階段、Copying 階段都不會阻塞
二. IO 操作
1. 同步I/O操作(synchronous I/O operation)
- I/O操作過程中,存在請求程式阻塞的階段
- I/O模型包括:blocking IO、non-blocking IO、IO multiplexing
2. 非同步I/O操作(asynchronous I/O operation)
- 整個I/O操作完成,請求程式都不會阻塞
- IO模型包括:asynchronous IO
更多的Python學習教程下期繼續更新!
這裡有整理影片教程,剛好在學習的夥伴,可以回覆:Python教程,領取!
Python 900集全套影片教程(全家桶) 提取:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69923331/viewspace-2694170/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 計算機I/O與I/O模型計算機模型
- Java NIO1:I/O模型概述Java模型
- 網路I/O模型模型
- Linux下的5種I/O模型與3組I/O複用Linux模型
- 02. I/O 操作
- Veritas Quick I/O and Cached Quick I/OUI
- java 淺析I/O模型Java模型
- 流?I/O 操作?阻塞?epoll?
- Hadoop的I/O操作Hadoop
- I/O埠和I/O記憶體記憶體
- Java™ 教程(命令列I/O)Java命令列
- 深入理解Java I/O模型Java模型
- I/O模型、Libuv和Eventloop模型OOP
- 網路I/O模型 解讀模型
- 作業系統—I/O 模型作業系統模型
- Java I/O 模型的演進Java模型
- Java NIO:淺析I/O模型Java模型
- python 非同步 I/OPython非同步
- Java I/OJava
- Java I/O 教程(一) 介紹Java
- Java I/O 教程(四) FileInputStream 類Java
- Java I/O 教程(五) BufferedOutputStream 類Java
- Java I/O 教程(六) BufferedInputStream 類Java
- I/O阻塞與同步理解
- 簡述python非同步i/o庫 —— asyncioPython非同步
- Java I/O模型及其底層原理Java模型
- Linux裡五種I/O模型Linux模型
- 系統程式設計 - I/O模型程式設計模型
- 從 I/O 模型到 Netty(二)模型Netty
- 從 I/O 模型到 Netty(一)模型Netty
- 從 I/O 模型到 Netty(三)模型Netty
- Java I/O流模型概念分析整理Java模型
- socket阻塞與非阻塞,同步與非同步、I/O模型非同步模型
- 從網路I/O模型到Netty,先深入瞭解下I/O多路複用模型Netty
- Java(8)I/OJava
- 【java】I/O流Java
- Java I/O流Java
- 檔案I/O