| 在's profile不在PhotosBlogLists | Help |
|
|
04/11/2006 NetBSD BookmarksDownload Systems
News
Main Websites
Packages
Blogs
Forums
Other Websites
User's Docs
PDF Docs
NetBSD LiveCD, Floppy, Flash and Others
NetBSD Books
NetBSD CultureNetBSD: Articles, Advocacy, Reviews
NetBSD - Technical Articles in Polish (warpman's selection)
NetBSD - Technical Articles in English (warpman's selection)
Firms Offering NetBSD Systems
Varia29/05/2006 OnLamp.com的Clean up portszt from http://www.wonglaye.net/blog/?p= FreeBSD ports即便得到所有赞美,也存有局限性。其中之一实际上来自它的强项-upgrade系统。两者以一种郁闷的方式互相影响。
port安装过程记录一个port所include的所有文件和所有依赖。比如,许多ports需要PNG图形库。port记录它使用的PNG版本,如1.0.11。当你安装了一部分软件,这一般和可以在ports树中找到是相同的版本。FreeBSD upgrade进程可以升级被port tree支持的软件版本。比如,PNG最近升级到1.0.12版本,库版本号没有增加,但是新库有一些小bug修复。我想升级。但是如果我那样做了,编码了确切PNG版本号的30多个ports将得到错误记录。 ? 我的笔记本有187个包(packages)。我一个星期升级一次。这很快就变得零乱,不久之后就难以忍受。幸好,Akinori MUSHA has stepped up to the plate(怎么翻译)并开发了一套可以整理这种零乱状态的工具:portupgrade(1)和他的朋友们(小熊温尼和他的朋友们)。 portupgrade中包含的工具实现了port系统的新特性。首先是pkgdb 和portdb,用来对/var/db/pkg索引和ports树创建数据库。这样能加快搜索并操作之。这些工具也可以重写/var/db/pkg里不同的文件来维护一致性。最后是各种pkg_*命令的wrappers,当添加或删除软件时可以用来重写数据库和纯文本记录。所有这些可以通过安装/usr/ports/sysutilis/portupgrade来得到。 在开始使用portupgrade之前,备份 /var/db/pkg!我从没在这个程序上遇到过麻烦,但是任何可以直接改写系统记录的工具具有无限可能使你的生活一团糟。如果你完全破坏了package records,你需要还原它: #tar -czvf dbpkg.tgz /var/db/pkg 运行pkgdb -F 来初始化安装,并进行基本的清理工作。如果你有许多ports,并已升级过几次port树。第一次时应留出一定时间。一旦有了一致性的数据库,维护将是又快又easy的;只是第一次会比较耗时。
Checking the origin of Hermes-1.3.2 Checking the origin of Mesa-3.4.1 Checking the origin of Mesa-3.4.2_1 Checking the origin of ORBit-0.5.10_5 Checking the origin of XFree86-aoutlibs-3.3.6.9 … 当遇到依赖改变的包时,pkgdb会询问是否要修改。
libaudiofile-0.2.1_1 ? ([y]es/[n]o/[a]ll) [yes] esound已经记录libaudiofile版本0.2.2作为依赖,但是安装的是版本0.2.1_1。我也许过去做过pkg_add -f,以强制安装尽管有微小版本差异。问我是否想要更新我在/var/db/pkg/esound-0.2.22/+CONTENTS的入口来指向实际安装的libaudiofile的版本。如果默认,他将修改入口记录,如果输入“a”,不仅修改libaudiofile对于esound的入口,而且还修改所有用到libaudiofile的其他包。这对于具有很多依赖的包比如PNG,显得格外方便。
New dependency? (? to help): ? 这里我有一个选项。我可以指派一个新的依赖,或我可以告知package已经不再有什么依赖了。当Xaw3d需要imake,我知道在这个特别的系统里,它不会发现imake已经安装了。我想要删除依赖性。如果敲”?”来查看帮助会发现:
New dependency? (? to help):?
Control-D it is. 如果我选择“YES”,将清除该依赖。如果我选择“all”将清除所有该依赖无论何时出现。许多ports使用imake;我都想清除。稍后你将看到:
Delete this? ([y]es/[n]o/[a]ll) [yes] Deleted. 还有几次,在别处也出现了pkgdb不能推测依赖的情况
New dependency? (? to help): ? [Enter] to skip, [Ctrl]+[D] to delete, [.][Enter] to abort, [Tab] to complete New dependency? (? to help): timidity++-2.10.4 用tab可以完成。我知道timidity++-esound用到某版本的timedity,但是我不想挖地三尺以求整个完整的版本号。我可以输入前两个字母然后按Tab键,就得到了剩下的包的名字。
Remove any of them? [no] 这里我有一个问题。从一个包安装软件而需要另外一个包的情况是很疏松平常的。也许你已安装的包有一点版本出入。如果你正通过package来安装,它会自动安装依赖,即使稍有出入的版本已经安装了。这有时会在我的系统中出现。我的本本有两个不同版本的Mesa,但是一个已经覆盖了另一个。这明显的不能算最糟糕的,因为我的系统还在工作。(最后我完全删除了mesa并安装了适合的版本)。尽管如此我依然需要清理packge数据库。我手动卸载了老版本。
Hermes = Mesa = ORBit < XFree86-aoutlibs < Xaw3d = aalib = <代表安装的版本比port树中的旧.可以通过运行portversion | grep '<'来查看哪些port过时了.我经常使用它来查看自己的系统.比如,我的Apache过时了.但是在我的本本上我已经不使用apache了,所以我可以删除它.标准的pkg_delete命令仍然适用,但是我用了,我的package数据库将同我的系统失去同步.使用pkg_deinstall来代替.
—< Deinstalling 'apache-1.3.20' [Updating the pkgdb in /var/db/pkg ... - 182 packages found (-1 +0) (...) done] # 好处是我再也不用给出完整版本号!(对于FreeBSD的pkg_*,这困扰我良久,但是无能为力).portupgrade工具包含全局函数,可以进行模式匹配。
===> Cleaning for gettext-0.10.35 ===> Cleaning for gmake-3.79.1 ===> Cleaning for libtool-1.3.4_2 ===> Cleaning for jpeg-6b ===> Cleaning for png-1.2.0 ===> Cleaning for freetype2-2.0.5 ===> Cleaning for gd-1.8.4_4 If you want to compile in X support use ‘make -DWITH_X11′ instead ===> Extracting for gd-1.8.4_4 …. 将看到熟悉的make输出界面。如果继续观察,会发现转而去卸载已安装的包,更新数据库,然后继续。
pkg_delete: package ‘gd-1.8.4_3′ is required by these other packages and may not be deinstalled (but I’ll delete it anyway): scr2png-1.1 [Updating the pkgdb in /var/db/pkg … - 180 packages found (-1 +0) (…) done] ===> Installing for gd-1.8.4_4 … 一旦安装完成,会再一次更新package数据库。所有的都是同步的。
This port will try to ensure that the tools used by the FreeBSD Documentation Project are installed on your system so you can convert documentation from SGML to other formats. 组件其中之一是JadeTex,它依赖于TeTex。TeTex的源代码超过30M,可能需要很长的下载时间。
make JADETEX=yes?
*** Error code 1 Stop. 我考。这个port需要定制。你可以修改/usr/ports/textproc/docproj/Makefile添加 JADETEX=no。现在它将完全透明得运行。
是的,没错它可以,我说过的它真是好样的。 original:Michael W. Lucas 26/05/2006 Linux日志文件系统及性能分析(组图) 日志文件系统可以在系统发生断电或者其它系统故障时保证整体数据的完整性,Linux是目前支持日志文件系统最多的操作系统之一,本文重点研究了Linux常用的日志文件系统:EXT3、ReiserFS、XFS和JFS日志技术,并采用标准的测试工具PostMark和 Bonnie++对它们进行了测试,给出了详细的性能分析,对Linux服务器应用具有重要的参考价值。 01/04/2006 笑话(连笑话都是转贴的 —_—!)
甲:你的Blog每天的访问量是多少? 乙:2个,我的Blog访问量很稳定;) 甲:哦?是哪两个? 乙:我和Google爬虫 甲:........
骇客:看老子多牛,搞定N台Unix服务器 小强:看爷爷我多牛,搞定你家厨房^____^
甲:我想学一种可以做任何东西的编程语言,要强大,要实用,要可以通过它学习其他的语言,有这样的语言吗 乙 :英语 甲:...
答:被阿扁推翻了。 董存瑞问:劳苦人民还当牛做马吗? 答:不劳动了,都下岗了。 吴琼花问:姐妹们都翻身得解放了吗? 答:思想解放了,都当小姐了。 杨子荣问:土匪都剿灭了吗? 答:都改当公安和城管了。 杨白劳问:地主都打倒了吗? 答:都入党了! 雷锋问:那资本家呢? 答:都进人大和政协了! 刘胡兰问:同志们都藏好了吗 答:都隐身上网了 29/03/2006 Google 另类技巧不完全手册 大家一定对 Google 十分熟悉了吧?除了最常规的搜索功能,它还具有很多十分另类的技巧.下面就列举一些给大家看看. 1、搜索在线摄像头监视站点 在Google中输入"inurl:"ViewerFrame?Mode=""或者"inurl:"MultiCameraFrame?Mode=""、"inurl:"view/index.shtml""(输入时不带外面的双引号,在英文状态下输入),你会获得无数个未经加密的网络摄像机监视到的画面.无聊的时候玩玩,可以满足一下我们的好奇心.此外,打开这个站点:www.opentopia.com/hiddencam.php ,在"from"中选择"China",你还可以看到国内的某处网络摄像机画面. 2、让Google搜索结果在新窗口中打开 默认情况下Google的搜索结果跟百度等搜索引擎不一样,它是直接在当前网页中打开搜索结果,这对我们的使用会感到不方便,其实我们可以通过设置来达到目的. 打开Google后,选择"使用偏好"链接,在打开页面的"结果视窗"中勾选"开启新视窗以显示查询结果"一项,单击"存储偏好设置"按钮即可. 3、比较两个关键词在Google中搜索结果数量 想知道克里和布什谁更火?那就比较一下Google的搜索结果数量就知道了.打开www.googlefight.com/,在"Keyword #1"和"Keyword #2"中分别输入"克里"和"布什",单击"Make a fight!"按钮即可看到他们各自的结果.笔者试过,克里有741000个搜索结果,布什有4020000个搜索结果,布什获胜! 4、让Google来告诉去哪儿旅游 想好去哪儿旅游了吗?问问Google吧.打开douweosinga.com/projects/besttimetovisit站点,在"Enter the name of destination"栏中输入你想要去的城市名字,比如"北京",点击"Go"即可获得结果. 5、搜索注册码 在google里搜索时敲入"你搜索的软件名 94fbr",一般情况下就会立刻搜索到注册码,举个例子,搜索"ACDSee 94fbr",就会得到ACDSee的注册码. 94fbr 是 Office 2000 的序列号的一部分,而这个序列号又广为流传,所以能找到它的地方就一定有其他软件的注册码. 6、有趣的关键字 在Google中输入"_*_"这个关键字,不管你是"搜索所有网页"还是"仅搜索中文网页",你都只能搜索到一大堆中文页面.想明白这是为什么吗?到blog.outer-court.com/forum/5066.html去看看就知道了,原来这是ASCII字符和Google之间的矛盾. 7、汉语拼音输入检索 为了方便使用中文的用户在网上搜索,Google允许用户直接在键盘上输入汉语拼音来检索相关事物,例如: 输入 shang hai shi ke biao 检索结果提示:您是不是要找:上海时刻表 这正是我们需要查找的关键词,用户可以据此浏览相关结果,这包括上海地区的各种交通工具的时刻表.如果需要查找更详细的资料"上海飞机航班时刻表",则只要在原来的检索结果"上海时刻表"中间输入feijihangban,例如: 上海fei ji hang ban时刻表 Google的这项新功能,可以免除用户在中文和拼音输入方面的互相转换.用户在输入拼音时,不要留有空格,否则Google会误认为英文.Google把拼音与常用的字或者词组一一对应,因此,过于生僻的字或词组不适合于用这个方法查找. 8、中英文字典 经常使用计算机的用户手头上自然会有一、两个字典软件,用于查找和翻译中英文的词义.作为一种使用频率较高的工具,Google也提供了一个中英文字典,很方便使用.用户可以按照下列方法查找词义查找英文的中文词义则输入fy computer,查找中文的英文词义则输入 翻译 计算机 9、天气查询 天气情况也是人们经常要查询的信息之一,Google 提供的天气查询来自于一个更新及时的中文气象网站,适合中国人使用.用户输入中文和英文都可以查询,例如要了解雅典的天气情况,可以按照下列方法输入: 雅典 天气 athens tq 返回的查询结果中会在第一条出现一个"雅典天气预报",用户点击后就可以看到当天雅典的天气情况.如果地名相同者,用户还需要进行一次选择. 10、股票查询 查询股票的网站已经很多了,Google提供的股票查询只是更方便一些而已,用户可以按照股票名称、股票代码或者股票名称的声母字母查询,下列为查询"中国联通"股票行情的举例. 中国联通 股票 zglt gp gp 600050 11、邮政编码和区号查询 人们时常需要查询邮政编码和电话区号,Google提供了这样一个实用的功能,用户据此能够获得所要查询的省市名称,邮政编码及长途电话区号,下面为查询举例: 邮编 杭州 区号 绍兴 yb 杭州 qh 绍兴 需要注意的是用户只能查询到城市级别的邮政编码和区号,而无法进一步查询区县的具体信息. 12、手机归属地查询 用户在输入手机号码后可以获得号码段、归属地、卡类型、邮政编码和电话区号的信息,但是从实用的角度看,其中只有手机归属地的信息较为有用. 13、计算器使用 Google有计算器的功能,例如在google检索框中输入45*86+35/7,就会得到结果: (45*86) + (35/7) = 3875 有兴趣的用户,或者经常在计算机上进行运算的用户不妨可以试一试. 14、购物检索 Google新开设的购物检索称之为Froogle,网址为http://froogle.google.com/ 用户只要输入商品的名称,就可以看到该商品的图片和价格,用户还可以限定一种商品的价格进行检索,并且将检索结果按需要从高价到低价排序列出,许多商品可以直接在网上订购,这种图文并茂的检索购物方式较受用户青睐. 15、美国实用生活信息查询 如果用户生活在美国或者短期去美国出差和学习,下面的查询功能或许能对他们又帮助,因为这些检索服务目前仅限于美国. 地区代码查询 用户输入美国的地区代码,在返回的检索结果中的第一项就是该地区的地图,用户可以通过不断的点击来找到一条具体的大街. 条形码查询 用户输入一个商品的条形码就可以找到有关该产品的说明. 飞机航班查询 用户输入一家航空公司的名称和航班号,即可获得该航班的出发地和目的地,起飞和到达时间,以及实际航行情况,目前是否开始检票,抵达目的地候机大楼的舱门号. 车牌号查询 用户输入车牌号,可以获得一辆车的名称、型号、出厂年份,车身和发动机情况. 邮件查询 用户输入一个邮件的号码(美国),可以获悉该邮件目前的状况,譬如邮件已经抵达或者正在路途上等. 17/03/2006 谈谈GCC4.0几个值得关注的新特性本文侧重介绍了 GCC 4.0 内部结构相对于 3.4.x 版本的一些全新变化。 GCC(GNU Compiler Collection) 是 GNU(GNU's Not Unix) 计划提供的编译器家族,它能够支持 C, C++, Objective-C, Fortran, Java 和 Ada 等等程序设计语言前端,同时能够运行在 x86, x86-64, IA-64, PowerPC, SPARC 和 Alpha等等几乎目前所有的硬件平台上。鉴于这些特征,以及 GCC 编译代码的高效性,使得GCC 成为绝大多数自由软件开发编译的首选工具。虽然对于程序员们来说,编译器只是一个工具,除了开发和维护人员,很少有人关注编译器的发展,但是GCC的影响力是如此之大,它的性能提升甚至有望改善所有的自由软件的运行效率,同时它的内部结构的变化也体现出现代编译器发展的新特征,所以 2005年4月20日,GNU 组织发布的 GCC 4.0 引起了广泛的关注。那么这次 GCC 从 3.4.x 直接跃迁到 4.x 的主版本变化到底有什么值得关注的呢?
我们可以从不同的角度看待 GCC 的这次变迁,对于普通程序员来说,关注的主要是GCC 的前端支持情况以及编译性能的变化。 1. GCC 4.0 的前端支持 GCC 的开发者和使用者当中,大多数人都是 C 或者 C++ 的用户,所以 GCC 对Fortran 语言支持不足也不令人奇怪。但是,这并不代表 Fortran 是无足轻重的,事实上,开发商业的 Fortran 编译器的公司要远远多于开发 C 和 C++ 编译器的公司。 在科学计算和工程应用领域,程序员们仍然在频繁使用 Fortran 程序,同时,大量的经过长时间考验的函数库也为Fortran语言的数值计算提供了强有力的支持,所以,在一些"超级计算机"(supercomputer)上,Fortran仍然是绝大多数应用的首选语言。 然而,在GCC 4.0发布之前,如果不想购买商用的Fortran编译器,那么程序员们的唯一选择就是GNU的g77编译器。但是g77编译器是一个相当陈旧的技术,很多Fortran语言的新特性都不能支持,比如流行的Fortran 95,它能够支持的模块化编程,并行处理和数组操作等等,g77编译器基本上都无法支持。 这次GCC 4.0发布时推出了支持Fortran 95语言前端的编译器gfortran,它已经能够大大超越g77编译器,支持Fortran 95标准中的很多新特性,虽然gfortran还有一些缺陷,比如不能支持自动并行化(automatic parallelization),不能支持Fortran 2003中的面向对象特性等等,它已经给了Fortran程序员除了商业编译器和g77以外一个更好的选择。 2. GCC 4.0的编译性能 编译器的性能主要可以从三个方面来考查: 1. 编译时间(compile time),指编译器编译一个源程序得到目标代码所需要的时间。 2. 目标代码的大小(object size),编译得到的目标代码当然是越精悍越好了。 3. 目标代码运行时间(run time),运行时间体现了速度和效率。 这里,作者没有亲自测试和实验,引用了Scott Robert Ladd的《GCC 4.0: A Review for AMD and Intel Processors》文章中的一些实验结果。这篇文章引起了比较大的反响,其实验结果和结论也得到了广泛的认可,如果对Scott的具体测试采用的软硬件平台和工具方法感兴趣,原文可以在http://www.coyotegulch.com/reviews/gcc4/index.html看到。 Scott使用AMD和Intel的两款处理器:64位的Opteron处理器和32位的Pentium 4处理器,分别针对GCC 3.4.3和GCC 4.0来进行测试。他选用了POV-Ray 3.6.1, LAME 3.96.1, SciMark 2.0和Linux 2.6.11.8作为benchmark来进行测试,分别记录了GCC 3.4.3和GCC 4.0在ADM Opteron和Intel Pentium 4下的编译时间、代码大小和代码运行时间进行比较,具体的实验结果请参见原文。 这样,根据这些实验数据,我们可以给出一个粗糙的结论,在编译性能方面,GCC 4.0似乎不如GCC 3.4.3,因为在很多时候,GCC 4.0的编译时间、代码大小以及代码运行时间全面高于GCC 3.4.3。这样的结果看似出人意料,GCC这次大的版本变化就是因为引入了新的优化框架,怎么会编译性能有所下降呢?这主要是因为:首先,这是一次主版本变化,我们可以理解巨大的变化带来的性能损耗;另外,更主要的是,GCC新的优化框架的潜力尚未完全发挥出来,这一点,在我们文章结束的时候,读者会有更深的理解。 3. GCC 4.0 的内部结构变化
GCC 遵循 GPL 协议,是开放源代码的,其开发过程也是完全开放的,任何人都可以对 GCC 的发展作出贡献,因而 GCC 特别适合用于学习和研究编译器。对于学习和研究编译器本身来说,GCC 内部的结构变化显然更吸引人。 目前 GCC 发行维护者 Mark Mitchell 在接受 internetnews.com 网站采访时这样说到:"毫无疑问地,GCC 4.0 中最引人注意的特性以及为何把 GCC 的这个版本称作 4.0 而不是 3.5,就是因为其新的优化框架(optimization infrastructure)。大体上来说,GCC 以前的版本的代码优化工作主要在底层机器指令级别进行的。不幸的是,到了底层的时候,很多信息已经丢失了,因此,GCC 4.0 在更接近输入高级语言程序的级别上做了很多优化工作。" Mark Mitchell 所说的 GCC 新的优化框架主要就是指 Tree SSA(Static Single Assignment),Tree SSA 经过长时间的独立开发,最终整合进了 GCC 的主流(mainstream)中,可见这种设计是意义非凡的。Tree SSA 是什么?为什么要采用 Tree SSA? 使用了 Tree SSA 的 GCC 有什么不同?新的 GCC 编译和优化框架是什么样的?等等,这些将是本文探讨的主要问题。 这部分文章内容是这样组织的:首先回顾 GCC 4.0 版本之前的编译流程,以便进行对比;接下来介绍 GCC 4.0 的编译流程以及新的优化框架结构,这里先介绍 GENERIC Tree和 GIMPLE Tree,SSA 形式等基本概念,在读者对这些概念和理论有了一定的了解之后,再介绍 GCC 中是如何实现 Tree SSA 框架结构的。 3.1 GCC 4.0 之前的编译流程 这里有必要回顾一下 GCC4.0 之前的版本进行代码优化的框架结构,以便进行对比分析。GCC 的前端在接受了输入的源程序之后,经过分析器(parser)处理得到 Parse Tree(通常是一种抽象语法数,AST, Abstract Syntax Tree),根据这个 Parse Tree 生成程序的RTL(Register Transfer Language)表示,然后在 RTL 表示的基础上进行优化处理,然后生成相应的目标代码,如下图 1 所示。 但是 RTL表示是一个相当接近底层的表示,也就是说它更接近目标代码,适合进行目标相关的优化工作,比如寄存器分配等等。然而,很多的优化转换工作需要更高层的程序信息,比如数组引用、数据类型、控制流结构等等,这些很难用 RTL 表示,或者无法用 RTL表示。 ![]() 图1 GCC 4.0之前版本的代码编译流程和优化框架 3.2 GCC 4.0 的优化框架(Optimization Infrastructure) 提供一个可移植性强、跨平台以及编译高效代码的编译器,是 GCC 一贯追求的目标,为了使 GCC 能够获得更好的编译性能,高层程序信息级别的优化工作是必须的。Tree SSA设计的主要目的就在于此,它既与前端语言无关,又与后端目标无关,而且能够提供在 RTL表示层很难或者无法进行的高级分析和转换。 Tree SSA 起先是作为 GCC 的一个分支(branch)进行独立开发的,经过两年多的努力开发,终于在 2004 年 5 月 13 日进入了 GCC 的主流版本。在 GCC 的 SSA for Trees 分支的网页上明确说明了,这个项目的目的就是构建一个对基于 SSA 形式的树的优化框架。在学习编译原理的时候我们知道,编译器通常会使用树的形式来描述程序,GCC 也是这样,在接受了输入的源程序后,GCC 驱动其相应语言的前端分析器(parser),处理得到一个 Tree。从图 1 可以看到,4.0 版本之前的 GCC 几乎是立即把这些 Tree 转换成了 RTL 表示。那么现在 GCC4.0 的 Tree SSA 优化框架就是在前端生成 Parse Tree 之后,把这些 Tree 转换成基于 SSA 的 Tree,对这些 SSA 形式的 Tree 进行高层次的优化,然后才把 Tree 转换成 RTL 表示。 3.2.1 GENERIC Tree 和 GIMPLE Tree 这个框架结构看起来比较简单,而且 GCC 的 Parse Tree 能够提供足够的信息来实现SSA,但是在真是实施的时候,还是有很大的困难的,最主要的两个困难是这样的: 1. GCC 中的树没有统一的表示形式,每一个前端都定义了自己的树。这就意味着要得到基于SSA形式的树必须要对每种前端分析生成的树都进行处理。 2. GCC 前端得到的 Parse Tree 的复杂度是无法估量的。把这些树转换成基于 SSA形式的树需要进行复杂的处理工作。 为了解决以上两个问题,GCC Tree SSA 分支的开发小组引入了 GENERIC Tree 和GIMPLE Tree 两个概念: 1. GENERIC Tree 是特意创造出来的 GCC通用的树的表示形式,它能够表示不同的前端所需要的所有的结构,而且又能够去除语言相关性。 2. GIMPLE Tree是取自GENERIC Tree和SIMPLE两个短语的。因为GENERIC Tree的复杂性导致实现SSA形式的困难,需要把GENERIC Tree进行简化,这种简化的GENERIC Tree就称之为GIMPLE Tree。 好了,了解了这些内容之后,我们可以看看 GCC 4.0 的编译流程和优化框架,如下图2所示: ![]() 图2 GCC 4.0 的编译流程和优化框架 3.2.2 Single Static Assignment Form 的基础介绍 到现在为止,我们基本搞清了新的 GCC 的编译过程,也大概了解了所谓的新的 Tree SSA 优化框架。上面提到的 GENERIC Tree 和 GIMPLE Tree 都是为了实现 SSA 而做的准备工作,那么 SSA 本身究竟是什么?为什么 GCC 要把 Parse Tree 转换成基于 SSA 形式的 Tree 再做优化工作呢?为弄清楚这些问题,我们有必要多花一些篇幅对SSA的基本概念和理论做一些介绍。 SSA 的全称是 Static Single Assignment,直译过来就是静态单一赋值,它是IBM公司在上个世纪 80 年代研究的成果。从前面的讨论可以看出,Tree SSA 与 RTL 一样,也是一种中间表示形式,不过相比 RTL 要更高层一点。SSA 形式是一种相对而言比较新颖的中间表示形式,早期的讲编译原理或者编译器的课本中大多没有提及。 简单的说,SSA 形式就是每个变量只能被赋值一次。这样,非 SSA 形式的程序在转换成 SSA 形式的时候,其中的部分变量就会被分割成很多版本,通常使用下标来表示这些不同的版本。下面举一个简单的例子来说明,如下图 3 所示: ![]() 图3 程序的非 SSA 形式和 SSA 形式 上图中所示的代码片段,由于 y 变量被赋值两次,所以在转化成 SSA 形式的时候,y变量被分割成两个版本 y1 和 y2,这样就保证了每个变量仅仅被赋值一次。 由于 SSA 形式中每个变量只能被赋值一次,那么 SSA 形式就能有效地把程序中所操作的数值和这些数值的存储位置这两者分开,这样就能方便一些优化工作。比如我们刚才看的图 3 中的代码片段,我们可以通过肉眼分析发现在非 SSA 形式中的第一条语句y := 1是一条无效的冗余语句,真正决定 y 变量值的是第二条 y := 2 赋值语句。那么在代码优化的时候,第一条语句就应该被删除掉。但是这是我们人工发现的优化结果,如果想要编译器来完成这个优化工作,需要进行复杂的分析,在编译原理中称之为"定义可达性分析"(reaching definition analysis)。而在 SSA 形式中,显然,做出这样的优化决定则无需进行太多分析。 这只是 SSA 形式诸多优点中的一个而已,使用 SSA 形式可以利用更多的编译器优化算法或者是提高这些算法的效率,比如 constant propagation, sparse conditional constant propagation, dead code elimination, global value numbering, partial redundancy elimination 以及register allocation 等等。这里涉及太多编译理论和算法,本文不作详细讨论。 SSA 形式具有上文所述的优点,当然也会有其复杂和困难的地方了,下面我们通过一个稍微复杂点的程序片段来说明把非 SSA 形式的程序转换成 SSA 形式程序的时候有些什么需要考虑的问题: ![]() 图4 图 4-a 所示的非 SSA 形式的程序在转换成了图 4-b 所示的 SSA 形式的程序后,有一个问题很难解决,就是图 4-b 中最下面程序块中 y 的值无法确定。因为在此之前有一条选择语句,导致程序控制流产生了分支,此时 y 的值可能是 y1 也可能是 y2,这是由程序具体执行时经过哪一条控制流来决定的。处理的方法是在最后一块程序片段之前加上一个 Φ 函数,定义一个新的 y3,并从 y1 或者 y2 中选择一个适当的值赋给 y3,如图 4-c 所示。 推而广之,在将非 SSA 形式的程序转换成 SSA 形式后,如果某个变量被分割成了 n个不同版本的变量后,在某一点需要会合,那么在这个会合点 (joint point) 就需要加入一个 Φ 函数来确定应该选择这 n 个不同版本的变量中的某一个值。这样问题就转变成了如何计算这个 Φ 函数以及确定在程序中的什么位置应该插入 Φ 函数,这个可以使用 dominance frontiers 来进行计算,关于如何高效计算这个 Φ 函数的算法研究本文不作深入讨论。 3.2.3 GCC 4.0 中的 Tree SSA 框架的设计和实现 至此,我们已经比较清楚的了解了什么是 SSA,SSA 形式有什么好处,如何将非 SSA表示转换成基于SSA形式的表示以及这个过程中需要解决的主要问题等等,本文将不再对SSA进行深入的讨论了,回到我们的主题,继续讨论GCC 4.0 的 Tree SSA 优化框架是如何设计和实现的,它是怎样把 Tree SSA 融入到 GCC 的编译过程中去的。 回顾上图2表示的 GCC 4.0 编译流程,在得到 GIMPLE Tree 之后,经过 GIMPLE optimizer 和 GIMPLE expander 的处理,得到了程序的 RTL 表示。其实把程序转换成SSA形式和在此基础上进行优化就在这个过程中完成的,下面我们就来具体看看 GCC 4.0 是怎么做的。在 GIMPLE 和 RTL 之间是树优化 (Tree Optimization) 的过程,如下图 5 所示。图 5 中所示的树优化器 (Tree Optimizer) 主要完成这几个功能: 1. 生成一个控制流转换图 CFG(Control Flow Graph)。 2. 将 GIMPLE Tree 转换成基于 SSA 形式的 Tree。 3. 进行 Tree SSA 的优化。 4. 将优化后的基于 SSA 形式的 Tree 转换成 RTL 接口所能识别的非 SSA Tree 的形式。 ![]() 图5 GCC 4.0 的 Tree Optimizer 结构 结合 GCC 4.0 代码中的部分源文件来说明:图 5 中这个 Tree Optimizer 的行为是由tree-optimize.c 文件驱动的,tree-ssa.c, tree-into-ssa.c 以及 tree-outof-ssa.c 负责完成 SSA 形式的转换、验证以及其他需要与 SSA 形式交互的功能,建立和管理控制流转换图 CFG 的工作由 tree-cfg.c 完成。不同的树分析和优化功能分别在相应的源文件中独立实现,这些分析和优化函数必须向 GCC 注册,然后才能由 tree-optimize.c 进行驱动和管理,结合图 5来看,SSA pass1, SSA pass2 … SSA passn 代表了实现各种不同功能的 SSA 分析器,他们向 Tree Optimizer 注册,在编译时刻 Tree Optimizer 根据编译选项等等选择相应的SSA分析器进行优化或者其他处理工作,并保证在基于 SSA 形式的处理完成之后将 SSA 树转换成非 SSA树,交给下面的 RTL 模块处理。 至此,GCC 4.0 的 Tree SSA 优化框架结构应该比较清楚了。读者可能会注意到,文中多次提到Tree SSA是一个优化框架结构(Optimization Infrastructure),为什么说是一个Infrastructure 呢?其实把 Infrastructure 称作框架结构或许并不贴切,更精确地说 Tree SSA是 GCC 提供的一种进行优化工作的基础设施。图 5 中已经体现出了这一点,Tree SSA 的分析和优化工作不是一成不变的,具体选择哪些优化功能和算法是由Tree Optimizer选择驱动的,而且这个Infrastructure是相当灵活的,我们可以很方便的加入一个 SSA 分析器,只需要如下步骤: 1. 创建一个 struct tree_opt_pass 类型的全局变量。 2. 在 tree-pass.h 头文件中为这个新的分析器添加一个外部声明(extern declaration)。 3. 调用 NEXT_PASS 把这个新的分析器加入到 tree-optimize.c: init_tree_optimization_passes 序列中。 所以这种 Infrastructure 是一个相当灵活和方便的设计,使得我们可以便利地加入新的SSA分析器,或者使用更高效的算法来重新设计完成一些优化功能等等。 4. 总结 GCC 4.0 发布以来得到了引起了广泛的关注,新的 gfortran 前端给 Fortran 程序员带来了福音,但也有很多不尽如人意的地方,比如编译性能的损耗,以及向后兼容问题。比如KDE(K Desktop Environment) 开发小组在发现 GCC 4.0 无法正常编译 KDE 后,迅速的抛弃了 GCC 4.0。而且,出于稳定性的考虑,GCC 3.x 版本的开发仍然在进行中。这些似乎给 GCC 4.0 的前景笼罩上了一层阴影,但我们应该容忍一点,给 GCC 4.0 一些信心,向后兼容的问题应该是能够解决的。 至于编译性能的问题,通过我们这篇文章的讨论,我们可以看到 GCC 4.0 Tree SSA 的优化框架结构并没有充分发挥出其潜能,还可以增加和改进更多 Tree SSA 的优化工作,假以时日,GCC 4.0 的编译性能会得到提高的。 总的来说,这次 GCC 从 3.x 版本跃迁到 4.x 版本更像一个进化 (evolution) 的过程,而非一个革命性 (revolution) 的过程,它采用的 Tree SSA 优化框架代表了编译器发展的方向,我们应该关注 GCC 4.0 的进一步发展。 5. 参考文献 [1] Tree SSA: A New Optimization Infrastructure for GCC. Diego Novillo, Red Hat Canada, Ltd.发表在 GCC Developers Summit 上。 [2] Kenneth Zadeck在GCC&GNU Toolchain Developers' Summit 2004 上做的关于 SSA 的报告,Static Single Assignment Form。 [3] Design and Implementation of Tree SSA. 仍然是 Diego Novillo 在 GCC Developers Summit 上发表的文章。 [4] Scott Robert Ladd 的《GCC 4.0: A Review for AMD and Intel Processors》,对 GCC 4.0 和GCC 3.4.3 的性能做了评测,http://www.coyotegulch.com/reviews/gcc4/index.html。 [5] GNU 主页上关于 GCC Tree SSA branch 的说明,http://gcc.gnu.org/projects/tree-ssa/。 关于作者 王逸,南京大学计算机科学与技术系在读博士生,对软件安全、Linux、编译器等比较有兴趣,目前主要关注的是隐蔽信道分析。 10/01/2006 RAID等级、RAID功能
05/01/2006 挖掘动力 主板DDR内存时序指南以DFI LanParty NF4 SLI-DR主板为例,DDR内存既然叫做双倍速率SDRAM(Dual date rate SDRSM),就是说他是SDRAM的升级换代产品。从技术上分析,DDR SDRAM最重要的改变是在界面数据传输上,其在时钟信号上升缘与下降缘时各传输一次数据,这使得DDR的数据传输速率为传统SDRAM的两倍。那么大家就应该知道了,我们所说的DDR400,DDR333,DDR266,他们的工作频率其实仅为那些数值的一半,也就是说DDR400工作频率为200MHz。 FSB与内存频率的关系 首先请大家看看表一:FSB(Front Side Bus:前端总线)和内存比率与内存实际运行频率的关系。
对于大多数玩家来说,FSB和内存同步,即1:1(DFI 用1/01表示)是使性能最佳的选择。而其他的设置都是异步的。同步后,内存的实际运行频率是FSBx2,所以,DDR400的内存和200MHz的FSB正好同步。如果你的FSB为240MHz,则同步后,内存的实际运行频率为240MHz x 2 = 480MHz。
强烈建议采用1:1的FSB与内存同步的设置,这样可以完全发挥内存带宽的优势。 Command Per Clock(CPC) 可选的设置:Auto,Enable(1T),Disable(2T) Command Per Clock(CPC:指令比率,也有翻译为:首命令延迟),一般还被描述为DRAM Command Rate、CMD Rate等。由于目前的DDR内存的寻址,先要进行P-Bank的选择(通过DIMM上CS片选信号进行),然后才是L-Bank/行激活与列地址的选择。这个参数的含义就是指在P-Bank选择完之后多少时间可以发出具体的寻址的L-Bank/行激活命令,单位是时钟周期。显然,也是越短越好。但当随着主板上内存模组的增多,控制芯片组的负载也随之增加,过短的命令间隔可能会影响稳定性。因此当你的内存插得很多而出现不太稳定的时间,才需要将此参数调长。目前的大部分主板都会自动设置这个参数。 该参数的默认值为Disable(2T),如果玩家的内存质量很好,则可以将其设置为Enable(1T)。 CAS Latency Control(tCL) 可选的设置:Auto, 1, 1.5, 2, 2.5 3, 3.5, 4, 4.5 一般我们在查阅内存的时序参数时,如“3-4-4-8”这一类的数字序列,上述数字序列分别对应的参数是“CL-tRCD-tRP-tRAS”。这个3就是第1个参数,即CL参数。 CAS Latency Control(也被描述为tCL、CL、CAS Latency Time、CAS Timing Delay),CAS latency是“内存读写操作前列地址控制器的潜伏时间”。CAS控制从接受一个指令到执行指令之间的时间。因为CAS主要控制十六进制的地址,或者说是内存矩阵中的列地址,所以它是最为重要的参数,在稳定的前提下应该尽可能设低。内存是根据行和列寻址的,当请求触发后,最初是tRAS(Activeto Precharge Delay),预充电后,内存才真正开始初始化RAS。一旦tRAS激活后,RAS(Row Address Strobe )开始进行需要数据的寻址。首先是行地址,然后初始化tRCD,周期结束,接着通过CAS访问所需数据的精确十六进制地址。期间从CAS开始到CAS结束就是CAS延迟。所以CAS是找到数据的最后一个步骤,也是内存参数中最重要的。 这个参数控制内存接收到一条数据读取指令后要等待多少个时钟周期才实际执行该指令。同时该参数也决定了在一次内存突发传送过程中完成第一部分传送所需要的时钟周期数。这个参数越小,则内存的速度越快。必须注意部分内存不能运行在较低的延迟,可能会丢失数据,因此在提醒大家把CAS延迟设为2或2.5的同时,如果不稳定就只有进一步提高它了。而且提高延迟能使内存运行在更高的频率,所以需要对内存超频时,应该试着提高CAS延迟。 该参数对内存性能的影响最大,在保证系统稳定性的前提下,CAS值越低,则会导致更快的内存读写操作。CL值为2为会获得最佳的性能,而CL值为3可以提高系统的稳定性。注意,WinbondBH-5/6芯片可能无法设为3。 RAS# to CAS# Delay(tRCD) 可选的设置:Auto, 0, 1, 2, 3, 4, 5, 6, 7. 该值就是“3-4-4-8”内存时序参数中的第2个参数,即第1个4。RAS# to CAS# Delay(也被描述为:tRCD、RAS to CAS Delay、Active to CMD),表示"行寻址到列寻址延迟时间",数值越小,性能越好。对内存进行读、写或刷新操作时,需要在这两种脉冲信号之间插入延迟时钟周期。在JEDEC规范中,它是排在第二的参数,降低此延时,可以提高系统性能。建议该值设置为3或2,但如果该值设置太低,同样会导致系统不稳定。该值为4时,系统将处于最稳定的状态,而该值为5,则太保守。 如果你的内存的超频性能不佳,则可将此值设为内存的默认值或尝试提高tRCD值。 Min RAS# Active Timing(tRAS) 可选的设置:Auto, 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15. 该值就是该值就是“3-4-4-8”内存时序参数中的最后一个参数,即8。Min RAS# Active Time (也被描述为:tRAS、Active to Precharge Delay、Row Active Time、Precharge Wait State、Row Active Delay、Row Precharge Delay、RAS Active Time),表示“内存行有效至预充电的最短周期”,调整这个参数需要结合具体情况而定,一般我们最好设在5-10之间。这个参数要根据实际情况而定,并不是说越大或越小就越好。 如果tRAS的周期太长,系统会因为无谓的等待而降低性能。降低tRAS周期,则会导致已被激活的行地址会更早的进入非激活状态。如果tRAS的周期太短,则可能因缺乏足够的时间而无法完成数据的突发传输,这样会引发丢失数据或损坏数据。该值一般设定为CAS latency + tRCD + 2个时钟周期。如果你的CAS latency的值为2,tRCD的值为3,则最佳的tRAS值应该设置为7个时钟周期。为提高系统性能,应尽可能降低tRAS的值,但如果发生内存错误或系统死机,则应该增大tRAS的值。 如果使用DFI的主板,则tRAS值建议使用00,或者5-10之间的值。 Row Precharge Timing(tRP) 可选的设置:Auto, 0, 1, 2, 3, 4, 5, 6, 7 该值就是“3-4-4-8”内存时序参数中的第3个参数,即第2个4。Row Precharge Timing (也被描述为:tRP、RAS Precharge、Precharge to active),表示"内存行地址控制器预充电时间",预充电参数越小则内存读写速度就越快。 tRP用来设定在另一行能被激活之前,RAS需要的充电时间。tRP参数设置太长会导致所有的行激活延迟过长,设为2可以减少预充电时间,从而更快地激活下一行。然而,想要把tRP设为2对大多数内存都是个很高的要求,可能会造成行激活之前的数据丢失,内存控制器不能顺利地完成读写操作。对于桌面计算机来说,推荐预充电参数的值设定为2个时钟周期,这是最佳的设置。如果比此值低,则会因为每次激活相邻紧接着的bank将需要1个时钟周期,这将影响DDR内存的读写性能,从而降低性能。只有在tRP值为2而出现系统不稳定的情况下,将此值设定为3个时钟周期。 如果使用DFI的主板,则tRP值建议2-5之间的值。值为2将获取最高的性能,该值为4将在超频时获取最佳的稳定性,同样的而该值为5,则太保守。大部分内存都无法使用2的值,需要超频才可以达到该参数。 Row Cycle Time(tRC) 可选的设置:Auto, 7-22,步幅值1。 Row Cycle Time (tRC、RC),表示“SDRAM行周期时间”,它是包括行单元预充电到激活在内的整个过程所需要的最小的时钟周期数。 其计算公式是:row cycle time (tRC) = minimum row active time (tRAS) + row precharge time (tRP)。因此,设置该参数之前,你应该明白你的tRAS值和tRP值是多少。如果tRC的时间过长,会因在完成整个时钟周期后激活新的地址而等待无谓的延时,而降低性能。然后一旦该值设置过小,在被激活的行单元被充分充电之前,新的周期就可以被初始化。在这种情况下,仍会导致数据丢失和损坏。因此,最好根据tRC = tRAS + tRP进行设置,如果你的内存模块的tRAS值是7个时钟周期,而tRP的值为4个时钟周期,则理想的tRC的值应当设置为11个时钟周期。 Row Refresh Cycle Time(tRFC) 可选的设置:Auto, 9-24,步幅值1。 Row Refresh Cycle Time (tRFC、RFC),表示"SDRAM行刷新周期时间",它是行单元刷新所需要的时钟周期数。该值也表示向相同的bank中的另一个行单元两次发送刷新指令(即:REF指令)之间的时间间隔。tRFC值越小越好,它比tRC的值要稍高一些。 如果使用DFI的主板,通常tRFC的值不能达到9,而10为最佳设置,17-19是内存超频建议值。建议从17开始依次递减来测试该值。大多数稳定值为tRC加上2-4个时钟周期。 Row to Row Delay(RAS to RAS delay)(tRRD) 可选的设置:Auto, 0-7,每级以1的步幅递增。 Row to Row Delay,也被称为RAS to RAS delay (tRRD),表示"行单元到行单元的延时"。该值也表示向相同的bank中的同一个行单元两次发送激活指令(即:REF指令)之间的时间间隔。tRRD值越小越好。 延迟越低,表示下一个bank能更快地被激活,进行读写操作。然而,由于需要一定量的数据,太短的延迟会引起连续数据膨胀。于桌面计算机来说,推荐tRRD值设定为2个时钟周期,这是最佳的设置,此时的数据膨胀可以忽视。如果比此值低,则会因为每次激活相邻紧接着的bank将需要1个时钟周期,这将影响DDR内存的读写性能,从而降低性能。只有在tRRD值为2而出现系统不稳定的情况下,将此值设定为3个时钟周期。 如果使用DFI的主板,则tRRD值为00是最佳性能参数,4超频内存时能达到最高的频率。通常2是最合适的值,00看上去很奇怪,但有人也能稳定运行在00-260MHz。 Write Recovery Time(tWR) 可选的设置:Auto, 2, 3。 Write Recovery Time (tWD),表示"写恢复延时"。该值说明在一个激活的bank中完成有效的写操作及预充电前,必须等待多少个时钟周期。这段必须的时钟周期用来确保在预充电发生前,写缓冲中的数据可以被写进内存单元中。同样的,过低的tWD虽然提高了系统性能,但可能导致数据还未被正确写入到内存单元中,就发生了预充电操作,会导致数据的丢失及损坏。 如果你使用的是DDR200和266的内存,建议将tWR值设为2;如果使用DDR333或DDR400,则将tWD值设为3。 如果使用DFI的主板,则tWR值建议为2。 Write to Read Delay(tWTR) 可选的设置:Auto, 1, 2。 Write to Read Delay (tWTR),表示"读到写延时"。三星公司称其为“TCDLR (last data in to read command)”,即最后的数据进入读指令。它设定向DDR内存模块中的同一个单元中,在最后一次有效的写操作和下一次读操作之间必须等待的时钟周期。 tWTR值为2在高时钟频率的情况下,降低了读性能,但提高了系统稳定性。这种情况下,也使得内存芯片运行于高速度下。换句话说,增加tWTR值,可以让内容模块运行于比其默认速度更快的速度下。如果使用DDR266或DDR333,则将tWTR值设为1;如果使用DDR400,则也可试着将tWTR的值设为1,如果系统不稳定,则改为2。 Refresh Period(tREF) 可选的设置:Auto, 0032-4708,其步进值非固定。 Refresh Period (tREF),表示“刷新周期”。它指内存模块的刷新周期。 先请看不同的参数在相同的内存下所对应的刷新周期(单位:微秒,即:一百万分之一秒)。?号在这里表示该刷新周期尚无对应的准确数据。 1552= 100mhz(?.??s) 如果采用Auto选项,主板BIOS将会查询内存上的一个很小的、名为“SPD”(Serial Presence Detect )的芯片。SPD存储了内存条的各种相关工作参数等信息,系统会自动根据SPD中的数据中最保守的设置来确定内存的运行参数。如过要追求最优的性能,则需手动设置刷新周期的参数。一般说来,15.6us适用于基于128兆位内存芯片的内存(即单颗容量为16MB的内存),而7.8us适用于基于256兆位内存芯片的内存(即单颗容量为32MB的内存)。注意,如果tREF刷新周期设置不当,将会导致内存单元丢失其数据。 另外根据其他的资料显示,内存存储每一个bit,都需要定期的刷新来充电。不及时充电会导致数据的丢失。DRAM实际上就是电容器,最小的存储单位是bit。阵列中的每个bit都能被随机地访问。但如果不充电,数据只能保存很短的时间。因此我们必须每隔15.6us就刷新一行。每次刷新时数据就被重写一次。正是这个原因DRAM也被称为非永久性存储器。一般通过同步的RAS-only的刷新方法(行刷新),每行每行的依次刷新。早期的EDO内存每刷新一行耗费15.6us的时间。因此一个2Kb的内存每列的刷新时间为15.6?s x2048行=32ms。 Write CAS# Latency(tWCL) 可选的设置:Auto, 1-8 Write CAS Latency (tWCL),表示“写指令到行地址控制器延时”。SDRAM内存是随机访问的,这意味着内存控制器可以把数据写入任意的物理地址,大多数情况下,数据通常写入距离当前列地址最近的页面。tWCL表示写入的延迟,除了DDRII,一般可以设为1T,这个参数和大家熟悉的tCL(CAS-Latency)是相对的,tCL表示读的延迟。 DRAM Bank Interleave 可选的设置:Enable, Disable DRAM Bank Interleave,表示“DRAM Bank交错”。这个设置用来控制是否启用内存交错式(interleave)模式。Interleave模式允许内存bank改变刷新和访问周期。一个bank在刷新的同时另一个bank可能正在访问。最近的实验表明,由于所有的内存bank的刷新周期都是交叉排列的,这样会产生一种流水线效应。虽然interleave模式只有在不同bank提出连续的的寻址请求时才会起作用,如果处于同一bank,数据处理时和不开启interleave一样。CPU必须等待第一个数据处理结束和内存bank的刷新,这样才能发送另一个地址。目前所有的内存都支持interleave模式,在可能的情况下我们建议打开此项功能。 对于DFI主板来说,任何情况下该设置都应该是Enable,可以增大内存的带宽。Disable对将减少内存的带宽,但使系统更加稳定。 DQS Skew Control 可选的设置:Auto, Increase Skew, Decrease Skew DQS Skew Control,表示“DQS时间差控制”。稳定的电压可以使内存达到更高的频率,电压浮动会引起较大的时间差(skew),加强控制力可以减少skew,但相应的DQS(数据控制信号)上升和下降的边缘会出现电压过高或过低。一个额外的问题是高频信号会引起追踪延迟。DDR内存的解决方法是通过简单数据选通脉冲来增加时钟推进。DDRII引进了更先进的技术:双向的微分I/O缓存器来组成DQS。微分表示用一个简单脉冲信号和一个参考点来测量信号,而并非信号之间相互比较。理论上提升和下降信号应该是完全对成的,但事实并非如此。时钟和数据的失谐就产生了DQ-DQS skew。 如下图所示。 对于DFI主板来说,建议设置为Increase Skew可以提升性能,而Decrease Skew在牺牲一定性能的情况下,可以增加稳定性。 DQS Skew Value 可选的设置:Auto, 0-255, 步进值为1。 当我们开启了DQS skew control后,该选项用来设定增加或减少的数值。这个参数对系统的影响并不很敏感。 对于DFI主板来说,开启"Increase Skew"选项后,可以将该值设为50-255之间的值。值越大,表示速度越快。 DRAM Drive Strength 可选的设置:Auto, 1-8 ,步进值为1。 DRAM Drive Strength(也被称为:driving strength),表示“DRAM驱动强度”。这个参数用来控制内存数据总线的信号强度,数值越高代表信号强度越高,增加信号强度可以提高超频的稳定性。但是并非信号强度高就一定好,三星的TCCD内存芯片在低强度信号下性能更佳。 如果设为Auto,系统通常会设定为一个较低的值。对使用TCCD的芯片而言,表现会好一些。但是其他的内存芯片就并非如此了,根据在DFI NF4主板上调试和测试的结果,1、3、5 、7都是性能较弱的参数,其中1是最弱的。2、4、6、8是正常的设置,8提供了最强的信号强度。TCCD建议参数为3、5或7,其他芯片的内存建议设为6或8。 DFI用户建议设置:TCCD建议参数为3、5、7,其他芯片的内存建议设为6或8。 DRAM Data Drive Strength 可选的设置:Auto, 1-4 ,步进值为1。 DRAM Data Drive Strength表示“DRAM数据驱动强度”。这个参数决定内存数据总线的信号强度,数值越高代表信号强度越高。它主要用于处理高负荷的内存读取时,增加DRAM的驾驭能力。因此,如果你的系统内存的读取负荷很高,则应将该值设置为高(Hi/High)。它有助于对内存数据总线超频。但如果你并没有超频,提升内存数据线的信号强度,可以提高超频后速度的稳定性。此外,提升内存数据总线的信号强度并不能增强SDRAM DIMM的性能。因此,除非你内存有很高的读取负荷或试图超频DIMM,建议设置DRAM Data Drive Strength的值为低(Lo/Low)。 要处理大负荷的数据流时,需要提高内存的驾驭能力,你可以设为Hi或者High。超频时,调高此项参数可以提高稳定性。此外,这个参数对内存性能几乎没什么影响。所以,除非超频,一般用户建议设为Lo/Low。 DFI用户建议设置:普通用户建议使用level 1或3,如果开启了CPC,可能任何高于1的参数都会不稳定。部分用户开启CPC后能运行在3。更多的人关闭CPC后2-4都能够稳定运行。当然最理想的参数是开启CPC后设为level4。 Strength Max Async Latency 可选的设置:Auto, 0-15 ,步进值为1。 Strength Max Async Latency目前还没能找到任何关于此项参数的说明,不知道其功能。感觉网友的经验,在进行Everest的LatencyTest时,可以看出一些差别。在我的BH-6上,参数从8ns到7ns在Latency Test的测试结果中有1ns的区别。从7ns调低6ns后,测试结果又减少了2ns。 DFI主板建议设置:BIOS中的默认值为7ns,建议大家在5-10之间调节。6ns对内存的要求就比较高了,建议使用BH-5和UTT芯片的用户可以尝试一下,但对TCCD不适用。7ns的要求低一些,UTT和BH-5设为7n比较适合超频。8ns对UTT和BH-5就是小菜一碟,8ns时TCCD通常能稳定运行在DDR600,如果想超频到DDR640就必须设为9ns甚至更高了。 Read Preamble Time 可选的设置:Auto, 2.0-9.5,步进值为0.5。 Read Preamble Time这个参数表示DQS(数据控制信号)返回后,DQS又被开启时的时间间隔。Samsung早期的显存资料显示,这个参数是用以提升性能的。DQS信号是双向的,无论从图形控制器到DDR SGRAM还是从DDR SGRAM到图形控制器都起作用。 DFI主板建议设置:BIOS中的该值设置为Auto时,实际上此时执行的是默认值5.0。建议大家在4.0-7.0之间调节,该值越小越好。 Idle Cycle Limit 可选的设置:Auto,0-256,无固定步进值。 Idle Cycle Limit这个参数表示“空闲周期限制”。这个参数指定强制关闭一个也打开的内存页面之前的memclock数值,也就是读取一个内存页面之前,强制对该页面进行重充电操作所允许的最大时间。 DFI主板建议设置:BIOS中的该值设置为Auto时,实际上此时执行的是默认值256。质量好的内存可以尝试16-32,华邦(WINBOND)BH-5颗粒的产品能稳定运行在16。Idle Cycle Limit值越低越好。 Dynamic Counter 可选的设置:Auto, Enable, Disable。 Dynamic Counter这个参数表示“动态计数器”。这个参数指定开启还是关闭动态空闲周期计数器。如果选择开启(Enable),则会每次进入内存页表(Page Table)就强制根据页面冲突和页面错误(conflict/page miss:PC/PM)之间通信量的比率而动态调整Idle Cycle Limit的值。这个参数和前一个Idle Cycle Limit是密切相关的,启用后会屏蔽掉当前的Idle Cycle Limit,并且根据冲突的发生来动态调节。 DFI主板建议设置:BIOS中的该值设置为Auto和关闭和一样的。打开该设置可能会提升性能,而关闭该设置,可以使系统的更稳定。 R/W Queue Bypass 可选的设置:Auto, 2x, 4x, 8x, 16x。 R/W Queue Bypass表示“读/写队列忽略”。这个参数指定在优化器被重写及DCI (设备控制接口:Device Control Interface)最后一次的操作被选定前,忽略操作DCI的读/写队列的时间。这个参数和前一个Idle Cycle Limit是相类似,只是优化器影响内存中的读/写队列。 DFI主板建议设置:BIOS中的该值默认为16x。如果你的系统稳定,则保留该值。但如果不稳定,或者要超频,就只有降低到8x甚至更低的4x或2x。该值越大,则说明系统性能越强,该值越小,则会是系统越稳定。 Bypass Max 可选的设置:Auto, 0x-7x, 步进值为1。 Bypass Max表示“最大忽略时间”。这个参数表示优化器选择否决之前,最后进入DCQ(Dependence Chain Queue)的可以被优化器忽略的时间。仔细研究后,我觉得这个参数会影响内存到CPU内存控制器的连接。 DFI主板建议设置:BIOS中的该值默认为7x。建议4x或7x,两者都提供了很好的性能及稳定性。如果你的系统稳定,则保留该值。但如果不稳定,或者要超频,就只有降低到8x甚至更低的4x或2x。该值越大,则说明系统性能越强,该值越小,则会是系统越稳定。 可选的设置:Auto, Disable (8burst), Enable (4burst)。 32 Byte Granulation表示"32位颗粒化"。当该参数设置为关闭(Disable)时,就可以选择突发计数器,并在32位的数据存取的情况下,最优化数据总线带宽。因此该参数关闭后可以达到最佳性能的目的。 DFI主板建议设置:绝大多数情况下,建议选择Disable(8burst)选项。开启Enable (4burst)可以使系统更稳定一些。 第三部分 超强的内存芯片 上述参数的设置不可能适用于每位用户。不同的内存芯片的电压、参数都不同,所以超频能力也不一样。下面给出超频能力很强的一些内存芯片,建议大家在选购时多加以留意。 Winbond(华邦)系列颗粒::BH-5、CH-5、BH-6、CH-6 、UTT; 03/01/2006 主流Blog软件的完全比较这里是一份对目前8种主流Blog软件的详细比较,当你无法决定哪个Blog服务最适合你的时候,这个表格无疑会起到很大帮助。 http://www.ojr.org/ojr/images/blog_software_comparison.cfm
Blog software comparison chartThis chart is a companion to the article "Time to check: Are you using the right blogging tool?," published July 14, 2005 in the USC Annenberg Online Journalism Review. Do note that this chart reflects only standard features of the tools' installation, and not every possible extension, plug-in modification... or hack.
©2005 Online Journalism Review. 30/12/2005 服务器内存
26/12/2005 故乡的雁 括弧 此雁非彼燕 括弧完阴历十一月初三,阴。大风,晨起即生,至晚不休 十一月初四,晴。碧空万里,无片丝云。一扫前些日满天阴郁 至午时分,闻北天嘎嘎雁鸣。屋外有人大呼“雁。。。雁。。。好多。。。雁。。。快来”。急奔出外,见漫天飞鸿,浩浩荡由北而至,遍布上空。成群结队,数千有余。目之所及,尽皆如是。并行不悖,井然有序。褐翼白肚,振翅翱翔,形态优雅。亦飞亦鸣,眼耳皆悦。至今仅只此次耳,深恐此行留憾,遂操相机拍之(不是我 08/12/2005 2005岁末BLOG程序大评点ASP L-Blog: http://www.loveyuki.com oblog: http://www.oioj.net SLblog:http://SLblog.com Misslog: http://www.misslog.com/blog LBS: http://www.voidland.com/blog Z-Blog: http://www.rainbowsoft.org/zblog/ PJBlog: http://www.pjhome.net/ Alpar's Blog: http://blog.fz0132.com nblog: http://blog.nowans.com/ 2s-space:http://www.2s-space.com d2kblog: http://www.d2ksoft.com/ KeeBlogSystem: http://keesky.com/blog/ ASP.NET .Text: http://scottwater.com/Dottext/default.aspx BlogX: http://www.simplegeek.com/CategoryView.aspx/BlogX dasBlog: http://www.dasblog.net PHP Okphp BLOG: http://cn.okphp.com/ BlogHoster: http://www.webligo.com exBlog: http://www.exblog.net/ Pixelpost PhotoBlog: http://www.pixelpost.org/ bMachine: http://boastology.com 7log: http://www.7log.com O-blog: http://www.phpblog.cn/ pigface blog: http://www.flashforweb.com/ bo-blog: http://www.bo-blog.com/ C-Blog: http://www.saysay.cn SaBlog: http://www.4ngel.net/blog/angel/ Simple PHP Blog: http://www.simplephpblog.com/ yo2blog: http://www.oneoo.com/ sBLOG: http://www.sblog.cn/ b2: http://www.cafelog.com php b2evolution: http://www.b2evolution.net wordpress: http://www.wordpress.org pivot: http://www.pivotlog.net nucleus: http://www.nucleuscms.org M-logger: http://miracle.shakeme.net drupal: http://www.drupal.org Pmschine: http://www.pmachine.com bBlog: http://dev.bblog.com/ serendipity: http://www.s9y.org Plog http://www.plogworld.net Plainslash: http://www.51zhao.com/plainslash/ TatterTools PHP/MYSQL CGI movable Type: http://www.movabletype.org Greymatter: http://www.noahgrey.com/greysoft/ HUS Reviv: http://supermanc.51.net/norman/blog.cgi Blosxom: http://www.blosxom.com JSP Roller:http://www.rollerweblogger.org/page/project DLOG4J: http://dlog4j.sourceforge.net/ TM: http://www.terac.com 28/10/2005 注解高端UNIX服务器之技术注解高端UNIX服务器之技术 作 者: 陈志红、海纳 转载自:赛迪网技术天地 对于服务器而言(不管是PC服务器,还是UNIX服务器),单纯地提高单个处理器的运算能力和处理能力正在变得越来越难,虽然许多制造商从材料、工艺和设计等方面进行了不懈的努力,近期内仍然使得CPU保持着高速的增长势态,但高频之下的高功耗所引起的电池容量问题和散热问题等负面效应,以及这些负面效应对整机系统产生的电磁兼容性问题,又反过来将CPU运算能力的提升推到了暮年。显然,提高单个处理器速度和性能已是强弩之末,而研发多个 CPU的并行处理技术,才是真正提高现代服务器处理能力和运算速度的有效途径。这也正是多处理器服务器不仅是UNIX服务器的专利,而且也是已经在PC服务器中普遍采用的原因。目前,业界比较关注的并行处理技术主要有SMP技术、MPP技术、COMA技术、集群技术和NUMA技术等。 1.SMP技术 在非对称多处理系统中,任务和资源由不同处理器进行管理,有的CPU只处理I/O,有的CPU只处理操作系统的提交任务,显然非对称多处理系统是不能实现负载均衡的。在对称多处理系统中,系统资源被系统中所有CPU共享,工作负载能够均匀地分配到所有可用处理器之上。 目前,大多数SMP系统的CPU是通过共享系统总线来存取数据,实现对称多处理的。如某些RISC服务器厂商使用Crossbar或Switch方式连接多个CPU,虽然性能和可扩展性优于Intel架构,但SMP的扩展性仍有限。 在SMP系统中增加更多处理器的难点是系统不得不消耗资源来支持处理器抢占内存,以及内存同步两个主要问题。抢占内存是指当多个处理器共同访问内存中的数据时,它们并不能同时去读写数据,虽然一个CPU正读一段数据时,其他CPU可以读这段数据,但当一个CPU正在修改某段数据时,该 CPU将会锁定这段数据,其他CPU要操作这段数据就必须等待。 显然,CPU越多,这样的等待问题就越严重,系统性能不仅无法提升,甚至下降。为了尽可能地增加更多的CPU,现在的SMP系统基本上都采用增大服务器Cache容量的方法来减少抢占内存问题,因为Cache是CPU的“本地内存”,它与CPU之间的数据交换速度远远高于内存总线速度。又由于Cache支持不共享,这样就不会出现多个CPU抢占同一段内存资源的问题了,许多数据操作就可以在CPU内置的Cache或CPU外置的 Cache中顺利完成。 然而,Cache的作用虽然解决了SMP系统中的抢占内存问题,但又引起了另一个较难解决的所谓“内存同步”问题。在SMP系统中,各CPU通过Cache访问内存数据时,要求系统必须经常保持内存中的数据与Cache中的数据一致,若Cache的内容更新了,内存中的内容也应该相应更新,否则就会影响系统数据的一致性。由于每次更新都需要占用CPU,还要锁定内存中被更新的字段,而且更新频率过高又必然影响系统性能,更新间隔过长也有可能导致因交叉读写而引起数据错误,因此,SMP的更新算法十分重要。目前的SMP系统多采用侦听算法来保证CPU Cache中的数据与内存保持一致。Cache越大,抢占内存再现的概率就越小,同时由于Cache的数据传输速度高,Cache的增大还提高了CPU的运算效率,但系统保持内存同步的难度也很大。 在硬件方面,SMP可以在UltraSPARC、SPARCserver、Alpha以及PowerPC架构上实现,也可以利用包括486以上所有Intel芯片来实现。 2.集群技术 常见集群技术有: (1)服务器镜像技术 (2)应用程序错误接管集群技术 错误接管集群技术是将建立在同一个网络里的两台或多台服务器通过集群技术连接起来,集群节点中的每台服务器各自运行不同的应用,具有自己的广播地址,对前端用户提供服务,同时每台服务器又监测其他服务器的运行状态,为指定服务器提供热备份服务。 错误接管集群技术通常需要共享外部存储设备—磁盘阵列柜,两台或多台服务器通过SCSI电缆或光纤与磁盘阵列柜相连,数据都存放在磁盘阵列柜上。这种集群系统中通常是两个节点互为备份的,而不是几台服务器同时为一台服务器备份,集群系统中的节点通过串口、共享磁盘分区或内部网络来互相监测对方的心跳。 错误接管集群技术经常用在数据库服务器、MAIL服务器等的集群中。这种集群技术由于采用共享存储设备,所以增加了外设费用。它最多可以实现32台机器的集群,极大地提高了系统的可用性及可扩展性。目前在提高系统的可用性方面用得比较广泛的是应用程序错误接管技术,即我们通常所采用的双机通过SCSI电缆共享磁盘阵列的集群技术。 (3)容错集群技术 容错集群技术的一个典型的应用即容错机,在容错机中,每一个部件都具有冗余设计。容错集群技术的实现往往需要特殊的软硬件设计,因此成本很高,但是容错系统最大限度地提高了系统的可用性,是财政、金融和安全部门的最佳选择。 3.NUMA技术 对称多处理也是一种共享存储器的多处理机结构。它的单一寻址空间、简单的编程方式、操作方便是其容易普及的主要原因。大规模并行处理(MPP)属于集群系统这一类体系结构,它的优势是可扩展性好,但需要并行编程和并行编译,使用不便。NUMA系统把SMP与集群的优势结合在一起,它既有SMP的可编程性,又具有集群的可扩展性。实际上,这一“优势的结合”实为一种折衷,其中关键是寻求结合的途径并确定结合点。 NUMA3系统架构的由来 第三代NUMA系统采用不同的功能模块(Brick)构成,这些模块比第二代NUMA机的模块小,功能更专一、更具可扩展性,而且尺寸标准化,这就进一步增加了系统的灵活性。 在第三代NUMA服务器中,采用性能更好的交叉开关Bedrock,所有的处理器和存储器通过Bedrock连接在一起。这些处理器、存储器和交叉开关的结合组成了称为NUMAlink的互联结构。另外,在第三代NUMA服务器中采用了更先进的路由芯片,通过使用特殊的光缆提供具有高带宽和极低延迟的互联网络,路由芯片所有的Bedrock交叉开关连接起来形成一个单一的、连续的达1TB的存储空间。处理器和本地以及远程存储器之间的通信宽带(双向)由原来的1.6GBps提高到3.2GBps。另外,电源采用N+1的冗余方式,因此可靠性也进一步提高。 在NUMA体系结构中,每个处理器与自已的本地存储器和高速缓存相连,多个处理器通过处理器、存储器互联网络相连。处理器还通过处理器、I/O网络访问共享的I/O和外围设备。至于处理器之间的通信则通过可选的处理器之间的通信网络来实现。NMUA技术在科学与工程计算领域具有不可替代的地位,在联机事务处理(OLTP)、决策支持服务(DSS)和Intranet以及Internet中的地位也越来越重要。目前,NUMA并行机的处理器数目可达到512个,且带宽可随处理器数目基本上呈线性扩展。这样大的处理器数,使单一系统映像的NUMA机足以覆盖绝大多数的应用。首先,由于它具有与SMP相同的编程模式,因此在科学与工程计算领域具有不可替代的地位;其次,由于它具有共享内存和良好的可扩展性优势,所以能很好适应企业数据中心的多种应用。 今天,NUMA系统能够运行世界上一些最大的UNIX数据库应用,而且正被广泛接受为电子商务的主流技术,包括处理功能、I/O的大规模可扩展性、高可用性、工作负荷和资源管理的广泛灵活性,而且无需改变SMP编程模型。 存储一致性与ccNUMA 在ccNUMA系统中,每个CPU有一个私用高速缓冲存储器。为了得到较好的性能,CPU经常在它的高速缓存中取指令及存储数据。在这种系统中,一个存储器地址的内容可以有许多独立的拷贝给各个CPU。如果每个CPU指向同一个存储器地址,则每个CPU的高速缓存将得到该地址的内容拷贝。但是当一个CPU修改该地址的内容后,必须阻止其他各个CPU使用当前已经“过时”的数据,这就是所谓高速缓存一致性问题。那么如何保证所有高速缓存能反映存储器的真实情况呢? 高速缓存一致性不是用软件来实现,它必须用硬件来管理。高速缓存一致性问题也不是用CPU来实现,而是用Hub芯片中的部分辅助线路来实现。为了提高系统的带宽和规模可伸缩性,在采用ccNUMA体系结构的服务器中,不采用基于总线的广播方法,而是采用基于目录的高速缓存一致性方案。任何时候,当一个节点请求访问存储器中某一Cache行时,它的集线器就启动曾经访问过该行节点的高速缓存,并把Cache行的存储器数据拷贝到这一节点的高速缓存中。当存储器中的Cache行未被独占时,其他各节点就可按同样方式通过互联网络从高速缓存中读取该行数据。当一个CPU要修改一个 Cache行时,它必须取得独占权。为此,集线器从目标行的状态位中进行检索,并发送一个无效信息给对该行数据作过拷贝的每个节点,在目录存储器中设置了对内容作修改的节点的编号。当一个CPU要读一个Cache行,且该行被独占时,集线器就要求该节点对这个Cache行作拷贝。其他节点则通过互联网络从拥有独占权节点的高速缓存中拷贝该Cache行的最新信息。如果两个节点要求同时访问某一Cache行时,则有协议来保证某个节点去访问该Cache行。 ccNUMA结构的服务器在性能、灵活性、可用性方面都能适合用户多种应用的要求,它已成为当今互联网经济时代非常卓越的 Internet/Web服务器,特别是在宽带因特网中作为多媒体应用的核心服务器。与集群不同的是,集群采用一种松散的结合方式,在几台机器之间相互通信,内部交换时间长、消耗大,而且把几台机器作为一个系统管理,势必增加了管理上的难度。而ccNUMA计算机则不同,无论它内部有多少个处理器,对用户来说,它也仅仅是简单的一台计算机。 总而言之,ccNUMA克服了SMP和集群的某些弊端,在他们不能施展才能的地方发挥了作用。 模块化结构 模块化服务器的最大好处之一,就是可以保护客户的投资。模块化服务器是一种可伸缩的服务器,客户可以随着业务需要,通过向服务器中添加各种模块,扩展他们的服务器系统;另一个显著优点是维护管理十分方便。模块化服务器增强了系统的可用性和容错性。从高性能多处理器计算机体系结构观点来看,ccNUMA体系结构,把多个处理器通过路由器光纤互联在一起,系统带宽可随系统规模扩大而增加,从而克服了基于总线的SMP体系结构所造成的瓶颈。 ccNUMA结构采用超立方体的多维互联特性,加上模块化计算所带来的灵活性,使系统的可伸缩性达到了前所未有的水平,同时节省了费用。因此,模块化的 NUMA服务器在灵活性和经济性方面达到了一个新境界。 硬件分区 长久以来一直存在着一个话题:UNIX服务器能否替代专有系统。这同样是一个见仁见智的问题,但是不容忽视的事实是,各UNIX厂商在高端产品不断推陈出新,增加产品的技术内涵,既以达到并超过大型主机为目标,又作为自己UNIX技术的集中体现,与其他UNIX厂商竞争。 当然, UNIX技术的发展决不能仅限于性能和功能上。在安全性和管理性上,UNIX服务器有不少需要向主机学习的地方。但是,高端UNIX系统已经基本可以满足主机用户的要求,并且在各厂家的推动下更快地进步。UNIX占据主机的部分市场也将是不可避免的。这就和NT服务器和低端UNIX服务器的竞争有些类似。 随着市场竞争的日益加剧和IT企业的大规模兼并,曾经出现的几十家UNIX厂商竞相角逐的景象已不复存在。目前仅剩下几家UNIX厂商,他们把持了UNIX服务器的市场和技术发展趋势。下面我们就看看几款有代表性的产品。 HP 9000 Superdome高端UNIX服务器 Superdome服务器主要面向大型互联网企业、互联网服务提供商,以及开发电子商务战略,需要处理大量数据的企业。 Superdome是惠普公司在继V系列之后推出的第一款支持64个及可无限扩展微处理器的服务器,可以同时支持PA-RISC和 IA64处理器。64个CPU的一款可支持256GB内存,I/O插槽最多可达192个。Superdome提前做好了开放系统的集成工作,可在同一台系统上分区,运行HP UX-11i、Linux、MPE和Windows NT;性能可以通过硬件物理分区、多级分区、软件虚拟分区和综合动态分区等功能获得提高。惠普为Superdome制定了全新的销售定价方式和服务模式- “全面客户服务模式”。Superdome的客户将得到惠普公司的全套解决方案,使客户在系统革新、建设、运行和发展升级四个使用阶段中都能全程享受到惠普提供的支持服务。 IBM p系列680服务器
680中配备的微处理器采用了绝缘硅(SOI)技术。该技术通过在芯片电路上涂上一层绝缘体,降低了电流发热。芯片热度的降低不仅可以提高运行速度,还可以减少运行错误,或系统崩溃的机率。680配备的CPU运行频率为600MHz,每一枚微处理器的缓存容量为16MB,系统内存容量为 96GB,SMP配置最多可达4个6路处理器模块。 Sun Enterprise 10000服务器 Sun Enterprise 10000运行在Solaris操作环境下,对于基于主机的或客户机/服务器的各类应用,如在线交易处理、决策支持系统、数据仓库、通信服务或多媒体服务等,它都是理想的通用服务器或数据服务器。 Sun E10000脱胎于CRAY的CS6400,是第一个具有硬件分区(Hard Partition)功能的UNIX高端服务器,同时也是第一个达到64路SMP计算的UNIX单机。它采用Sun UltraSPARCII 400MHz处理器,最多可配置64个CPU,最大内存容量为64GB,可以实现最多16个分区(或称为域),在线磁盘存储容量可达64TB,具有动态重组特性(可提供在线服务能力)和动态系统域特性。通过在系统的核心部位采用Gigaplane-XB互连,提供的数据带宽可达到每秒12.8GB。 SGI Origin 3000服务器 SGI Origin 3000高性能服务器新产品采用SGI NUMAflex结构,即SGI新型模块化计算结构或称为第三代NUMA架构。SGI 3000服务器可以从两个64位的MIPS RISC CPU的最低配置扩展到512个CPU的共享存储的多处理器系统。另外,SGI的InfiniteReality3图形子系统也可以集成到该结构中。 第三代NUMA服务器采用模块化设计,7种基本模块分别是CPU扩展模块、磁盘存储器扩展模块、基本的I/O模块、PCI扩展模块、路由器互联模块、XIO扩展模块和图形扩展模块。模块化设计使系统配置更加灵活,更加经济高效,并具有很高的容错性和系统扩充性,能为客户提供可靠的总体投资保护和卓越的性能。 30/09/2005 计算机科学与技术领域常用中文电子信息资源举要
06/09/2005 硬盘的相关参数分析与常见误区硬盘的相关参数分析与常见误区类型:原创 作者:中关村在线 日期:2004-05-28 17:34:20 硬盘的主要技术指标 在我们平时选购硬盘时,经常会了解硬盘的一些参数,而且很多杂志的相关文章也对此进行了不少的解释。不过,很多情况下,这种介绍并不细致甚至会带有一些误导的成分。今天,我们就聊聊这方面的话题,希望能对硬盘选购者提供应有的帮助。 首先,我们来了解一下硬盘的内部结构,它将有助于理解本文的相关内容。
工作时,磁盘在中轴马达的带动下,高速旋转,而磁头臂在音圈马达的控制下,在磁盘上方进行径向的移动进行寻址 硬盘常见的技术指标有以下几种: 1、 每分钟转速(RPM,Revolutions Per Minute):这一指标代表了硬盘主轴马达(带动磁盘)的转速,比如5400RPM就代表该硬盘中的主轴转速为每分钟5400转。 2、 平均寻道时间(Average Seek Time):如果没有特殊说明一般指读取时的寻道时间,单位为ms(毫秒)。这一指标的含义是指硬盘接到读/写指令后到磁头移到指定的磁道(应该是柱面,但对于具体磁头来说就是磁道)上方所需要的平均时间。除了平均寻道时间外,还有道间寻道时间(Track to Track或Cylinder Switch Time)与全程寻道时间(Full Track或Full Stroke),前者是指磁头从当前磁道上方移至相邻磁道上方所需的时间,后者是指磁头从最外(或最内)圈磁道上方移至最内(或最外)圈磁道上方所需的时间,基本上比平均寻道时间多一倍。出于实际的工作情况,我们一般只关心平均寻道时间。 3、 平均潜伏期(Average Latency):这一指标是指当磁头移动到指定磁道后,要等多长时间指定的读/写扇区会移动到磁头下方(盘片是旋转的),盘片转得越快,潜伏期越短。平均潜伏期是指磁盘转动半圈所用的时间。显然,同一转速的硬盘的平均潜伏期是固定的。7200RPM时约为4.167ms,5400RPM时约为5.556ms。 4、 平均访问时间(Average Access Time):又称平均存取时间,一般在厂商公布的规格中不会提供,这一般是测试成绩中的一项,其含义是指从读/写指令发出到第一笔数据读/写时所用的平均时间,包括了平均寻道时间、平均潜伏期与相关的内务操作时间(如指令处理),由于内务操作时间一般很短(一般在0.2ms左右),可忽略不计,所以平均访问时间可近似等于平均寻道时间+平均潜伏期,因而又称平均寻址时间。如果一个5400RPM硬盘的平均寻道时间是9ms,那么理论上它的平均访问时间就是14.556ms。 5、 数据传输率(DTR ,Data Transfer Rate):单位为MB/s(兆字节每秒,又称MBPS)或Mbits/s(兆位每秒,又称Mbps)。DTR分为最大(Maximum)与持续(Sustained)两个指标,根据数据交接方的不同又分外部与内部数据传输率。内部DTR是指磁头与缓冲区之间的数据传输率,外部DTR是指缓冲区与主机(即内存)之间的数据传输率。外部DTR上限取决于硬盘的接口,目前流行的Ultra ATA-100接口即代表外部DTR最高理论值可达100MB/s,持续DTR则要看内部持续DTR的水平。内部DTR则是硬盘的真正数据传输能力,为充分发挥内部DTR,外部DTR理论值都会比内部DTR高,但内部DTR决定了外部DTR的实际表现。由于磁盘中最外圈的磁道最长,可以让磁头在单位时间内比内圈的磁道划过更多的扇区,所以磁头在最外圈时内部DTR最大,在最内圈时内部DTR最小。 6、 缓冲区容量(Buffer Size):很多人也称之为缓存(Cache)容量,单位为MB。在一些厂商资料中还被写作Cache Buffer。缓冲区的基本要作用是平衡内部与外部的DTR。为了减少主机的等待时间,硬盘会将读取的资料先存入缓冲区,等全部读完或缓冲区填满后再以接口速率快速向主机发送。随着技术的发展,厂商们后来为SCSI硬盘缓冲区增加了缓存功能(这也是为什么笔者仍然坚持说其是缓冲区的原因)。这主要体现在三个方面:预取(Prefetch),实验表明在典型情况下,至少50%的读取操作是连续读取。预取功能简单地说就是硬盘“私自”扩大读取范围,在缓冲区向主机发送指定扇区数据(即磁头已经读完指定扇区)之后,磁头接着读取相邻的若干个扇区数据并送入缓冲区,如果后面的读操作正好指向已预取的相邻扇区,即从缓冲区中读取而不用磁头再寻址,提高了访问速度。写缓存(Write Cache),通常情况下在写入操作时,也是先将数据写入缓冲区再发送到磁头,等磁头写入完毕后再报告主机写入完毕,主机才开始处理下一任务。具备写缓存的硬盘则在数据写入缓区后即向主机报告写入完毕,让主机提前“解放”处理其他事务(剩下的磁头写入操作主机不用等待),提高了整体效率。为了进一步提高效能,现在的厂商基本都应用了分段式缓存技术(Multiple Segment Cache),将缓冲区划分成多个小块,存储不同的写入数据,而不必为小数据浪费整个缓冲区空间,同时还可以等所有段写满后统一写入,性能更好。读缓存(Read Cache),将读取过的数据暂时保存在缓冲区中,如果主机再次需要时可直接从缓冲区提供,加快速度。读缓存同样也可以利用分段技术,存储多个互不相干的数据块,缓存多个已读数据,进一步提高缓存命中率。
这是我们经常能看到的硬盘参数指标,正确理解它们的含义无疑对选购是有帮助的 7、 噪音与温度(Noise & Temperature):这两个属于非性能指标。对于噪音,以前厂商们并不在意,但从2000年开始,出于市场的需要(比如OEM厂商希望生产更安静的电脑以增加卖点)厂商通过各种手段来降低硬盘的工作噪音,ATA-5规范第三版也加入了自动声学(噪音)管理子集(AAM,Automatic Acoustic Management),因此目前的所有新硬盘都支持AAM功能。硬盘的噪音主要来源于主轴马达与音圈马达,降噪也是从这两点入手(盘片的增多也会增加噪音,但这没有办法)。除了AAM外,厂商的努力在上文的厂商介绍中已经讲到,在此就不多说了。至于热量,其实每个厂商都有自己的标准,并声称硬盘的表现是他们预料之中的,完全在安全范围之内,没有问题。这一点倒的是不用担心,不过关键在于硬盘是机箱中的一个组成部分,它的高热会提高机箱的整体温度,也许硬盘本身没事,但可能周围的配件却经受不了,别的不说,如果是两个高热的硬盘安装得很紧密,那么它还能承受近乎于双倍的热量吗?所以硬盘的热量仍需厂商们注意。 对硬盘认识的常见误区(一) 1、 转速与寻道时间: 现在不少人都认为硬盘转速越快寻道时间就越快,但这是最常见的错误认识,事实上寻道速度根本不决定于转速,因为两者的控制设备就不一样。转速是由主轴马达控制,寻道则由音圈马达控制。寻道时间说白了就是体现了磁头臂径向运动的速度与控制能力,音圈马达与相应的伺服系统起着重要作用。另外,磁头的高灵敏度也有助于在高密度磁盘上准确捕获伺服标记,进而快速定位。很多情况下,我们都可以看到5400RPM硬盘的寻道时间与7200RPM硬盘一样(如三星的V40与P40)。之所以有些高速硬盘(如SCSI硬盘)的寻道时间更快,是因为厂商的有意设计,就好像一台Pentium4电脑只配32MB内存让人觉得不平衡一样,厂商也会给高速硬盘配上更快的寻道时间(也意味着更好的元件与更高的成本,显然厂商要根据市场的需要权衡利弊)。实际上,通过上文有关平均访问时间的解释,大家应该明白,提高转速的主用意就是减少平均潜伏期,进而加快整体的访问速度,也许很多人不认同这是它最重要的用意,由此就又引出了下一个误区。 2、 转速与数据传输率: 在很多人的印象和厂商的宣传中,更高的转速的主要用意在于提高数据传输率,但这并不正确。持续数据传输率决定于很多指标,并不光只是转速。当然,有人会说转速更高,磁头单位时间划过的扇区就越多,不错,但前提是线密度一样。线密度可理解为每磁道扇区数(SPT,Sectors Per Track)。低速硬盘完全可以通过提高SPT来加大数据传输率, SCSI硬盘就是追求SPT的典型。事实上,很多厂商在相同单碟容量上对于不同的转速采用了不同的SPT设计,如金钻七的最外圈磁道扇区数为837个,而星钻三代则为896个。有人可能会问,那如何保证容量一致呢?这就涉及到每英寸磁道数(TPI,Tracks Per Inch),它代表了磁道密度。SPT高则TPI就会相应减少,如金钻七为60000TPI,星钻三代则是57000TPI。本次测试最典型的例子是Caviar系列硬盘,WinBench测得的数据传输率与某些7200RPM产品相当。虽然我没有该系列硬盘最外圈SPT资料,但肯定不会低于1000(若转速实为5400RPM),即使转速真的是6000RPM,也在900之上。因此5400RPM硬盘完全可以通过提高33%(7200RPM比5400RPM转速高33%)的SPT来得到相同的数据传输率。 综上所述,7200RPM相对于5400RPM硬盘的最大优势就在于更短的平均潜伏期,进而减少平均访问时间。毕竟转速是死的,5400RPM永远处于劣势。 3、 真正的内部数据传输率: 随着硬盘知识的普及,硬盘DTR这一指标也逐渐被人们所认识,但又出现了新的误区——拿以Mbps为单位的最高内部DTR说事,这其中某些厂商与所谓高手的误导有着不可推卸的责任,后果也是相当严重。由于内部DTR决定了硬盘的实际数据传输性能,所以很多人都在关心硬盘的内部DTR,而厂商也投其所好,在产品资料中基本都公布了最大内部传输率,但多是以Mbps为单位,不少人因此拿这个数值来预测硬盘的性能,甚至分析到接口速率的瓶颈(这些人通常将其换算成MBPS,而目前最高的数值将近80MBPS,离Ultra ATA-100的最大速率已相差不远了)。但是,它恰恰不能通过除8来换算成MBPS,因为这个数值是磁头处理二进制0/1信号(即bit)的纯理论性能,而磁头处理的信号很大部分并不是用户需要的数据(存入的数据都是经过编码的,包含许多辅助信息),因此不能以字节为单位。很多硬盘这一数值都是相当高的,如以前的富士通硬盘,指标很好,但实际性能却是另一码事。完全可以说,这个Mbps值没有什么实际价值,给人的是一种假象。 在硬盘中,真正重要的是内部持续DTR,它分为单磁道瞬间DTR与持续DTR两个指标,单磁道瞬间DTR的计算公式是“512字节×SPT×磁盘每秒所转圈数”或“512字节×SPT÷磁盘转一圈所用时间”,由于磁盘转一圈所用时间一般不能除尽,所以经常用前一种公式。持续DTR的计算公式则为“512字节×SPT×磁头数/总耗时”,其中“总耗时=(磁头数-1)×磁头切换时间+道间寻道时间+磁头数×磁盘转一圈的时间”。磁头切换时间一般在产品的用户手册中有标注,大约在1ms左右。单磁道瞬间DTR表明了硬盘实际上所能达到的最大内部DTR,持续DTR则体现了硬盘真正的数据传输能力。很遗憾的是,目前只有迈拓和IBM提供了内部持续DTR数据,其他厂商仍然用Mbps数值迷惑普通大众。但是,厂商心里是明白的,他们自己也不会混淆概念(只是没事偷着乐),在数据的说法上也是非常严谨,如果你哪天发现厂商公布的内部DTR使用了MB/s为单位,那么这很可能就是我们所真正需要的数据,而不要再用Mbps去除8了。
IBM 120GXP的技术资料,其中有两个内部DTR,我们只需关心第二个 4、 缓冲区容量与性能: 上文说过内部DTR决定了外部DTR的实际表现,但为了将内部DTR对外部DTR的影响降至最低,产生了缓冲区设计。理论上讲,缓冲区越大,即使内部DTR不变,硬盘的性能也会更好,这就好比CPU中的缓存一样。不过,要做到缓冲区容量的增加并提高性能还是有一定难度的。这主要体现在缓存功能管理与数据安全两个方面。缓存功能管理决定了缓冲区智能化与缓存效果,简单的说就是一种管理算法与替换策略,负责这一任务的就是缓存控制器。上文已经讲到目前都将缓冲区做分段处理,并且是动态的,根据数据流情况自动划分。以120GXP为例,在读操作时可最多划分12个数据段(平均容量约155KB),在写操作时数据段可高达52个(平均容量约35KB)。那么怎么去动态的划分区段,怎么去选择最不常用的区段以替换成新的数据,都将影响最终的性能表现。比如区段划分不合理将影响缓冲区空间的利用率和预读效果,数据替换不合理将影响缓存命中率,这样一来说不定与小容量缓冲区性能差不多。讲到这,大家肯定会想到了CPU缓存的算法(比如N路级联与更新策略等),的确两者有相同之处。对于更大容量的缓冲区,肯定就不能照搬小容量缓冲区的缓存管理算法。因此,缓冲区越大性能越好是有前提的,这对厂商的缓存管理技术水平提出了更高的要求。 大容量缓冲区的数据安全性主要是指在突然断电的情况下,缓冲区中的待写数据将如何处理的问题。这方面笔记本电脑硬盘就有了得天独厚的优势,因为有电池为后盾,笔记本电脑硬盘的缓冲区容量已经提升到了16MB。但对于台式机,这是个不小的考验。WD公司在这方面做出了有意义的探索,主要方法是通过将数据暂时保存在最外圈暂存区(因为最外圈的写入速度最快),下次开机再写入原目的地址的方法来保证缓冲区中待写数据的安全,显然这需要特殊的管理机制,也是厂商的自由发挥了。 最后我们再谈谈目前普遍流行的说法——大容量缓冲区对零散数据非常有利,这是很片面的认识。当然,这种说法可以理解,也没有什么根本性错误,但容易误导人们对大容量缓冲区的认识。从分段式缓存结构可以看出,更大的缓冲区理论上可以划分出更多的数据段,能容纳更多的互不相干的小数据块。而这种随机的、不连贯的、小数据量的读取行为在Web服务、数据库服务与日常办公应用中很常见。如在Web服务中,经常出现对一个网页同时有多个请求的情况,而一个网页的大小也就是几十到几百KB的容量,如果缓冲区能缓存更多的页面,那么服务器的表现也会越好。因此大容量缓冲区在这方面的贡献,我们完全肯定。但另一方面,对于大容量,连续读写的数据操作,大容量缓冲区同样能发挥重要的作用。更大的缓冲区此时意味可一次缓冲更多的数据(硬盘会根据数据量将区段合并),即能在相同的时间内向主机或磁头发送更多的数据,而磁头的连续读写扇区的能力更容易发挥。所以,在音频、视频处理等经常用到大数据量连续读写的场合,大容量缓冲区硬盘是最佳之选。在下面的测试中,大家也会发现8MB缓冲区硬盘相对于2MB缓冲区硬盘的整体优势。 对硬盘认识的常见误区(二) 5、 SCSI与IDE的性能: 在WD1000JB推出时,有些读者就根据其与低端SCSI硬盘的对比测试数据,曲解原文的用意发表了IDE硬盘性能已经可与SCSI硬盘相抗衡的看法,这显然是一种误导。在测试原文中与WD1000JB做对比的是希捷早期万转SCSI硬盘——Cheetah 36XL。单碟容量为9GB,不到1000JB单碟容量的1/3,缓冲区容量为4MB,而WD1000JB则是8MB,但两者的持续传输率基本一致,因此有一定可比性。原文将当时最高配置的IDE硬盘与较低配置的SCSI硬盘作对比的主要用意在于证明8MB缓冲区的作用,并通过测试表明在此情况下最高端IDE的性能完全可以与低端SCSI一争高低,而不是给“IDE性能可与SCSI对抗”这一笼统的错误说法提供论据,因为这种比较是有条件的。从测试成绩上看,Cheetah 36XL全面落后,但这是在单盘情况下。而随着硬盘数量的增多,SCSI共享数据通道的优势将逐渐体现,此时就不是IDE硬盘可比的了,即使你接满4块IDE硬盘也于事无补,况且随着更高单碟容量(如18GB)的万转SCSI与15000转SCSI硬盘的普及,IDE的单盘优势也不明显了。所以SCSI与IDE根本就针对着不同的市场与操作应用。做对比测试的原作者也只是借WD1000JB证明,目前最高端IDE硬盘完全可以在负荷不很繁重的中低端单盘工作站市场一展身手,而不是全面冲击SCSI硬盘,这一点一定要认清楚,不要误解原文作者的用意。 6、 总容量与性能: 如果单碟容量相同,那么总容量的不同就意味着磁头数量(即数据面数,一张磁盘有两个数据面,但有时只用一个,而一个数据面对应一个磁头)的不同,这其中会与性能有什么关系呢?由此就要联系到柱面这一概念,柱面是指硬盘中每张磁盘上编号(位置)相同的磁道集合,硬盘操作时,是从最外圈柱面开始,当该柱面所有磁道用完后,再移至内圈的下一个柱面,而不是先存完一张盘再存一张盘。同系列的硬盘的柱面数是一样的,但每个柱面包含的磁道数要因磁头数而异,计算公式为:磁道数=磁头数×柱面数。如迈拓D740X,20GB型号由于只有一个磁头,所以一个柱面的容量是一个磁道,而80GB型号则是4个磁头,一个柱面的容量就是4个磁道。以最外圈柱面为例,D740X是外圈磁道是837个扇区,按每扇区512字节计算,20GB型号的最外圈柱面的容量为418.5KB, 80GB型号的最外圈柱面容量为1674KB 。也就是说如果连续存储500KB的数据,20GB就要移动磁头进行道间寻道了,但80GB的还不会,只是存在同一柱面内磁头切换的延迟。大家可以这么认为,80GB型号中一个柱面相当于20GB型号中的4个柱面,而同一柱面内的磁道切换速度通常要快于柱面间的切换,对保持数据传输率更为有利。
柱面示意图 由此,很多人可能得出结论,同一产品系列中,磁头数越多的型号的连续读写性能越好(如果是零散读写根本不受柱面容量的影响)。这个说法基本正确,但是有忽略的地方。首先,目前的硬盘都采用了区域数据记录,在同一区域内,每磁道扇区数固定,比如D740X分为15个数据区(最外圈还有一个但用于存储系统数据,可不计),最外圈数据区中有2582个柱面,这些柱面的扇区数是相同的,所以即使是20GB型号,也只会在存满1.03GB左右的数据后才转入下一个SPT更少的数据区。而且也有柱面切换速度比磁头切换快的硬盘,D740X就是,因此在这头1个GB的数据区中,80GB的D740X型号性能也许更差。但我们一般使用硬盘都要分区,C盘大概在5-10GB左右,此时20GB的型号已用到了第4个数据区,而10GB的容量在80GB型号中还没有超出第二个数据区,因此就这个分区的整体性能而言,80GB的显然要占优势。从WinBench的硬盘传输率曲线上就能看出这一点, 80GB型号的最高传输率范围覆盖了更多的空间。不过,上面的对比是较极端的,如果是40GB与60GB的型号去对比就不会这么明显,可以说磁头数相差如果在3个以内,性能的差距将非常微弱,但对有的硬盘,即使磁头数相差3个也基本不会有什么差距。
上为D740X-80GB型号的DTR曲线图,下为D740X-40GB型号的DTR曲线图,以10GB容量为界,可发现40GB型号已经用到了DTR更低的第三个数据区,而80GB型号仍处在DTR更高的第二个数据区,理论性能要强于40GB型号 现在再让我们看看另一个例子——酷鱼四,从曲线图上可以看出其第一个数据区占据了1/3多的柱面,也就是说即使是20GB的酷鱼四,在前10GB容量的性能不见得就比80GB的型号差。所以,具体的差别除了要看磁头相差数量还要看数据区的设置。另外,在产品的生产过程中,厂商可能随时进行改进(不仅指Firmware,还包括元件的优化与改良等),往往会出现新的产品比老产品性能更好的情况,比如WD的CaviarXL系列,评测的1200BB是2001年9月的产品(10月才发布单碟40GB的CaviarXL系列),800BB与400BB都是今年一月和二月的产品(Firmware版本没变),后两者的表现与1200BB相比并无劣势。而IBM则为不同磁头数的型号开发了不同版本的Firmware,使得各型号的性能表现都趋于一致。因此,影响容量与性能的可变因素很多。
上为酷鱼四-60GB型号的DTR曲线图,下为酷鱼四-80GB型号的DTR曲线图,即使以20GB容量为界,可发现60GB型号仍在DTR最高的第一个数据区,理论上性能和80GB型号一样 不过,在一些测试中,最大容量型号的表现基本都很出色,有的大容量5400RPM的性能甚至好过一些小容量的7200RPM硬盘。 7、 FDB的作用: FDB马达对于很多人来说是比较新鲜的,在很多公司的宣传中,FDB的作用被定为减少噪音与热量,甚至能提高性能。这么说似乎有道理,但容易产生误导。BB轴承使用圆形滚珠(材料可为金属或陶瓷)作为主轴与基座之间的运动连接/支撑体,由于滚珠加工精确度产生的必然差异,在主轴高速运转中,滚珠之间会发生碰撞而振动,这就是马达(主轴)噪音的主要根源(其他原因还包括轴承装配精度与力矩的平衡),FDB则使用了液态润滑物质代替滚珠,这样就完全消除了因碰撞产生的噪音。但是,主轴的噪音在硬盘整体噪音中的强度比重较小,而且人耳对其远不如音圈马达寻道噪音敏感(因为频率较低),所以FDB的减噪功能确切的说只有在硬盘空闲时(磁盘空转,磁头不寻址)才能体现。另外,对于热量,滚珠之间磨擦肯定是一个热源,但这与马达电机相比也不算什么,而且FDB的效率往往并不如BB,马达功耗可能会更大。第一块使用FDB的IDE硬盘——希捷的“大灰熊”,其热量之高想必是很多老玩家记忆犹新的,而且即使是不用滚珠的音圈马达的热量也很高。因此主轴马达的主要热源并不在轴承。我们在测试中也发现,现阶段FDB并没有体现出对BB的降热优势。 综上所述,大家要对FDB有一个客观的认识,不能盲目听信宣传,认为FDB肯定比BB好(毕竟转速是固定的,性能不会改变)。至少在目前,FDB并没有多大优势,这可能也是为什么IBM与WD仍没有使用FDB的一大原因。 8、 怎么测试硬盘: 看过不少的硬盘横向测试,虽然使用的软件都一样,但其中的测试方法实在不敢认同。硬盘测试有两个方面,一是硬盘本身的性能,另一个是硬盘对整机性能的影响。对于前者,很多测试人员将被测硬盘也当作是系统硬盘,也划出成多个分区。虽然比较符合实际的应用,但不能真正反映硬盘的性能,而真正符合实际应用的测试并不在于硬盘的单独测试上。事实上,最合理的硬盘单独测试方法是,操作系统与测试软件装在另一个硬盘上,被测硬盘单独接在一个硬盘接口,接下来就是分区,此时必须要将全部容量分成一个区才能体现硬盘的综合性能。现在最常用也是最好用的硬盘测试软件WinBench99就是以分区大小来确定测试区域的,包括DTR、访问时间、应用模拟测试等,在DTR测试中以分区的最外圈磁道开始到分区的最内圈磁道终止,所以如果只用头10GB的容量为一个分区,那么测出来的就是这10GB之内的DTR而不是整个硬盘的,这也是为什么有些数据中,结束端比起始端的数值还要高的原因(如果分区容量没有超出数据区,那么很容易因为误差产生这种结果)。另外,如果测试区域很小,则磁头寻道的时间也会限制在更低的范围内(因为寻道的范围也小了),同样有利于得高分,类似的影响也体现在商业与高端测试中。所以,硬盘单独测试时必须进行全分区!至于用什么样的文件系统就不是很重要了,不过FAT32的得分一般都比NTFS的高,但如果测试条件统一,那么都是有说服力的,成绩排名也不会因为文件系统的改变而改变。 现在再说说整机测试。虽然是硬盘横向测试,但要想知道哪个硬盘对整机性能提升最大,就必须动用Winstone系列软件来进行对比测试了,这可以说是对硬盘的性能终极考试,因为WinBench99相对简单,也不是很全面,更容易被厂商钻空,而Winstone就不一样了,硬盘只是其中的一个子系统,但它也会影响最终的成绩。遗憾的是很多硬盘横向测试中都没有这一项,只是简单的跑跑WinBech99就完了。Winstone测试就要在接近真实使用情况的设置下进行,此时就不能用全分区了,因为现实中很少有人这么做。而测试一般都在被测硬盘的C区,所以容量通常为5-10GB。当然,也可以进行全分区的整机测试,这就取决于测试人员自己的决定了。 在经过正确的硬盘单独与整机测试后,我们就能对被测产品性能有一个比较全面的认识和客观的评价了。 好啦,有关硬盘的相关常识今天就先讲到这,在日后本站的硬盘测试中,还将陆续向大家介绍相关的硬盘技术与知识,敬请大家密切留意本站的动态。 08/08/2005 什么是Cairo?Cairo,过去叫做Xr或Xr/Xc,是一个跨平台的开放源代码的矢量图形函数库,可以提供高质量的显示和打印输出。通过Glitz函数库, Cairo 能使用 OpenGL或X Render扩展的硬件加速功能来绘制图像,这使得基于Cairo的应用能在现代化的3D显示硬件上获得益处。 Cairo提供一个稳定的用户层API,它可以提供现代化的图形处理管理能力,如绘制和填充,映射转换,合成(注意,是合成)与改变alpha半透明图像,高真文本显示等等。能够在不同的媒体上实现相同的输出。 其实更早关于Cairo人们关注的还是Gtk/Gnome的进展,我们可以在 Gnome中国 上看到对Cairo应用前景的展望,可以看到,Cairo应用可以实现的东西是激动人心的。 Cairo拥有多种不同的后端,能够支持多种输出设备。现在所支持的后端包括: 图像:以内存图像缓冲区(in-memory image buffers)为目标。该图像缓冲区可被保存成文件,或者其数据可以被不具有本地后端的图形系统调用。 gl: 通过 glitz库(http://www.freedesktop.org/Software…制图像。包括GLX 和 AGL (分别为Unix和苹果的标准)。 png: 这个后端使用图像后端来生成png图像文件。 ps: 生成一个PostScript文件,适合高质量打印输出。现在ps后端生成点阵内容,连接图像后端。 xlib: 使用X Window的xlib接口,以Windows 或 Pixmaps 为目标。Render扩展可用,但不必需。 xcb: 和xlib相似,但使用XCB(http://freedesktop.org/Software/xcb)接口。 还有其他一些后端正在开发中: svg quartz——MacOS的后端(http://cairographics.org/QuartzBackend) win32——Windows GDI 后端(http://cairographics.org/win32) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|