技术标签: JAVA IO JAVA IO多路复用
1、在Java中,常见的IO模型有4种,
2、同步与阻塞概念
1)同步和异步的概念描述的是用户线程与内核的交互方式
2)阻塞和非阻塞的概念描述的是用户线程调用内核IO操作的方式
“真正”的异步IO需要操作系统更强的支持。在IO多路复用模型中,事件循环将文件句柄的状态事件通知给用户线程,由用户线程自行读取数据、处理数据。而在异步IO模型中,当用户线程收到通知时,数据已经被内核读取完毕,并放在了用户线程指定的缓冲区内,内核在IO完成后通知用户线程直接使用即可。(图片来自https://blog.csdn.net/sehanlingfeng/article/details/78920423)
相比于IO多路复用模型,异步IO并不十分常用,不少高性能并发服务程序使用IO多路复用模型+多线程任务处理的架构基本可以满足需求。Java的NIO是基于I/O复用来实现的。
3、IO多路复用的底层原理
IO多路复用使用两个系统调用(select/poll/epoll和recvfrom),blocking IO只调用了recvfrom;select/poll/epoll 核心是可以同时处理多个connection,而不是更快,所以连接数不高的话,性能不一定比多线程+阻塞IO好,多路复用模型中,每一个socket,设置为non-blocking,阻塞是被select这个函数block,而不是被socket阻塞的。
1)select机制
客户端操作服务器时就会产生这三种文件描述符(简称fd):writefds(写)、readfds(读)、和exceptfds(异常)。select会阻塞住监视3类文件描述符,等有数据、可读、可写、出异常 或超时、就会返回;返回后通过遍历fdset整个数组来找到就绪的描述符fd,然后进行对应的IO操作。
优点:
几乎在所有的平台上支持,跨平台支持性好
缺点:
由于是采用轮询方式全盘扫描,会随着文件描述符FD数量增多而性能下降。
每次调用 select(),需要把 fd 集合从用户态拷贝到内核态,并进行遍历(消息传递都是从内核到用户空间)
默认单个进程打开的FD有限制是1024个,可修改宏定义,但是效率仍然慢。
2)poll机制
基本原理与select一致,只是没有最大文件描述符限制,因为采用的是链表存储fd。
3)epoll机制
epoll之所以高性能是得益于它的三个函数
1)epoll_create()系统启动时,在Linux内核里面申请一个B+树结构文件系统,返回epoll对象,也是一个fd
2)epoll_ctl() 每新建一个连接,都通过该函数操作epoll对象,在这个对象里面修改添加删除对应的链接fd, 绑定一个callback函数。
3)epoll_wait() 轮训所有的callback集合,并完成对应的IO操作
优点:
没fd这个限制,所支持的FD上限是操作系统的最大文件句柄数,1G内存大概支持10万个句柄
效率提高,使用回调通知而不是轮询的方式,不会随着FD数目的增加效率下降
内核和用户空间mmap同一块内存实现
文章浏览阅读1.2k次。当父组件axjos获取数据,子组件使用props接收数据时,执行mounted的时候axjos还没有返回数据,而且mounted只执行一次,这时 props中接收的数据为空解决方案:在对应组件中判断数据的长度..._vue axios异步请求没有返回就调用了mounted
文章浏览阅读6.2w次,点赞203次,收藏705次。仓库管理系统进行了字典管理、公告管理、用户管理、物资管理、物资申请管理、仓库员管理、统计报表等服务。设备采用关联数据库里的MySQL做为全面的数据库,合理存放数据,合理备份数据,确保数据稳定性。除此之外,程序流程还具备程序流程所需要的所有功能,大大提升了实际操作安全度,使库房管理系统软件从概念迈向实际,真真正正提升了信息资源管理效率。_仓库管理后端接口案例
文章浏览阅读8.2k次,点赞2次,收藏3次。电脑端M3U8文件转mp4概述:在视频这块,m3u8是一种索引文件,其文件内容索引至多个无格式或ts格式的文件。m3u8在ios自带浏览器可直接打开,安卓上的uc浏览器\QQ浏览器等也能运行行。ts格式的windows可以打开,无格式的windos不能直接打开,windows端有几种方案可合成并打开这些文件。我实现的是windows下,借助bat脚本语言和格式工厂的方法,实现m3u8文件所索引..._m3u8直接打开
文章浏览阅读6k次,点赞9次,收藏62次。Linux1、Linux介绍Linux是类Unix计算机操作系统的统称。Linux操作系统的内核的名字也是“Linux”。Linux这个词本身只表示Linux内核,但在实际上人们已经习惯了用Linux来形容整个基于Linux内核的系统。Linux是由芬兰大学Linus Torvalds于1991年编写的。2、Linux发行版组成Linux内核应用软件一些GNU程_linux 服务器
文章浏览阅读223次。Java Runtime 类是 Java 标准库中的关键类之一,它提供了对当前Java虚拟机实例的访问和控制,允许程序动态地修改和管理运行时环境。每个Java应用程序都有一个Runtime类实例,使得程序能够与其运行的环境相连接。Runtime类所在包为java.lang包,因此在使用的时候不需要进行导包。并且Runtime类被public修饰了,因此该类是可以被继承的。
文章浏览阅读2.1k次,点赞3次,收藏4次。总得来说,同步异步出现在以下几个领域:1 计算机网络。数据通信技术中有同步通信与异步通信。同步通信简单的说就是你在发送数据时候我必须同时接受。这个过程有精确的时钟控制。而异步通信是你在发数据时候必须加上开始与结束符号,这样我才可以接受,异步通信没有时钟控制。因为没有了时钟的控制(额外硬件),所以成本低,设备简单,但是传输效率较低。(开始与结束符占了开销)。在网络协议(network protoc..._计算机里的同步和异步
文章浏览阅读417次,点赞4次,收藏6次。用户的需求具体体现在各种学习文件的提供、保存、更新和查询方面,这就要求数据库结构能充分满足各种信息的输入和输出。得到上面数据项和数据结构以后,就可以设计出能够满足用户需求的各种实体,以及它们之间的关系,为后面的逻辑结构设计打下基础。根据系统的需求,该系统应该具有六个功能模块:会员注册模块,新闻发布模块,留言本模块,拾到信息公布享模块。设计规划出的实体有:管理员信息实体、注册用户信息实体、信息实体、拾到信息实体、站内新闻实体。2)注册用户信息,包括数据项:ID(系统自动编号),姓名,性别、班级等。
文章浏览阅读499次,点赞9次,收藏13次。想象一下,如果你可以仅通过敲击键盘,就能让你的思维火花转化为眼前跳动的影像,那会是怎样的体验?这不是科幻小说的情节,而是OpenAI最新推出的神奇工具——Sora。
文章浏览阅读655次。Ubuntu 20.04 LTS安装树莓派系统_树莓派 ubuntu 20.04安装
文章浏览阅读742次,点赞2次,收藏2次。显错注入显错注入是SQL注入的一种,而SQL注入是指web应用程序对用户输入数据的合法性没有判断,导致攻击者可以构造不同的sql语句来实现对数据库的操作。SQL注入漏洞产生的条件: 1、用户能够控制数据的输入。 2、原本执行需要执行的代码时,拼接了用户的输入。打开webug靶场,打开id为1的靶场后,如图:这里我们使用工具的是Hackbar2.1.3版本,这个是免费的。首先,我们需要判断是否存在SQL注入。在参数后面多加一个单引号,然后将它上传,发现报错了通过页面的返回结果,_webug靶场
文章浏览阅读3.5w次,点赞23次,收藏139次。环境介绍Active Directory域控制器已经搭建好主域控和辅域控,主域控故障,手动升级辅域控为主。主域控:2012DC1,ip:192.168.15.1辅域控:2012DC2,ip:192.168.15.21、升级前分别在2012dc1和2012dc2上查询fsmo的归属2、在2012dc1上,打开AD用户和计算机,更改连接的域控制器3、选择20..._升级域控
文章浏览阅读1k次,点赞3次,收藏4次。很多人搞不懂springboot和spring-cloud的关系到底是什么,也不知道这两者时间有什么区别,今天简单的聊聊。2022年发了一篇Springcloud和Springboot的区别对比,但后面回看总觉得少了点东西,这次重新发个补充一下。_spring cloud 源码