暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Linux五种IO与Redis网络通信模型简介

波波的小书房 2021-08-10
1139

Linux五种IO模型


Java的三种IO模型

  • 阻塞IO,BIO

  • 非阻塞IO,NIO

  • 异步IO,AIO


Java关于IO的API,底层依赖了操作系统层面的IO模型。
将磁盘文件读取到内存的过程:磁盘->内核态->用户态。

linux五种IO模型
  • 阻塞IO模型:调用recvfrom函数进行数据拷贝;

  • 非阻塞IO模型:不用阻塞,但要时不时主动调用一下recvfrom

  • 信号驱动IO模型:不用时不时主动调用,而是有信号主动通知你,当接收到信号之后,再调用recvfrom。信号驱动是异步的,但数据拷贝仍是同步的;

  • IO多路复用模型:多个IO注册到同一个select上,select会监听所有注册好的IO。调用select函数会阻塞,直到至少有一个IO准备好了就返回,返回后再调用recvfrom函数进行数据拷贝由于调用select会有阻塞,因此这种方式是阻塞的;

  • 异步IO:只有异步IO是异步的,其它四种都是同步的,异步指的是数据拷贝的过程是异步的;用户进程调用aio_read后,剩下的准备数据、数据拷贝工作都交给内核去做,等数据拷贝完成后,再通知用户进程;


参考文章:漫话:如何给女朋友解释什么是Linux的五种IO模型?


IO多路复用函数库select、poll、epoll的区别?

select、poll、epoll都属于IO多路复用。

I/O多路复用通过一种机制,可以监视多个文件描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。

select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的。而异步I/O则无需自己负责进行读写。  


epoll跟select都能提供多路I/O复用的解决方案。在现在的Linux内核里有都能够支持,其中epoll是Linux所特有,而select则是POSIX所规定,一般操作系统均有实现。


select:通过轮寻找哪个IO准备好了时间复杂度是O(n);
poll:本质和select没有区别,但它没有最大连接数的限制,因为它是基于链表来存储IO注册信息的,时间复杂度是O(n);
epoll:事件驱动机制。epoll会将哪个流发生了哪种IO事件告诉我们(每个事件会关联上文件描述符),因此事件复杂度是O(1);

在选择select,poll,epoll时要根据具体的使用场景及它们自身特点:

  • 表面上看epoll的性能最好,但是在连接数少并且连接都十分活跃的情况下,select和poll轮询机制的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调;


redis网络通信模型

redis基于reactor模型开发了自己的网络事件处理器(即文件事件处理器)。
文件事件处理器使用IO多路复用机制,同时监听多个套接字,但由于redis单线程的特性,redis的IO多路复用程序会将所有产生事件的套接字放到一个队列里面,通过这个队列有序、同步的方式向文件事件分派器传送套接字。


redis的IO多路复用程序封装了select、epoll等IO多路复用函数库,并自动选择系统中性能最高的函数库。


文章转载自波波的小书房,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论