IO模型的5中模式

本文详细介绍了Linux下的IO模型,包括阻塞IO、非阻塞IO、多路复用(如select、poll、epoll)和信号驱动IO,以及异步IO。重点讨论了它们的工作原理和区别。此外,还提到了优化IO操作的方法,如Java中的直接内存和sendFile系统调用,实现0拷贝以提高效率。这些技术对于系统性能优化和高并发场景至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


参考:unix网络编程
前言:

在LInux系统下,用户空间会和内核空间可以互相切换

阻塞IO

阻塞IO:由用户空间切换成内核空间,内核空间在等待数据到达,数据到达后从网卡复制到内存,复制结束由内核空间切换成用户空间,读取。在此过程中用户线程一直被阻塞。(处理一个事件不能处理其他事件)

同步阻塞

非阻塞IO

非阻塞IO:等待数据不阻塞,数据到达复制阶段也阻塞。

同步非阻塞

多路复用

selector,先阻塞住,有事件过来才不阻塞;read也阻塞。节省了等等事件的时间

本质也是同步

信号驱动

异步IO

线程1发起(指定回调方法) -----> 线程2获取结果(结果出来后通过线程1的方法返回)
异步都是非阻塞。

同步:线程自己发起动作,自己去获取结果。
异步:线程发起动作,其他线程获取结果。

读文件写入socket流

在这里插入图片描述
java使用直接内存,在用户缓冲区和内核缓冲区之间不用再复制,总共3次,节省1次。

优化

linux2.1提供的sendFile方法,java对应channel的transferTo和transFrom方法拷贝

linux2.4 java调用了transferTo方法后,从java的用户态到内核态,使用DMA将数据读入内核缓冲区,不会使用cpu,
只发生了用户态和内核态的切换,数据从磁盘到内核缓冲区,再从内核缓冲区到网卡,0拷贝是不经过java的内存,不会占用cpu时间。DMP会解放cpu时间。
0拷贝适合小文件传输。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值