Netty系列学习第一章 I/O之路

一、I/O(基本概念)

1.I/O模型

  1. 阻塞I/O模型:在进程空间调用recvfrom,其系统调用知到数据包到达且被复制到应用进程的缓冲区中或者发生错误时才返回,在此期间一直会等待,进程在从调用recvfrom开始到它返回的整段时间内都是被阻塞的,因此被称为阻塞I/O模型;
  • 自己的理解:进程只要使用阻塞I/O方法,就会一直等待该方法作出响应(返回数据或者报错);
  1. 非阻塞I/O模型,recvfrom从应用层到内核的时候,如果该缓冲区没有数据的话,就直接返回一个EWOULDBLOCK错误,一般都对非阻塞I/O模型进行轮询检查这个状态,看内核是否有数据到来;
  • 自己的理解:进程调用 非阻塞I/O方法,会先读取缓冲区的数据,如果缓冲区无数据,直接返回错误,有数据才从内核复制到用户空间。
  1. I/O复用模型,Linux提供select/poll,进程通过将一个或多个fd(file descriptor 文件描述符,对一个文件的读写操作调用内核提供的系统命令返回的)传递给select/poll系统调用,阻塞在select操作上,这样select/poll可以侦测多个fd是否处于就绪状态,Linux还有epoll系统调用,使用基于事件驱动方式代替顺序扫描,当fd就绪会返回可读条件,然后在使用recvfrom从内核复制数据到用户空间;
  • 自己的理解:进程使用 I/O复用模型,会通过select/poll epoll方法去判断是否可复制数据,满足条件,再从内核复制数据;
  1. 信号驱动I/O模型:首先开启套接口信号驱动I/O功能,并通过系统调用sigaction执行一个信号处理函数(此系统调用立即返回,进程继续工作,非阻塞),当数据准备就绪时,就为该进程生成一个SIGIO信号,通过信号回调通知应用程序调用recvfrom来读取数据
  • 自己的理解:进程使用信号驱动I/O模型,就是别人提供一个sigaction方法,你只要调用I/O方法,就会立即返回是否可复制数据的SIGIO信号,可以复制之后再通知应用程序调用recvfrom方法复制数据;
  1. 异步I/O:告知内核启动某个操作,并让内核在整个操作完成之后(包括将数据从内核复制到用户自己的缓冲区)通知我们,这种模型与信号驱动模型的主要区别是,信号驱动I/O由内核通知我们何时可以开始一个I/O操作,异步I/O模型由内核通知我们I/O操作何时已经完成。
  • 自己的理解:进程使用异步I/O模型,就是内核完成整个复制操作后,通知我们已经完成了

2.epoll的优点

2.1 支持一个进程打开的socket描述符FD不受限制,仅仅受限于操作系统的最大文件句柄数

因为select/poll单个进程打开的FD是由一定限制的,默认值1024,而epoll没有这方面的限制。

2.2 I/O效率不会随着FD数目的增加而线性下降

其实select/poll是遍历所有的socket集合,如果这个集合中有部分socket是活跃的,那么效率就很低,而epoll是通过socket自身的callback机制来确定哪些socket是活跃的

2.3 使用mmap加速内核与用户空间的消息传递

epoll是通过内核与用户空间mmap同一块内存来实现的

2.4 epoll的API更加简单

你可能感兴趣的:(Netty,java)