当前位置: 首页 > news >正文

centos 6.5 搭建wordpresswindows优化大师可以卸载吗

centos 6.5 搭建wordpress,windows优化大师可以卸载吗,政府网站集约化建设 发言,dedecms 漏洞有一个很常见的场景,比如需要将文件从磁盘上原封不动地发送到网络的另一端。这通过代码实现起来很简单:对于Java而言,你可以使用InputStream的某个实现类将文件一块块地读取到小的缓冲区(通常我们都将缓冲区大小设置为8KB&#xf…

有一个很常见的场景,比如需要将文件从磁盘上原封不动地发送到网络的另一端。这通过代码实现起来很简单:对于Java而言,你可以使用InputStream的某个实现类将文件一块块地读取到小的缓冲区(通常我们都将缓冲区大小设置为8KB),然后再将缓冲区数据输出到OutputStream中。更好的做法是你可以创建一个PipedInputStream实例,让它来管理缓冲区。但是,如果你的应用对性能有要求,那么通过这种方式去读取文件再发送在操作系统层面来看就显得有些太耗资源了。
为什么这样说呢?结合下图我来解释下原因
在这里插入图片描述

  1. JVM执行read()系统调用;
  2. 操作系统从用户态切换到内核态,然后把数据读到内核缓冲区;
  3. 内核将数据拷贝到应用缓冲区,并切换回用户态,read()调用返回;
  4. JVM处理代码逻辑,然后执行write()系统调用;
  5. 操作系统切换到内核态,将数据从应用缓冲区拷贝到socket内核缓冲区;
  6. 操作系统返回到用户态,JVM继续执行后面的业务逻辑。

如果你的应用不关心延时和吞吐量等性能指标,那么以上做法是没问题的,但是如果你的应用有这方面要求,比如静态资源服务器,那么这样做将会无法满足性能要求。上图中有4次上下文切换以及2次不必要的内存拷贝。

系统级别的Zero-Copy(零拷贝)

从上面的方式中可以很清楚的看到,将数据从内核缓冲区拷贝到应用缓冲区,以及从应用缓冲区拷贝到socket内核缓冲区是完全没必要的,因为我们没有对数据作任何处理,仅仅只是将数据从一个socket倒腾到另一个socket。零拷贝技术就能消除这两次额外的内存拷贝。零拷贝技术的实现方式没有一个统一的标准,它取决于不同的操作系统。典型地,那些UNIX LIKE系统用sendfile()来实现零拷贝功能。
使用零拷贝方式实现上面场景的图示如下
在这里插入图片描述
你可能会说,操作系统还是要在内核内存空间做一次拷贝呀!是的。但是从操作系统的角度来说,它已经是零拷贝了,因为已经没有数据从内核空间拷贝到用户空间了。内核需要做一次拷贝的原因是一般的硬件DMA方式只能存取连续的内存空间(所以才有了缓冲区)。但是如果硬件支持scatter-n-gather特性,这次的拷贝就可以避免。
支持scatter-n-gather特性时的图示如下
在这里插入图片描述
很多WEB服务器都支持零拷贝,比如Tomcat和Apache。默认情况下Apache的这个特性是关闭的。
注意: Java的NIO通过transferTo方法提供零拷贝。

MMap

上面的零拷贝方案有个问题,因为没有涉及到用户态,所以除了打通流管道,我们无法通过代码来修改流管道里的数据。不过现在有个比零拷贝昂贵但优于传统I/O的方案——内存映射,简称MMap。
在这里插入图片描述
MMap允许代码将文件映射到内核内存,应用可以直接访问这个内核内存,就像访问用户态的内存空间一样,这样就不会产生内核空间到用户空间的内存拷贝。不过这种方式仍然需要4次上下文切换以及3次数据拷贝(其中有一次是CPU参与的内核内存拷贝)。操作系统将文件的某块数据映射到内存,受益于操作系统的虚拟内存管理,热点数据能被提前载入到内存,所有的数据是页对齐的,因此不需要缓冲区拷贝就能将数据倒腾到目标socket。

虽然,MMap避免了额外的内存拷贝,但是使用了MMap不一定会比普通的方式快,这取决于不同的操作系统。因为这涉及到MMap的创建和销毁所需要的性能开销以及页缺失时的负面影响。

Java中实现MMap方式的类是MappedByteBuffer,它其实也是一种DirectByteBufferDirectByteBufferMappedByteBuffer的子类),不过这两个类并没有直接的关系。我们通常所说的直接内存并没有MMap的特性。

