2006年04月04日

 服务器端组件

首先,服务器端的组件要有别于客户端的组件.客户端的组件是通过网络传输,依靠HTML来起作用.而且只能在IE上有用.但是服务器端的组件是运行在服务器端,它在服务器上执行各种操作.因此,所有的浏览器都能享用,它依靠的是服务器而不是浏览器.

当IIS被请求执行一个ASP程序,它首先会在ASP文件中找到 〈% %>标签之间的代码,并且执行它(也可以是〈script runat=server>〈/script>之间的代码).如果这个ASP程序在先前被调用过,那么它就会用内存中的编译过的程序来向用户返回HTML代码,如果没有,那么它就重新编译.这里ASP就比CGI多一点速度优势,因为CGI是每一个请求都使用一个线程.这样就大大消耗了服务器的资源.

想不想你写的程序自己就能在IIS运行!?!现在你就行了!使用VB5(当然现在是VB6了),你就能建立Dynamic Linked Libraries (DLL 文件),它能在IIS上直接运行(如果有asp文件来请求的话).

系统和软件的要求

你需要一个32位的操作系统来运行ASP.当然你也得安装IIS或PWS.我们下面的程序是在windows95+PWS+VB5的环境下开发的.

我们开始吧

启动你的VB,选择ActiveX图标.这个图标可以在新建工程找到!VB会提供一个默认的工程名(project1)和类名(class1).我们会将这两个名字都改掉.在改名之前,请首先确认我们拥有Microsoft Active Server Pages Object Library,它在我们的程序非常有用.从菜单中选择"工程",然后在其中选择"引用",就会出现"引用"窗口从中选择Microsoft Active Server Pages Object Library.

给工程和类命名

现在我们来根据自己的爱好来为project1和class1来命名吧!给它们命名也是很重要的,我们以后会用这个工程名和类名来创建这个组件的实例!后面详细介绍.

如何改名,我就不想多说了!
我们的工程名改为Exmaple,类名为Helloword

怎样使用工程和类

现在我们有了我们自己的工程(Example1)和类名(HelloWorld).以后我们就会在ASP代码中使用它们的名字来引用这个组件.在ASP中我们就这样引用,如下:

Set ObjReference = Server.CreateObject("ProjectName.ClassName")

对于我们工程的引用就是:
Set ObjReference = Server.CreateObject("Example1.HelloWorld")
现在我们就能用ObjReference来调用我们在组件中所创建的函数,子程序.下面我们会来写一个SayHello的子程序, 我们执行它的代码如下:

〈%
Set ObjReference = Server.CreateObject("Example1.HelloWorld")
ObjReference.SayHello
%>

为了在Helloword类中使用ASP的方法,你必须在此类中写一个OnStartPage
子函数.如下:

Public Sub OnStartPage(PassedScriptingContext As ScriptingContext)
Set MyScriptingContext = PassedScriptingContext
End Sub

现在,无论什么时候用户访问一个带有本组件的ASP文件,IIS就会把ScriptingContext传送给我们的对象请我们使用.这个ScriptingContext包括了全部的ASP方法和属性.实现上,这使得我们有能力访问所有ASP的对象.看下面的代码:

Public Sub OnStartPage(PassedScriptingContext As ScriptingContext)
Set MyScriptingContext = PassedScriptingContext
Set MyApplication = MyScriptingContext.Application
Set MyRequest = MyScriptingContext.Request
Set MyResponse = MyScriptingContext.Response
Set MyServer = MyScriptingContext.Server
Set MySession = MyScriptingContext.Session
End Sub

以后我们就能用在VB中用MyApplication 来代替ASP中的Application,同理可以代替Request,Server…..,不过我们来是要在 OnStartPage之前来申明这些变量:

Private MyScriptingContext As ScriptingContext
Private MyApplication As Application
Private MyRequest As Request
Private MyResponse As Response
Private MyServer As Server
Private MySession As Session

使用ASP的对象
我们的变量现在就能像标准的ASP对象来使用了!比如,我们经常在ASP中用Request.form()来收集提交表单的数据.现在我们在我们的VB中实现这个功能,代码如下:

用ASP中实现:
〈%
MyTempVariable = Request.Form("userName")
Response.Write ("you entered "& MyTempVariable & "as your user name")
%>

在VB中实现:

MyTempVariable = MyRequest.Form("userName")
MyResponse.Write ("you entered "& MyTempVariable & "as your user name")

通过使用MyResponse来代替Response,我们能够使用所有Response的方法,当然,MyResponse这个名字可以随便来取,你甚至可以就取Response.
另一件我们得注意的是,我们得在我们的建立的类中,写上OnEndPage子函数,这个OnStartPage是相反的!OnStartPage是创建对象,OnEndPage是消毁对象.

Public Sub OnEndPage()
Set MyScriptingContext = Nothing
Set MyApplication = Nothing
Set MyRequest = Nothing
Set MyResponse = Nothing
Set MyServer = Nothing
Set MySession = Nothing
End Sub
SayHello方法
我们来建立一个子函数,用于显示"Holle World".这个SayHello方法只是HelloWorld这个类中一个子函数,我们以后会在ASP中用以下的显示这个方法

〈%
Set ObjReference = Server.CreateObject("Example1.HelloWorld")
ObjReference.SayHello
%>
SayHello的程序,很简单的!

Public Sub SayHello()
MyResponse.Write ("Hello World")
End Sub

现在一个小型的组件编写完成,剩下的工作就是编译这个组件,在"工程"菜单中保存它,取什么名字都可以,我们用Exmaple1.vbp吧! 然后就用在菜单中选择"make exmaple1.dll",将其编译成DLL文件.一个组件就真正完成了!
注意,编译了此组件那么你就得先把你的PWS关掉,然后再编译此组件.否则VB就会告诉你些组件在使用中.

在ASP中使用我们的自己的组件.

当你更正了在编译中的错误,成功地编译了example1这个工程,现在你就得拿出你最喜欢的HTML编辑器来写下下面的语句,保存为ASP文件.

〈HTML>
〈HEAD>
〈TITLE>Example 1〈/TITLE>
〈/HEAD>

〈BODY>

〈%
Set ObjReference = Server.CreateObject("Example1.HelloWorld")
ObjReference.SayHello
%>

〈/BODY>
〈/HTML>

运行后即可看到结果:

Hello World

注册组件

如果你想和你的朋友,邻居分享你的组件,那么你就得在你的系统上注册你的组件.我们一般使用Regsvr32.exe来注册组件.注册后你的组件会出现在Win95/Win98的windows/system目录中.下面是一个注册的例子:
Regsvr32.exe C:/wwwroot/Example1/Example1.dll
在你的系统中,VB会自动给你注册,所以你很少用到Regsvr32.exe
我们这里只是写了一个非常小的组件,你们可以写好自己的更大的组件,而且还可以用VB中的很多控件.

    随着Internet的发展,Web技术日新月异,人们已经不再满足于静态HTML技术,更多的是要求动态、交互的网络技术。继通用网关接口(CGI)之后,微软推出的IIS+ASP的解决方案作为一种典型的服务器端网页设计技术,被广泛应用在网上银行、电子商务、网上调查、网上查询、BBS、搜索引擎等各种互联网应用中。与此同时,Access数据库作为微软推出的以标准JET为引擎的桌面型数据库系统,由于具有操作简单、界面友好等特点,具有较大的用户群体。目前,IIS+ASP+Access是中小型Internet网站的首选方案。但是,该解决方案在为我们带来便捷的同时,也带来了严峻的安全问题。

一、安全隐患分析

  IIS+ASP+Access解决方案的主要安全隐患来自Access数据库的安全性,其次在于ASP网页设计过程中的安全意识和措施。
