带着问题学习:I/O模型

0. 问题

Redis为何这么快?https://redis.io/topics/benchmarks
Nginx为何能够支持高并发?
使用Node.js为何可以写出高性能的Web服务?

1. I/O是什么

所谓的I/O就是计算机内存与外部设备之间拷贝数据的过程。

你的支付宝上显示账户余额的过程就是一次I/O操作,支付宝app通过网络将数据从数据库拷贝到内存里。
在这里插入图片描述

2. 关键概念

在介绍I/O模型前,先来解释下什么是同步?什么是异步?什么是阻塞?什么是非阻塞?

异步:应用程序不需要自己去触发数据从内核空间到用户空间的拷贝,由内核空间调用应用程序定义的回调函数来完成。
同步:应用程序主动去触发数据从内核空间到用户空间的拷贝。
阻塞:应用程序在发起I/O操作时,在没有拿到数据前,处于等待状态。
非阻塞:应用程序在发起I/O操作时,不管有没有拿到数据,都立即返回。

在这里插入图片描述
另一番解释。

  • 同步:A调用B。B的处理是同步的,在B处理完之前他不会通知A,只有处理完之后才会明确的通知A。
  • 异步:A调用B。B的处理是异步的,B在接到请求后先告诉A我已经接到请求了,然后异步去处理,处理完之后通过回调等方式再通知A。
  • 阻塞:A调用B。A一直等着B的返回,只是等着,不干其他事。
  • 非阻塞:A调用B。A不用一直等着B的返回,先去忙别的事情了。

同步、异步说的是被调用者B(操作内核内核)。阻塞、非阻塞说的是调用者A(应用程序中的用户线程)。

3. UNIX下的5种I/O模型

1、同步阻塞I/O
2、同步非阻塞I/O
3、I/O多路复用(系统调用select、pselect、poll、epoll、kqueue)
4、异步I/O
5、信号驱动I/O

4. Java提供的I/O

1、BIO
同步阻塞I/O

2、NIO
同步非阻塞I/O

3、NIO.2
对操作系统异步I/O的封装

5. Tomcat如何实现I/O

NioEndpoint组件如何实现非阻塞I/O?

Nio2Endpoint组件如何实现异步I/O?

AprEndpoint组件如何实现非阻塞I/O?

99. 彩蛋

单服务器高性能的关键之一就是服务器采用的并发模型,并发模型有两个关键设计点:

  • 服务器如何管理连接
  • 服务器如何处理请求

以上两个设计点最终都和操作系统的I/O模型及进程模型有关。

  • I/O模型:同步、异步、阻塞、非阻塞
  • 进程模型:单进程、单线程、多进程、多线程

Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型。
Redis是用单线程-多路复用IO模型来实现高性能的内存数据服务。
Redis采用多进程-多路复用I/O模型的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值