天天看点

计算机基础 文件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 并发编程 - 理解原子性