ToB企服应用市场:ToB评测及商务社交产业平台

标题: 面试官:BIO、NIO、AIO是什么,他们有什么区别? [打印本页]

作者: 守听    时间: 2022-6-24 02:56
标题: 面试官:BIO、NIO、AIO是什么,他们有什么区别?
哈喽!大家好,我是小奇,一位热爱分享的程序员
小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧
文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】更有我为大家准备的福利哟!回复【项目】有我为大家准备的一些项目源码。
  
文章目录



一、前言

   书接上回,感觉上次的公司氛围不太好(其实就是女的少),还是不去了,等有了大公司要我我就再去。
    今天下起了大雨,农村的空气格外的清新,呼吸起来让我非常的放松,悠然自得呀。这么好的天气不去买点熟食再买上瓶牛栏山在家喝一顿就可惜了,说干就干,披上雨披去镇上买二两牛肉。
    走到了村口看到了邻居家的大美和小美,不知道她俩去哪里吃饭了,吃了一身巧克力。
    我:“你俩这是去哪里吃饭了?吃的这一身巧克力。”
    大美:“吃啥饭呀,厂子里下了班就回来了,回家做饭吃。”
    我:“没吃饭这一身巧克力咋来的。”
    小美:“刚才拐弯太猛甩出去了。”
  
   我:“你俩也是人才。。。路这么不好走我也不去镇上买熟食了,还是回家吧,免得熟食吃不成再吃一身巧克力。”
  
   回到家里躺沙发上打开电视,这下雨天看看电视也挺美滋滋呀。突然电话响了。
    我:“喂您好”。
    对面:“您好,请问是小奇吗”。
    我:“是我,你是?”。
    对面:“我是XXX公司的,我看到hr推给我你的简历,我感觉还不错,你什么时候方便来现场面试一下”。
    我:“现在不方便现场面试了”。
    对面:“好吧,那你现在方便吗?我们现在线上面试一下吧”。
    我:“好的”。
  二、面试

   面试官:“你能说一下网络IO模型吗?”
    我:“网络IO模型有BIO、NIO、AIO ”。
    面试官:“他们分别代表什么,有什么区别吗?”
    BIO:同步阻塞IO。
NIO:同步非阻塞IO。
AIO:异步非阻塞IO。
    面试官:“BIO为什么是同步阻塞IO,他阻塞的是谁跟谁之间的关联?”。
    首先在网络编程中,客户端给服务端发送消息大约分为两个个步骤。
1、发起连接。
2、发送数据。
    在BIO中每一个连接都需要分配一个线程来执行,假如A客户端连接了服务器,但是还没有发送消息,这个时候B客户端向服务器发送连接请求,这个时候服务器是没有办法处理B客户端的连接请求的。
  
   因为一个线程处理了一个客户端的连接后就阻塞住,并等待处理该客户端发送过来的数据。处理完该客户端的数据后才能处理其他客户端的连接请求。
  
   面试官:“那你这个是只有一个线程的时候,那我弄多个线程不就好了,来一个请求连接我弄一个线程”。
    我:“那假如有一万个连接请求同时过来,那你开启一万个线程服务端不就崩了嘛。”
    面试官:“那我弄一个线程池呢,我最大线程数最多弄500呢?”。
    我:“那假如有500线程只请求连接,并不发送数据呢,那你这个线程池不也一样废了吗。这500个请求连接上了还没有发送数据,那么线程池的500个线程就没办法去处理别的请求,这样照样废废了。”
    面试官:“那咋办呢?”。
    我:“别慌,哥有办法,可以使用NIO同步非阻塞,这样就不需要很多线程,一个线程也能处理很多的请求连接和请求数据。”
    面试官:“NIO他是怎么实现一个线程处理多个连接请求和多个请求数据的呢?”。
    我:“NIO会将获取的请求连接放入到一个数组中,然后再遍历这个数据查看这些连接有没有数据发送过来。”
  
   面试官:“这招高啊”。
    我:“那必须滴。”
    面试官:“但是有个问题啊,如果B和C只连接了,但是一直没有发送数据,那每次还循环判断他俩有没有发送数据的请求是不是有点多余了,能不能在我知道B和C肯定发送了数据的情况下再去遍历他呢?”。
    我:“那你让客户B和客户C发送数据的时候给你打一个电话不就行了,然后你就只遍历他俩。”
    面试官:“他们也不能够给我打呀,你再想一个别的办法”。
    我:“可以引入Epoll,在JDK1.5开始引入了epoll通过事件响应来优化NIO,原理是客户端的每一次连接和每一次发送数据都看作是一个事件,每次发生事件会注册到服务端的一个集合中去,然后客户端只需要遍历这个集合就可以了。”
    面试官:“那AIO有什么特点呢?”
    我:“AIO是异步非阻塞,他对于客户端的连接请求和发送数据请求是用不同的线程来处理的,他是通过回调来通知服务端程序去启动线程处理,适用于长连接的场景。”
    面试官:“小伙子不错呀,什么时候能回北京入职呢”
    我:“额。。。等等吧,现在家里雨太大了,容易弄一身巧克力。”
    面试官:“行,那你来了北京一定来我们公司上班啊”
    我:“额。。。这个跟你承诺不了,万一还有别的好公司给我打电话呢”。
    面试官:“来吧,条件好商量”
    我:“我考虑考虑吧”。
  三、总结

   这里关于网络编程模型还没有整理完毕,文章后面持续更新,建议收藏。
    文章中涉及到的命令大家一定要像我一样每个都敲几遍,只有在敲的过程中才能发现自己对命令是否真正的掌握了。
    如果觉得我的文章还不错的话就点个赞吧,另外可以微信搜索【小奇JAVA面试】阅读更多的好文章,获取我为大家准备的资料。回复【项目】更有开源项目持续更新分享给大家。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4