C中static函数的作用

1、函数之外的变量就是全局变量,这个想法正确吗?
答: 在C中,完全正确。只不过按有没有加static修饰可以分为静态全局变量和一般全局变量两种。
2、 如果在全局变量的前面加上static 会有什么用?
答:在C中,静态全局变量意味着两个方面。一、在生命期方面,它与一般全局变量一样,是与整个程序共存亡的;二、在可见性方面,它只在定义它的那个编译单元中可见。比如说,你在testA.c中定义了一个静态全局变量x: static int x;则你只能在testA.c的函数中引用它,在另一个文件testB.c中如果想用它的话:extern int x;然后再某个函数中使用x,则一般编译器在连接阶段会报错说找不到x这个符号。
3、 如果在函数的前面加上static 会有什么用?
答:与静态全局变量差不多。简单地说,在testA.c中定义的静态函数:static void A(void)是不能在testB.c的函数中调用的,如果一定要这样的话编译器连接时会报错的。
static的用途:一般对那些非接口函数和确定外部不使用的全局变量加上static限制,可以保证不会被其它编译单元非法使用,同时也可以避免与别的编译单元中的同名符号冲突。在驱动程序中用的较多。

深入CACHE

Cache是我们经常关心的话题,K6-Ⅲ的推出引出了一种全新的缓存结构即Tri-level Cache设计思想。那么对于微机系统而言,Cache到底有什么作用?它的工作原理又是如何的呢?

一、使用Cache的必要性

所谓Cache即高速缓冲存储器,它位于CPU与主存即DRAM(Dynamic RAM 动态存储器)之间,是通常由SRAM(Static RAM 静态存储器)构成的规模较小但存取速度很快的存储器。

目前计算机主要使用的内存为DRAM,它具有价格低、容量大等特点,但由于使用电容存储信息,存取速度难以提高,而CPU每执行一条指令都要访问一次或多次主存,DRAM的读写速度远低于CPU速度,因此为了实现速度上的匹配,只能在CPU指令周期中插入wait状态,高速CPU处于等待状态将大大降低系统的执行效率。

SRAM由于其采用了与CPU相同的制作工艺,因此与DRAM相比,它的存取速度快,但体积大、功耗大,价格很高,不可能也不必要将所有的内存都采用SRAM。

因此为了解决速度与成本的矛盾就产生了一种分级处理的方法,即在主存和 CPU之间加装一个容量相对较小的SRAM作为高速缓冲存储器。

当采用Cache后,在Cache中保存着主存中部分内容的副本(称为存储器映象), CPU在读写数据时,首先访问Cache(由于Cache的速度与CPU相当,所以CPU可以在零等待状态下完成指令的执行),只有当Cache中无 CPU所需的数据时(这称之"未命中",否则称为"命中"),CPU才去访问主存。而目前大容量Cache能使CPU访问Cache命中率高达90%- 98%,从而大大提高了CPU访问数据的速度,提高了系统的性能。

二、使用Cache的可行性

对大量的典型程序的运行情况分析结果表明,在一个较短的时间内,由程序产生的地址往往集中在存储器逻辑地址空间的很小范围内。在多数情况下,指令是顺序执行的,因此指令地址的分布就是连续的,再加上循环程序段和子程序段要重复执行多次,因此对这些地址的访问就自然具有时间上集中分布的趋向。数据的这种集中倾向不如指令明显,但对数组的访问以及工作单元的选择都可以使存储器地址相对集中。这种对局部范围的存储器地址的频繁访问,而对此范围以外的地址则访问甚少的现象称为程序访问的局部性。根据程序的局部性原理,在主存和CPU之间设置Cache,把正在执行的指令地址附近的一部分指令或数据从主存装入 Cache中,供CPU在一段时间内使用,是完全可行的。

三、Cache的基本工作原理

