【第三章:BAT等名企面试真题解析8讲】第13节:百度面试真题解析之Zero Copy技术
前言
在我秋招面试过程当中,关于Zero Copy的问题一共出现了3次。对于一个程序员来说,当一个问题出现了3次那么就需要重视和总结,事不过三。本节我会对Zero Copy做一个介绍,并结合百度面试真题进行解析。
系统级IO
要理解Zero Copy技术的出现,首先需要知道什么是系统级IO。Linux系统级IO分为:
1.标准IO库
2.IO系统调用
3.网络IO库
IO系统调用:
Linux标准访问文件方式是通过两个系统调用实现的:read()和write(),这两个系统调用在用户态都是没有缓冲。当用户进程使用read 和 write 读写Linux的文件时,进程会从用户态进入内核态,通过I/O操作读取文件中的数据。
read ():
ssize_t read(int fd, void * buf, size_t count);
read()会把参数fd所指的文件传送count 个字节到buf 指针所指的内存中。
write():
ssize_t write (int fd, const void * buf, size_t count);
write()会把参数buf所指的内存写入count个字节到参数放到所指的文件内。
举例来说,要写入数据到文件上时,内核先将数据写入到内核中所设的缓冲当中;假如这个缓冲储存器的长度是100字节,调用系统函数write时,假设每次要写入的数据的长度为10个字节,那么你几要调用10次write函数才能将内核缓冲区写满;此时数据还是在缓冲区,并没有写入到磁盘,缓冲区满了之后,才真正进行实际上的IO操作,将数据写入磁盘。因为内存和磁盘读取速度的巨大差异,采用内核缓存可以减少磁盘IO的次数,提升磁盘IO的效率。
标准IO库:
标准IO库是基于IO系统调用实现的,优化了对系统调用的使用方式。引入标准IO库有以下几个原因:
1.因为IO系统调用的使用方式非常底层,需要指定读写的count以及buf,使用比较麻烦,所以标准IO库对IO系统调用进行封装。
2.因为read 和 write 等底层系统调用需要在用户态和内核态之间切换,如果每次读写的数据很少,那么切换带来的开销将大大降低IO的效率,所以标准IO库在用户态也引入了缓冲机制,提升了性能。
3.IO系统调用在不同的操作系统之间是不能通用的,但是标
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
<p> 《收割BAT:C++校招学习路线总结》,专刊共计17节。专刊分为五大主要内容,包括后台开发学习路线、简历制作,面试技巧、BAT等名企面试真题解析和工作学习常用工具。本专刊将介绍我在技术成长过程当中的经验,通关BAT的面试技巧,并结合亲身经历的面试真题由浅入深的讲解后台开发方向的重点问题,让你们的求职之路更加顺畅。 本专刊购买后即可解锁所有章节,故不可以退换哦~ </p> <p> <br /> </p>
