python io操作需要用到什么硬件_Python I/O 操作(一)
一、I/O 概念
I/O 指的是相對內存而言的 input 和 output
從文件、數據庫、網絡向內存中寫入數據叫做 input
從內存向文件、數據庫、網絡中輸出數據叫做 output
I/O 操作相比 CPU 操作而言是極慢的,往往 CPU 運行一秒鐘,I/O 要忙幾個月,所以要提高 I/O 密集型程序的運行效率,異步 I/O 是毫無疑問的
舉例說明 io 模塊的使用:
import io
strio = io.StringIO()
strio.writelines('hello\n')
strio.writelines('world')
print('1、StringIO:')
print(strio.getvalue())
byteio = io.BytesIO()
byteio.write('你好'.encode())
print('2、BytesIO:')
print(byteio.getvalue().decode())
二、異步 I/O
2.1 系統調用
現代的操作系統通常都具有多任務處理的功能,通常靠進程來實現。操作系統的運算器(或處理器)快速在每個進程間切換執行,所以看起來就像多個進程同時運行。這樣就帶來了很多安全問題,例如一個進程可以輕易修改進程的內存空間中的數據來使另一個進程異常或達到一些其它目的,因此操作系統必須保證每一個進程都能安全地執行。這一問題的解決方法是在處理器中加入基址寄存器和界限寄存器。這兩個寄存器中的內容限制了存取指令所訪問的儲存器的地址范圍,這樣就可以在系統切換進程時寫入這兩個寄存器的內容到該進程被分配的地址范圍,從而避免惡意軟件
為了防止用戶程序修改基址寄存器和界限寄存器中的內容來達到訪問其它內存空間的目的,這兩個寄存器必須通過一些特殊的指令來訪問。通常,處理器設有兩種模式:“用戶模式” 與 “內核模式” ,通過一個標簽位來鑒別當前正處于什么模式。一些諸如修改基址寄存器內容的指令只有在內核模式中可以執行,而處于用戶模式的時候硬件會直接跳過這個指令并繼續執行下一個
同樣,為了安全問題,一些 I/O 操作的指令都被設置為只有在內核模式下可以執行,因此操作系統有必要為應用程序提供諸如讀取磁盤某位置的數據的接口,這些接口就被稱為系統調用
當操作系統接收到系統調用請求后,會讓處理器進入內核模式,從而執行諸如 I/O 操作、修改基址寄存器內容等指令,當處理完系統調用內容后,操作系統會讓處理器返回用戶模式,來執行用戶代碼
2.2 用戶態和內核態
在 CPU 執行的所有指令中,有一些指令是非常危險的,如果錯用將導致整個系統崩潰,例如清內存、設置時鐘等。如果所有程序都能使用這些指令,那么你的系統將極不穩定,死機可能經常發生。所以 CPU 將指令分為特權指令和非特權指令。對于那些危險的指令,只允許操作系統及其相關模塊使用,普通的應用程序只能使用那些不會造成災難的指令(例如 Intel 的 CPU 將特權級別由高到低分為四個級別:RING0,RING1,RING2 和 RING3)
Linux 內核是一個有機的整體,每一個用戶進程運行時都有一份內核的拷貝,每當用戶進程使用系統調用時,都自動地將運行模式從用戶級轉為內核級(即上文提到的用戶模式和內核模式),此時進程在內核的地址空間中運行
當一個任務(進程)執行系統調用而進入內核空間中執行時,我們就稱進程處于內核運行態(或簡稱為內核態)。此時處理器處于特權級最高的(0 級)內核代碼中執行。當進程處于內核態時,執行的內核代碼會使用當前進程的內核棧。每個進程都有自己的內核棧。當進程在執行用戶自己的代碼時,則稱其處于用戶運行態(用戶態)。即此時處理器在特權級最低的(3 級)用戶代碼中運行。當正在執行用戶程序而突然被中斷程序中斷時,此時用戶程序也可以象征性地稱為處于進程的內核態。因為中斷處理程序將使用當前進程的內核棧。這與處于內核態的進程的狀態有些類似
處理器總處于以下狀態中的一種:
1、內核態,運行于進程上下文,內核代表進程運行于內核空間
2、內核態,運行于中斷上下文,內核代表硬件運行于內核空間
3、用戶態,運行于用戶空間
三、Linux 系統中的 I/O 模型
計算機有運算器、控制器、存儲器、輸入設備、輸出設備五部分組成。運算器(或處理器)的速度是最快的,內存讀寫數據、磁盤尋址、網絡傳輸相對而言是極慢的,運算器和控制器主要集成在 CPU 中,其它的都是 I/O ,CPU 大部分時間都是在等待 I/O 完成操作,會浪費大量的時間,I/O 成了最大的性能瓶頸
網絡通信是兩個主機之間的通信,需要有外設接收外部的數據,再將數據存放到內存,整個過程是很消耗時間的。計算機之間互連離不開網絡,而網絡 I/O 相對來說速度最慢。為了提高 I/O 操作效率,操作系統提供了幾種高性能的 I/O 模型,其中異步 I/O 是一個比較好的解決方案,性能得到了大幅提升
Linux 系統中有五種 I/O 模型,本文重點介紹的是 I/O 復用模型,廣泛使用的 I/O 多路復用機制的系統調用有 select, poll, epoll 這三種
3.1 阻塞 I/O
當用戶態進程調用系統函數獲取數據時,如果內核中還沒有準備好數據,用戶態進程將掛起一直等待,不進行其它操作,等內核將數據準備好之后,將數據從內核空間拷貝到用戶空間,這時候系統調用函數返回,解除阻塞狀態,用戶態進程處理接收到的數據
3.2 非阻塞 I/O
用戶態進程調用系統函數獲取數據時,如果內核中還沒有準備好數據,內核會返回錯誤信息給進程,用戶態進程接收到錯誤信息,不會阻塞在那里,但進程會不斷調用系統函數詢問內核,直到內核準備好數據,將數據從內核復制到用戶空間,系統函數調用結束,開始處理接收到的數據
3.3 I/O 復用
在計算機網絡里面,有很多關于 “復用” 的用法,比如多路復用。本來一條鏈路上一次只能傳輸一個數據流,如果要實現多個源之間多條數據流傳輸,那就得需要多條鏈路了,復用技術可以通過將一條鏈路劃分頻率,或者劃分傳輸的時間,使一條鏈路上可以傳輸多條數據流。I/O 復用就是在一個進程里會處理多個消息事件
3.4 信號驅動式 I/O 模型
當用戶態進程需要數據時,會向內核發送一個信號,告訴內核要什么數據,然后自己去做其它的事情,當內核態的數據準備好之后,內核馬上給用戶態進程發送信號,用戶態進程收到信號立馬調用系統函數,將數據從內核空間拷貝到用戶空間,完成之后用戶態進程開始處理接收到的數據
3.5 異步 I/O 模型
用戶態進程需要數據時會告訴內核態需要什么,然后就不用管了,可以做其它事情,內核會將用戶態需要的數據準備好,然后將數據復制到用戶空間,這時才通知用戶態進程直接處理用戶空間的數據
我們看到前四個 I/O 模型處理數據時,都是用戶態進程將數據從內核空間拷貝到用戶空間,這一段時間對于進程來說是阻塞的,只有異步 I/O 是內核將數據從內核空間拷貝到用戶空間,用戶態進程完全是異步操作,所以前四個模型可以稱為同步 I/O ,最后一個是異步 I/O
五個 I/O 模型的比較
總結
以上是生活随笔為你收集整理的python io操作需要用到什么硬件_Python I/O 操作(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql+server+80_Wind
- 下一篇: python 一句话校验软件 hash值