传统的Socket架构下通常采用两级缓冲结构,即在CPU中集成了一级缓存(L1 Cache),在主板上装二级缓存(L2 Cache);而SlotⅠ架构下的L2 Cache则与CPU做在同一块电路板上,以内核速度或者内核速度的一半运行,速度比Socket下的以系统外频运行的L2 Cache更快,能够更大限度发挥高主频的优势,当然对Cache工艺要求也越高。CPU首先在L1 Cache中查找数据,如找不到,则在L2Cache中寻找;若数据在L2 Cache中,控制器在传输数据的同时,修改L1 Cache;若数据既不在L1 Cache中,又不在L2 Cache中,Cache控制器则从主存中获取数据,将数据提供给CPU的同时修改两级Cache。K6-Ⅲ则比较特殊,64KB L1 Cache,256KB Full Core Speed L2 Cache,原先主板上的缓存实际上就成了L3 Cache。根据有关测试表明:当512K-2MB的三级缓存发挥作用时,系统性能还可以有2%~10%的提高;Tri-level成为PC系统出现以来提出的解决高速CPU与低速内存之间瓶颈最为细致复杂的方案。而且,今后Cache的发展方向也是大容量、超高速。  

在主存-Cache存储体系中,所有的指令和数据都存在主存中,Cache只是存放主存中的一部分程序块和数据块的副本,只是一种以块为单位的存储方式。Cache和主存被分为块,每块由多个字节组成。由上述的程序局部性原理可知,Cache中的程序块和数据块会使CPU要访问的内容大多数情况下已经在Cache中,CPU的读写操作主要在CPU和Cache之间进行。CPU访问存储器时,送出访问单元的地址,由地址总线传送到Cache控制器中的主存地址寄存器MA,主存—Cache地址转换机构从MA获取地址并判断该单元内容是否已在Cache中存有副本,如果副本已存在Cache中,即命中。当命中时,立即把访问地址变换成它在Cache中的地址,然后访问Cache。

如果CPU要访问的内容不在Cache中,即不命中,则CPU转去直接访问主存,并将包含此存储单元的整个数据块(包括该块数据的地址信息)传到 Cache中,使得以后的若干次对内存的访问可转化为对Cache的访问。若Cache存储器已满,则需在替换控制部件的控制下,根据某种替换算法/策略,用此块信息替换掉Cache中的原来的某块信息。

所以,要想提高系统效率,必须提高Cache命中率,而Cache命中率的提高则取决于Cache的映象方式和Cache刷新算法等一系列因素;同时 Cache中内容应与主存中的部分保持一致,也就是说,如果主存中的内容在调入Cache之后发生了变化,那么它在Cache中的映象也应该随即改变,反之,当CPU修改了Cache中的内容后,主存中的相应内容也应作修改。

从上面的简单介绍中,我们知道了Cache也是一类存储器,它是为了解决CPU与主存之间速度匹配问题而设置的,且不能由用户直接寻址访问。下篇将就Cache映象问题、刷新问题和保持数据一致性问题作简要论述。

四、地址映像

所谓映象问题是指如何确定Cache中的内容是主存中的哪一部分的拷贝,即必须应用某种函数把主存地址映象到Cache中定位,也称地址映象。当信息按这种方式装入Cache中后,执行程序时,应将主存地址变换为Cache地址,这个变换过程叫作地址变换。地址映象方式通常采用直接映象、全相联映象、 组相联映象三种。   

1.直接映象  

每个主存地址映像到Cache中的一个指定地址的方式,称为直接映象方式。在直接映象方式下,主存中存储单元的数据只可调入Cache中的一个位置,如果主存中另一个存储单元的数据也要调入该位置则将发生冲突。地址映像的方法一般是将主存空间按Cache的尺寸分区,每区内相同的块号映像到Cache 中相同的块位置。一般地,Cache被分为2N块,主存被分为同样大小的2M块,主存与Cache中块的对应关系可用如下映像函数表示:j = i mod 2N。式中,j是Cache中的块号,i是主存中的块号。   

直接映象是一种最简单的地址映像方式,它的地址变换速度快,而且不涉及其他两种映像方式中的替换策略问题。但是这种方式的块冲突概率较高,当称序往返访问两个相互冲突的块中的数据时,Cache的命中率将急剧下降,因为这时即使Cache中有其他空闲块,也因为固定的地址映像关系而无法应用。   

