IO模型详解

IO模型分类

  1. 同步与异步IO:
      同步与异步是指用户空间和内核空间调用发起方式。同步IO是由用户空间发起的,内核空间被动接受;异步IO是内核空间发起的,用户空间被动接受。

  2. 阻塞与非阻塞:
      阻塞与非阻塞是指在执行io操作期间,用户程序的状态。用户程序执行阻塞IO时会一直阻塞,知道内核空间准备好数据、将数据从内核空间复制到用户空间两个步骤都完成后才返回;用户进程执行非阻塞IO时,程序并不会被阻塞,而是立刻返回一个状态值。

IO模型讲解

  1. Java IO:
      平时使用的Java io都是同步阻塞IO,发起io操作的用户程序会一直阻塞,直到内核空间获得数据,并将数据复制到用户空间再返回。

  2. 同步非阻塞IO:
      IO操作用用户程序发起,但是无需等待,直接返回一个状态值。io操作可干就干,不可干就去执行别的业务,当IO可干后就讲数据从内核缓冲区复制到用户缓冲区。

  3. 同步非阻塞IO(NIO):
      用户程序发起IO操作,如果数据没有准备好则返回,然后不断查询数据是否准备好。当内核数据准备好后,用户程序将数据从内核中拷贝到用户空间,这个阶段用户程序会被阻塞。在轮训内核数据是否准备完毕过程中会消耗大量CPU资源。

  4. Java NIO(IO多路复用):
      这里需要指出,Java nio不是nio,Java NIO是new IO(新IO)。Java nio有叫做io多路复用,是建立在操作系统Select/epoll系统调用之上的IO。单个线程不断轮训注册到select上的socket,将数据已经准备好的通道返回给用户程序。因此通过一次select/epoll系统调用就可以返回多个可用链接。
      但是Java nio 也有一个缺点,在数据复制到用户空间阶段,用户程序会被阻塞。

  5. 异步io:
      异步io又叫信号驱动IO,当数据准备好并将数据从内核空间复制到用户空间后,操作系统调用回调函数通知用户程序,然后用户程序读取用户空间的数据,执行背的操作。
      异步IO的缺点是需要注册IO操作完成的回调函数,这些功能需要操作系统的支持,目前只有Windows系统有晚上的异步功能。Linux系统从2.6之后才引入,但并不完善。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值