前言
我们的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会进行系统调用,将导致上下文从用户模式切换到内核模式,然后