哈喽!大家好,我是小奇,一位热爱分享的程序员
小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧
文章持续更新
书接上回,感觉上次的公司氛围不太好(其实就是女的少),还是不去了,等有了大公司要我我就再去。
今天下起了大雨,农村的空气格外的清新,呼吸起来让我非常的放松,悠然自得呀。这么好的天气不去买点熟食再买上瓶牛栏山在家喝一顿就可惜了,说干就干,披上雨披去镇上买二两牛肉。
走到了村口看到了邻居家的大美和小美,不知道她俩去哪里吃饭了,吃了一身巧克力。
我:“你俩这是去哪里吃饭了?吃的这一身巧克力。”
大美:“吃啥饭呀,厂子里下了班就回来了,回家做饭吃。”
我:“没吃饭这一身巧克力咋来的。”
小美:“刚才拐弯太猛甩出去了。”
我:“你俩也是人才。。。路这么不好走我也不去镇上买熟食了,还是回家吧,免得熟食吃不成再吃一身巧克力。”
回到家里躺沙发上打开电视,这下雨天看看电视也挺美滋滋呀。突然电话响了。
我:“喂您好”。
对面:“您好,请问是小奇吗”。
我:“是我,你是?”。
对面:“我是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是异步非阻塞,他对于客户端的连接请求和发送数据请求是用不同的线程来处理的,他是通过回调来通知服务端程序去启动线程处理,适用于长连接的场景。”
面试官:“小伙子不错呀,什么时候能回北京入职呢”
我:“额。。。等等吧,现在家里雨太大了,容易弄一身巧克力。”
面试官:“行,那你来了北京一定来我们公司上班啊”
我:“额。。。这个跟你承诺不了,万一还有别的好公司给我打电话呢”。
面试官:“来吧,条件好商量”
我:“我考虑考虑吧”。
这里关于网络编程模型还没有整理完毕,文章后面持续更新,建议收藏。
文章中涉及到的命令大家一定要像我一样每个都敲几遍,只有在敲的过程中才能发现自己对命令是否真正的掌握了。
如果觉得我的文章还不错的话就点个赞吧