首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
牛客508046383号
广州大学 C工程师
发布于广东
关注
已关注
取消关注
@已删除:
IO:阻塞和非阻塞、同步和异步
阻塞和非阻塞阻塞的时候线程会被挂起阻塞:当数据还没准备好时,调用了阻塞的方法,则线程会被挂起,会让出CPU时间片,此时是无法处理过来的请求,需要等待其他线程来进行唤醒,该线程才能进行后续操作或者处理其他请求。非阻塞:意味着,当数据还没准备好的时候,即便我调用了阻塞方法,该线程也不会被挂起,后续的请求也能够被处理。同步同步和异步跟串行和并行非常形似。假设在一个场景下:完成一个大任务需要4个小任务。同步的做法:需要依次4个步骤,注意这里是依次,也就是说完成这个步骤,需要先完成前置步骤,也就是说下一个步骤是要看上一个步骤的执行结果。异步的做法:可以同时进行4个步骤,无需等待其他步骤的执行结果。阻塞和同步的最本质差别在于:即便是同步,在等待的过程中,线程是不会被挂起,也不需要让出CPU时间片的,在IO中的体现网络编程的基本模型是:Client/Server模型两个进程之间要相互通信,其中服务端需要提供位置信息,让客户端找到自己。服务端提供IP地址和监听的端口。客户端拿着这些信息去向服务端发起建立连接请求,通过三次握手成功建立连接后,客户端就可以通过socket向服务器发送和接受消息。BIOBIO通信模型采用的是典型的:一请求一应答通信模型采用BIO通信模型的服务端,通常会由一个独立的Acceptor线程负责监听客户端的连接。他不负责处理请求,他只是起到一个委派工作的作用,当他接收到请求之后,会为每个客户端创建一个新的线程进行链路处理。处理完之后,通过输出流,返回应答给客户端,然后线程被销毁,资源被回收。该模型的最大问题就是缺乏弹性伸缩能力,服务端的线程个数和客户端的并发访问数是**1:1**的关系。由于线程是Java虚拟机非常宝贵的资源,当线程书膨胀之后,系统的性能会随着并发量增加呈正比的趋势下降。而且会有OOM的风险,当没有内存空间创建线程时,就无法处理客户端请求,最终导致进程宕机或卡死,无法对外提供服务。最大的问题就是:每当有一个客户端请求接入时,就会创建一个线程来处理请求。为了改进这个一线程一连接模型,后面又演进出通过:线程池消息队列来实现1个或者多个线程处理N个客户端的模型。在这里,无论是线程池和消息队列,都是解决内存空间,线程的问题,并没有实质性地改变同步阻塞通信本质问题所以这种优化版本的BIO也被称为是伪异步。伪异步IO采用线程池和任务队列可以实现一种:伪异步的IO通信将客户端的请求封装成一个Task(该任务实现java.lang.Runnable接口),投递到消息队列中。如果通过线程池维护一堆处理线程,去消费队列中的消息。处理完毕之后,再去通过客户端就可以了,他的资源是可控的,无论客户端的请求量是多少,也不会发生变化,同样这也是他的缺点之一。建立连接的accpet方法、读取数据的read方法都是阻塞。这就意味着,如果有一方处理请求或者发出请求的比较慢,或者是网络传输比较慢,那么都会影响对方。当调用OutputStream的write方法写输出流的时候,它将会被阻塞,直到所有要发送的字节全部写入完毕,或者发生异常。在TCP/IP中,当消息的接收方处理缓慢的时候,由于消息滑动窗口的存在,那么它的接收窗口就会变小,就是那个TCP window size。如果这里采用同步阻塞IO,并且write操作被阻塞很久,直到TCP window size 大于0或者发生IO异常了。那么通信对方返回应答时间过长会引起的级联故障:线程问题:假如所有的可用线程都被故障服务器阻塞,那么后续所有的IO消息都将被队列中排队。队列问题:如果队列采用的是有界队列,队列满了之后那么就会无法后续处理请求;如果采用的是无界队列,那么会有OOM风险。NIONIO,官方叫法是new IO,因为它相对于之前出的java.io包是新增的但是之前老的IO库都是阻塞的,New IO类库目标就是为了让Java支持非阻塞IO,所有更多的人称为Non-Block IO缓冲区BufferBuffer是一个对象,通常是ByteBuffer类型任何时候操作NIO中的数据,都需要经过缓冲区。在NIO库里,所有数据操作是用缓冲区处理的。读取数据时,是直接读到缓冲区中(这里并没有直接读到某个地方,而是都放到缓冲区中)写入数据时,写入到缓冲区缓冲区实质上是一个数组,通常是一个字节数组ByteBuffer,自身还需要维护读写位置,可以用指针或者偏移量来实现。除了ByteBuffer还有其他基本类型缓冲区:CharBuffer:字符缓冲区ShortBuffer:短整型缓冲区IntBuffer:整形缓冲区LongBuffer:长整型缓冲区DoubleBuffer:双精度缓冲区通常是用ByteBuffer通道Channel网络数据通过Channel读取和写入Channel通道和Stream流最大的区别在于:Channel的数据流向是双向的Stream的数据流向是单向的这就意味着:使用Channel,可以同时进行读和写,他是全双工模型。(可以联想到HTTP1.1HTTP2.0HTTP3.0 ``websocket)多路复用器SelectorSelector是NIO编程的基础Selector会不断轮询注册在其上的Channel。如果某个Channel发生读写事件,就代表这个Channel是就绪状态,会被Selector轮询出来。然后根据SelectionKey可以获取就绪Channel的集合,进行后续IO操作。一个Selector可以轮询多个Channel,JDK是基于epoll代替传统的select,所以不受句柄fd的限制。意味着,一个线程负责Selector的轮询千万个客户端,AIONIO2.0引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现通过java.util.concurrent.Future类来表示异步操作的结果。在执行异步操作的时候传入一个java.nio.channelsCompletionHandler接口的实现类作为操作完成的回调NIO2.0的异步socket通道是真正的异步非阻塞IO。同步socket channel:SocketServerChannel异步socket channel:AsynchronousServerSocketChannel它不需要通过多路复用器(selector)对注册到里面的通过进行轮询操作,就可以实现异步读写。AIO和NIO最大的区别在于:异步Socket Channel是被动执行对象NIO需要我们把channel注册到selector上进行顺序扫描、轮询AIO则是通过Future类,实现回调方法:completed、failed4种IO对比IO模型主要是探讨2个维度:同步/异步阻塞/非阻塞同步/异步的判断标准主要是:Channel的问题阻塞/非阻塞的判断标准主要是:selector的问题阻塞的关键点在于:建立连接和数据传输BIO(阻塞)意味着在完成建立连接(accpet)动作之后,才能进行后续操作NIO(非阻塞)在处理客户端的连接时,可以将对应的channel注册到Selector上,此时我不管他好了没有,我有Selecotr来帮我去扫就绪态的channel,所以他是非阻塞的异步非阻塞IO异步非阻塞IO:AIO有的人也叫JDK1.4推出的NIO为异步非阻塞IO但是严格来说,它只能被称为是非阻塞IO,并不是真正意义上的异步前期selector的底层是通过select/poll来实现的,虽然是用epoll替代了select/poll,上层的API没有变化,只是一次NIO的性能优化,仍旧没有改变IO的模型在JDK1.7提供的NIO2.0新增了:异步套接字通道,他才是真正的异步IO。多路复用器SelectorSelector的核心功能:就是用来轮询注册在它上面的Channel当发现某个就绪态的Channel,就会找出他的SelectionKey,然后进行后续的IO操作。前期的时候JDK1.4,selector底层是基于select/poll技术实现后面优化,使用epoll来代替伪异步IO只是在线程层面上进行了一次优化,IO模型并没有改变通过处理任务Task队列+线程池处理请求的方式来优化资源解决了BIO的线程和请求:1对1的关系
点赞 0
评论 0
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
05-07 08:58
门头沟学院 Java
别瞎相处!应届生和mentor相处的底层逻辑
刷牛客发现,80%的应届生实习翻车,不是因为技术不行,是不会跟mentor相处。要么是不敢提问,遇到问题自己硬扛,最后耽误了项目进度,被骂;要么是不动脑子,什么鸡毛蒜皮的小事都问,让mentor觉得你能力差;要么是过度依赖mentor,自己不思考,永远只能做CRUD,转正无望;甚至还有人跟mentor对着干,最后实习证明都拿不到。我自己4段实习,从外包到传统公司,再到互联网大厂,遇到过坑人的mentor,也遇到过神仙带教,踩过无数的坑,也总结出了一套和mentor相处的底层逻辑和实用方法。今天就跟所有应届生讲透:和mentor相处的本质是什么?怎么建立健康的相处模式?怎么正确提问?哪些红线绝对...
你和你的mentor相处...
点赞
评论
收藏
分享
05-02 22:52
北京理工大学 Java
双九混子的暑期总结
背景:本硕网安,此前无实习。 其实从去年七八月起,我就算开始准备实习了。但当时还在纠结选什么语言,实验室的项目也还没什么成果。就这样一拖再拖,拖到国庆后才正式开始学 Java,同时还得兼顾导师安排的比赛(用的正是我一直在做的那个项目)。一直拖到十一月初初赛结束,才勉强学完黑马的 Java SE。接着开始学 Java Web,边玩边学,直到十二月初才看完。 第一个比赛失利之后,导师又安排我参加另一个比赛的初赛(复用上一个比赛的成果)。之后我开始准备算法,跟着代码随想录的题单刷题,Redis 和后面的内容没系统学,最后是直接背的八股。这期间也一直在挑项目,挑着挑着就到了一月,勉强敲完了一个轮子项目...
点赞
评论
收藏
分享
04-10 10:46
门头沟学院 机器学习
节子不适合边界感太强的人
如果给公司写点评,我会这么写:下午茶不错,零食很多,工位很舒服,但工作和生活之间几乎没有门。公司福利乍看真的很香。冰箱里永远有饮料,茶水间每天补零食,晚上加班还能报销宵夜。刚开始我特别吃这套,觉得公司至少在“照顾员工”这件事上做得不错。后来慢慢发现,这些福利背后的潜台词是:你最好在公司待久一点。最明显的是消息边界。白天群里聊需求,晚上10点还在群里接龙改方案,周末一条“你有空的时候看一下”能让你半天心里不踏实。最烦的是,这种工作方式不会明着说要占用你私人时间,但会让你形成一种默认在线的习惯。有段时间我甚至洗澡都把手机放在旁边,怕错过消息。后来有次我妈给我打视频,问我最近是不是很忙,怎么连说话都在看手机。我那一瞬间才意识到,原来工作已经把我切得这么碎了。所以如果按大众点评来写,我会评价:赠品很多,隐形消费也不少。适合现阶段愿意all in工作的人,不太适合下班后还想完整做回自己的人。
肥蓝不吃鱼:
字节是网吧工位吧
给工作过的公司写一条大众...
点赞
评论
收藏
分享
04-10 11:02
已编辑
字节跳动_飞书_全栈开发(准入职员工)
我来的时候,江水很平静
“无名小卒,还是名扬天下?”我知道很多人都不觉得我能走到今天这一步,当然,也包括我自己。在我的人生里,有两部作品刻下了最深的烙印:《斗破苍穹》与《龙族》。它们总被人拿来对照:一边是萧炎的桀骜轻狂,一边是路明非的怯懦衰颓。有人说,天蚕土豆没见过魂天帝,但江南见过真凯撒。我时常觉得,自己就是那个衰小孩路明非。可路明非可以开挂,我不可以;我也无数次幻想过,能拥有萧炎那般年少轻狂的人生,可我没有他与生俱来的逆天天赋。我只是个平庸的普通人,一个看过《斗破苍穹》却开不了挂的路明非,只能一步一步往上爬。从我下定决心找实习的那一刻起,我就给自己定下了目标:“我一定要为字节跳动卖命.jpg”。萧炎有他的三年之约,我有我的两年半之约(其实是一年半)。2024.11.20,科大讯飞的第一封实习offer落进邮箱,我迈出了这场奔赴的第一步。2025.8.18,放弃百度转正的安稳机会,转身走进前路未卜的不确定里。我很感谢我在百度的mentor,是她从茫茫人海选中了我,给了我大厂实习的机会。即便有段时间我状态差、产出不理想,她依旧愿意认可我、希望我留下转正。2025.11.14,我选择走进字节跳动,以实习生的身份重新出发。2026.3.25 - 3.31,一周速通上海飞书,幸遇赏识我的伯乐,斩获Special Offer。被告知面试通过的那一刻,我的内心无比平静,就像这个offer本就该属于我。不是侥幸,是应得的。这一路,有人看轻过我的出身,不相信我能走到这里;也有人在我看不见前路的时候,替我举过灯。没有他们的鼓励与支撑,就没有今天站在这里的我。我看到了自强不息的激荡,那是一个双非的伟大乐章!我是雨夜迈巴赫,我要开启属于我的新篇章了。
在看牛客的本杰明很勇...:
真心祝贺l总 我永远的偶像 我滴神
春招至今,你收到几个面试...
点赞
评论
收藏
分享
05-03 18:43
哈尔滨工业大学 后端工程师
京东物流java一面面经
项目挑一个讲?这个项目里大部分是大模型,工程上的有讲一下吗?有用到 Agent 吗?Agent 和传统大模型有什么区别?工作记忆了解吗?向量数据库和传统数据库区别是什么?从模型上查询索引结构上、事务上的区别呢?你提到的给 A 推荐的喜好是怎么做的?你的项目如果对标京东、阿里的话,有没有了解到现在成熟的方案?比方说对你的身高体重、用户画像等这类长期记忆的应用。大模型使用向量数据库的诉求是什么?什么场景用向量数据库?向量数据库在 AI 里的核心作用在哪?向量数据库开源的有哪些? 在毕设过程中,有哪些方案是做过技术调研的?做过压测吗?2000 QPS 的瓶颈在哪里?怎么优化?压测的时候什么指标达到了...
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
毕业啦!我们要一起去广州打拼啦!
1.8W
2
...
毕业了,有些话只能藏在心里了
1.6W
3
...
2026春招到底卷成什么样了?填问卷说出真相,最高领200元现金红包
1.3W
4
...
字节 中国交易与广告 后端一面
1.1W
5
...
211本,130投0面,agent应用开发,简历求助!
7518
6
...
从阿里被裁到快手升P6,我花了四年
6808
7
...
别人:阿里 字节 腾讯
5762
8
...
在携程的一天
5756
9
...
从腾讯到阿里感,谢一路走来的自己
5346
10
...
华为暑期实习
5346
创作者周榜
更多
正在热议
更多
#
这个offer值得去吗?
#
31727次浏览
230人参与
#
校招薪资来揭秘
#
960577次浏览
4062人参与
#
在爱玛,骑向未来
#
20378次浏览
395人参与
#
如果春招能重来,我会___
#
29384次浏览
295人参与
#
24秋招避雷总结
#
1020015次浏览
7098人参与
#
你会因为行情,降低找工作标准吗?
#
45134次浏览
328人参与
#
机械人还在等华为开奖吗?
#
339205次浏览
1652人参与
#
米哈游求职进展汇总
#
688634次浏览
3348人参与
#
华为池子有多大
#
178075次浏览
931人参与
#
26届春招投递记录
#
8668次浏览
72人参与
#
25届网易互娱暑实进度
#
109102次浏览
802人参与
#
通信/硬件求职避坑tips
#
172025次浏览
1170人参与
#
记录我的毕业季
#
4606次浏览
118人参与
#
机械人,你的秋招第一份简历被谁挂了
#
268757次浏览
2450人参与
#
远程面试的尴尬瞬间
#
363841次浏览
2062人参与
#
大学最后一个寒假,我想……
#
103293次浏览
846人参与
#
机械求职避坑tips
#
103678次浏览
589人参与
#
你认为小厂实习有用吗?
#
145045次浏览
762人参与
#
运营商笔面经互助
#
219635次浏览
1833人参与
#
美团秋招笔试
#
216384次浏览
1192人参与
#
网易求职进展汇总
#
213151次浏览
1523人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务