1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
拷贝数据

实现零拷贝的管道 IO-Lite也可以用来实现一个消除了拷贝的改良型管道程序(传递IO-Lite buffer的指针而不是拷贝) 将改良后的管道应用到CGI程序和web服务器之间,可以消除冗余的拷贝 实现IO-Lite IO-Lite必须处理复杂的共享模式: 应用程序、TCP程序和文件服务器等均可能有指向IO-Lite buffer的缓冲区。 IO-Lite必须实现一个复杂的替换策略: IO-Lite页既可能是虚拟内存页又可能是文件页 需将标准的页替换规则和文件缓存替换策略集成在一起。 找到一种干净的方法将IO-Lite集成到OS中 IO-Lite已经在UNIX中实现了 5.6.3 使用I/O拼接避免文件系统拷贝 I/O拼接的基本思想: 引入一个新的系统调用sendfile(),允许内核将读文件的调用和向网络发送消息的调用合并 文件到socket传输的传统方法需两次系统调用: read (file, tem_buf, len); write (socket, tmp_buf, len); 使用sendfile()传输文件到socket: sendfile (socket, file, len); 内核2.1版本的sendfile实现 调用sendfile()时: 文件数据先被拷贝到内核中的文件缓冲区 然后从文件缓冲区拷贝到内核中的socket缓冲区 最后从socket缓冲区拷贝到适配器 与read/write方式相比,减少了一次拷贝 内核版本2.4之后的sendfile实现 调用sendfile()时: 文件数据先被拷贝到内核中的文件缓冲区 将记录数据位置和长度的信息保存到socket缓冲区 数据通过DMA通道直接发送到适配器 消除了copy 2 和 copy 3 基于sendfile的机制不能推广到与CGI程序通信 Sendfile() 已用于apache、nginx、lighttpd等web服务器中 5.7 扩展到拷贝之外 除数据拷贝外,其它涉及包中所有数据的操作也是高开销操作,如检查和计算、格式转换等: 需要CPU参与 需要使用内存总线 将拷贝循环扩展到包括检查和计算: 利用load和store之间的空周期做累加计算 不增加任何额外的开销 Integrated Layer Processing(ILP) 除检查和之外,其它数据密集的操作能否都集成到拷贝循环中? 整合层次处理(ILP)的主要思想: 对同一个数据包进行多种数据操作时,将这些操作整合在一个循环中,避免对包中的数据进行多次的读和写(P1)。 整合层次处理会有什么问题? ILP面临的问题 问题一: 不同操作需要的信息一般来自不同的层次,将不同层次的代码整合在一起而不牺牲模块化特性极其困难 问题二: 不同操作可能需要在不同长度的数据块上以及数据包的不同部位进行 问题三: 有些操作可能是相互依赖的。比如,如果数据包的TCP检查和验证失败,就不应当对包进行解密操作 ILP面临的问题(续) 问题四: 过分提高整合度可能降低代码的局部性,增大指令cache的miss率,反而产生不良的后果 结论: ILP很难实现(问题1~问题3) ILP可能性能不佳(问题4) ILP可能完全没有必要(若包数据需要被处理几次,则数据很可能驻留在cache中) 目前只有检查和计算被整合在数据拷贝过程中 5.8 扩展到数据操作之外 消除数据拷贝和整合数据操作,其技术共同点都是避免冗余的读/写操作,以减少对内存总线的压力。 还有哪些因素会影响内存总线的使用呢? Cache的使用效率 DMA或PIO的选择 5.8.1 有效使用 I-cache 处理器包含一个或多个数据cache,以及一个或多个指令cache: 一般而言,包数据几乎不能从 d-cache 获得好处 处理数据包需要的状态可以从d-cache 获益 处理数据包的程序代码可以从 I-cache 获益 代码和状态都可能竞争内存带宽,相比而言,代码对内存带宽的竞争更严重: 处理一个包需要的状态一般较小,比如一个连接表项 协议栈处理的代码大得多,而I-cache的容量一般很小 高效地利用I-cache是提高性能的一个关键 I-Cache的实现特点(1) 大多数处理器使用直接映射的I-cache: 内存地址的低位比特用来检索I-cache条目 如果高位比特匹配,直接从I-cache返回内容 若不匹配,进行一个主存访问,用新的内容替换原来的条目 问题: 被映射到I-cache同一位置的代码会被轮流替换出去,即使它们都是经常使用的代码。 I-Cache的实现特点(2) 每一条I-cache包含多条指令: 当取一条指令时,同一个代码块中的全部指令都会被读入。(基于空间局部性假设而优化) 问题: 不常用的

文档评论(0)

zhuwo + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档