linux io指的是一種檔案操作;在Linux中,檔案就是一串二進位流,那麼在資訊的交換過程中,我們都是對這些流進行資料收發操作,這些操作簡稱為I/O操作;由於Linux使用的是虛擬記憶體機制,所以必須透過系統呼叫請求核心來完成IO動作。
本教學操作環境:linux5.9.8系統、Dell G3電腦。
linux io指的是什麼?
我們都知道在Linux的世界,一切皆檔案。
而檔案就是一串二進位流,不管Socket、FIFO、管道還是終端,對我們來說,一切都是流。
在資訊的交換過程中,我們都是對這些流進行資料收發操作,簡稱為I/O操作。
往流讀取數據,系統呼叫Read,寫入數據,系統呼叫Write。
通常使用者程序的一個完整的IO分為兩個階段:
磁碟IO:
網路IO:
作業系統和驅動程式運行在核心空間,應用程式運行在用戶空間,兩者不能使用指標傳遞數據,因為Linux使用的虛擬記憶體機制,必須透過系統呼叫請求核心來完成IO動作。
IO有記憶體IO、網路IO和磁碟IO三種,通常我們說的IO指的是後兩者!
為什麼需要IO模型
如果使用同步的方式來通訊的話,所有的操作都在一個執行緒內順序執行完成,這麼做缺點是很明顯的:
- 因為同步的通訊操作會阻塞同一個執行緒的其他任何操作,只有這個操作完成了之後,後續的操作才可以完成,所以出現了同步阻塞多執行緒(每個Socket都建立一個執行緒對應),但是系統內執行緒數量是有限制的,同時執行緒切換很浪費時間,適合Socket少的情況。
因該需要出現IO模型。
Linux的IO模型
在描述Linux IO模型之前,我們先來了解Linux系統資料讀取的過程:
以使用者請求index.html檔案為範例說明
#基本概念
使用者空間與內核空間
作業系統的核心是內核,獨立於普通的應用程序,可以存取受保護的記憶體空間,也有存取底層硬體設備的所有權限。
- 為了確保內核的安全,使用者行程不能直接操作內核,作業系統將虛擬空間分割為兩部分,一部分為內核空間,一部分為使用者空間。
進程切換
為了控制進程的執行,核心必須有能力掛起正在CPU上執行的進程,並恢復先前掛起的某個進程的執行。
這種行為稱為進程切換。
因此可以說,任何進程都是在作業系統核心的支援下運行的,是與核心緊密相關的。
進程的阻塞
正在執行的進程,由於期待的某些事件未發生,例如請求系統資源失敗、等待某種操作的完成、新數據尚未到達或無新工作做等,則由系統自動執行阻塞原語(Block),使自己由運行狀態變為阻塞狀態。
可見,進程的阻塞是進程本身的主動行為,也因此只有處於運行態的進程(獲得CPU),才可能將其轉換為阻塞狀態。
當行程進入阻塞狀態,是不佔用CPU資源的。
檔案描述子
檔案描述子(File Descriptor)是電腦科學中的一個術語,是一個用於表述指向文件的引用的抽象化概念。
檔案描述子在形式上是一個非負整數,實際上,它是一個索引值,指向核心為每個行程所維護的該行程開啟檔案的記錄表。
- 當程式開啟一個現有檔案或建立一個新檔案時,核心會向進程傳回一個檔案描述符。
快取IO
大多數檔案系統的預設 IO 操作都是快取 IO。
其讀寫過程如下:
讀取操作:作業系統檢查核心的緩衝區有沒有需要的數據,如果已經快取了,那麼就直接從快取中返回;否則從磁碟、網路卡等中讀取,然後快取在作業系統的快取中;
寫入操作:將資料從使用者空間複製到核心空間的快取中。這時對使用者程式來說寫操作就已經完成,至於什麼時候再寫到磁碟、網卡等中由作業系統決定,除非顯示地呼叫了 sync 同步指令。
假設核心空間快取無需要的數據,使用者行程從磁碟或網路讀取資料分兩個階段:
階段一: 核心程式從磁碟、網路卡等讀取資料到核心空間快取區;
#階段二: 使用者程式從核心空間快取拷貝數據到用戶空間。
快取IO 的缺點:
資料在傳輸過程中需要在應用程式位址空間和核心空間進行多次資料拷貝操作,這些資料拷貝操作所帶來的CPU以及記憶體開銷非常大。
同步阻塞
用戶空間的應用程式執行一個系統調用,這會導致應用程式阻塞,什麼也不乾,直到資料準備好,並且將資料從核心複製到用戶進程,最後進程再處理數據,在等待數據到處理數據的兩個階段,整個進程都被阻塞,不能處理別的網路IO。
- 呼叫應用程式處於不再消費 CPU 而只是簡單等待回應的狀態,因此從處理的角度來看,這是非常有效的。
這也是最簡單的IO模型,在通常FD較少、就緒很快的情況下使用是沒有問題的。
同步非阻塞
非阻塞的系統呼叫呼叫之後,進程並沒有被阻塞,核心馬上回傳給進程,如果資料還沒準備好,此時會回傳一個error。
進程在回傳之後,可以做點別的事情,然後再發起系統呼叫。
重複上面的過程,循環往復的進行系統呼叫。這個過程通常被稱之為輪詢。
輪詢檢查內核數據,直到數據準備好,再拷貝數據到進程,進行數據處理。
需要注意,拷貝資料整個過程,進程仍然是屬於阻塞的狀態。
這種方式在程式設計中對Socket設定
O_NONBLOCK
即可。
IO多路復用
IO多路復用,這是一種進程預先告知核心的能力,讓核心發現進程指定的一個或多個IO條件就緒了,就通知進程。
使得一個行程能在一連串的事件上等待。
IO複用的實作方式目前主要有Select、Poll和Epoll。
偽代碼描述IO多路復用:
while(status == OK) { // 不断轮询 ready_fd_list = io_wait(fd_list); //内核缓冲区是否有准备好的数据 for(fd in ready_fd_list) { data = read(fd) // 有准备好的数据读取到用户缓冲区 process(data) }}
訊號驅動
首先我們允許Socket進行訊號驅動IO ,並安裝一個訊號處理函數,進程繼續運作並不阻塞。
當資料準備好時,進程會收到一個SIGIO訊號,可以在訊號處理函數中呼叫I/O操作函數處理資料。
流程如下:
開啟套接字訊號驅動IO功能
系統呼叫Sigaction執行訊號處理函數(非阻塞,立刻返回)
資料就緒,產生Sigio訊號,透過訊號回調通知應用來讀取資料
此種IO方式存在的一個很大的問題:Linux中訊號佇列是有限制的,如果超過這個數字問題就無法讀取資料
非同步IO流程如下所示:
- 當使用者執行緒調用了
aio_read
系統調用,立刻就可以開始去做它的事,用戶執行緒不阻塞
- 核心就開始了IO的第一個階段:準備資料。當核心一直等到資料準備好了,它就會將資料從核心核心緩衝區,拷貝到使用者緩衝區
- #核心會給使用者執行緒發送一個訊號,或是回呼使用者執行緒註冊的回調接口,告訴用戶線程Read操作完成了
- 用戶線程讀取用戶緩衝區的數據,完成後續的業務操作
相對於同步IO,非同步IO不是順序執行。
用戶進程進行aio_read
系統呼叫之後,無論核心資料是否準備好,都會直接返回給用戶進程,然後用戶態進程可以去做別的事情。
等到資料準備好了,核心直接複製資料給進程,然後從核心向進程發送通知。
對比訊號驅動IO,非同步IO的主要區別在於:
- 訊號驅動由內核告訴我們何時可以開始一個IO操作(資料在內核緩衝區中),而異步IO則由核心通知IO操作何時已經完成(資料已經在用戶空間中)。
非同步IO又叫做事件驅動IO,在Unix中,為非同步方式存取檔案定義了一套函式庫函數,定義了AIO的一系列介面。
- 使用
aio_read
或aio_write
啟動非同步IO操作,使用aio_error
檢查正在執行的IO操作的狀態。
目前Linux中AIO的核心實作只對檔案IO有效,如果要實作真正的AIO,需要使用者自己來實作。
目前有許多開源的非同步IO函式庫,例如libevent、libev、libuv。
相關推薦:《Linux影片教學》
以上是linux io指的是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Linux操作系統的5個核心組件是:1.內核,2.系統庫,3.系統工具,4.系統服務,5.文件系統。這些組件協同工作,確保系統的穩定和高效運行,共同構成了一個強大而靈活的操作系統。

Linux的五個核心元素是:1.內核,2.命令行界面,3.文件系統,4.包管理,5.社區與開源。這些元素共同定義了Linux的本質和功能。

Linux用戶管理和安全性可以通過以下步驟實現:1.創建用戶和組,使用命令如sudouseradd-m-gdevelopers-s/bin/bashjohn。 2.批量創建用戶和設置密碼策略,使用for循環和chpasswd命令。 3.檢查和修復常見錯誤,如家目錄和shell設置。 4.實施最佳實踐,如強密碼策略、定期審計和最小權限原則。 5.優化性能,使用sudo和調整PAM模塊配置。通過這些方法,可以有效管理用戶和提升系統安全性。

Linux文件系統和進程管理的核心操作包括文件系統的管理和進程的控制。 1)文件系統操作包括創建、刪除、複製和移動文件或目錄,使用命令如mkdir、rmdir、cp和mv。 2)進程管理涉及啟動、監控和終止進程,使用命令如./my_script.sh&、top和kill。

