java中transferto_被朋友问到什么是零拷贝,我一脸懵逼…

前言

我们的Web应用多多少少都会处理一些静态内容,需要先从磁盘中读取到数据,在不经过修改后将此数据写入到套接字,伪代码如下:

read(file, tmp_buf, len);

write(socket, tmp_buf, len);

虽然看似简单,但是它的效率却不高,因为在这两个调用之后,数据已经被至少复制了四次,并且执行了大概相同数量的用户/内核态上下文切换,那么啥是用户/内核态呢?用户态是指当程序运行在3级特权级上时,因为这是最低特权级,是普通的用户进程运行的特权级,反过来,当程序运行在0级特权级上时,就可以称之为运行在内核态。而为了使应用程序访问到内核管理的资源,内核必须提供一组通用的访问接口,这些接口就叫系统调用,当我们需要做IO操作如open、read、write、就需要通过系统调用来和内核进行交互,但是系统调用的开销很大,要尽量减少系统调用的次数,因为系统调用会从用户态进入到内核态,用户态和内核态的频繁切换,会消耗大量的CPU资源,会影响数据传输的性能。用户态切换到内核态的还有俩种方式,异常和外围设备的中断。

那这里特权又是指什么?

从80286处理器开始,Intel引入了保护模式,特权级就是保护模式中的一个重要概念,操作系统的核心代码运行在最高特权级(0特权级)上,而用户程序运行在最低特权级(3特权级上),特权级1、2一般用于运行系统服务程序。

对于上面的例子,我们可以把他分为以下几个步骤:

read会进行系统调用,将导致上下文从用户模式切换到内核模式,然后

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值