前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >netty权威指南读书笔记——走进java nio

netty权威指南读书笔记——走进java nio

作者头像
全栈程序员站长
发布2022-11-11 14:46:42
3090
发布2022-11-11 14:46:42
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

一、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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月2日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档