概述
什么是I/O
什么是I/O 就是 input/output 网络上的输入输出
现在是什么时代,数据时代,在通俗一点,就是流量时代,有流量就有资源控制能力,比如 抖音短视频、微博话题、直播平台。
表面上看不论是文字评论,图片,或者视频流,其实本质就是在 输入信息输出信息。
所以编程上面技术有很多目的都是为了更好的解决i/o问题。
i/o定位
输入输出的地方有很多
1:网络io
2:缓存io
3: 硬盘io
网络i/O模型
网络五大io模型:阻塞io、非阻塞io、io多路复用、信号驱动模型(异步阻塞IO)、异步io((异步非阻塞IO))
生活故事:
场景:去饭店吃饭
角色:顾客 服务员 厨师
顾客来吃饭点餐,服务员告诉厨师,做好饭给到客户;
io: 顾客来吃饭点餐 为网络请求输入
服务员接待 相当于线程 建立socket连接
厨房做饭相当于内核数据
服务员与厨房出餐 输出
这个过程就叫做io
接下来说明一下 同步异步/阻塞非阻塞
同步异步是针对于 厨师做饭环节 也就是内核数据处理
==同步就是 下一环节以上一环节结果关注 == 成顺序
比如做饭环节然后送餐环节 这样的效果就是 服务员关注做饭环节,会问厨师做好饭了没 在进行下一个送餐环节
异步就是上一环节引导下一环节 在没结果之前各自关注,有结果在引导下一环节
服务员引导厨师 需要做什么,就自己忙去 然后厨师做好饭 引导 服务员过来在续上 送餐环节
阻塞非阻塞是针对于 服务员取餐环节
阻塞,服务员傻等出餐
非阻塞,服务员玩手机等出餐
同步阻塞io: 顾客来了点餐,一个服务员与之建立连接,告知厨师需要获取什么餐 服务员等待出餐就一直等待,新的顾客来了,就需要新的服务员去建立连接因为之前那个还在等待出餐,随着人越来越多,服务员不可能为每一个顾客配一个。所以out
同步非阻塞io: 非阻塞 感觉就是不等待了,一个顾客C1来了,一个服务员S1过来接待 问需要吃点什么,告诉厨师,这个时候S1不是在一直等待了,而是去做别的事情了,过一会儿在来厨师餐好了没(轮询)。 哎呦,感觉比阻塞io好了一些,但是同样的是一个顾客对应一个服务员,只是服务员聪明了一点,顾客多了还是面临一对一就不好搞的问题。
同步阻塞 io多路复用: 只有一个服务员,来了一个顾客,服务员把顾客点餐信息给到厨师,然后就去干其他事情了,等饭好了,厨师告诉服务这边。之前服务员主动询问的方式通过厨师通知的形式变成了被动告知这样就避免了前俩种因为主动询问浪费资源,只需一个服务员关注于厨师做好饭提供的消息来按顺序送餐给顾客
同步阻塞信号驱动IO模型:在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个信号函数,然后用户线程会继续执行,当内核数据就绪时会发送一个信号给用户线程,用户线程接收到信号之后,便在信号函数中调用IO读写操作来进行实际的IO请求操作。这个一般用于UDP中,对TCP套接口几乎是没用的,原因是该信号产生得过于频繁,并且该信号的出现并没有告诉我们发生了什么事情
异步非阻塞io:
CPU处理很快,硬盘读写很慢,这就相当于 服务员取餐送餐很快 厨师做饭很慢;
服务员不用一直等着出餐,可以做点别的事情,比如扫地,擦桌子,等做好了在去送餐,看起来好像跟非阻塞差不多也是在等餐的时候干点其他活,但是区别就在于:
异步是 厨师做好饭 才会去送餐
非阻塞是 轮询 去问 不一定是做好饭的状态
最后
以上就是醉熏柜子为你收集整理的redis 基础之io多路复用的全部内容,希望文章能够帮你解决redis 基础之io多路复用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复