>[success] # I/O模型是什么?
**在計算機編程中,I/O模型是用于描述輸入和輸出處理方式的術語**。它指的是**計算機系統與外部設備之間進行數據交互的過程**,包括讀取和寫入數據。當外部設備(如鼠標、鍵盤、硬盤等)進行輸入或輸出操作時,會產生相應的I/O事件。這些事件需要被操作系統或應用程序捕捉并進行相應的處理,以便提供更好的用戶體驗或實現特定的功能。
>[danger] ##### I/O 和系統的關系
總的來說,IO(輸入/輸出)操作是計算機編程中非常重要的一部分,**它涉及到程序與外部世界的交互,包括從設備讀取數據、向設備輸出數據以及文件讀寫等操作**。IO操作和操作系統密切相關,因為**操作系統負責管理計算機系統的所有資源,包括硬件設備和軟件資源。**
文件寫入輸出為例他也是IO操作的一種形式,它涉及到將數據從程序的內存中寫入到**磁盤(外部設備)** 文件中,將數據從**磁盤(外部設備)**文件讀取到程序的**內存中(外部設備)** 文件系統是實現文件IO操作的一種機制,它將磁盤上的數據組織成文件和目錄的形式,使得程序可以通過文件名和路徑來訪問這些數據。操作系統提供了一些API,使得程序可以進行文件IO操作,如文件打開和關閉、文件讀取和寫入、文件指針操作和文件屬性查詢等。程序通常使用文件輸入流和文件輸出流來進行文件讀寫操作,它們是操作系統提供的高級API,封裝了底層的IO操作,使得程序員可以更方便地進行文件讀寫操作。
* 操作系統提供了一些常用的文件IO操作API,以下是其中一些常見的API:
1. `open()`:打開文件,返回文件句柄。
2. `close()`:關閉文件。
3. `read()`:從文件中讀取數據。
4. `write()`:向文件中寫入數據。
5. `lseek()`:移動文件指針。
6. `feof()`:檢查文件是否到達文件尾。
7. `ferror()`:檢查文件是否出錯。
8. `rewind()`:將文件指針指向文件開始位置。
9. `fgets()`:從文件中讀取一行數據。
10. `fputs()`:將字符串寫入文件。
11. `fprintf()`:將格式化的數據寫入文件。
12. `fscanf()`:從文件中讀取格式化的數據。
>[danger] ##### 編程語言和I/O事件之間的關系
編程語言是一種工具,通過它我們可以開發出各種應用程序。在應用程序中,處理I/O事件是非常常見的需求。為了幫助程序員處理I/O事件,編程語言提供了一些API(應用程序接口),就像是使用這種工具需要的配件和零件一樣。這些API可以使得程序能夠及時地捕捉和處理I/O事件,從而提供更好的用戶體驗或實現特定的功能。
因此,編程語言和 I/O 事件之間的關系非常密切。編程語言提供了一些工具和機制,使得程序能夠更好地處理和響應 I/O 事件。
>[danger] ##### 舉例說明
輸入文字、保存文件、播放音樂等等,都需要涉及到計算機和外部設備之間的交互。**這種交互就叫做I/O,即輸入/輸出** 。當用戶在鍵盤上輸入文字時,操作系統會捕捉到這個事件并將其傳遞給應用程序,應用程序接收到事件后會將文字顯示在屏幕上。同樣地,當應用程序需要將數據存儲到硬盤上時,操作系統會捕捉到這個事件并將數據傳遞給硬盤進行存儲。 綜上所述,I/O模型是計算機系統與外部設備之間進行數據交互的過程,包括讀取和寫入數據。編程語言提供了一些API,幫助程序捕捉和處理I/O事件,使得程序能夠更好地處理和響應這些事件,從而提供更好的用戶體驗或實現特定的功能。
綜合來看,輸入文字、保存文件、播放音樂等等操作都需要計算機與外部設備之間的交互。這種交互就叫做 I/O,即輸入/輸出。I/O 事件指的就是這些交互過程中產生的事件。**編程語言提供了一些工具和機制,幫助程序捕捉和處理 I/O 事件,使得程序能夠更好地處理和響應這些事件,從而提供更好的用戶體驗或實現特定的功能**。
>[info] ## I/O 處理方式
不同的編程語言和操作系統提供了不同的 I/O 處理方式,當涉及到 I/O 操作時,常常會聽到一些術語,如**阻塞、非阻塞、同步和異步**。這些術語指的是 I/O 操作的不同模型
在計算機中,I/O 模型可以分為四種類型:**阻塞、非阻塞、同步和異步**。
* **阻塞 I/O**:當應用程序執行 I/O 操作時,線程被阻塞并一直等待直到 I/O 操作完成。因為線程在等待時無法執行任何其他操作,所以阻塞 I/O 會浪費 CPU 時間。**舉個例子:** 像在快餐店點餐一樣,當你點完餐之后,必須等待餐廳廚師將你的食物做好才能離開,期間你不能做其他的事情。這種模型在計算機領域中并不常見,因為它會嚴重影響系統性能
* **非阻塞 I/O**:當應用程序執行 I/O 操作時,線程不會等待 I/O 操作完成。相反,它會立即繼續執行,并且會在后續時間檢查 I/O 操作是否完成。**舉個例子:** 像在快餐店點餐一樣,當你點完餐之后,你可以在旁邊等待,等到你的食物做好之后再離開,期間你可以去做其他的事情。在計算機領域中,這種模型允許我們在等待 I/O 完成時繼續執行其他任務。
* **同步 I/O**:當應用程序執行 I/O 操作時,它會一直等待,直到 I/O 操作完成。這意味著線程會阻塞,并且無法執行任何其他操作,直到 I/O 操作完成。**舉個例子:** 像在高檔餐廳點餐一樣,你必須在點完餐之后等待食物做好才能離開。在計算機領域中,這意味著我們必須等待 I/O 操作完成后才能繼續執行后續的代碼。
* **異步 I/O**:當應用程序執行 I/O 操作時,它會立即返回,并在后續時間處理 I/O 操作完成的通知。這意味著線程不會阻塞,并且可以繼續執行其他操作。**舉個例子:** 像在餐廳預訂一樣,你可以預訂餐廳中的一個桌位,然后離開餐廳去做其他的事情。當你的桌位準備好時,餐廳會通知你返回。在計算機領域中,這種模型允許我們啟動 I/O 操作并繼續執行后續代碼,等到 I/O 操作完成時再回調通知我們。
>[danger] ##### 同步阻塞 I/O
同步阻塞 I/O 是最常見的 I/O 模型之一。在這種模型中,當一個線程發起一個 I/O 請求時,它將被阻塞直到該請求完成并返回結果。在 I/O 操作執行期間,線程無法執行任何其他任務,因此會浪費 CPU 時間。這種模型可以保證 I/O 操作的正確性,但是在等待 I/O 操作完成期間,程序無法執行其他任務,導致程序的性能和并發性受到限制。
>[danger] ##### 同步非阻塞 I/O
同步非阻塞 I/O 模型是指在進行 I/O 操作時,可以立即返回一個狀態,告訴調用者是否已經完成操作。在等待 I/O 完成的過程中,當前線程不會被阻塞,可以繼續執行其他操作。但是,在完成 I/O 操作之前,必須不斷地輪詢狀態,直到操作完成。同步非阻塞 I/O 這個概念本身有些自相矛盾,因為同步通常意味著阻塞,而非阻塞則通常是異步的。因此,在大多數編程語言中,同步 I/O 操作通常是阻塞的,而非阻塞的 I/O 操作通常是異步的。
>[danger] ##### 異步阻塞 I/O
異步阻塞 I/O 模型是指在進行 I/O 操作時,可以先提交一個請求,然后等待系統完成操作并通知調用者,完成后再執行回調函數。在等待 I/O 完成的過程中,當前線程被阻塞。這種模型的特點是對于單個 I/O 操作,性能較好,但是無法充分利用 CPU 處理其他任務。
>[danger] ##### 異步非阻塞 I/O 模型
異步非阻塞 I/O 模型是指在進行 I/O 操作時,可以先提交一個請求,然后立即返回,并且在 I/O 操作完成后,系統會自動通知調用者,執行回調函數。在等待 I/O 完成的過程中,當前線程不會被阻塞,可以繼續執行其他操作。這種模型的特點是可以提高性能,同時充分利用 CPU 處理其他任務。
?? 復用
- 基礎
- 什么是Node.js
- 理解 I/O 模型
- 理解node 中 I/O
- 對比node 和java 使用場景
- node 模塊管理
- 內置模塊 -- buffer
- 內置模塊 -- fs
- fs -- 文件描述符
- fs -- 打開文件 api
- fs -- 文件讀取 api
- fs -- 文件寫入 api
- fs -- 創建目錄 api
- fs -- 讀取文件目錄結構 api
- fs -- 文件狀態(信息) api
- fs -- 刪除文件/目錄 api
- fs -- 重命名 api
- fs -- 復制文件 api
- 內置模塊 -- events
- 內置模塊 -- stream
- 可讀流 -- Readable
- 可寫流 -- Writable
- Duplex
- Transform
- 內置模塊 -- http
- http -- 從客戶端發起
- http -- 從服務端發起
- 內置模塊 -- url
- 網絡開發