1.数据库可能被下载
  在IIS+ASP+Access网站中,如果有人通过各种方法获得或者猜到数据库的存储路径和文件名,则该数据库就可以被下载到本地。例如:对于网上书店数据库,一般命名为book.mdb、store.mdb等,存储路径一般为“URL/database”或放在根目录“URL/”下,这样,任何人敲入地址:“URL/database/store.mdb”, 数据库就可以被下载了。
2.数据库可能被解密
  由于Access数据库的加密机制比较简单,即使设置了密码,解密也很容易。该数据库系统通过将用户输入的密码与某一固定密钥(例如: Access 97为86 FB EC 37 5D 44 9C FA C6 5E 28 E6 13)进行“异或”来形成一个加密串,并将其存储在*.mdb文件从地址“&H42”开始的区域内。我们可以轻松地编制解密程序,一个几十行的小程序就可以轻松地获得任何Access数据库的密码。因此,只要数据库被下载,其信息就没有任何安全性可言了。
3.ASP页面的安全性
  (1)源代码安全性隐患。由于ASP程序采用非编译性语言,大大降低了程序源代码的安全性。如果黑客侵入站点,就可以获得ASP源代码;同时对于租用服务器的用户,因个别服务器出租商的职业道德问题,也会造成ASP应用程序源代码泄露。
  (2)程序设计中容易被忽视的安全性问题。ASP代码使用表单实现交互,而相应的内容会反映在浏览器的地址栏中,如果不采用适当的安全措施,只要记下这些内容,就可以绕过验证直接进入某一页面。例如在浏览器中敲入“…page.asp?x=1”,即可不经过表单页面直接进入满足“x=1”条件的页面。因此,在验证或注册页面中,必须采取特殊措施来避免此类问题的产生。

二、提高IIS+ASP网站安全性的方法
   

  1.防止数据库被下载
由于Access数据库加密机制过于简单,有效地防止数据库被下载,就成了提高ASP+Access解决方案安全性的重中之重。以下两种方法简单、有效。
  (1)非常规命名法。为Access数据库文件起一个复杂的非常规名字,并把它放在几个目录下。例如,对于网上书店的数据库,我们不把它命名为“book.mdb”或“Store.mdb”,而是起个非常规的名字,例如:faq9jl.mdb,再把它放在如./akkt/kj61/acd/av5 的几层目录下,这样黑客想通过猜的方式得到Access数据库文件名就很难了。
  (2)使用ODBC数据源。在ASP程序设计中,如果有条件,应尽量使用ODBC数据源,不要把数据库名写在程序中,否则,数据库名将随ASP源代码的失密而一同失密,例如:
DBPath = Server.MapPath(“./akkt/kj61/acd/av5/faq9jl.mdb ”)  
conn.open “driver={Microsoft Access Driver (*.mdb)};dbq=”& DBPath  
可见,即使数据库名字起得再怪异,隐藏的目录再深,ASP源代码失密后,也很容易被下载下来。如果使用ODBC数据源,就不会存在这样的问题了:
conn.open “ODBC-DSN名”  
2.对ASP页面进行加密
  为有效地防止ASP源代码泄露,可以对ASP页面进行加密。我们曾采用两种方法对ASP页面进行加密。一是使用组件技术将编程逻辑封装入DLL之中;二是使用微软的Script Encoder对ASP页面进行加密。使用组件技术存在的主要问题是每段代码均需组件化,操作比较繁琐,工作量较大,而使用Encoder对ASP页面进行加密,操作简单、收效良好。Script Encoder的运行程序是SCRENC.EXE,使用方法是:
SCRENC [/s] [/f] [/xl] [/l defLanguage ] [/e defExtension] inputfile outputfile
其中:/s 是屏蔽屏幕输出;/f 指定输出文件是否覆盖同名输入文件;/xl 指是否在.asp文件的顶部添加@Language指令;/l defLanguag指定缺省的脚本语言; /e defExtension 指定待加密文件的扩展名。
3.注册验证
  为防止未经注册的用户绕过注册界面直接进入应用系统,我们采用Session对象进行注册验证。例如,我们制作了下面的注册页面。
设计要求注册成功后系统启动hrmis.asp?page=1页面。假设,不采用Session对象进行注册验证,则用户在浏览器中敲入“URL/hrmis.asp?page=1”即可绕过注册界面,直接进入系统。
在此,利用Session对象进行注册验证:
<%
’读取使用者所输入的账号和密码
UserID = Request(“UserID”)
Password = Request(“Password”)
’检查UserID 及Password 是否正确
If UserID <>“hrmis” Or Password <>“password” Then
Response.Write “账号错误!”
Response.End
End If
’将Session 对象设置为通过验证状态
Session(“Passed”) = True
%>
进入应用程序后,首先进行验证:
<%
’如果未通过验证,返回Login状态
If Not Session(“Passed”) Then
Response.Redirect “Login.asp”
End If
%>
通过对IIS+ASP+Access网上应用系统安全性的研究,我们对现有系统进行了改造,收到了较好的效果。

   主要使用request对象的ServerVariables属性,通过它来获得环境变量的值。使

用的语法为:Request.ServerVariables(variable),“variable”表示环境变量的名称,如服务器主机名称、WEB服务器软件名等等,若“variable”为“REMOTE_ADDR”则表示访问者的IP地址,通过它就可以实现IP地址的过滤。

  源程序如下:(文件名:demo.asp)

  <html>
  <head>
  <meta http-equiv=“Content-Type” content=“text/html; charset=gb_2312-80”>
  <meta name=“GENERATOR” content=“Microsoft FrontPage Express 2.0”>

  <style>
  <!--
  .as{ line-height: 15px; font-size: 9pt }
  a:hover {color: rgb(0,51,240);text-decoration:underline}
  .p9 { font-family: “宋体”; font-size: 9pt; line-height: 15pt}
  .p12 { font-family: “宋体”; font-size: 12pt; line-height: 18pt}
  a:link { text-decoration: none;}
  a:visited { text-decoration:none;}
  a:hover {text-decoration: underline;font-size: 125%;color:blue}
  -->
  </style>

  <title>ASP页面防火墙功能演示</title>
  </head>

  <body background=“back.jpg”>
  <%
  ′使用Request.ServerVariables(“REMOTE_ADDR”)得到IP地址并保存在变量rip中
  rip=Request.ServerVariables(“REMOTE_ADDR”)
  strip=cstr(rip)
  ′取得IP地址第三个段的值并保存到strip中

  for i=1 to 2
  strip=right(strip,len(strip)-instr(1,strip,“.”))
  next

  strip=left(strip,instr(1,strip,“.”)-1)
  ′IP地址有效性检验及密码验证,包括两方面的内容:
  ′如果IP地址符合则通过验证;如果IP地址不符合则检验输入的密码是否正确(此处密码为“asp”)
  if (left(rip,5) <> “127.1” or strip<“1” or strip>“50”) and request(“Passwd”)<>“asp” then
  %>
  <p><font color=“#FF0000”>对不起,你的IP是<%=rip%>,本页面可以访问的IP是127.1.1.*到127.1.50.*之间,如果你是本单位内部网的用户,请确认你的浏览器没有使用代理!<BR></font></p>

  <form action=“demo.asp” method=“POST” id=form1 name=form1>
  <p>请输入访问密码:<input type=“password” name=“Passwd” > <input type=“submit” value=“确认” name=“B1”>;
  </p>
  </form>

  <%else %>
  ′合法用户可以访问的页面,在此可以加入任何信息
  祝贺您,您已经顺利通过了页面的安全认证,可以直接使用本站点的资源!
  <%end if%>
  </body>
  </html>

  实际使用只要稍微修改上面的程序(如IP地址等信息)就可以了,当然这只是在一个页面中实现了安全防范功能,如果一个网站有多个页面的话,可以设置一个session变量来对用户进行标志,以在后面的页面中进行判断。

  上面只是ASP的一个很简单的应用,其实使用ASP可以实现许多动态或者其他交互形式的功能,如果您想详细了解ASP的用法,可以到具体的ASP网站上去参考相关内容。

     很多的网站都有记数器,用来记录网站的访问量,这给网站管理员即时了解本网站的运行及访问情况提供了很多的方便。笔者研究过很多用ASP编写的计数器程序,发现大部份都是在一个访客访问站点的时候就打文本文件或数据库,读取以前的计数值进行加1,然后再写入文件,若网站访问量很大,可能会对系统造成很大的负担,那么有没有优化的方法呢,笔者经过研究测试,答案是:有。

