程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-06(2)

BIO/NIO/多路复用

发布于2021-05-29 20:43     阅读(1136)     评论(0)     点赞(0)     收藏(3)


在前一篇文章中,我们讲了内核态和用户态,我们知道计算机中的涉及硬件操作如网络通信的是调用内核的系统调用来实现的。

我们运行一段服务端socket监听程序(典型的阻塞IO场景):

我们知道server.accept是阻塞的,如果没有连接连上来就会一直等待不会往下执行。

同时我们是道reader.readLIne也是阻塞的,不写入东西也不会往下执行。所以我们new了个线程,可以达到同时监听多个连接的目的。

其实网络通信过程中的系统调用:前面两个函数的阻塞的根因是因为内核的accept和recv的系统调用是阻塞调用,所以会有BIO。

这段程序中涉及到的系统调用如下:

java的bio对应的包是:java.io.*

  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. import java.io.OutputStream;

 

java的nio对应的:java.nio.*(jdk1.4之后才有)

  1. import java.nio.ByteBuffer;
  2. import java.nio.channels.SocketChannel;

下面是一段典型的java nio服务端的代码:其中

ss.configureBlocking(false)//很重要,表示设置为非阻塞io

ss.accept在非阻塞模式下不会阻塞,

  • 非阻塞模式:在调用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黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

0 0
收藏该文
已收藏

评论内容:(最多支持255个字符)