Python學習之 IO 操作

2022-07-19 04:27:10 字數 3388 閱讀 8707

阻塞io / 非阻塞io /io多路復用 / 非同步io

說明:同步io包含(阻塞io / 非阻塞io /io多路復用),因為他們有個共同特性就是都需要核心態到使用者態的乙個等待。

基本概念解釋,環境限定為linux:

1:使用者空間和記憶體空間

首先作業系統是採用虛擬儲存器,就32位系統來說,它的虛擬儲存空間是2的32次方==4g,作業系統的核心是核心,它是獨立於普通的應用程式,它可以訪問受保護的記憶體空間,底層硬體等,為保障使用者程序不能直接操作核心,作業系統將虛擬儲存空間分為2部分,分為:核心空間和使用者空間,核心空間將最高的1g位元組(定址:0xc0000000到0xffffffff)分配使用,最低的3g位元組分配給使用者空間,供程序使用。

2:程序切換

也就類似執行緒切換,由核心將正在cpu上執行的程序掛起,然後恢復以前掛起的程序,這就是程序切換。所以程序都是在作業系統的核心的支援下執行的。與核心緊密相連

從乙個程序切換到另乙個程序,執行過程如下:

1:儲存處理機上下文,包括程式計數器和暫存器

2:更新pcb資訊

3:把程序的pcb移入相應的佇列,

4:選擇另乙個程序執行,並更新其pcb

5:更新記憶體管理的資料結構

6:恢復處理機上下文

3:程序的阻塞

當正在執行的程序執行期間,由於所期待的事情未發生,如(請求資源失敗,某種操作的完成,新資料尚未到達等),則由系統自動執行阻塞原語,使程序自己由執行變為阻塞狀態,由此可見,程序阻塞是程序自身的一種主動行為,因此只有執行的程序才能進入阻塞狀態,處於阻塞狀態的程序是不占用cpu資源的。

4:檔案描述符

是乙個用於表述指向檔案的引用的抽象化概念。簡單理解它就是乙個索引值(非負整數),指向核心為每乙個程序所維護的該程序開啟的檔案記錄表

流程:程式開啟乙個檔案或建立乙個新檔案,核心向程序返回乙個檔案描述符,通過檔案描述符對檔案控制代碼(就是真實檔案物件)操作在程式設計底層基本是圍繞檔案描述符展開。這個概念只適用於unix,linux系統

5:快取i/o

也被稱為標準i/o,就是資料先被拷貝到作業系統的核心緩衝區,然後再從核心緩衝區拷貝到應用程式的位址空間。(就是說資料是從核心態到使用者態的乙個拷貝)

缺點:資料 在傳輸過程中需要在應用程式的位址空間和核心緩衝區中進行多次拷貝操作,這些拷貝操作對cpu和記憶體開銷也是非常大。

i/o模式

i/o執行經歷的2個階段:

1:等待資料的準備,就是將資料先讀到核心快取中。

2:將資料從核心拷貝到程序中

通過這2個階段,linux產生了5種網路模式:(阻塞i/0,非阻塞i/o,i/o多路復用,訊號驅動i/o(這個用的少),非同步i/o)

1:阻塞i/o (blocking io)

在linux中,預設下所有的socket都是阻塞io,

當使用者程序呼叫了recvfrom這個系統呼叫,kernel就開始了io的第乙個階段:準備資料(對於網路io來說,很多時候資料在一開始還沒有到達。比如,還沒有收到乙個完整的udp包。

這個時候kernel就要等待足夠的資料到來)。這個過程需要等待,也就是說資料被拷貝到作業系統核心的緩衝區中是需要乙個過程的。而在使用者程序這邊,整個程序會被阻塞(當然,是程序自己選擇的阻塞)。

當kernel一直等到資料準備好了,它就會將資料從kernel中拷貝到使用者記憶體,然後kernel返回結果,使用者程序才解除block的狀態,重新執行起來。

看圖:特點:blocking io的特點就是在io執行的兩個階段(核心等資料階段和核心態到使用者態考資料階段)都被block了。

2:非阻塞i/o (nonblocking io)

在linux中,可以設定socket為非阻塞io,

當使用者程序發出read操作時,如果kernel中的資料還沒有準備好,那麼它並不會block使用者程序,而是立刻返回乙個error。從使用者程序角度講 ,它發起乙個read操作後,並不需要等待,而是馬上就得到了乙個結果。使用者程序判斷結果是乙個error時,它就知道資料還沒有準備好,於是它可以再次傳送read操作。一旦kernel中的資料準備好了,並且又再次收到了使用者程序的system call,那麼它馬上就將資料拷貝到了使用者記憶體,然後返回。

看圖:

特點:nonblocking io的特點是使用者程序需要不斷的主動問kernel資料是否準備完畢。(這裡資料從核心到使用者還是存在阻塞)

3:io多路復用 (io multiplexing)

就是:select,poll,epoll,這3種方式也稱作 事件驅動模型,selelct/epoll好處是單個process可以同時處理多個網路連線的io,

基本原理:select,poll,epoll會不斷的輪詢所負責的所有socket,當某個socket有資料到達了,就通知使用者程序。

看圖:

注意:單執行緒下 阻塞模式是不能夠實現多路復用

特點:i/o 多路復用的特點是通過一種機制乙個程序能同時等待多個檔案描述符,而這些檔案描述符(套接字描述符)其中的任意乙個進入讀就緒狀態,select()函式就可以返回。

當使用者程序呼叫了select,那麼整個程序會被block,而同時,kernel會「監視」所有select負責的socket,當任何乙個socket中的資料準備好了,select就會返回。這個時候使用者程序再呼叫read操作,將資料從kernel拷貝到使用者程序。

4:非同步io (asynchronous io) 實現全程無卡點

使用者程序發起read操作之後,立刻就可以開始去做其它的事。而另一方面,從kernel的角度,當它受到乙個asynchronous read之後,首先它會立刻返回,所以不會對使用者程序產生任何block。然後,kernel會等待資料準備完成,然後將資料拷貝到使用者記憶體,當這一切都完成之後,kernel會給使用者程序傳送乙個signal,告訴它read操作完成了。

看圖:

總結:

blocking和non-blocking的區別

呼叫blocking io會一直block住對應的程序直到操作完成,而non-blocking io在kernel還準備資料的情況下會立刻返回

synchronous io和asynchronous io的區別

synchronous io做」io operation」的時候會將process阻塞,所以(阻塞,非阻塞,多路復用)都屬於同步io

Python學習 IO流操作

今天學習了io流操作,所以總結一下,順便回顧下這一天學習的知識點。照舊,我們廢話少說,直接進入我們的主主題 io流操作 首先先了解下io流的概念吧。什麼是io流呢?io流 input output stream 1 io流主要指計算機的輸入和輸出操作 2 常見的io流操作,一般說的是 記憶體 與 磁...

Python學習 檔案操作IO

開啟檔案 以讀檔案模式開啟乙個檔案物件,使用open 函式,傳入檔名和標示符 file open e python.txt r 注意 路徑符號不能用 而是 讀檔案 f.read aaaa nbbb nbccc nddd neee nfff nhhh n 注意 read 會一次性讀取檔案的全部內容,如...

Python 檔案I O操作

fo open foo.txt r 檔案開啟並建立乙個名為fo.txt的r 可讀寫檔案 fo open foo.txt w 檔案開啟並建立乙個名為fo.txt的w只寫檔案 fo read 10 檔案讀取前10個字元fo tell 檔案當前目錄位置fo seek 0 0 檔案定址,seek offse...