LInux——五种IO模型

Linux中的IO简述

IO主要分为以下的三种:

  • 内存IO
  • 网络IO
  • 磁盘IO

通常我们所说的IO是后两者,Linux中无法直接操作IO设备,必须通过系统调用请求kernal来协助完成IO的动作,内存会为每一个IO设备维护一个缓冲区。

IO操作会涉及两个对象:

  1. 调用这个IO的进程(或线程);
  2. 系统内核的kernal

五种模型介绍

1、阻塞IO

最简单的一种IO模型,简单理解就是死等,即进程或线程一直等待某个条件,不满足就会一直等待

当用户程序执行 read ,线程会被阻塞,一直等到内核数据准备好,并把数据从内核缓冲区拷贝到应用程序的缓冲区中,当拷贝过程完成,read 才会返回。

注意,阻塞等待的是「内核数据准备好」和「数据从内核态拷贝到用户态」这两个过程。过程如下图:LInux——五种IO模型_第1张图片

2、非阻塞IO

应用进程与内核交互,不断轮询,不停地去问内核数据是否准备好

  • 如果没有准备好,返回error,应用进程得到error后,过一段时间再发送请求,在两次请求时间内,进程可以先做其他事情。
  • 如果准备好了,将数据拷贝到用户空间

LInux——五种IO模型_第2张图片

3、IO多路复用

IO多路复用实际上就是用select , poll, epoll监听多个io对象,当io对象有变化(有数据)的时候就通知用户进程。好处就是单个进程可以处理多个socket。

4、信号驱动型IO模型

进程预先向预先注册一个信号处理函数,当内核数据准备好之后发送一个信号给进程

5、异步IO模型

用户进程发起read操作,告诉内核当整个操作完成时、如何通知我们、立刻就可以开始去做其它的事,内核收到read操作之后会立刻返回、所以不会对用户进程产生任何阻塞、然后、内核会等待数据准备完成、然后将数据拷贝到用户内存、当这一切都完成之后、内核会给用户进程发送一个信号、告诉它read操作完成了。

LInux——五种IO模型_第3张图片

你可能感兴趣的:(Linux,LInux)