Python教程:精簡概述I/O模型與I/O操作

千鋒Python唐小強發表於2020-05-25

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章