DirectByteBuffer

Java NIO中有三种ByteBuffer

  1. HeapByteBufferByteBuffer.allocate()使用的就是这种缓冲区,叫堆缓冲区,因为它是在JVM堆内存的,支持GC和缓存优化。但是它不是页对齐的,也就是说如果要使用JNI的方式调用native代码时,JVM会先将它拷贝到页对齐的缓冲空间。
  2. DirectByteBufferByteBuffer.allocateDirect()方法被调用时,JVM使用C语言的malloc()方法分配堆外内存。由于不受JVM管理,这个内存空间是页对齐的且不支持GC,和native代码交互频繁时使用这种缓冲区能提高性能。不过内存分配和销毁的事就要靠你自己了。
  3. MappedByteBufferFileChannel.map()调用返回的就是这种缓冲区,这种缓冲区用的也是堆外内存,本质上其实就是对系统调用mmap()的封装,以便通过代码直接操纵映射物理内存数据。

参考资料

  • It’s all about buffers: zero-copy, mmap and Java NIO
  • Linux 中的零拷贝技术,第 1 部分
  • Linux 中的零拷贝技术,第 2 部分
http://www.lbrq.cn/news/2724841.html

相关文章:

  • php做网站技术方案青岛自动seo
  • 全国住房和城乡建设厅网站推广方案怎么做
  • 域名不变 新网站搜索引擎优化的目的是对用户友好
  • wordpress 慢外贸推广优化公司
  • 东莞公司网站建设台州seo排名外包
  • 小型企业网站的设计与实现最新足球赛事
  • 做自己的网站能赚钱吗海外营销推广
  • 合肥市建设局网站国外推广渠道平台
  • 游戏币网站怎么做seo实战培训课程
  • 做两个网站 之间超链接网络推广怎么样
  • 凯里做网站的公司上海网站建设开发公司
  • 做网站的基本步骤电商推广联盟
  • 中山网站方案自助网站建设平台
  • 番禺做网站哪家好如何让百度快速收录网站文章
  • 亚马逊网站建设进度计划书百度关键词挖掘工具爱站网
  • 做电子商务网站 除了域名 网页设计 还有服务器 和网站空间seo入门黑帽培训教程
  • 正版win10做win7系统下载网站优化seo是什么意思
  • b2b网站建站自动外链网址
  • 网站建设业务流程图网站开发北京公司
  • 公司发展规划seo管理
  • 怎样做内网网站站长统计ios
  • 网站可以做无形资产百度搜索 手机
  • wordpress 做网站网上交易平台
  • 网站代码模板免费百度博客收录提交入口
  • crm订单管理系统免费广州seo公司
  • 网站费用怎么做会计分录品牌建设的五个要素
  • 杭州装修公司排名前十强seo网站排名优化公司哪家好
  • 申请建设网站经费申请自动化测试培训机构哪个好
  • 湛江网站开发公司企业网站开发
  • 视频收费网站怎么做miy188coo免费入口
  • Spring Boot 静态函数无法自动注入 Bean?深入解析与解决方案
  • [论文阅读] 人工智能 | 当Hugging Face遇上GitHub:预训练语言模型的跨平台同步难题与解决方案
  • 开发避坑指南(27):Vue3中高效安全修改列表元素属性的方法
  • OpenBMC中C++策略模式架构、原理与应用
  • 计算机如何进行“卷积”操作:从图像到矩阵的奥秘
  • Python 元类基础:从理解到应用的深度解析