天天看點

計算機基礎 檔案IO與網絡IO 概述

本文知識點:

計算機IO類型有那些

Linux6種檔案IO模型分别是那些

Linux5種網絡IO模型分别是那些

前言

I/O輸入/輸出(Input/Output),計算機中常見的裝置。從裝置的角度出發有鍵盤、滑鼠、顯示器、列印機、網絡。網絡對于計算機而言可以充當輸入也可以充當輸出。從軟體角度出發I/O是計算機中處理資料的通道,檔案I/O系統、網絡I/O等都是系統軟體的一部分。

檔案IO

在Linux系統中使用VFS屏蔽系統底層的檔案系統差異。VFS全名Virtual Filesystem,作用是為使用者應用程式提供open、read、write等函數來操作I/O,為使用者提供了一個統一的、抽象的、虛拟的檔案系統,提供統一的對外API,使使用者程式調用時無需感覺底層的檔案系統,隻是在真正執行讀寫操作時才調用之前注冊的檔案系統相對應的函數。VFS相當于一個門面,對底層不相同的檔案系統進行包裝後适配提供統一的接口供I/O應用程式使用。

VFS提供了6種I/O:

  • Bufferd I/O : 緩存I/O又叫作标準I/O,是大多數檔案系統的預設IO操作,經過PageCache
  • Direct I/O : 直接I/O,By Pass PageCache。offset、length需要對齊到block_size。
  • Sync I/O:同步I/O,即發起I/O請求後被阻塞直到完成。緩存I/O和直接I/O都屬于同步I/O。
  • Async I/O :異步I/O,即發起I/O請求後不會被阻塞,核心完成後回調。
  • Write Back : Bufferd I/O時,僅僅寫入PageCache後便傳回,不待資料寫入硬碟。
  • Write Through :Bufferd I/O時,不僅僅寫入PageCache,而且需要同步等待資料寫入硬碟後傳回。

Linux 檔案I/O模型圖,VFS工作在最上層:

計算機基礎 檔案IO與網絡IO 概述

網絡IO

網絡IO可以分為5種:

  • Blocking I/O : 阻塞I/O模型,調用listen() 、send()、recv()方法将阻塞線程,在I/O執行的兩個階段都會被阻塞
    • 計算機基礎 檔案IO與網絡IO 概述
  • Nonblocking I/O : 非阻塞I/O模型,在I/O執行的兩個階段不會阻塞線程,需要線程不段的輪詢擷取狀态
    • 計算機基礎 檔案IO與網絡IO 概述
  • I/O multiplexing : 多路複用I/O模型,有些地方稱為事件驅動I/O,使用者隻需要調用select,調用select會block使用者線程,直到kernel監視到有任何一個socket中的資料準備好了,select就會傳回。使用者線程可以進行read操作,将資料從核心copy到使用者線程。
    • 計算機基礎 檔案IO與網絡IO 概述
  • Signal driven I/O : 信号驅動I/O,使用者線程執行I/O操作後不會阻塞,資料準備好後使用者線程會收到SIGIO信号,在信号處理函數中調用I/O操作函數處理資料。這個模型不常用
  • Asynchronous I/O :異常I/O,使用者線程執行read操作後立即傳回,使用者态與核心态不會block,當資料準備完成後會發送一個Signal資訊通知使用者線程read操作完成
    • 計算機基礎 檔案IO與網絡IO 概述

在Java中常用的網格I/O模型有Blocking I/O、Nonblocking I/O、I/O multiplexing、Asynchronous I/O,也就是大家常常說起的BIO、NIO、AIO。

最後用一張圖來看下各個網絡I/O模型之前的對比:

計算機基礎 檔案IO與網絡IO 概述

往期推薦:

知識點: Java ReentrantReadWriteLock 讀寫鎖共享鎖與排他鎖

知識點: Java公平鎖與非公平鎖 原理講解ReentrantLock 鎖的饑餓效應及解決辦法

知識點: JAVA 悲觀鎖與樂觀鎖原理分析 ABA與自旋效率問題分析及解決

知識點:Java 并發程式設計 - 了解原子性