NIO和BIO,及零拷贝

IO模型,可以理解成是有一种通信模型

BIO是一种阻塞通信模型,每建立一个链接,就会产生一个线程,当链接建立,但是没有信息传递时,这个线程会一直阻塞在这里。这时就会很消耗资源。

NIO是一种非阻塞IO模型,他使用一个线程来管理多个链接。依靠buffer,channel,selector三个组件来完成单线程的多路复用。通过selector来监听多个channel注册的事件,如果有事件发生,就会对这个事件进行处理(比如建立链接,接受信息等)。

零拷贝

比如我们要从磁盘读取一个文件,将文件内容对外做一次发送,这个简单的操作就涉及到几次拷贝。

如图:

1.从磁盘读取到内核的缓存区,进行一次拷贝,同时这是从用户态切换到内核态

2.从应用读取内核缓冲区数据,进行第二次拷贝,同时内核态切换成用户态,cpu参与拷贝

3.从应用缓存区拷贝到socket缓存区,进行第三次拷贝,socket缓存区属于内核态,这里又会发生一次状态切换

4从socket缓存区拷贝到网卡,进行第四次拷贝

总结:一共有4个拷贝,3次状态切换

mmap映射技术

在内核缓存区拷贝到应用时,使用映射技术,对物理磁盘和虚拟地址进行映射,减少一次拷贝

 

sendfile技术

内核缓存区和socket缓冲区都是内核态,那么他们能不能直接拷贝呢?使用它们内核态的地址,也就是文件符号引用,可以理解成他们在内核态的地址,这样直接使用文件符号引用符来做拷贝

这样只需要三次拷贝,两次状态切换

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值