2.全相联映象

主存中的每一个字块可映像到Cache任何一个字块位置上,这种方式称为全相联映像。这种方式只有当Cache中的块全部装满后才会出现块冲突,所以块冲突的概率低,可达到很高的Cache命中率;但实现很复杂。当访问一个块中的数据时,块地址要与Cache块表中的所有地址标记进行比较已确定是否命中。在数据块调入时存在着一个比较复杂的替换问题,即决定将数据块调入Cache中什么位置,将Cache中那一块数据调出主存。为了达到较高的速度,全部比较和替换都要用硬件实现。

3.组相联映象

组相联映象方式是直接映象和全相联映象的一种折衷方案。这种方法将存储空间分为若干组,各组之间是直接映像,而组内各块之间则是全相联映像。它是上述两种映像方式的一般形式,如果组的大小为1,即Cache空间分为2N组,就变为直接映像;如果组的大小为Cache整个的尺寸,就变为了全相联映像。组相联方式在判断块命中及替换算法上都要比全相联方式简单,块冲突的概率比直接映像的低,其命中率也介于直接映像和全相联映像方式之间。

五、替换策略和一致性问题的处理方法   

Cache和存储器一样具有两种基本操作,即读操作和写操作。  

当CPU发出读操作命令时,根据它产生的主存地址分为两种情形:

一种是需要的数据已在Cache中,那么只需直接访问Cache,从对应单元中读取信息到数据总线;

另一种是需要的数据尚未装入Cache,CPU需从主存中读取信息的同时,Cache替换部件把该地址所在的那块存储内容从主存拷贝到 Cache中;若Cache中相应位置已被字块占满,就必须去掉旧的字块。常见的替换策略有两种:

1.先进先出策略(FIFO) 

FIFO(First In First Out)策略总是把最先调入的Cache字块替换出去,它不需要随时记录各个字块的使用情况,较容易实现;缺点是经常使用的块,如一个包含循环程序的块也可能由于它是最早的块而被替换掉。

2.最近最少使用策略(LRU)

LRU(Least Recently Used)策略是把当前近期Cache中使用次数最少的那块信息块替换出去,这种替换算法需要随时记录Cache中字块的使用情况。LRU的平均命中率比 FIFO高,在组相联映像方式中,当分组容量加大时,LRU的命中率也会提高。

当CPU发出写操作命令时,也要根据它产生的主存地址分为两种情形:一种是不命中时,只向主存写入信息,不必同时把这个地址单元所在的整块内容调入Cache中;另一种是命中时,这时会遇到如何保持Cache与主存的一致性问题,通常有三种处理方式:   

1.直写式(write through)

    即CPU在向Cache写入数据的同时,也把数据写入主存以保证Cache和主存中相应单元数据的一致性,其特点是简单可靠,但由于CPU每次更新时都要对主存写入,速度必然受影响。
2.缓写式(post write)

    即CPU在更新Cache时不直接更新主存中的数据,而是把更新的数据送入一个缓存器暂存,在适当的时候再把缓存器中的内容写入主存。在这种方式下,CPU不必等待主存写入而造成的时延,在一定程度上提高了速度,但由于缓存器只有有限的容量,只能锁存一次写入的数据,如果是连续写入,CPU仍需要等待。
3.回写式(write back)

    即CPU只向Cache写入,并用标记加以注明,直到Cache中被写过的块要被进入的信息块取代时,才一次写入主存。这种方式考虑到写入的往往是中间结果,每次写入主存速度慢而且不必要。其特点是速度快,避免了不必要的冗余写操作,但结构上较复杂。
此外,还有一种设置不可Cache区(Non-cacheable Block)的方式,即在主存中开辟一块区域,该区域中的数据不受Cache控制器的管理,不能调入Cache,CPU只能直接读写该区域的内容。由于该区域不与Cache发生关系,也就不存在数据不一致性问题。目前微机系统的BIOS设置程序大多允许用户设置不可Cache区的首地址和大小。

