哈喽!大家好,我是小奇,一位热爱分享的程序员

小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧

文章持续更新

一、前言

书接上回,感觉上次的公司氛围不太好(其实就是女的少),还是不去了,等有了大公司要我我就再去。

今天下起了大雨,农村的空气格外的清新,呼吸起来让我非常的放松,悠然自得呀。这么好的天气不去买点熟食再买上瓶牛栏山在家喝一顿就可惜了,说干就干,披上雨披去镇上买二两牛肉。

走到了村口看到了邻居家的大美和小美,不知道她俩去哪里吃饭了,吃了一身巧克力。

我:“你俩这是去哪里吃饭了?吃的这一身巧克力。”

大美:“吃啥饭呀,厂子里下了班就回来了,回家做饭吃。”

我:“没吃饭这一身巧克力咋来的。”

小美:“刚才拐弯太猛甩出去了。”

我:“你俩也是人才。。。路这么不好走我也不去镇上买熟食了,还是回家吧,免得熟食吃不成再吃一身巧克力。”

回到家里躺沙发上打开电视,这下雨天看看电视也挺美滋滋呀。突然电话响了。

我:“喂您好”。

对面:“您好,请问是小奇吗”。

我:“是我,你是?”。

对面:“我是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是异步非阻塞,他对于客户端的连接请求和发送数据请求是用不同的线程来处理的,他是通过回调来通知服务端程序去启动线程处理,适用于长连接的场景。”

面试官:“小伙子不错呀,什么时候能回北京入职呢”

我:“额。。。等等吧,现在家里雨太大了,容易弄一身巧克力。”

面试官:“行,那你来了北京一定来我们公司上班啊”

我:“额。。。这个跟你承诺不了,万一还有别的好公司给我打电话呢”。

面试官:“来吧,条件好商量”

我:“我考虑考虑吧”。

三、总结

这里关于网络编程模型还没有整理完毕,文章后面持续更新,建议收藏。

文章中涉及到的命令大家一定要像我一样每个都敲几遍,只有在敲的过程中才能发现自己对命令是否真正的掌握了。

如果觉得我的文章还不错的话就点个赞吧

面试官:BIO、NIO、AIO是什么,他们有什么区别?的更多相关文章

  1. BIO,NIO,AIO总结

    熟练掌握 BIO,NIO,AIO 的基本概念以及一些常见问题是你准备面试的过程中不可或缺的一部分,另外这些知识点也是你学习 Netty 的基础. BIO,NIO,AIO 总结 1. BIO (Bloc ...

  2. BIO,NIO,AIO 总结

    BIO,NIO,AIO 总结 Java 中的 BIO.NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装.程序员在使用这些 API 的时候,不需要关心操作系统层面的知识,也不 ...

  3. IO回忆录之怎样过目不忘(BIO/NIO/AIO/Netty)

    有热心的网友加我微信,时不时问我一些技术的或者学习技术的问题.有时候我回微信的时候都是半夜了.但是我很乐意解答他们的问题.因为这些年轻人都是很有上进心的,所以在我心里他们就是很优秀的,我愿意多和努力的 ...

  4. Netty5序章之BIO NIO AIO演变

    Netty5序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使 ...

  5. Netty序章之BIO NIO AIO演变

    Netty序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使用 ...

  6. Java提供了哪些IO方式?IO, BIO, NIO, AIO是什么?

    IO一直是软件开发中的核心部分之一,而随着互联网技术的提高,IO的重要性也越来越重.纵观开发界,能够巧妙运用IO,不但对于公司,而且对于开发人员都非常的重要.Java的IO机制也是一直在不断的完善,以 ...

  7. (转)也谈BIO | NIO | AIO (Java版)

    原文地址: https://my.oschina.net/bluesky0leon/blog/132361 关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一 ...

  8. 拿搬东西来解释udp tcpip bio nio aio aio异步

     [群主]雷欧纳德简单理解 tcpip是有通信确认的面对面通信   有打招呼的过程  有建立通道的过程 有保持通道的确认    有具体传输udp是看到对面的人好像在对面等你 就往对面扔东西[群主]雷欧 ...

  9. 也谈BIO | NIO | AIO (Java版--转)

    关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个 ...

  10. I/O模型系列之三:IO通信模型BIO NIO AIO

    一.传统的BIO 网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请 ...

随机推荐

  1. c/c++中的i++和++i的区别

    使用 i++ vs. ++i i++是先赋值再加1 ++i是先加1再赋值 到目前为止,你已经学习了如何编写下面这样的 C++ for 循环: for (int i = 0; i < 10; i+ ...

  2. 《每周一点canvas动画》——圆周运动

    接<每周一点canvas动画>--波形运动 圆周运动可以分为两种基本的形式:正圆运动和椭圆运动.在讲解圆周运动之前,必不可少的数学公式即将袭来.so,各位骚年们,请护好自己的膝盖.听不懂没 ...

  3. ps让图片背景透明

    效果图:  jpg=>png,背景透明 步骤: 1.选择橡皮工具的第三个  魔术橡皮 保存为png,    按住Ctrl+alt+shift+s    保存:

  4. python并发——生产者消费者信号量实现

    介绍 写扫描器的时候,需要让资产扫描结果一出来(生产者),另外一边就会开个线程去运行漏洞扫描(消费者). 但是又不能让结果没出来,另外一边消费者就开始干活了. 代码 # *coding:UTF-8 * ...

  5. C#多线程下的调优

    一.原子操作 先看一段问题代码 /// <summary> /// 获取自增 /// </summary> public static void GetIncrement() ...

  6. ssm整合-ssmbuild

    目录 项目结构 导入相关的pom依赖 Maven资源过滤设置 建立基本结构和配置框架 Mybatis层编写 Spring层 Spring整合service层 SpringMVC层 Controller ...

  7. linux下elf二进制文件怎么回事(ls,vmstat等命令)

    这个实验有两个目的: 1.linux的可执行命令例如:ls .cd等都是二进制elf格式文件等,后面的逻辑是什么,我们怎么窥探底层内容. 2.ELF可执行文件默认从地址0x080480000开始分配 ...

  8. HTTP请求头格式和响应格式

    HTTP请求头格式 提示: 回车符 \r 换行符 \n 请求首行分析: 请求方式: GET 和 POST 方式: GET请求:地址栏访问.超链接访问都是get请求方式,get请求方式不安全,地址栏大小 ...

  9. Java第十周作业

    1.编写一个方法,实现冒泡排序(由小到大),并调用该方法 package gc; public class gc { /** * @param args */ public static void m ...

  10. 测试平台系列(92) 让http请求支持文件上传

    大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程,希望大家多多支持. 欢迎关注我的公众号米洛的测开日记,获取最新文章教程! 回顾 上一节呢,我们编写了oss的 ...