快速了解IO模型

同步与异步的区别:多个任务或事件必须逐个进行,一个任务或事件的执行会导致整个流程的等待是同步。异步不会导致整个流程的等待。异步是宏观上的一种模式,通过多线程可以实现异步,单线程也可以通过NIO的方式达到异步效果。

同步IO与异步IO的区别:数据没有就绪,内核或者用户线程会去轮询数据是否就绪直到数据就绪,然后拷贝数据到用户线程,拷贝数据阶段是由用户线程操作,所以此阶段用户线程阻塞;用户线程发起请求操作,内核会检查数据是否就绪,就绪后将数据拷贝数据到用户线程再通知用户线程,数据拷贝阶段由内核完成(必须要有操作系统的底层支持),用户线程没有被阻塞。同步IO与异步IO的区别是拷贝数据阶段,是由内核还是用户线程完成。异步IO是最理想的IO模型,IO操作的两个阶段都由内核完成(也叫Proactor模式),不阻塞用户线程。

阻塞和非阻塞的区别:一个任务或事件在执行任务过程中,请求操作的条件不满足就等待直到条件满足是阻塞。请求操作的条件不满足返回一个标志信息告知条件不满足并放弃等待是非阻塞。

阻塞IO与非阻塞IO的区别:数据没有就绪就等待(阻塞)直到数据就绪,然后内核将数据拷贝到用户线程是阻塞IO;数据没有就绪会返回一个标志信息告知数据没有就绪,用户线程会去做其他事情,不会傻傻等待数据就绪是非阻塞IO。阻塞与非阻塞的区别就是IO操作的第一阶段,检查数据就绪时,用户线程是是否被阻塞。

多路复用IO:NIO就是多路复用IO。非阻塞IO相比多路复用IO,轮询是由用户线程完成,多路复用IO是由内核轮询,所以非阻塞IO效率要低于多路复用IO。NIO通过selector轮询每个注册的channel(channel相比传统的流,channel是双向的,流是单向的分输入输出流),来监听事件,并逐个相应,当事件过多,后续的事件没有及时处理会影响新一轮的轮询。NIO采用的是Reactor模式,会有专门的线程去轮训,处理事件(处理事件可以用多线程或者线程池方式提高效率),再轮询。

信号驱动IO:与异步IO相比,信号驱动IO在数据就绪后,是通过用户线程调用IO函数进行实际的IO操作(调用时用户线程是阻塞的),异步IO是内核调用IO函数进行实际的IO操作,用户线程接收成功信号后,可以直接使用数据。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值