一个基于ARM cotex单片机做的网络收音机和播放器项目

http://code.google.com/p/arm-webradio/

一个用两个IO驱动LCD1206显示的超牛方案

整理自:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4301955&bbs_page_no=1&bbs_id=9999

1、完成结果展示图:

1 

2

增加了“无线馈电及传送数据”部分的电路展示:

3 

电路图如下,仔细观察可以发现实物图中有几个贴片的阻容件,秘密就在这里,利用电容的记忆效应,把串行的数据转为并行。

6

示范程序如下比较简单,不用多注释应该都能看懂。作为演示用途,其中有些长时间延时没有没有使用定时器,在多任务系统中当然要用定时中断来代替了。

//         Drive a LCD1602 with 2 wire 
//=================================================== 
//ICC-AVR application builder : 2010-10-3 19:30:02 
// Target : M16 
// Crystal: 4.0000Mhz 

#include <iom16v.h> 
#include <macros.h> 

#define Set_E PORTB|=2 
#define Clr_E PORTB&=~2 
#define Set_D PORTB|=1 
#define Clr_D PORTB&=~1 
#define Set_xy(y,x) Send(0,(y<<6)|(x&15)|0x80) 

//=================================================== 
void init_devices(void) 
{ 
  CLI(); //disable all interrupts 
  DDRB  = 0x03; 
  MCUCR = 0x00; 
  GICR  = 0x00; 
  SEI(); //re-enable interrupts 
} 

//=================================================== 
void Delay(unsigned int i) 
{ 
  while(i--); 
}	

//=================================================== 
void Send(unsigned char RS, unsigned char dat) 
{ 
  unsigned char i; 
  for (i = 2; i > 0; i--) 
  { 
    if (dat & 0x80) Set_D; else Clr_D; 
    Delay(10608);//14520us 
    if (RS) Set_E; 
    if (dat & 0x40) Set_D; else Clr_D; 
    Delay(462);  //660us 
    if (dat & 0x20) Set_D; else Clr_D; 
    Delay(18);   //30us 
    Set_E; 
    if (dat & 0x10) Set_D; else Clr_D; 
    _NOP();      //0.5us < t < 1.36us 
    Clr_E; 
    dat <<= 4; 
  }	
} 

//=================================================== 
void init_1602(void) 
{ 
  unsigned char i = 3; 
  Clr_D; 
  Clr_E; 
  Delay(10608); 
  do{ 
    Clr_D; 
    Delay(462); 
    Set_D; 
    Set_E; 
    Delay(18); 
    if (i == 0) Clr_D; 
    _NOP();_NOP();_NOP(); 
    Clr_E; 
    }while(i--); 
  Send(0,0x28); 
  Send(0,0x01); 
  Send(0,0x0f); 
} 

//=================================================== 
void Send_S(unsigned char *p) 
{ 
  while(*p) Send(1,*p++); 
}	

//=================================================== 
void main(void) 
{ 
  unsigned char i; 
  init_devices(); 
  init_1602(); 
   
  Set_xy(0,2); 
  Send_S("Hello world!"); 
  Set_xy(1,3); 
  Send_S("I'm COWBOY."); 
  for (i=0;i<255;i++) Delay(10000); 
   
  Send(0,0x01); 
  Set_xy(0,3); 
  Send_S("Welcome to"); 
  Set_xy(1,1); 
  Send_S("www.ourdev.cn"); 
  while(1); 
}   

 

后记:这个设计的突出特点部分是串并转换的思想和设计电路,虽然从运行时间上、稳定性上将不太可取,但是,这个设计方法可以在很多地方用到,还有就是这个作者敢想、敢做。要是真的需要很少的引脚来控制LCD的话,我宁肯选择一个带SPI接口的LCD,可定比这个方案稳定、快速。

发现Google在主页上宣传其自己的手机

记得,像Google这样的公司是很难在搜索主页上见到他的广告的。今天居然发现它在主页上推广自己的手机。

点击链接,发现实际链接到三星的销售平台,看来Google手机是三星代工的了。

