I/O(input/output)内存模型(1)

I/O

i/o内存模型在java中,我们一般分位三大模型,BIO,NIO和AIO,当下最流行的IO框架Netty就是基于NIO模型的。

I/O的意思就是输入和输出:

常见的输入,举个例子,从计算机的角度来说,输入就是我们用键盘打字,鼠标点击等等方式向我们的计算机输入信息。输出呢,也就是显示器,音箱之类的设备,向用户展示信息,进行人机交互。

我们站在JAVA内存的角度来考虑,input,就是把磁盘里面的东西读取到我们的JAVA软件或者JAVA内存中,我们可以用输入流,如InputStream#read实现。输出呢,就是我们把JAVA软件读取的内容或者JAVA内存中的内容存盘,我们可以用输出流,如OutputStream#write() 来实现。

一般我们讨论的最多的JAVA I/O模型有三个,BIO,NIO和AIO。讨论模型之前,我们需要先讨论一下I/O的基本概念。

同步/异步/阻塞/非阻塞

我们讨论I/O,首先讨论四个概念:同步/异步/阻塞/非阻塞

在分体式服务中,我们对于消息中间件的使用其实会更好的帮助我们去理解这几个概念。

1.同步与异步

我们讨论同步和异步,最简单的理解就是消息通信机制的不同。

举个例子,你去买东西,你问店员有没有46码的鞋子,店员说你稍等我帮你查一下,然后查到了告诉你有没有货,这就是同步通信机制。

还有一种情况,就是商店大促,人很多,你去问店员有没有46码的鞋子,店员说现在人太多了,我给你留个微信,我找一找有货微信给你发消息。这就是异步通信机制。

两者的区别再什么地方呢?很明显,同步通信的情况下,你发出一个查询的请求,店员调用方法查找,你继续等待这个店员返回调用的结果(有还是没有),再进行下一步操作,比如购买。也就是A线程发出请求到B线程,必须等到B线程执行完毕,A线程拿到执行结果之后,才能继续执行后续代码。

而异步通信的情况呢,就是我不需要等待返回,我给店员说好查到了给我回微信消息,然后就可以继续去干我的事了。等店员微信给我说,找到了,再继续买鞋的任务。也就是A线程发出请求到B线程,无需等待返回结果,继续执行后续代码(调用发出直接返回),通过事件或者回调机制来得到B线程的返回结果(微信沟通回调)。

从上面的例子我们也可以明显的看出,异步通信一般在处理高并发的情况下,显得更有优势,所以在分体式服务中,我们时常会运用到异步的通信机制来达到消峰的目的。

2.阻塞与非阻塞

我们讨论阻塞与非阻塞,我们一般更关心程序在调用结果时的状态。

还是上面的例子,在阻塞情况下,我们会一直等在这里(挂起状态),直到店员查出结果,告诉我们有没有鞋子,与此同时如果有很多人同时询问店员的话,店员查询速度比较慢,就会造成人员堆积,一堆人排着队等店员查号。

非阻塞情况呢?就是你问了店员,然后你就去干你的事了,看看其他鞋子,玩玩手机之类的,不管有没有告诉你,你都无所谓,偶尔问一下店员,你查到没有?这样的话就不容易造成拥挤堵塞。

所以阻塞状态,也就是I/O需要彻底完成之后,才会返回给用户空间,而非阻塞就是I/O之后立刻有一个返回值,比如“请稍候”,“正在为您查询中,请稍等”之类的状态信息,无需等待I/O操作彻底完成。

3. 内存模型运用个人理解

除了我们上面讨论过的微服务消峰,异步和非阻塞的概念在人机交互(HCI)的设计上面的应用也是非常的广泛。

用户等待响应时常一直是HCI设计中一个重要的点,一个程序设计的用户体验与其可以说是直接挂钩的。对于用户容忍时间参考:

用户愿意等待的时间-性能指标与建议_weixin_30701521的博客-CSDN博客

通过调查可以看出,一般用户的容忍时间大概在2-8秒,我们如何通过UI和程序设计提高用户的体验度呢?一个用的很多的办法就是异步和非阻塞I/O.

在大量并发的情况下,无可避免的会出现请求排队的现象。再现在微服务盛行的情况下,我们处理高并发很容易想到的就是做服务集群和负载均衡,更多的就是使用消息中间件来实现消息队列,实现消峰。但是消息队列的等待也有可能造成用户的多次无效请求发送。

比如在抢购需求中,用户点击立即购买,客户端发送请求,服务器处理请求。

再同步模型下,用户需要等待服务器处理完请求,才能跳转页面进行下一步操作,这就会导致在服务器排队的情况下,不能及时的得到反馈,重复点击发送请求,增加服务器负荷,也有可能用户以为网络不好,卡机等,产生焦急心态,降低用户体验。

这时更好的解决方案就是在短时间内返回一个数据,表示我们已经了解了用户的需求,返回一个 “正在处理中,请稍候” 的异步回答,更好的可以设置一个拦截,只允许商品数量的请求进来,其他请求返回数据“失败”,这样异步结合的方式,在5秒之内给与用户及时的返回,来增加用户体验。

进入处理的请求也可以使用非阻塞思路来进行处理,增加服务器处理效率,减少队列来提高服务器性能和用户端体验。

本文参考了一.Netty入门到超神系列-BIO、NIO、AIO的认识_墨家@俏如来-CSDN博客 有兴趣的可以去看看,讲的很好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PigeonEssence

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值