熟悉ASP的朋友都知道,ASP提供一个Application属性用来保存服务器的一些公共变量,我们可以用这个变量来保存记数器的信息。

思路是先设定两个Application变量,一个Application(“TotalCount”),用来保存记数值;另一个Application(“LastwriteTime”),用来保存上次把记数值保存到文件的时间。我们可以自己定义把计数值保存到文件的间隔时间,比如1小时、1天或者一个月。在有访客访网站的时候,让Application(“TotalCount”)进行加1,如果上次保存计数的时间与现在的时间差大于我们设定的保存时间间隔值,那么就把当前的计数值写入文件保存,这样就减少了程序的IO操作,节约了系统的负担。

为了避免发生意外,如断电或者服务器停止反应需待重启等,我们可以设定保存时间间隔为2小时,这样即使发生意外,损失也不会太大。

例程如下:

<%

Dim oFSO   ‘定义FSO组件对象

Dim oFile  ’定义读写文件对象

Dim nCount ’定义从文件中读取的记数值

Dim sFilePath ‘定义计数器保存文件的路径

Const iInterval=2 ‘定义保存时间间隔为2小时

SFilePath=Server.MapPath("Count/Count.txt")  ’假设计数器文件在根目录下的Count目录中,文件名为Count.txt

IF  Application("TotalCount")=0 or Application("TotalCount")="" THEN

‘如果第一次运行网站,比如重启后,我们就需要从文件中读取出以前的计数值

   Set oFSO=Server.CreateObject("Scripting.FileSystemObject") ’实例化文件操作对象oFSO

      IF not oFSO.FileExists(sFilePath) THEN

          OFile=oFSO.CreateTextFile(sFilePath,true)  ’如果文件不存在,则创建一个文



      oFile.Write("1")   写入当前的计数值"1"

           oFile.close

           Application("TotalCount")=1

      ELSE

            Set oFile = oFSOt.OpenTextFile(sFilePath)

            NCount=OFile.ReadLine

            Application("TotalCount")=Clng(nCount)+1

            OFile.close

      End IF

      Application("LastwriteTime")= Now  ’设置最后一次访问的时间为当前时间



ELSE

      Application("TotalCount")= Application("TotalCount")+1

      IF DateDiff("H", Application("LastwriteTime"),Now)>iInterval THEN

       ‘如果当前时间与上次保存计数值的时间差大于设定的时间间隔,则把计数值重新写入文件

           Set oFSO=Server.CreateObject("Scripting.FileSystemObject") ’实例化文件操作对象oFSO

           OFile=oFSO.OpenTextFile(sFilePath,true)  ’打开文件

           oFile.Write(Application("TotalCount"))   ‘写入当前的计数值

        &n
        bsp;  oFile.close

           Application("LastwriteTime")= Now  ’设置最后一次访问的时间为当前时间

       END IF

End IF

Response.Write("欢迎光临本网站,你是访问本网站的第" & Application("TotalCount") & "位访客!")

%>

1. 现在的日期时间命令是
<%=now%> 即可

2.ASP取得表格(from)数据输入的方法,是使用一个内置的对象(object)—Requect,
它以get,post而异。

3.若要自己用VB或其它语言编写,.dll文件供ASP使用需将DLL文件注册方可:DOS下
输入 regsbr32 *.dll

4.显示五个重复的句子,字体越来越大
<% for i=1 to 5 %>
<font size=<% =i %> color=#00ffff>
快速ASP
</font>
<br>
<% next %>

5.传送字符串到用户端
response.write string
如:<% response.write "Welcome" %>

6.链接到指定的URL地址
response.redirect url
如:
<% response.redirect "homepage.asp"
%>

*但是如果此.ASP的文件内容已经传送到用户断,则再用redirect时会发生错误。

7.其他语言与ASP的结合:
如:早上显示早安,下午显示你好
<%
if time>+#12:00:00 AM# and time<#12:00:00 PM #
then
greeting="早安!"
else
greeting="你好!"
end if
%>
<%=greeting %>

8.<script>标记在ASP中的应用
例:

<html>
<body>
<% call function1 %>
</body>
</html>
<script runat=server language=javascript>
function function1()
{

}
</script>

9.#include 包括其它文件
<!–#include virtual|file="filename"–>
virtual指虚拟的文件地址。
file 代表绝对的文件地址。
如:
<!–#include virtual="/booksamp/test.asp"–>
<!–#include file="/test/test.asp"–>

而且可以层层嵌套。另外#include 不能在<%–%>之内

10.ASP取得表格输入数据的方法
:GET POST
一.get:用户端将数据加到URL后,格式为”?字段1=输入数据1&字段2=输入数据2&…",
再将其送到服务器。
如: actionwww.abc.com, 字段Name输入数据为jack,字段age的数据为15,则用get方法为
http://www.abc.com?Name=jack&Age=15

二.post:用户端用http信息数据传送到服务器
ASP中:
get:使用“输入数据= Request.QueryString("字段名")",将附加于URL的数据取出。
post:使用“输入数据=Request.Forml"(字段名")",读取HTTP信息数据字段。
* Request.QueryString范例
如:〈A hery="aspform.asp?Name=jack&Age=15">
按此〈/A〉〈p〉
Name:<%=request.QueryString("Name")%)
Age:<%=request.QeueryString("Age")%)
* get 范例
·aspturm.asp:
<form action="asp1b.asp" method="get">
姓名: <input type=text name="input1" value="Your name">
<p>
特征: <select name="input2">
<option>cool!
<option>handsome
<option>warmhearted
</select>
<input type=submit value="ok">
</form>
asp1b.asp的内容
<html><body>
<% =request.querystring("input1") %> hi, your character is
<%= request.querystring("input2") %>
</body></html>
11.request.From
语法: request.From(name)[(index)|.count]
name:字段名
index:当同一字段输入多个值时,指针值index指定要读取同一字段的那一个值,范围由1到
request.From(name).count
count:由request.From(name).count可知name字段输入几个值,若无此name字段,count为0


如下例:
<%
forI=1 to request.fron("input1").count
response.write request.From("input1")(I)&"<br>"
next
%>
若input1有两个值则都显示出
*若未采用index指定读取哪个.可用
〈%
for
each item request.From("input"))
repomse.write item &"<br>"
next
%>
也可用" for each x in tewuest.From"重复取得所有字段的输入值。

<% for each x in request.Form %>
request.From (<%=x%)=<%=request.Form
(x)%> <br>
<% next %>12.
获取客户端TCP/IP端口的方法:
如: tcp/ip port is <%=request("server_port")%>
使用server_port可以得到接收HTTP request的连接port信息