可见,Google手机应该主要是推广它手机操作系统平台Andriod,操作系统的暗战由此可见一斑。

 

image

Google推广的Nexus S手机图片:

big-2

Google API

]]>

Eclipse、SVN、Google Code的配置

1、简单YY几句:

最近才真正的发现Eclipse可真他娘的强大呀~ 几乎各种语言都有基于它的扩展工具包~

特别是:Eclipse的函数、变量、宏定义、结构体等的跳转功能以及和CVS、SVN等版本控制软件的良好接口,程序员用起来简直爽歪了~

eclipse内置CVS客户端,如果有CVS服务器可以用的话,就可以直接使用它做版本管理了,可是Google没有提供CVS管理,但是提供了SVN和MC,所以选择了SVN使用。

前几天下载了Eclipse的C/C++开发版本,仅仅用做目前工作的工程代码的编辑和利用CVS同步代码,觉得比较爽~ 虽然还有一些功能不很熟悉。

昨天用它打了个python开发用的补丁(pydev),安装了python后测试了一下,开发python也挺好用的。

今天,在工作累的时候有钻研了一下和SVN以及Google code的连接,这样就可以借助Google code的平台,在任何地方,利用闲暇时间来写一些开源小工具了~

要是上天能赐我一个ipad就更好了~ 那就真的可以随时随地写代码了~

 

2、缘起:

想利用Google code维护自己开发的一个小工具---自动定时管理工具(AutoTimerManage)。顺便学习和熟悉一下SVN和Eclipse。

 

3、安装Eclipse的SVN补丁:

3.1 下载Eclipse,根据自己需求下载对应版本即可,解压缩即可用。http://www.eclipse.org/downloads/

3.2 为Eclipse打上SVN管理工具补丁(subclipse)。参见(http://code.google.com/p/performancetestingtool/wiki/Eclipse_SVN)的描述。

1)打开Eclipse,菜单:help->Install new software,打开程序安装窗口,点击右上角“Add...”按钮,命名为SVN,并在下面添加链接“http://subclipse.tigris.org/update”,ok即可。

image

2)Eclipse开始自动连接到subclipse工具的下载站点。获取到需要可下载的工具名称,全部选中,然后点击下一步即可开始下载补丁文件以及说明文件了

image

3)然后一路next,接受安装协议,直到Finish就可以了,接下来就直接开始下载。(下载过程大约几分钟,视网速如何了...)最后下载完成后弹出个警告,同意即可。然后会弹出提示重启eclipse,ok即可。

image     ...     image image

4、配置SVN,连接Google Code:

1)点击Eclipse菜单:windiow->show view->other 打开选项配置窗口。

image

2)打开SVN目录,选中“SVN资源库”,确定。

image

2)在“SVN资源库”窗口点击右键,选择:新建->资源库位置

image

 

 

image

image

image

 

image

 

image

Eclipse+python开发环境配置

1、下载Eclipse编辑器。http://www.eclipse.org/downloads/

根据电脑的处理器选择32位或64位版本下载。选择“Eclipse Classic 3.6.2”或JAVA开发版本下载都可以。我选择“Eclipse Classic 3.6.2”版本安装的版本,下载后解压缩即可使用,可以将解压缩的目录复制到安装程序目录,便于管理。我复制到“C:\Program Files”目录下存放。

双击目录下 Eclipse.exe运行,进行简单的基本配置即可。

image

 

注意:如果电脑上没有安装过Java运行库的话,Eclipse启东时会报错提醒,需要去http://www.oracle.com/technetwork/java/javase/downloads/index.html下载JRE即可。

wps_clip_image-12116

 

2、下载Python编译器安装。http://www.python.org/getit/

参见下面截图,我下载了Python 3.2 Windows x86 MSI Installer版本。安装到默认路径“C:\Python31”即可。

image

 

3、下载Eclipse下开发Python的插件Pydev,目前版本是1.6.5。http://sourceforge.net/projects/pydev/

下载后,解压缩文件夹中包含两个目录。

wps_clip_image-10852

