PCEVA,PC绝对领域,探寻真正的电脑知识
打印 上一主题 下一主题
开启左侧

谈大容量内存的各种使用方案对磁盘效率影响

  [复制链接]
1#
ggxuelei 发表于 2012-1-22 21:56 | 显示全部楼层
很好的分析!
2#
ggxuelei 发表于 2012-10-9 17:28 | 显示全部楼层
变心金刚2 发表于 2012-10-9 16:33
烦请速封我账号并封IP以免我以后碰巧搜索到,又点击进此处,费心了


好多辩论啊,我看了半天,有点头晕。
各种回复都看了下。说说我的看法哈

首先,这个缓存机制,Windows不可能是永远正确永远100%英明的。换做RAMDISK,或者你说的,“程序主动申请去把可能用到的资源缓存起来”,凡是预判性的预缓存,都不可能是100%英明的,这个没有异议吧?

就是说,这个缓存,他很可能缓存到了后来其实没用到的东西,这样一直到最后这部分缓存的内容被释放掉,都没有派上用场。这样做了无用功。对吧?缓存命中率不可能100%,很可能很低呀。

那么,做了无用功的后果是什么?降低了系统效率,拖慢了应用运行的速度了么?

显然没有。为什么说没有?

我的理解,Win7的缓存,有一部分是Superfetch,将EXE程序加载过程中利用到的一些资源整理成.PF文件,在开机后就开始预加载到内存中,这部分算是主动的缓存。另外一种是被动的缓存。我们可以关闭Superfetch(用了SSD这个应该默认就关闭了),但是缓存还是会有,这部分应该就是被动缓存,程序调用到了资源后,这部分资源到了内存中,程序用过之后,系统没有直接释放这部分资源(除非程序强制要求释放,这个过程可以去看下.NET的编程),而是作为缓存了,因为程序后边可能会再次利用到,这种我认为是被动的缓存。

Superfetch的主动读取加载,可能会有额外系统开销(相对于不做Superfetch缓存来说),但是这个读取过程是在开机后磁盘压力小的时候进行的,系统不会爆发式的去读取以至到卡机的程度,影响是有,但是轻微。.PF文件的大小您也可以去看一下,并非多大的东西。.PF文件加载到内存中缓存的优先级是根据EXE程序运行的次数来排序的,经常运行的程序用到的资源优先预加载。

而被动式的缓存,我认为基本没有额外开销,应用程序去请求读取数据,读取以后,系统没有释放这部分内存而已,一点多余的磁盘IO开销也没有。这部分被动的缓存,即便0%的命中率,也不会使系统变得更慢。反过来,一旦缓存命中,系统效率会得到增益。

如果被动的这部分缓存没有被命中,而内存又不足了,这时候这部分缓存被释放掉了,做了无用功了么?做了,但是成本是什么?一段时间内内存占用率较高而已。但是占用率高并没有影响其他程序运行,因为一旦内存不足,这部分缓存就释放掉给其他程序使用了。释放内存的时间成本基本为0,缓存命中失败,不存在惩罚。

Win7的普遍缓存,成本很低,被动式的缓存几乎是没成本。为什么您还认为,这部分缓存是做了坏事呢?他造成什么负面影响了么?他无非是多占用了一些暂时用不到的内存空间,充分利用了大内存。

至于写入缓存,我认为Win7的缓存最主要的还是读取缓存而非写入缓存。因为普通应用环境下,读取的机会大于写入的机会。

至于你说的BT下载的情境,我认为,Win7不去为他单独定制一个配置的缓存,是因为没有太大的必要。下载软件普遍都有缓存设置,他会把数据攒够一个量以后才写入,而不是全零碎的随机写入。姑且不说SSD,就说HDD吧,他的弱项是随机存取,而不是持续读写,如果持续写入,当前的网速,很难对机械盘造成什么压力,更不要说SSD了。BT下载之所以在网速足够快的时候容易造成磁盘瓶颈,是因为他下载的过程中还需要同时频繁的进行读取,这才是问题。所以你把BT任务转成离线下载任务,磁盘压力会小,因为几乎不需要给别人上传了,不需要同时进行疯狂的读取了。
3#
ggxuelei 发表于 2012-10-9 17:38 | 显示全部楼层
本帖最后由 ggxuelei 于 2012-10-9 17:40 编辑

其实就一句话,被动缓存命中失败,不存在惩罚
Win7缓存是会做不少无用功,这和SSD没Trim下的垃圾回收差不多,但是垃圾回收还有耐久度惩罚呢

SSD没有Trim的时候,他去做垃圾回收,完全不知道他GC的有效数据,会不会在下一秒就因为用户的操作,变成无效,全白费无用功。

GC错了尚有惩罚呀,耐久度惩罚。但是Win7的缓存没命中,有什么惩罚呢?内存里多存取了次东西,多耗了点几乎可以无视的电量。内存里没命中的数据,内存不够用了,他的释放,内存块从有数据变成全0无数据,需要什么成本开销么?会让您卡机了么?

缓存的算法即便没做好,用不着缓存的东西他缓存了,下一秒能用到的,他没缓存上。这最恶劣的情况下,他只是没有让系统变得更快而已,但是并没有将系统拖慢,这是关键。

CPU的缓存其实也差不多,他只能提高算法,尽量提高预测成功率,让缓存命中。但是永远不可能英明到全命中。CPU的缓存才多大点?但是你认为CPU这个缓存是无必要的?这个好像就不必我去举例子去验证了吧??
4#
ggxuelei 发表于 2012-10-9 17:56 | 显示全部楼层
如果对编程、内存管理、大容量数据的程序内调用缓存有兴趣,可以看看Weak Reference弱引用之类的东西。对于大容量数据在程序逻辑里的处理可能方便理解。
大概提供一篇:http://blog.csdn.net/jinhuiyu/article/details/3709767

有点简单的编程基础应该就能看懂了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部