第七章 WINDOWS
7.1 WINDOWS的内存分配
内存是操作系统的核心部分,所以我们非常有必要了解内存的分配机制。在 DOS下,访问内存的指针是用段地址,偏移量来表示,所有程序共用一个内存空间,由低向高分配内存空间,所以任何程序都可以随便修改内存中的数据,包括不属于自己程序的内存空间和中断向量表。而且所有程序被局限在 1M的基本内存 (Base Memory)中,不能直接访问扩充内存。
第七章 WINDOWS
当你启动电脑时,WINDOWS的系统代码会加载到不同的内存部分。负责管理应用程序的窗口和图形的代码部分,即 USER和 GDI,
加载到内存的低端。 WINDOWS操作系统的核心是 VMM(虚拟机管理器),它将加载到内存的顶部,并在内存的高端运行。对于
Windows下的程序来说,它所访问的内存地址不再是真实的。
第七章 WINDOWS
而是虚拟的、独立的全平坦式 (flat)的内存空间。如一个 32位的程序可访问内存地址是
0x00000000到 0xffffffff(4G),指针不再存储段地址。所谓独立,指的是当进程 A加载到内存 0x400000处时,进程 B加载到内存的地址时一样是 0x400000,两者的地址空间是相互独立的。程序访问内存地址时,由 Windows
自动换算为真实的内存地址。
第七章 WINDOWS
这样,程序 A是无法直接访问程序 B的内存空间的,也就提高了系统的稳定性。其实,在这
4G的内存地址中,我们能使用的内存地址不到一半。我们的程序是无法分配到 0x80000000
以上的内存地址的,这 2G的内存地址都是被系统占用,是只读的。
第七章 WINDOWS
我们都知道,虽然在运行速度上硬盘不如内存,但在容量上内存是无法与硬盘相提并论的。当运行一个程序需要大量数据、占用大量内存时,内存就会被“塞满”,并将那些暂时不用的数据放到硬盘中,而这些数据所占的空间就是虚拟内存。不知大家发现没有,
在 Windows 2000( XP)目录下有一个名为
pagefile.sys的系统文件( Windows 98下为
Win386.swp),它的大小经常自己发生变动第七章 WINDOWS
小的时候可能只有几十兆,大的时候则有数百兆,这种毫无规律的变化实在让很多人摸不着头脑。其实,pagefile.sys是 Windows下的一个虚拟内存,它的作用与物理内存基本相似,但它是作为物理内存的“后备力量”
而存在的,也就是说,只有在物理内存已经不够使用的时候,它才会发挥作用。
第七章 WINDOWS
虚拟内存的大小是由 Windows来控制的,但这种默认的 Windows设置并不是最佳的方案,
因此我们要对其进行一些调整。这样才能发挥出系统的最佳性能。
虚拟内存的优化
1、改变页面文件的位置
其目的主要是为了保持虚拟内存的连续性。因为硬盘读取数据是靠磁头在磁性物质上读取。页面文件放在磁盘上的不同区域 。
第七章 WINDOWS
磁头就要跳来跳去,自然不利于提高效率。
而且系统盘文件众多,虚拟内存肯定不连续,
因此要将其放到其他盘上。改变页面文件位置的方法是:用鼠标右键点击“我的电脑”,
选择“属性 → 高级 → 性能设置 → 高级 → 更改虚拟内存”,在驱动器栏里选择想要改变到的位置(如图 1)即可。值得注意的是,当移动好页面文件后,要将原来的文件删除 (系统不会自动删除 )。
第七章 WINDOWS
图 1 改变页面文件的位置第七章 WINDOWS
2、改变页面文件的大小
改变了页面文件的位置后,我们还可以对它的大小进行一些调整(如图 2)。调整时我们需要注意,不要将最大、最小页面文件设为等值。因为通常内存不会真正“塞满”,
它会在内存储量到达一定程度时,自动将一部分暂时不用的数据放到硬盘中。最小页面文件越大,所占比例就低,执行的速度也就越慢。
第七章 WINDOWS
最大页面文件是极限值,有时打开很多程序,
内存和最小页面文件都已“塞满”,就会自动溢出到最大页面文件。所以将两者设为等值是不合理的。一般情况下,最小页面文件设得小些,这样能在内存中尽可能存储更多数据,效率就越高。最大页面文件设得大些,
以免出现“满员”的情况。
第七章 WINDOWS
图 2 调整页面文件的大小第七章 WINDOWS
3、禁用页面文件
当拥有了 512MB以上的内存时,页面文件的作用将不再明显,因此我们可以将其禁用。方法是:依次进入注册表编辑器
,HKEY_LOCAL_MACHINESystemCurrent
ControlSetControlSession Ma-
nagerMemoryManagement”下,在
,DisablePa-ging Executive”(禁用页面文件)
选项中将其值设为,1”即可(如图 3)。
第七章 WINDOWS
图 3 禁用页面文件第七章 WINDOWS
虚拟内存它在内存与硬盘之间的工作关系,同时认识到了虚拟内存并非越大越好,而应该根据计算机的具体配置进行合理的调整。也许你会发现,如果
Windows同时启动两次一个相同的应用程序 (如同时启动两个 Visual Studio),第二次起动的速度明显快于第一次。这是因为,虽然每个程序的内存空间是独立的,但它们有一部分内存是只读的,是可以几个进程共享包括放在 0x80000000内存空间以上的系统服务。
第七章 WINDOWS
使用 Windows操作系统的人有时会遇到这样的错误信息:,0X指令引用的
0x00000000内存,该内存不能 written”,然后应用程序被关闭。得到的回答往往是
,Windows就是这样不稳定”之类的义愤和不屑。其实,这个错误并不一定是 Windows
不稳定造成的。下面我们就来简单分析这种错误的常见原因。
第七章 WINDOWS
一、应用程序没有检查内存分配失败程序需要一块内存用以保存数据时,就需要调用操作系统提供的“功能函数”来申请,如果内存分配成功,函数就会将所新开辟的内存区地址返回给应用程序,应用程序就可以通过这个地址使用这块内存。这就是“动态内存分配”,内存地址也就是编程中的“指针”。内存不是永远都招之即来、
用之不尽的,有时候内存分配也会失败。
第七章 WINDOWS
当分配失败时系统函数会返回一个 0值,这时返回值,0”已不表示新启用的指针,而是系统向应用程序发出的一个通知,告知出现了错误。作为应用程序,在每一次申请内存后都应该检查返回值是否为 0,如果是,则意味着出现了故障,应该采取一些措施挽救,这就增强了程序的“健壮性”。
第七章 WINDOWS
若应用程序没有检查这个错误,它就会按照“思维惯性”认为这个值是给它分配的可用指针,继续在之后的运行中使用这块内存。真正的 0地址内存区保存的是计算机系统中最重要的“中断描述符表”,
绝对不允许应用程序使用。在没有保护机制的操作系统下(如 DOS),写数据到这个地址会导致立即死机,而在健壮的操作系统中,如 Windows等,这个操作会马上被系统的保护机制捕获,其结果就是由操作系统强行关闭出错的应用程序,以防止其错误扩大。这时候,就会出现上述的“写内存”错误,
并指出被引用的内存地址为,0x00000000”。
第七章 WINDOWS
内存分配失败故障的原因很多,内存不够、
系统函数的版本不匹配等都可能有影响。因此,这种分配失败多见于操作系统使用很长时间后,安装了多种应用程序(包括无意中
“安装”的病毒程序),更改了大量的系统参数和系统文件之后。
二、应用程序由于自身 BUG引用了不正常的内存指针第七章 WINDOWS
在使用动态分配的应用程序中,有时会有这样的情况出现:程序试图读写一块“应该可用”的内存,
但不知为什么,这个预料中可用的指针已经失效了。
有可能是“忘记了”向操作系统要求分配,也可能是程序自己在某个时候已经注销了这块内存而“没有留意”等等。注销了的内存被系统回收,其访问权已经不属于该应用程序,因此读写操作也同样会触发系统的保护机制,企图“违法”的程序唯一的下场就是被操作终止运行,回收全部资源。
第七章 WINDOWS
像这样的情况都属于程序自身的 BUG,你往往可在特定的操作顺序下重现错误。无效指针不一定总是 0,因此错误提示中的内存地址也不一定为,0x00000000”,而是其他随机数字。
如果系统经常有所提到的错误提示,下面的建议可能会有帮助:
第七章 WINDOWS
1.查看系统中是否有木马或病毒。这类程序为了控制系统往往不负责任地修改系统,从而导致操作系统异常。平常应加强信息安全意识,对来源不明的可执行程序绝不好奇。
2.更新操作系统,让操作系统的安装程序重新拷贝正确版本的系统文件、修正系统参数。
有时候操作系统本身也会有 BUG,要注意安装官方发行的升级程序
3.试用新版本的应用程序。
第七章 Windows
7.3 Windows程序代码的共享
DLL文件即动态链接库文件,是一种可执行文件,它允许程序共享执行特殊任务所必需的代码和其他资源。 Windows提供的 DLL文件中包含了允许基于 Windows的程序在
Windows环境下操作的许多函数和资源。
DLL多数情况下是带有 DLL扩展名的文件,但也可能是 EXE或其他扩展名。
第七章 Windows
它们向运行于 Windows操作系统下的程序提供代码、数据或函数。程序可根据 DLL文件中的指令打开、启用、查询、禁用和关闭驱动程序。
DLL可在,C:Windows”目录
,C:WindowsSystem”目录和程序的安装目录中找到。
第七章 Windows
如果启动程序,但一个或多个 DLL文件丢失或毁坏,则会收到出错消息,如“找不到
xyz.dll”。如果启动的程序带有一个过期的
DLL文件或不匹配的 DLL文件,则会出现“未定义的动态链接调用”消息。这时,你可在其他电脑上找到正确的 DLL文件并将它拷贝到适当的目录下,程序就能正确运行。
第七章 Windows
1、如何了解某应用程序使用哪些 DLL文件右键单击该应用程序并选择快捷菜单中的“快速查看”命令,在随后出现的“快速查看”窗口的
“引入表”一栏中你将看到其使用 DLL文件的情况。
2、如何知道 DLL文件被几个程序使用运行 Regedit,进入
HKEY_LOCAL_MACHINESoftwareMicrosrftWindo
wsCurrent-VersionSharedDlls子键查看,
第七章 Windows
其右边窗口中就显示了所有 DLL文件及其相关数据,
其中数据右边小括号内的数字就说明了被几个程序使用,( 2)表示被两个程序使用,( 0)则表示无程序使用,可以将其删除。
3、如何解决 DLL文件丢失的情况有时在卸载文件时会提醒你删除某个 DLL文件可能会影响其他应用程序的运行。所以当你卸载软件时,就有可能误删共享的 DLL文件。
第七章 Windows
一旦出现了丢失 DLL文件的情况,如果你能确定其名称,可以在 Sysbckup(系统备份文件夹)中找到该 DLL文件,将其复制到
System文件夹中。如果这样不行,在电脑启动时又总是出现,***dll文件丢失 ……” 的提示框,运行 Msconfig,进入系统配置实用程序对话框以后,单击选择,System.ini”标签,
找出提示丢失的 DLL文件,使其不被选中,
这样开机时就不会出现错误提示了。
第七章 Windows
在系统的组策略和注册表中,我们可以修改一些键值来优化我们的系统,并加强操作系统的安全性。可是,对于限制下载、禁止删除文件等功能,我们无法通过上述的操作来完成,这只有通过修改系统 DLL文件来实现。
目前,我们通过修改系统的 DLL文件,可以实现禁止删除文件、禁止 IE下载、禁止 IE另存为、禁止文件打开方式等功能。
第七章 Windows
系统中部分 DLL文件的功能
1,Browselc.dll IE所需要调用的库文件 DLL 结构雏形就是它了
2,Shdoclc.dll 系统窗口及设置等,如删除文件、重命名
3,Shell32.dll 系统窗口及设置等,如删除文件、重命名
4,Cryptui.dll IE控件下载及提示对话框程序第七章 Windows
7.4Windows数据的共享
在不同的文档和应用程序中共享数据的最简单的方法是通过 WINDOWS的剪贴板。
应用程序以不同的格式存储文档,格式就是数据的编码方式。当复制和剪切数据时,
windows就会将它们以多种格式传送到剪贴板中。
第七章 Windows
7.5对象的链接与嵌入( OLE)
OLE( Object Linking and Embedding,对象链接与嵌入)是一个 Microsoft Windows的特性,它可以在多种 Windows应用程序之间进行数据交换,或组合成一个合成文档。
Windows版本的应用系统同样支持该功能,
可以将其他 Windows应用程序的对象链接或嵌入到应用程序中,或在其他程序中链接或嵌入应用程序图形。
第七章 Windows
链接和嵌入都是把信息从一个文档插入另一个文档中,都可在合成文档中编辑源信息。
它们的区别在于:如果将一个对象作为链接对象插入到应用程序中,则该对象仍保留与源对象的关联。当对源对象或链接对象进行编辑时,两者将都发生改变。而如果将对象
“嵌入”到应用程序中,则它不再保留与源对象的关联。当对源对象或链接对象进行编辑时,将彼此互不影响。
第七章 Windows
是 microsoft为了不同应用程序之间的文件可以互相传递数据而指定的一种规格,例如在 WORD里面嵌入一段 MPEG,就是用 ole来实现在 word里面调用媒体播放器来播放 mpeg的。
比如在 POWERPOINT中,它的文字编辑功能很差,
照片处理功能也差,就可以通过“插入” -,
对象”中来选择。