将这两个目录下的文件全部复制到Eclipse安装程序的对应的两个同名字目录下,即可完成Eclipse Python开发补丁安装。

 

4、重启Eclipse。

打开windows菜单,打开preferences子菜单,弹出对话框中即可看到Pydev补丁的安装结果。

选中子项Interpreter-Python,进行Python开发环境的设置。如下图:

点击右上角的New按钮,在弹出对话框中点击“Browse...”按钮,然后找到Python的安装目录,选中Python.exe即可(这就是python程序的编译器)。还会弹出弹出环境变量设置选项,不用修改直接确认即可。

下图所示为配置完成的界面。

image

5、开发环境测试。

配置完成后重启Eclipse开发环境,打开“File”菜单,选择“New->Project”,新建一个工程。

image

选择Pydev下的Pydev Project选项,然后设置工程名称和存储路径即可。

image

建立工程完毕后,工程管理窗口自动添加了“src”目录和python编译器。如下图所示,然后,对“src”目录点右键添加一个文件命名为“main.py”即可。然后,打开文件添加代码“print("test,hello world!\n")”测试。如下图:

image

点击,上面的绿色运行按钮,Eclipse会提示选择希望编译的文件,默认,开始编译运行即可。会看到下方控制台输出运行结果。

测试完成。说明环境配置成功。

定时自动启动任务或提醒的实现-续1

以前自己有这个需求,就简单写了程序,随机启动后监控时间,本来还想实现一个脚本解析功能的,暂时还没做。现在公司中午定时开始做操,前台小MM总是忘记,拜托我搞个定时提醒工具,正好这个派上用场了。

设计思路:

1、VS实现一个Windows程序(不用console程序的原因是避免启动后有个不友好的黑色界面,我不知道该怎么消除它),删除winmian中的全部代码(避免弹出界面),然后添加如下代码:

实现代码

2、参考上面的代码,为了避免修改麻烦,使用“system(" \"d:\\Auto.bat\" ");”语句实现定时运行批处理脚本文件,同时需要建立一个脚本文件“Auto.bat”存放在D:盘根目录下。并且在文本编辑器中填写比处理代码如下:

批处理代码

这个批处理实现强制弹出关机界面,便于提醒,放置因为当前在操作其他工具而影响提示。并定时在3.5小时后关机(下班时间),这里关机时间当然可以随意修改了。还实现了启动千千播放器的功能,当然也可以改为其他可执行程序。

3、把生成的应用程序添加到系统自启动项中,随机启动即可。需要修改被启动对象时只需修改批处理,避免在我这里播放器的安装路径和其他人的不同。

4、如果再增加一个可以设置多组定时时间和对应启动任务功能就好了。有望在周末有空时把它改完备了。

===后记===

另,昨天用JScript借助网页也实现了此功能,这样运行修改都很方便,可惜的是,提醒的对话框常常因为当前在使用其他东西而被隐藏在后面。还有就是运行后IE总是提示危险插件,还要手动允许一下才能使用,很不爽,放弃之!不过作为一个成果也贴于此:

JScript处理代码


 

解决Windows XP在关闭IE时弹出读写内存错误的问题

计算机系统中运行一些容量较大的程序或者游戏时,系统常常会自动弹出“xx内存不能为read或written”的错误提示,遇到这种故障信息时,我们该如何才能将它有效排除,同时确保下次运行容量较大的程序或者游戏时,系统不会再次出现系统内存读写错误呢?事实上,当我们不幸遭遇上面的故障信息时,我们可以尝试按照如下步骤进行依次排查。

在上网冲浪的过程中,许多插件程序会偷偷地安装到计算机系统中,而不少插件程序往往都有防删除的功能,因此这些插件很容易与其他的应用程序发生冲突,从而间接地引起系统内存读写错误的现象。为了给那些大容量的应用程序或游戏提供一个干净、稳定的工作环境,我们最好定期使用安全防护软件,来查看系统是否被偷偷安装了各种无效的垃圾插件程序,一旦发现的话,那可以直接将它们从系统中及时卸载干净。

