- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
使用sendfile 让数据传输得到最优化
[转载]使用sendfile()让数据传输得到最优化2011年01月30日星期日12:19
使用sendfile()让数据传输得到最优化
Monday,July 22 2002 4:12 PM
当今国互联网的飞速发展让人们获益匪浅,同时人们对于互联网的期望值也变得越来越高。这就形成了一个矛盾,虽然互联网的发展已经是相当迅猛的了,但是人们还是期望从服务器到客户终端的文件传输的速度能够比现在再快一些,这种要求(当然是合理的要求)好像从来也满足不了。在向人们询问一种什么样的速度对于数据传输来说才是最理想的问题时,几乎每一次你都会得到一种不同的答案:有的人认为数据传输的速率越快越好,有的人则认为数据传输的速率只要在能够容忍的限度之内就可以了,而另一人则认为一种数据传输时不会有数据损失的最快速率才是他们真正需要的,当然,这里还有许多其它的回答,我就不一一赘述了。
在现实中,对于这个有关数据传输的问题是没有一个统一的答案的。绝大多数的人在评价数据传输的快慢时,还是会使用每秒钟传输的兆字节数来作为一种衡量的标准。但是,数据传输快慢的真正衡量标准却是CPU对于每一个传输的兆字节所花费占用的时间。对于实时应用软件,尤其是那些传输视频或者音频数据流的软件,最不想出现的一种状况就是所谓的延迟。CPU执行任务的时候如果没有任何的效率,那么,要实现对协议层(protocol-level)的负载平衡(load balancing)以及将主机的IP名私人化的支持(一种叫做Virtuozzo的操作系统虚拟化技术)都是不太可能的。一个加装了Virtuozzo的主机内能够装得下数以千计的网络站点,所以,尽可能的减少用来处理数据传输占据的CPU时间是非常重要的。
Sendfile()是一种崭新的操作系统核心,这种新核心能够帮助人们解决上边所描述的那些问题。而且,这种新内核对于UNIX,Linux,Solaris 8操作系统来说都是适用的。从技术角度来看,sendfile()是磁盘和传输控制协议(TCP)之间的一种系统呼叫,但是sendfile()还能够用来在两个文件夹之间移动数据。在各种不同的操作系统上实现sendfile()都会有所不同,当然这种不同只是极为细微的差别。通常来说,我们会假定所使用的操作系统是Linux核心2.4版本。
系统呼叫的原型有如下几种:
ssize_t sendfile(int out_fd,int in_fd,off_t*offset,size_t count)in_fd是一种用来读文件的文件描述符。
out_fd是一种用来写文件的描述符。Offset是一种指向被输入文件变量位置的指针,sendfile()将会从它所指向的位置开始数据的读取。Count表示的是两个文件描述符之间数据拷贝的字节数。sendfile()的威力在于,它为大家提供了一种访问当前不断膨胀的Linux网络堆栈的机制。这种机制叫做零拷贝(zero-copy),这种机制可以把传输控制协议(TCP)框架直接的从主机存储器中传送到网卡的缓存块(network card buffers)中去。为了更好的理解零拷贝(zero-copy)以及sendfile(),让我们回忆一下以前我们在传送文件时所需要执行的那些步骤。首先,一块在用户机器存储器内用于数据缓冲的位置先被确定了下来。然后,我们必须使用read()这条系统呼叫来把数据从文件中拷贝到前边已经准备好的那个缓冲区中去。(在通常的情况下,这个操做会把数据从磁盘上拷贝到操作系统的高速缓冲存储器中去,然后才会把数据从高速缓冲存储器中拷贝至用户空间中去,这种过程就是所谓的上下文切换。)在完成了上述的那些步骤之后,我们得使用write()系统呼叫来将缓冲区中的内容发送到网络上去,程序段如下所示:
intout_fd,intin_fd;
char buffer[BUFLEN];
…
/*unsubstantial code skipped for clarity*/
…
read(in_fd,buffer,BUFLEN);/*syscall,make context switch*/
write(out_fd,buffer,BUFLEN);/*syscall,make context switch*/
操作系统核心不得不把所有的数据至少都拷贝两次:先是从核心空间到用户空间的拷贝,然后还得再从用户空间拷贝回核心空间。每一次操做都需要上下文切换(context-switch)的这个步骤,其中包含了许多复杂的高度占用CPU的操作。系统自带的工具vmstat能够用来在绝大多数UNIX以及与其类似的操作系统上显示当前的上下文切换(context-switch)速率。请看叫做CS的那一栏,有相当一部分的上
您可能关注的文档
最近下载
- 心理卫生与心理咨询填空题.doc VIP
- 2023高考英语复习之高频词长难句练习2 全国乙卷七选五(解析版).pdf VIP
- 【高中化学】13个知识点的易错集锦.pdf VIP
- 现场签证单表格.docx VIP
- 中央财经大学后勤处、后勤服务产业集团 全员聘用管理暂行办法.doc VIP
- 2025中央财经大学后勤服务产业集团工程管理岗招聘1人(非事业编制)笔试备考试题及答案解析.docx VIP
- 最新国家开放大学国开电大《离散数学》形考任务+大作业答案.pdf VIP
- 现场签证单表格优质资料.doc VIP
- 24J331地沟及盖板参考图集.docx
- 汽车维修清单表(含使用说明).docx VIP
文档评论(0)