13.
通过HTTP_ACCEPT_LANGUAGE的HTTP表头信息,可以得到用户端的使用语言
环境.
以下例子判断用户端的语言环境,给出不同的页面.
<% language=request.servervariables("HTTP_ACCEPT_LANGUAGE")
if language="en" then %>
<!–#include file="english.asp">
<% else %>
<!–#include file="china.asp">
<% end if%>

14.主页保留的期限
如果用户端浏览器在一个主页保留的期限内,再度浏览此主页,则原在用
户端硬盘上的主页内容将被显示.
response.expires[=number]
其中NUMBER为记录数据盒(PAGE BOX)的保留期限,单位是分钟.
或:
response.expiresabsolute[=2004-10-14 7:31:25[time]]
如:设定一个主页保留期到某个日子.

15.连接到指定的URL地址
如:你希望确认用户已经看过INDEX.HTM,则可以检查是否已经看过,如
尚未确认,则自动连接到首页
<%
if not session("BEEN_to_home_page") then
response.redirect "index.asp"
end if
%>

16.判断是回到本页还是第一次进入
<%
if user_has_been_here_before then
response.write "<h3 align=center> Welcome Back
again"
else
response.write "Welcome!"
end if
%>


17.显示数据库中的图片与超级连接

<%
set conn=server.creatobject("ADODB.connection")
conn.open "myaddress"
set rs=conn.execute("select name,tel,url,image from
myaddress")
%>

<p>
<tabel>
<tr>
<% for i=0 to rs.fields.count-1 %>
<td>
<b>
<%=rs(i).name %>
</b>
</td>
<% next %>
</tr>
<% do while not rs.eof %>
<tr>
<% for i=0 to rs.fields.count-1 %>
<td valign =top>
<%
if rs(i).name="image" then
response.write "<img src="""&rs(i)&""" >"
else
if rs(i).name="url" then
response.write "<a href="""&rs(i)&""">"&rs(i)&"</a>"
else
response.write rs(i)
end if
end if
%>
</td>
<%next%>
</tr>
<% rs.movenext
loop
rs.close
conn.close
%>
</html>


18. 用ASP取得浏览器信息
<%
set a=server.creatobject("MSWC.BROWSERTYPE")
msg="您使用的浏览器是:"+a.browser+"version"+a.version
%>
<%=msg%>


19. asp访问cookies的方式(使用response和request)
如下:
写入cookies:
response.cookies("待写入的coookies名称")
="待写入数据“
读取cookies:
读取数据=request.cookies("待读的cookies名称")

2006年04月01日

http://news.google.com/options/icons/scholar.gif注册表http://news.google.com/options/icons/translate.gif开关http://news.google.com/options/icons/toolbar.gif[以下代码保存为.vbs]http://news.google.com/options/icons/labs.gif

Dim WSHShell,r,M,v,t,g,i
On Error Resume Next
Set WSHShell=WScript.CreateObject("WScript.Shell")
v="HKCU\Software\Microsoft\Windows\CurrentVersion\
Policies\System\DisableRegistryTools"
i="REG_DWORD"
t="注册表开关"
r=WSHShell.RegRead(v)
g=1
If (r=1) Then g=0
If g=1 Then
WSHShell.RegWrite v,1,i
M=MsgBox("是否限制注册表编辑器?",4,t)
Else
WSHShell.RegDelete v
M=MsgBox("是否解除注册表编辑器限制?",4,t)
End If

http://news.google.com/options/icons/alerts.gif解除注册表CMD、Regedit、Taskmgr限制http://news.google.com/options/icons/univ.gif

On Error Resume Next
Set WSHShell=WScript.CreateObject("WScript.Shell")
With WScript.CreateObject("WScript.Shell")
.RegDelete"HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableRegistryTools"
.RegDelete"HKCU\Software\Policies\Microsoft\Windows\System\DisableCMD"
.RegDelete"HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableTaskMgr"
End With
Mybox=MsgBox(enab&vbCR&"程序运行限制已解除!",1024,"Result")

2005年10月23日

       现在大家都希望有个同步软件可以达到网络目录或者文件的更新来减少自己的工作量,现在网络上也有很多软件可以达到这个目的,象同步专家之类的,但是这些软件需要安装服务端和客户端,客户端要常驻才能使用,并且占用了一定的资源.如下这个批处理利用net命令来进行文件和目录的同步更新.优点就是任何机器都可以做服务器和客户机,而且不占用任何资源.当然缺点也有就是写批处理有点烦^^.

我首先写出批处理,然后作详细的解释:
net use S: \\computer-01\D
attrib -s -h -r S:\ghostC:\WINDOWS\COMMAND\Xcopy.exe /s /e /y D:\ghost S:\ghost
net use * /delete

net use S: \\computer-02\D
attrib -s -h -r S:\ghost
C:\WINDOWS\COMMAND\Xcopy.exe /s /e /y D:\ghost S:\ghost
net use * /delete

    写说明一下net命令的用法,这里采用net命令其中一个参数net use,如果对其他有兴趣,可以在command窗口打net /?显示其help屏幕。
参数net use
作用:连接计算机或断开计算机与共享资源的连接,或显示计算机的连接信息。
命令格式:net use [devicename | *] [computernamesharename[volume]] [password | *]] [/user:[domainname]username] [[/delete] | [/persistent:{yes | no}]]
参数介绍:
键入不带参数的net use列出网络连接。
devicename指定要连接到的资源名称或要断开的设备名称。
computernamesharename服务器及共享资源的名称。
password访问共享资源的密码。
*提示键入密码。
/user指定进行连接的另外一个用户。
domainname指定另一个域。
username指定登录的用户名。
/home将用户连接到其宿主目录。
/delete取消指定网络连接。
/persistent控制永久网络连接的使用。
如下是简单的例子说明:
(1)net use e: YFANGTEMP 将YFANGTEMP目录建立为E盘
(2)net use e: YFANGTEMP /delete 断开连接

这里我只写两行批处理,用意这两大行网络标识是不同的,其他可以依次类推。我的网吧网络标识是computer-01~computer-N 也就是网吧电脑的网络名称,可以根据自己实际情况更改。譬如user01~userXX

开始解释每行命令,实际应用稍后解释。
一.命令解析。
1.net use S: \\computer-01\D (将computer-01的共享盘d盘进行网络连接,并映射成网络驱动盘s盘。这里d盘要做完全共享,如果不是完全共享文件就复制不过去了,到时不要耍菜刀追我^^。提示1:如果怕完全共享被人将文件删除,可以设完全共享密码。假设远程共享盘完全共享密码为123,那么这行命令改成如下: net use S: \\computer-01\D 123。这样访问远程客户机共享盘就没有问题了。提示2:这里为什么要选d盘而不是e盘c盘,是要和同步更新的服务机的盘符对应起来,我要复制本地机d盘下的东西,当然要和d盘对应。)

2. attrib -s -h -r S:\ghost\ (把目标盘下要复制的目标目录下的文件属性(只读、隐藏、系统)三项去掉。提示:如果目标盘没有ghost目录接下来的xcopy命令会自动创建的)

3. C:\WINDOWS\COMMAND\Xcopy.exe /y /s /e D:\ghost S:\ghost\(将本地机的d盘下的ghost目录下文件复制到虚拟映射盘s盘下ghost目录,这里的s盘就是computer-01上的d盘。提示1:s盘在执行第一大行后会自动消失,当执行第二大行时computer-02的d盘被虚拟映射成s盘;提示2:/s /e参数含义指把ghost下所有子目录包括空目录全部复制。/y 自动覆盖已有文件)

4. net use * /delete (断开所有连接)

2.实际应用
1.共享盘目录的更新:
比方现在头痛的传奇,我统一安装在d盘的netgames下的mir目录。把d盘完全共享并设置共享密码为****。当要更新文件和外挂文件时,外挂文件也是放在mir目录下的。这样先调试好一台电脑然后写出如下命令并执行。
net use S: \\computer-01\D ****
attrib -s -h -r S:\netgames\mir
C:\WINDOWS\COMMAND\Xcopy.exe D:\netgames\mir S:\netgames\mir
net use * /delete

提示:1。这里没有用/s/e就是只复制mir根目录下的文件而不复制整个目录
2.我们也可以在xcopy前插入一句C:\WINDOWS\COMMAND\del /y S:\netgames\mir\*.*
把mir下的文件删除干净后再复制。保险起见可以不写。
3.\\computer-01可以依次类推写下去,如computer-02 -03 -04. . . . .

2.共享目录的更新
上述我们把传奇目录下文件和外挂更新好后,但是出现一个问题。网管软件的桌面图标没有同步更新,好事作到底,上次我们是把整个盘符作了完全共享,这次我们只把一个目录完全共享并设置密码****。因为我用的是pubwin4网管软件,安装c盘,为了安全起见,还是只共享文件夹,而不是整个盘。Pubwin的桌面快捷方式安装在c盘的program files的hitsoft下,将hitsoft完全共享即可,传奇和传奇外挂快捷方式放在目录下的netgames下。批处理如下

net use S: \\computer-01\hitsoft ****
attrib -s -h -r S:\netgames
C:\WINDOWS\COMMAND\Xcopy.exe c:\program~1\hitsoft\netgames S:\netgames /s /y /e
net use * /delete

提示:我们可以做的更多,还有删除目录,只要把xcopy转换成deltree就可以了。
写了那么多头昏眼花 。闪了~ 如有不懂的可以来问我,使用前自己先试验几次。

作者:sengun

你碰到这样的情况吗?                      作者:吴进

  1. Windows98Windows95的对等网中,通过网上邻居访问其它计算机,有时要刷新好多次才能连接得上。

 

  2. Windows 2000 Server或者Win dows 2000 Advanced Server中访问其它的计算机 

,特别是访问Windows 98时很慢,要等3050秒钟。

 

  上Internet时就够慢了,现在连局域网也这样慢,怎么办?下面我们就和笔者一起来解决局域网“慢”的问题。

 

  网络中的问题主要出在硬件和软件两个方面,局域网中“慢”的问题也要从这两个方面来解决。

 

  一、硬件方面

 

  首先“来硬的”吧。决定网络速度的硬件无非是网卡、集线器和网线。

 

  1. 网卡

 

  早期的以太网卡大都是10M,现在10M/100M网卡已经取代10M网卡大行其道了,况且千兆网卡也已经面世。所以,如果你还是用的10M网卡,我劝你还是换一下吧。

 

  2. 集线器

 

  集线器是网络的中心元件,所有的数据都要经过它分配给其它计算机。普通集线器即HUB由于其工作方式落后于交换式集线器(交换机),所以在资金充足的情况下,用交换机速度要快得多。但是有些杂牌交换机最好别用,宁可多花些银子买个3COMD-LINK。如果资金不够最好能用好一些的HUB

 

  3. 网线

 

  别小看了网线,杂牌的网线和安普等一些名牌网线有明显不同的传输速度,特别是在100M的网络中。水晶头的制作也是关键。很多人认为只要线两端的水晶头的次序一样就行,殊不知,五类双绞线里四股线的“绕阻”是不一样的。笔者曾经到一个学校帮助解决网络时断时续的问题,一看水晶头的线序错了,重新做了一下结果问题顺利解决。水晶头的制作有两种常用标准T586AT856B

 

  需要说明的是:

 

  (1)HUB或交换机相互组网时,一根线的两头必须用同一个标准制作。在同一个HUB或交换机上最好只用一种标准制作网线。

 

  (2)当只有两台计算机不用HUB或交换机时,线的一头采用586A标准,另一头采用586B标准。因为,网卡的脚1和脚2用作发送数据,而脚3和脚6用作接收数据引脚。两种不同的标准正好将1236相对应。

 

  (3)不管两台计算机的物理位置多近,线的长度最好大于1.5米。不然也会发生时断时续的现象。

 

  另外,同轴电缆最大的传输速率只有10M,但它的传输距离比较远,一般细缆在185米,粗缆在500米。所以在远距离通信中若不采用光缆就只能牺牲速率用同轴电缆了。

 

  二、软件方面

 

  1. 在小型网络中,用NETBEUI协议的效率来得高。所以在局域网中尽量采用TCP/IPNETBEUI两种协议,或者只用NETBEUI协议,因为在对等网中只要有NETBEUI就行了。不管采用什么协议,必须保证相互访问的两台计算机上的协议相同。如果不同则可以用如下的方法添加协议。

 

  右击“网上邻居”选择“属性”,在“网络”对话框中按下“添加”,选择其中的“协议”。要使自己的计算机能被其它的计算机访问,还要选中“文件及打印共享”将“允许其它用户访问我的文件”前打上钩。

 

  2. 做到了以上几点,在Windows98中基本可以解决问题了。但是在Windows 2000 Server中通过网上邻居访问其它计算机时仍然很慢。其实我们可以绕过Windows2000的网上邻居来访问其它的计算机。这里笔者提供三种解决方法:

 

  方法一

 

  在运行中输入:

 

  “\\计算机名\共享名”或“\\IP地址\共享名”来访问其它计算机中的共享文件夹。

 

  方法二

 

  右击“我的电脑”或者“网上邻居”选择“映射网络驱动器”,在图3中的“驱动器”中选择一个盘符,在“路径”中以URL格式输入你的计算机名和共享名。然后像访问驱动器一样地访问共享文件夹。

 

  方法三

 

  在桌面上建立一个快捷方式,用于运行方法一中的命令。

 

  这三种方法都可以很快地访问网络中的其它计算机。

 

  由于笔者的水平有限,仅仅是粗略地叙述了可能出现的问题和一些解决方案。在实际的应用过程中可能还会有其它的更方便的解决方案。这篇文章旨在抛砖引玉,希望能解决读者的一些实际问题。 

摄影镜头的标识中,基本包含了镜头属性、焦距参数、光圈参数、所具特点等信息。

镜头的标识可以归纳为:

镜头属性:通常表示该镜头是AF卡口还是MF卡口,通常还包括一些镜头类别的标识;

焦距参数:表示镜头的焦距范围,单位为mm;

光圈参数:表示镜头的最大光圈系数,有些镜头还标识出镜头的最小光圈系数;

所具特点:表示镜头所采用的技术等;

版本序号:表示镜头在同规格镜头中,属于第几代。

比如,最常用的表示方法是:EF 28-80mm 1:3.5-5.6 USM IV

也有其他一些表示方法,请参见下图。

 

镜头属性

焦距参数

光圈参数

所具特点

版本序号

标识

EF

28-80mm

 1:3.5-5.6

USM

IV

表示含义

为EF卡口镜头

28-80mm

最大光圈为f/3.5-5.6

该镜头采用USM马达

为第4代

由于焦距参数的默认单位都是“mm”,光圈参数的表示都有“1:”前缀,通常可以简化表示为:

EF 28-80/3.5-5.6 USM IV

这些标识通常是印刷或者蚀刻在镜头前端的压环上,也有在镜身上也印刷有相应的字样。

一些特殊镜头,会在f-制光圈的标识下,进一步标识出T-光圈标识,比如:

Minolta STF 135/2.8[T4.5]

比较奇特的是与德国光学工业有关系的镜头,前面都是加上比如“Distagon”这样的单词。

摄影镜头知识[二]

一:关于内存超频与设置的基础知识

   在我们进行内存的选购之前,我们要对影响内存性能的一些基本知识进行一个了解,下面这十点,使笔者通过反复论证得到的结果,请大家务必了解。

1、对内存的优化要从系统整体出发,不要局限于内存模组或内存芯片本身的参数,而忽略了内存子系统的其他要素。

2、目前的芯片组都具备多页面管理的能力,所以如果可能,请尽量选择双 P-Bank 的内存模组以增加系统内存的页面数量。但怎么分辨是单 P-Bank 还是双 P-Bank 呢?就目前市场上的产品而言 ,256MB 的模组基本都是单 P-Bank 的,双面但每面只有 4 颗芯片的也基本上是单 P-Bank 的,512MB 的双面模组则基本都是双 P-Bank的。

3、页面数量的计算公式为: P-Bank 数量 X4,如果是 Pentium4 或 AMD 64 的双通道平台,则还要除以 2。比如两条单面 256MB 内存,就是 2X4=8 个页面,用在 875 上组成双通道就成了 4 个页面。

4、CL、tRCD、tRP 为绝对性能参数,在任何平台下任何时候,都应该是越小越好,调节的优化顺序是 CL → tRCD → tRP。

5、当内存页面数为 4 时 ,tRAS 设置短一些可能会更好,但最好不要小于 5。另外,短 tRAS 的内存性能相对于长 tRAS 可能会产生更大的波动性,对时钟频率的提高也相对敏感。

6、当内存页面数大于或等于 8 时,tRAS 设置长一些会更好。

7、对于 875 和 865 平台,双通道时页面数达到 8 或者以上时,内存性能更好。

8、对于非双通道 Pentium4 与 AMD 64 平台,tRAS 长短之间的性能差异要缩小。

9、Pentium4 或 AMD 64 的双通道平台下 ,BL=4 大多数情况下是更好的选择,其他情况下 BL=8 可能是更好的选择,请根据自己的实际应用有针对的调整。

10、适当加大内存刷新率可以提高内存的工作效率,但也可能降低内存的稳定性。

二、BIOS中内存相关参数的设置要领

Automatic Configuration“自动设置”(可能的选项:On/ Off或Enable/Disable)

可能出现的其他描述为:DRAM Auto、Timing Selectable、Timing Configuring By SPD等,如果你要手动调整你的内存时序,你应该关闭它,之后会自动出现详细的时序参数列表。

Bank Interleaving(可能的选项:Off/Auto/2/4)

这里的Bank是指L-Bank,目前的DDR RAM的内存芯片都是由4个L-Bank所组成,为了最大限度减少寻址冲突,提高效率,建议设为4(Auto也可以,它是根据SPD中的L-Bank信息来自动设置的)。

Burst Length“突发长度”(可能的选项:4/8)

一般而言,如果是AMD Athlon XP或Pentium4单通道平台,建议设为8,如果是Pentium4或AMD 64的双通道平台,建议设为4。但具体的情况要视具体的应用而定。

CAS Latency “列地址选通脉冲潜伏期”(可能的选项:1.5/2/2.5/3)

BIOS中可能的其他描述为:tCL、CAS Latency Time、CAS Timing Delay。

Command Rate“首命令延迟”(可能的选项:1/2)

这个选项目前已经非常少见,一般还被描述为DRAM Command Rate、CMD Rate等。由于目前的DDR内存的寻址,先要进行P-Bank的选择(通过DIMM上CS片选信号进行),然后才是L-Bank/行激活与列地址的选择。这个参数的含义就是指在P-Bank选择完之后多少时间可以发出具体的寻址的L-Bank/行激活命令,单位是时钟周期。显然,也是越短越好。但当随着主板上内存模组的增多,控制芯片组的负载也随之增加,过短的命令间隔可能会影响稳定性。因此当你的内存插得很多而出现不太稳定的时间,才需要将此参数调长 。目前的大部分主板都会自动设置这个参数,而从上文的ScienceMark 2.0测试中,大家也能察觉到容量与延迟之间的关系。

RAS Precharge Time “行预充电时间”(可能的选项:2/3/4)

BIOS中的可能其他描述:tRP、RAS Precharge、Precharge to active。

RAS-to-CAS Delay“行寻址至列寻址延迟时间”(可能的选项:2/3/4/5)

BIOS中的可能其他描述: tRCD、RAS to CAS Delay、Active to CMD等。

Active to Precharge Delay“行有效至行预充电时间”(可能的选项:1……5/6/7……15)

BIOS中的可能其他描述:tRAS、Row Active Time、Precharge Wait State、Row Active Delay、Row Precharge Delay等。根据上文的分析,这个参数要根据实际情况而定,具体设置思路见上文,并不是说越大或越小就越好。

三、认清影响内存性能的关键

    在讲完 SDRAM 的基本工作原理和主要操作之后,我们现在要重要分析一下 SDRAM 的时序与性能之间的关系,它不再局限于芯片本身,而是要从整体的内存系统去分析。这也是广大 DIYer 所关心的话题。比如 CL 值对性能的影响有多大几乎是每个内存论坛都会有讨论,今天我们就详细探讨一下。这里需要强调一点,对于内存系统整体而言,一次内存访问就是对一个页 (Page)的访问。由于在 P-Bank 中,每个芯片的寻址都是一样的,所以可以将页访问“浓缩”等效为对每芯片中指定行的访问,这样可能比较好理解。但为了与官方标准统一,在下文中会经常用页来描述相关的内容,请读者注意理解。

    可能很多人还不清楚页的概念,在这里有必要先讲一讲。从狭义上讲,内存芯片芯片中每个 L-Bank 中的行就是页,即一行为一页。但从广义上说,页是从整体角度讲的,这个整体就是内存子系统。

    对于内存模组,与之进行数据交换的单位就是 P-Bank 的位宽。由于目前还没有一种内存芯片是 64bit 位宽的,所以就必须要用多个芯片的位宽来集成一个 P-Bank。如我们现在常见的内存芯片是 8bit 位宽的,那么就需要 8 颗芯片组成一个 P-Bank 才能使系统正常工作。而 CPU 对内存的寻址,一次就是一个 P-Bank,P-Bank 内的所有芯片同时工作,这样对 P-Bank 内所有的芯片的寻址都是相同的。比如寻址指令是 B1、C2、R6,那么该 P-Bnak 内的芯片的工作状态都是打开 B1 的 L-Bank 的第 C2 行。好了,所谓广义上的页就是指 P-Bank 所包括的芯片内相同 L-Bank 内的相同工作行的总集合 。页容量对于内存子系统而言是一个很重要的指标。这个参数取决于芯片的容量与位宽的设计。由于与本文的关系不大,就不具体举例了。

    早期 Intel 845 芯片组 MCH 的资料:它可以支持 2、4、8、16KB 的页容量

    总之,我们要知道,由于寻址对同一 L-Bank 内行地址的单一性,所以一个 L-Bank 在同一时间只能打开一个页面,一个具有 4 个 L-Bank 的内存芯片,可以打开 4 个页面。这样,以这种芯片组成的 P-Bank,也就最后具备了 4 个页面,这是目前 DDR SDRAM 内存模中每个 P-Bank 的页面最大值。

1、影响性能的主要时序参数

    在讲完内存的基本操作流程与相关的 tRP、tRCD、CL、BL 之后,我们就开始深入分析这些参数对内存性能的影响。所谓的影响性能是并不是指 SDRAM 的带宽,频率与位宽固定后,带宽也就不可更改了。但这是理想的情况,在内存的工作周期内,不可能总处于数据传输的状态,因为要有命令、寻址等必要的过程。但这些操作占用的时间越短,内存工作的效率越高,性能也就越好。

    非数据传输时间的主要组成部分就是各种延迟与潜伏期。通过上文的讲述,大家应该很明显看出有三个参数对内存的性能影响至关重要,它们是 tRCD、CL 和 tRP。按照规定,每条正规的内存模组都应该在标识上注明这三个参数值,可见它们对性能的敏感性。

    以内存最主要的操作——读取为例。tRCD 决定了行寻址(有效)至列寻址(读 / 写命令)之间的间隔 ,CL 决定了列寻址到数据进行真正被读取所花费的时间,tRP 则决定了相同 L-Bank 中不同工作行转换的速度。现在可以想象一下对某一页面进行读取时可能遇到的几种情况(分析写入操作时不用考虑 CL 即可):

1、要寻址的行与 L-Bank 是空闲的。也就是说该 L-Bank 的所有行是关闭的,此时可直接发送行有效命令,数据读取前的总耗时为 tRCD+CL,这种情况我们称之为页命中 (PH,Page Hit)。

2、要寻址的行正好是现有的工作行,也就是说要寻址的行已经处于选通有效状态,此时可直接发送列寻址命令,数据读取前的总耗时仅为 CL,这就是所谓的背靠背 (Back to Back)寻址,我们称之为页快速命中(PFH,Page Fast Hit)或页直接命中(PDH,Page Direct Hit)。

3、要寻址的行所在的 L-Bank 中已经有一个行处于活动状态(未关闭),这种现象就被称作寻址冲突,此时就必须要进行预充电来关闭工作行,再对新行发送行有效命令。结果,总耗时就是 tRP+tRCD+CL,这种情况我们称之为页错失 (PM,Page Miss)。

    显然,PFH 是最理想的寻址情况,PM 则是最糟糕的寻址情况。上述三种情况发生的机率各自简称为 PHR —— PH Rate、PFHR —— PFH Rate、PMR —— PM Rate。因此,系统设计人员(包括内存与北桥芯片)都尽量想提高 PHR 与 PFHR,同时减少 PMR,以达到提高内存工作效率的目的。

2、增加 PHR 的方法

    显然,这与预充电管理策略有着直接的关系,目前有两种方法来尽量提高 PHR。自动预充电技术就是其中之一,它自动的在每次行操作之后进行预充电,从而减少了日后对同一 L-Bank 不同行寻址时发生冲突的可能性。但是,如果要在当前行工作完成后马上打开同一 L-Bank 的另一行工作时,仍然存在 tRP 的延迟。怎么办? 此时就需要 L-Bank 交错预充电了。

    早期非常令人关注的VIA 4路交错式内存控制,就是在一个L-Bank工作时,对另一个L-Bank进行预充电或者寻址(如果要寻址的L-Bank是关闭的)。这样,预充电与数据的传输交错执行,当访问下一个L-Bank时,tRP已过,就可以直接进入行有效状态了,如果配合得理想,那么就可以实现无间隔的L-Bank交错读/写(一般的,交错操作都会用到自动预充电),这是比PFH更好的情况,但它只出现在后续的数据不在同一页面的时时候。当时VIA声称可以跨P-Bank进行16路内存交错,并以LRU(Least Recently Used,近期最少使用)算法进行 交错预充电/寻址管理。

    L-Bank 交错自动预充电 / 读取时序图: L-Bank 0 与 L-Bank 3 实现了无间隔交错读取,避免了 tRP与tRCD对性能的影响 ,是最理想的状态

3、增加 PFHR 的方法

无论是自动预充电还是交错工作的方法都无法消除同行(页面)寻址时tRCD 所带来的延迟。要解决这个问题,就要尽量让一个工作行在进行预充电前尽可能多的接收工作命令,以达到背靠背的效果,此时就只剩下 CL 所造成的读取延迟了(写入时没有延迟)。

如何做到这一点呢?这就是北桥芯片的责任了。现在我们就又接触到 tRAS 这个参数,在 BIOS 中所设置的 tRAS 是指行有效至预充电的最短周期,在内存规范中定义为 tRAS(min),过了这个周期后就可以发出预充电指令。对于 SDRAM 和 DDR SDRAM 而言,一般是预充电命令至少要在行有效命令 5 个时钟周期之后发出,最长间隔视芯片而异(目前的 DDR SDRAM 标准一般基本在 70000ns 左右),否则工作行的数据将有丢失的危险。那么这也就意味着一个工作行从有效(选通)开始,可以有 70000ns 的持续工作时间而不用进行预充电。显然,只要北桥芯片不发出预充电(包括允许自动预充电)的命令,行打开的状态就会一直保持。在此期间的对该行的任何读写操作也就不会有 tRCD 的延迟。可见,如果北桥芯片在能同时打开的行(页)越多,那么 PFHR 也就越大。需要强调的是,这里的同时打开不是指对多行同时寻址(那是不可能的),而是指多行同时处于选通状态。我们可以看到一些 SDRAM 芯片组的资料中会指出可以同时打开多少个页的指标,这可以说是决定其内存性能的一个重要因素。

    但是,可同时打开的页数也是有限制的。从 SDRAM 的寻址原理讲,同一L-Bank 中不可能有两个打开的行(读出放大器只能为一行服务),这就限制了可同时打开的页面总数。以 SDRAM 有 4 个 L-Bank,北桥最多支持 8 个 P-Bank(4 条 DIMM)为例,理论上最多只能有 32 个页面能同时处于打开的状态。而如果只有一个 P-Bank,那么就只剩下 4 个页面,因为有几个 L-Bank 才能有同时打开几个行而互不干扰 。Intel 845 的 MHC 虽然可以支持 24 个打开的页面,那也是指 6 个 P-Bank 的情况下(845MCH 只支持 6 个 P-Bank)。可见 845 已经将同时打开页数发挥到了极致。

    不过,同时打开页数多了,也对存取策略提出了一定的要求。理论上,要尽量多地使用已打开的页来保证最短的延迟周期,只有在数据不存在(读取时)或页存满了(写入时)再考虑打开新的指定页,这也就是变向的连续读 / 写。而打开新页时就必须要关闭一个打开的页,如果此时打开的页面已是北桥所支持的最大值但还不到理论极限的话 (如果已经达到极限,就关闭有冲突的L-Bank内的页面即可),就需要一个替换策略,一般都是用 LRU 算法来进行,这与 VIA 的交错控制大同小异。

    回到正题,虽然 tRAS 代表的是最小的行有效至预充电期限,但一般的,北桥芯片一般都会在这个期限后第一时间发出预充电指令(自动预充电时,会在tRAS之后自动执行预充电命令),只有在与其他操作相冲突时预充电操作才被延后(比如,DDR SDRAM 标准中规定,在读取命令发出后不能立即发出预充电指令)。因此,tRAS 的长短一直是内存优化发烧友所争论的话题,在最近一两年,由于这个参数在 BIOS 选项中越来越普及,所以也逐渐被用户所关注。其实,在 SDRAM 时代就没有对这个参数有刻意的设定,在 DDR SDRAM 的官方组织 JEDEC 的相关标准中,也没有把其列为必须标明的性能参数 (CL、tRCD、tRP 才是),tRAS 应该是某些主板厂商炒作出来的,并且在主板说明书上也注明越短越好。

    其实,缩小 tRAS 的本意在于,尽量压缩行打开状态下的时间,以减少同 L-Bank 下对其他行进行寻址时的冲突,从内存的本身来讲,这是完全正确的做法,符合内存性能优化的原则,但如果放到整体的内存系统中,伴随着主板芯片组内存页面控制管理能力的提升,这种做法可能就不见得是完全正确的,在下文中我们会继续分析 tRAS 的不同长短设置对内存性能所带来的影响。

4、BL 长度对性能的影响

    从读 / 写之间的中断操作我们又引出了 BL(突发长度)对性能影响的话题。首先,BL 的长短与其应用的领域有着很大关系,下表就是目前三个主要的内存应用领域所使用的 BL,这是厂商们经过多年的实践总结出来的。

BL与相应的工作领域

    BL 越长,对于连续的大数据量传输很有好处,但是对零散的数据,BL 太长反而会造成总线周期的浪费,虽然能通过一些命令来进行终止,便也占用了控制资源。以 P-Bank 位宽 64bit 为例 ,BL=4 时,一个突发操作能传输 32 字节的数据,为了满足 Cache Line 的容量需求,还得多发一次,如果是 BL=8,一次就可以满足需要,不用再次发出读取指令。而对于 2KB 的数据 ,BL=4 的设置意味着要每隔 4 个周期发送新的列地址,并重复 63 次。而对于 BL=256,一次突发就可完成,并且不需要中途再进行控制,但如果仅传输 64 字节,就需要额外的命令来中止 BL=256 的传输。而额外的命令越多,越占用内存子系统的控制资源,从而降低总体的控制效率。从这可以看出 BL 对性能的影响因素,这也是为什么 PC 上的内存子系统的 BL 一般为 4 或 8 的原因。但是不是 8 比 4 好,或者 4 比 8 好呢?并不能统一而论,这在下文会分析到。

    到此,大家应该有一些优化的眉目了吧。我们可以先做一下界定,任何情况下,只要数值越小或越大(单一方向),内存的性能会越好的参数为 绝对参数 ,而数值越小或越大对性能的影响不固定的参数则为 相对参数。那么,CL、tRCD、tRP 显然就是绝对参数,任何情况下减少它们的周期绝对不会错。而且从上文的分析可以发现 ,从重要性来论,优先优化的顺序也是 CL → tRCD → tRP,因为 CL 的遇到的机会最多,tRCD 其次,tRP 如果页面交错管理的好,大多不受影响。而 BL、tRAS 等则可以算是相对参数。也正是由于这些相对参数的存在,才使得内存优化不再那么简单。

四、其他相关内存的更多BIOS设置

  想提高内存性能的用户可以参考以下内存设置:开机后按Del键进入bios 菜单,选择

   (1)进入"Advanced Chipset Features"下的" System BIOS Cacheable "

   System BIOS Cacheable : 优化时应设为Enabled
   打开这个功能可以允许系统在需要的时候将BIOS存放到L2缓存里,比BIOS存放在内存更能加快BIOS的
   (2) 进入"Advanced Chipset Features"下的"DRAM Clock/Drive Control"(见图一)具体的设置如下:



  System Performance : 优化时应设为Turbo
   系统提供Normal, Fast, Fastest, Turbo四个选项,当用户选择其中一项后,相关的项目如DRAM Active to CMD等会自动调整,方便用户调整系统性能。注意,大部分的DDR内存在Turbo这样的设定下都不能稳定工作,这种设置需要很好的内存条。如果想要得到最佳性能,那用户就要购买像***、Micron这样的名牌内存条。

   DRAM Clock : 优化时应设为 133 Mhz
   系统时钟循环周期有By SPD/100MHz/133MHz三个选项,用来设置内存与CPU外频同步或异步。By SPD是让主板自动识别PC1600和PC2100的DDR内存;100MHz/133MHz就是强制内存运行在设置的频率。当然强制内存运行在133MHz是最好的啦(如果采用kt333芯片的支持,内存运行在166MHz更加没问题)。在实际使用中如果用户想系统工作的更快应该将CPU与内存同步采用133 Mhz。

   DRAM Timing: 优化时应设为Manual
有Manual, SPD两个选项。 By SPD是让内存自动选择反应时间等参数。设为手动(Manual),可以调节读取数据所延迟的时间(SDRAM Cycle Length)和内存交错(Bank Interleave)。

   SDRAM Cycle Length : 优化时应设为2
   DDR SDRAM能够运行(CL)2或3模式,也就是说它们读取数据所延迟的时间既可以是两个时钟周期或是三个时钟周期。当然时钟周期小,系统运行的速度就快。但当CPU超频时,低的时钟周期未必能使用户的系统长时间稳定运行。

   Bank Interleave : 优化时应设为4 Bank
   系统有None、2 Bank和4 Bank三个选项。一般设为4 Bank,这是提升VIA芯片组内存性能的重要参数,但开启之后将影响内存的超频能力。内存交错(memory interleaving)可以让系统对内存的不同bank进行同时存取,而不是持续存取。Bank表示一个SDRAM设备内部的逻辑存储库的数量(现在通常是4个bank)。Interleave是加快内存速度的一种技术,举例来说,将存储体的奇数地址和偶数地址部分分开,这样当前字节被刷新时,可以不影响下一个字节的访问。这样,2或4路交错技术减少了等待时间,让内存更快,虽然不是2或4倍的速度,但还是快了许多。要购买VIA芯片主板的朋友,一定要认准有4 Bank interleaving调节的板子再买,没有它,内存性能上可要大打折扣的!

  DRAM Burst Length : 优化时应设为8
   要使用这选项必须使用在2001年10月17日以后的bios。我尝试设为8和4进行测评,最后选择高分的8。这可能是KT266A芯片与KT266芯片在处理内存爆发字节长度上不同之处,多数KT266芯片的主板BIOS上是没有这个选项。

   DRAM PreChrg to Act CMD : 优化时应设为2T
   DRAM Act to PreChrg CMD: 优化时应设为 6T

   当设为5T时系统性能没有明显的提高。另一方面当长时间把值设为5T会导致数据丢失和硬盘错误。切记小心使用!!!!

   DRAM Active to CMD : 优化时应设为2T
   表示内存对命令的反应时间,当然2T比3 T要快很多。
   DRAM Queue Depth : 优化时应设为4 Level
   DRAM Drive Strength : 优化时应设为Auto
   DRAM Command Rate : 优化时应设为1T

   设为1T会得到更好的内存性能。但是,1T似乎是个极苛刻的设置,要有质量比较好的内存来支持。
   DCLK I/O Timing : 优化时应设为0ns
   Fast R-W Turn Around : 优化时应设为Enabled

   设为Enabled能打开内存快速读写转换功能
   Continuos DRAM Request: 优化时应设为Enabled
   设为Enabled能打开内存连续请求功能

  (3)要使系统稳定工作,还必须在 "Frequency/Voltage Control" 设置以下值:
   Auto Detect DIMM/PCI Clk :设为Enabled
   CPU Clock :设为133
   CPU Ratio :设为最稳定的倍频
   取决于CPU在破解倍频后能提供的最大而且能稳定工作的倍频。雷鸟、毒龙CPU破解倍频的方法是用铅笔把L1上的金点连接起来。
   CPU VCore Voltage :设为1.75
   CPU VCore Voltage表示CPU 的核心电压。在超频可以支持最高核心电压 1.85 伏。当然高核心电压有利于超频后的CPU稳定工作,但也会带来发热量的增加。
   VDIMM Voltage:设为2.60
   8KHA+的内存电压是默认2.60伏,比正常内存电压多0.10伏. CPU超频后为使系统稳定工作用户可以将内存电压升高0.20 至 0.30 伏。但注意有些质量不好的内存在2.80伏下会无法工作。

以上提到的选项在不同主板上的描述上有差异,并且有些主板不提供这么多的选项,请大家注意。IT.SOGO