发布于2021-05-29 20:43 阅读(1292) 评论(0) 点赞(0) 收藏(3)
在前一篇文章中,我们讲了内核态和用户态,我们知道计算机中的涉及硬件操作如网络通信的是调用内核的系统调用来实现的。
我们运行一段服务端socket监听程序(典型的阻塞IO场景):
我们知道server.accept是阻塞的,如果没有连接连上来就会一直等待不会往下执行。
同时我们是道reader.readLIne也是阻塞的,不写入东西也不会往下执行。所以我们new了个线程,可以达到同时监听多个连接的目的。
其实网络通信过程中的系统调用:前面两个函数的阻塞的根因是因为内核的accept和recv的系统调用是阻塞调用,所以会有BIO。
这段程序中涉及到的系统调用如下:
java的bio对应的包是:java.io.*
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
java的nio对应的:java.nio.*(jdk1.4之后才有)
- import java.nio.ByteBuffer;
- import java.nio.channels.SocketChannel;
下面是一段典型的java nio服务端的代码:其中
ss.configureBlocking(false)//很重要,表示设置为非阻塞io
ss.accept在非阻塞模式下不会阻塞,
null(实际上系统调用的返回时-1,java返回时null)
;如果有连接,则返回SocketChannel。我们就达到一个线程监听多个请求的作用。前面的BIO需要多个线程才能同时监听到多个请求。
SocketChannel简述:https://blog.csdn.net/weixin_33951761/article/details/94492402
注意for循环需要遍历所有连接,向内核发送recv系统调用,系统调用会产生软中断造成用户态内核态上下文切换,有很多无效系统调用。那怎么很容易想到减少系统调用的次数。
所以我们有了多路复用器,进程发生系统调用前,先去查下有多少个可以读:
目前支持I/O多路复用的系统调用有 select,pselect,poll,epoll
,I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作
。epoll跟select都能提供多路I/O复用的解决方案。在现在的Linux内核里有都能够支持,其中epoll是Linux所特有,而select则应该是POSIX所规定
,一般操作系统均有实现。关于io多路复用可参考此文:https://www.cnblogs.com/jeakeven/p/5435916.html
高版本的jdk主要是用的是epoll系统调用:epoll是在2.6内核中提出的,是之前的select和poll的增强版本。相对于select和poll来说,epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次
。
基本原理:epoll支持水平触发和边缘触发,最大的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就绪态,并且只会通知一次
。还有一个特点是,epoll使用“事件”的就绪通知方式
,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd
,epoll_wait便可以收到通知。Epoll对于多核来说很友好,相对于前面两个系统调用,多了create和ctl,意味这不用每次都传很多的文件描述符,但是在内核里面增加了两块空间。空间换时间的做法。
java实际上用的是操作系统的系统调用来实现的自己的多路复用,也就是操作系统的多路复用是java的多路复用的基础。
此文来自于网课记录一下
作者:听说你很拽
链接:http://www.javaheidong.com/blog/article/207413/6b51569ace98b4cab8e5/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!