Shell腳本是Linux系統中用於自動化執行命令的強大工具。 1)Shell腳本通過解釋器逐行執行命令,處理變量替換和條件判斷。 2)基本用法包括備份操作,如使用tar命令備份目錄。 3)高級用法涉及使用函數和case語句管理服務。 4)調試技巧包括使用set-x開啟調試模式和set-e在命令失敗時退出。 5)性能優化建議避免子Shell,使用數組和優化循環。

Linux是一個基於Unix的多用戶、多任務操作系統,強調簡單性、模塊化和開放性。其核心功能包括:文件系統:以樹狀結構組織,支持多種文件系統如ext4、XFS、Btrfs,使用df-T查看文件系統類型。進程管理:通過ps命令查看進程,使用PID管理進程,涉及優先級設置和信號處理。網絡配置:靈活設置IP地址和管理網絡服務,使用sudoipaddradd配置IP。這些功能在實際操作中通過基本命令和高級腳本自動化得以應用,提升效率並減少錯誤。

進入Linux維護模式的方法包括:1.編輯GRUB配置文件,添加"single"或"1"參數並更新GRUB配置;2.在GRUB菜單中編輯啟動參數,添加"single"或"1"。退出維護模式只需重啟系統。通過這些步驟,你可以在需要時快速進入維護模式,並安全地退出,確保系統的穩定性和安全性。

Linux的核心組件包括內核、shell、文件系統、進程管理和內存管理。 1)內核管理系統資源,2)shell提供用戶交互界面,3)文件系統支持多種格式,4)進程管理通過fork等系統調用實現,5)內存管理使用虛擬內存技術。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

記事本++7.3.1
好用且免費的程式碼編輯器