与系统内存读写操作有关的Windows Management Instrumentation服务要是发生错误的话,也会导致系统弹出内存读写错误的提示,所以当我们遇到这种错误现象时,可以尝试手工修复一下Windows Management Instrumentation服务,下面就是具体的修复步骤:

首先,用鼠标右键单击系统桌面中的“我的电脑”图标,从弹出的快捷菜单中执行“管理”命令,打开本地系统的计算机管理窗口,在该窗口的左侧显示区域,依次展开“服务和应用程序”/“服务”选项,在对应“服务”选项所在的右侧显示区域中,找到Windows Management Instrumentation服务,并用鼠标右键单击该服务选项,从弹出的快捷菜单中执行“属性”命令,打开服务属性设置界面;

wps_clip_image-27938

其次在该设置界面的“常规”标签页面中,单击“停止”按钮,将Windows Management Instrumentation服务暂时停止运行。之后,打开计算机系统的资源管理器窗口,在该窗口中依次展开“Windows->system32->wbem->repository”文件夹,然后将“repository”文件夹窗口中的所有文件进行一下备份,备份完成后将该文件夹中的所有内容全部清除掉;

接下来,重新启动一下计算机系统,待系统启动成功后,按前面操作打开Windows Management Instrumentation服务的属性设置界面,单击该界面中的“启动”按钮,相信这么一来Windows Management Instrumentation服务就能正常运行了。

如果计算机系统不小心感染了病毒或者发生了误删除操作,那么与系统内存读写操作有关的系统文件很可能受到损坏,而这些系统文件一旦受到损坏的话,那么我们就很容易遭遇内存读写故障提示了。所以,我们一旦碰到内存读写错误的提示时,不妨按照如下步骤修复一下系统,看看系统是否存在损坏的文件:

首先使用最新版本的杀毒软件,来对计算机系统进行彻底地病毒查杀操作,因为计算机系统一旦感染了病毒而不进行清除的话,我们即使修复了系统文件,病毒仍然有可能会继续破坏系统文件,所以及时使用杀毒软件来将计算机中的病毒全部清除干净,可以确保系统文件不会继续受到病毒的威胁。

其次使用系统自带的“sfc”命令,来尝试将受到损坏的系统文件修复到正常状态。在修复受损系统文件时,只要在运行中输入“CMD”,打开“命令提示符”窗口,在其中输入字符串命令“sfc/scannow”,单击回车键后,该命令程序就会对系统每个角落处的系统文件进行搜索扫描,一旦发现系统文件的版本不正确或者系统文件已经损坏的话,它就能自动弹出提示界面,要求我们插入Windows系统的安装光盘,以便从中提取正常的系统文件来替代不正常的系统文件,从而达到修复系统文件的目的。要是系统修复操作成功的话,相信我们重新启动计算机系统时,就不会看到有什么不正常的现象了。

我们知道,在运行一些容量较大的程序或者游戏时,需要消耗相当的系统内存资源,要是此时内存空间不够时,那么系统内存读写错误的故障提示很有可能就会发生。为了有效避免这种错误提示,我们最好在运行容量较大的程序或者游戏之前,应该先将计算机系统重新启动一下,这样能够将系统内存空间充分释放出来;如果计算机内存空间本身就比较小的话,那么我们建议各位最好及时升级内存,以便拓展内存的有效使用空间,以防止由于系统内存不足而造成系统内存读写错误的发生。

当然,在系统自身内存空间不足的情况下,我们应该先将那些随机启动的杀毒软件以及相关即时监控的程序暂时关闭掉,之后再尝试运行容量较大的应用程序或者网络游戏,因为杀毒软件及相关监控程序会在一定程度上消耗一些系统内存资源,将它们关闭可以节省不小的内存空间,从而能够有效避免内存读写错误现象的发生。当然,值得注意的是,我们在运行完大容量的程序或游戏之后,还必须记得及时将相关程序的监控功能全部打开。

转自:http://www.zhaokey.org/2011/02/16/rangwindowsxpbuzaichuneicunduxiecuowu/