要不试试这样来理解IO?

导语:我知道,作为一个程序员,很多人总喜欢把IO挂在嘴边,总认为IO能为自己的能力镀金,诚然,如果你明白了真正的IO操作其实是由操作系统帮忙完成的 你也就理解为什么进行IO操作时进程需要挂起等待了!原谅这些肤浅的程序员吧,他们在无数个夜晚挑灯夜战,加班加点,做项目赶进度,又基本没有个人生活,还随时可能猝死,哪里还有什么时间回炉深造,更何况作者也曾经是他们中的一员。

  • 什么是IO?

IO是输入input输出output的首字母缩写形式,直观意思是计算机输入输出,它描述的是计算机的数据流动的过程,因此IO第一大特征是有数据的流动,因此输入输出他是一个相对的概念 主体不同,那输入与输出就表达的含义也不同,例如:我们以进程为主体 那么当线程从内存读取数据时我们就可以认为这是输入,当进程向内存写数据时就可以认为是一次输出。
以一个进程的输入类型的IO调用为例,它将完成或引起如下工作内容:
进程向操作系统请求外部数据
操作系统将外部数据加载到内核缓冲区
操作系统将数据从内核缓冲区拷贝到进程缓冲区
进程读取数据继续后面的工作
当应用程序(进程)发起 I/O 调用后,会经历两个步骤:
内核等待 I/O 设备准备好数据
内核将数据从内核空间拷贝到用户空间。

  • 阻塞和非阻塞IO

阻塞和非阻塞强调的是进程对于操作系统IO是否处于就绪状态的处理方式。
我们都知道,进程其实是无法直接操作内核的 即进程需要通过操作系统来完成IO操作 所以IO操作一般分为两步 IO调用和IO执行 IO调用由进程发起 操作系统响应进程的IO调用 之后执行IO操作并将内核态数据拷贝到用户态供进程进行数据读写。但是在这个过程中操作系统的IO执行并不是立马完成的,进程需要等待,这个状态又被称为操作系统非就绪状态 那么这里便有阻塞与非阻塞之说了 什么意思呢 比如,进程在发起IO调用之后进程一直在阻塞等待操作系统IO就绪返回结果时 我们称这种IO为阻塞式IO,相反即为非阻塞式IO,这也是为什么我们使用非阻塞式IO时需要进行轮询操作系统IO操作是否处于就绪状态的原因 所以传统非阻塞式IO会轮询CPU 所以CPU消耗很大

  • 同步和异步IO
    同步和异步强调的进程如何处理操作系统进行IO之后反馈的结果,同步是经典的实现 进程傻傻的等着操作系统将数据从内核空间拷贝到用户空间 然后又去将数据拷贝到进程空间中,在这期间似乎干不了其他事情,但是异步IO就不一样了 异步IO一般都是基于事件回调的 ,进程不会傻傻的等待操作系统完成IO数据复制然后他又去复制数据而是进程会立马返回等到操作系统完成了所有工作之后会通知进程进行数据复制工作,这就是同步IO和异步IO的区别

  • IO多路复用- IO操作的性能之巅?

这几年爆火的Netty 似乎凭借着IO多路复用技术赚足了观众缘,Netty爆火的背后原因其实就是IO多路复用技术
我们上面介绍非阻塞式IO时 我说过 非阻塞式IO有一个很大的问题 那就是需要进程轮询操作系统是否处于就绪状态的问题,那IO多路复用是怎么解决这个问题的呢
IO 多路复用模型中,线程首先发起 select 调用,询问内核数据是否准备就绪,等内核把数据准备好了,用户线程再发起 read 调用。read 调用的过程(数据从内核空间->用户空间)还是阻塞的。
IO 多路复用模型,通过减少无效的系统调用,减少了对 CPU 资源的消耗。
Java 中的 NIO ,有一个非常重要的选择器 ( Selector ) 的概念,也可以被称为 多路复用器。通过它,只需要一个线程便可以管理多个客户端连接。当客户端数据到了之后,才会为其服务。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值