大家好,又见面了,我是你们的朋友全栈君。
一、linux网络IO模型:linux将所有外部设备都当作文件处理,对一个文件的读写操作通过调用内核命令执行,返回一个file descriptor(fd 文件描述符),而对于一个socket也有对应的socketFD,描述符是一个数字,指向内核中的一个结构体(文件路径,数据区属性等)。
1、unix提供了5种I/O模型:
a、阻塞I/O模型(默认模型):应用进程调用recvfrom后,系统调用直到数据包到达并被复制到应用缓存中或发生错误才返回,期间应用进程一直被阻塞。
b、非阻塞I/O模型:调用recvfrom后,若系统缓冲区没有数据,则直接返回一个ewouldblock错误,之后轮询检查该状态,若数据到达则复制到应用缓存中后返回。
c、I/O复用模型:linux提供select/poll,应用程序将一个或多个fd传递给select/poll系统调用,然后阻塞在select上,这样可以同时侦测多个fd是否处于就绪状态,select/poll顺序扫描fd是否就绪,且支持到fd数量有限。此外Linux提供了epoll基于事件模式的驱动,当有fd就绪时,就立即调用回掉函数rollback。数据拷贝到应用缓存区期间,应用进程被阻塞。
d、信号驱动I/O模型:首先开启信号驱动I/O功能,并通过系统调用sigaction执行一个信号处理函数(立即返回,非阻塞),数据准备就绪后,为该进程生成一个sigio信号,并通知应用程序调用recvfrom读取数据(拷贝数据到应用缓存期间阻塞),拷贝完成返回。
e、异步I/O:告知内核启动某个操作,并在操作完成后通知我们(包括将数据从内核复制到应用缓冲区)。与信号驱动模式到区别是:信号I/O由内核告诉我们何时开始一个I/O操作;异步I/O由内核告诉我们何时完成了I/O操作。
2、多路复用:在i/o编程中,当需要处理多个客户请求,可利用多线程或i/o多路复用技术进行处理。i/o多路复用通过将多个i/o阻塞f复用到同一个select阻塞上,从而使得系统可以使用单线程处理多个客户端请求。i/o多路复用主要应用场景包括:
a、服务器需要同时处理多个处于监听状态或链接状态到socket;
b、服务器需要同时处理多种网络协议到socket;
目前支持i/o多路复用的系统调用包括:select、pselect、poll、epoll。
相比select、epoll有诸多优点,包括:
a、一个进程打开的socketFD不受限制(仅受限于操作系统的最大文件句柄数,跟系统内存关系较大),select模式通过多进程select或者改动FD_SETSIZE编译到内核的方式增大fd数量;
b、I/O效率不受fd数目的增加而线性下降,select采用轮询fd,epoll通过活跃的fd进行事件回掉;
c、使用mmap加速内核和用户空间的消息传递,无论使用select还是epoll都要将内核数据复制到应用缓冲区,epoll通过内核和用户空间mmap同一块内存实现;
d、epoll的api更加简单;
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/186818.html原文链接:https://javaforall.cn