存档

2011年12月 的存档

镁光的某些SSD导致假死的解决方案

2011年12月30日 没有评论

“某些SSD”包括但不限于M4、C300。

我的M4(固件0009)已经遇到过好几次了。
具体表现是,系统硬盘灯常亮,系统范围内无响应,半分钟或更久后恢复,在事件管理器中有“设备 \Device\Ide\iaStor0 没有在传输等待时间内响应。”的错误信息(ID=9)。
在镁光官方论坛有人给出了解决方案:http://forum.crucial.com/t5/Solid-State-Drives-SSD/Solution-C300-Disk-Freeze-ups-in-Windows-7-solved-for-me/m-p/38766

导致这个问题的原因是这些SSD不能处理Intel® Rapid Storage Technology中含有的LPM(Link Power Management)特性。把下面的文本复制成.reg格式保存后导入注册表就可以关闭LPM了,然后重启就好了。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\iaStor\Parameters\Port0]
“LPM”=dword:00000000
“LPMDSTATE”=dword:00000000
“DIPM”=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\iaStor\Parameters\Port1]
“LPM”=dword:00000000
“LPMDSTATE”=dword:00000000
“DIPM”=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\iaStor\Parameters\Port2]
“LPM”=dword:00000000
“LPMDSTATE”=dword:00000000
“DIPM”=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\iaStor\Parameters\Port3]
“LPM”=dword:00000000
“LPMDSTATE”=dword:00000000
“DIPM”=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\iaStor\Parameters\Port4]
“LPM”=dword:00000000
“LPMDSTATE”=dword:00000000
“DIPM”=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\iaStor\Parameters\Port5]
“LPM”=dword:00000000
“LPMDSTATE”=dword:00000000
“DIPM”=dword:00000000

您也可以从此处下载压缩后的DisableLPM.reg:DisableLPM.7z

据作者说还会加快SSD的速度,不过我的M4貌似速度没啥变化。

操作系统里面内存管理的几个概念

2011年12月21日 3 条评论

活动页面:最近使用过的页面(通常通过PDE/PTE中的A位判断)。
不活动页面:不是活动页面,也不是未使用的页面,就是不活动页面。活动页面经过一段时间的老化以后就变成了不活动页面。为了老化页面,通常不断扫描PDE/PTE中的A位来记录一个PDE/PTE的年龄。
  脏页面:页面中的内容尚未写到页面文件中的不活动页面。这种页面要是想要回收然后分配给其他进程的话代价比较大,因为需要做IO。
  干净页面(这翻译= =):就是页面中的内容已经写到页面文件了。这种页面回收的代价较小,通常只需要操作一些内存中的数据结构就可以了。
活动页面和不活动页面都是分配出去的页面。
未使用的页面:没有分配出去的页面。
在分配页面的时候,一般来说首选未使用的页面,其次是干净页面,最后才是脏页面,如果还不行就去老化活动页面。

内存抖动:通常是因为工作集大小的设置不合适(过小)导致的,当然也可能是页面调度算法本身不够完善,具体表现是刚被置换出去不久的页面又再次访问,于是就会不停的因为换入换出页面而发生IO,进而拖慢系统。

另外说一个Windows特有的东西,是ReadyBoost。
ReadyBoost是从Windows Vista开始引入的一个用来加速系统的概念。通过使用U盘来存储某些系统使用的数据加速系统运行速度。
实际上,ReadyBoost应该是将U盘作为分页的外部存储设备使用的。
按理来说U盘的连续读写远远慢于系统的主硬盘(不管多好的U盘~,当然,USB3.0+SSD的话……那你干吗不把SSD做主硬盘?= =),所以用U盘做分页的外部设备反而会更慢。
这个主要是因为U盘的随机存取效率要远高于机械硬盘(在ReadyBoost提出的时候基本还都在用机械硬盘),而通常需要调入内存的页面不会太多——1024个页面也只有4M的大小,但是对于主硬盘来说,每次操作都会需要很长的时间(这个时间主要花费在寻道上),U盘,或者说闪存在这种情况下就要快很多,所以置换页面的时候把一些小数据放入U盘的话,再次访问它们的时候相比于放入主硬盘,要快很多,自然也可以提高系统响应速度。
当然由于SSD的出现,ReadyBoost也只能是一个时代的产物,在Windows 8正式发布的时候有可能会被去掉。即使没有,在Windows 9(如果我们可以度过2012的话,如果微软也可以的话。)几乎是可以肯定是会被去掉的,因为SSD的随机存取效率相对于普通U盘来说是足够快的。其实在我的机子上(前一阵刚换了颗SSD——我绝对不是富二代!),ReadyBoost是被强制关闭,因为主硬盘的随机存取效率足够高了。
(在系统内存耗尽的时候SSD相对于传统机械硬盘的效率提升非常明显,开了2个程序每个分配1.8G+的内存然后不断的将内存初始化为随机内容,系统依然可以正常响应,只有Aero的动画有些卡而已。)
当然,如果系统主内存足够大,那么ReadyBoost几乎没有用处。

另外有一个跟操作系统关系不是太大的内存问题,就是内存的缓存机制(内存:虽然偶常常被系统用来给磁盘之类的东西做缓存,但是其实人家也是有缓存的啦~(通常是CPU的L1、L2、L3?)),x86(以及x64?)里面分写回(Write-back)和写过(Write-through)(这俩词纯粹是我自己的翻译= =)两种。写过的意思是,遇到一次写操作同时写缓存和主内存。显然这种缓存机制对于写入操作不能加速,但是实现起来容易。另外一种,也就是写回,这种缓存机制在碰到写入操作的时候只会更新缓存中的内容,而不会去更新主内存;稍后如果有新的缓存项需要替换这条缓存项的话再(首先判断这条缓存项是不是脏的)将其写入主内存。一般认为(只是一般认为)写回机制要比写过效率高,因为写回机制对主内存的操作会少一些,但是这种缓存机制显然实现起来要困难一些。
究竟写回和写过谁的效率更高?这个取决于当时的环境。如果系统负载很大,而且程序的局部性不明显的话,这时候缓存命中率会很低,那么写过的效率要高,这个效率提升主要提升自缓存算法,因为少了一些判断;如果系统负载不大,这种情况下缓存命中率比较高,这时候写回的效率要高,这时候的效率提升主要来自于缓存的速度,因为缓存的速度要比主内存的速度快。