示在“任务管理器”的“性能”选项卡的“核心存”部分。
总数 (K) :56552 分页数:45828
未分页 (K) :10724
还可以使用“任务管理器”查看一个独立进程正在使用的未分页合并存数量和分页合并存数量。操作步骤如下:
1) 单击“Windows任务管理器”的“进程”选项卡,然后从“查看”菜单中选择“选择列”命令,显示“进程”选项卡的可查看选项。
2) 在“选择列”对话框中,选定“页面缓冲池”选项和“非页面缓冲池”选项旁边的复选框,然后单击“确定”按钮。
返回Windows 2000“任务管理器”的“进程”选项卡时,将看到其中增加显示了各个进程占用的分页合并存数量和未分页合并存数量。
仍以刚才打开观察的应用程序 (例如Word) 为例,请在表5-2中记录:
表5-2 实验记录 映像名称 WINWORD.EXE PID 820 存使用 32276K 页面缓冲池 241K 非页面缓冲池 24K 从性能的角度来看,未分页合并存越多,可以加载到这个空间的数据就越多。拥有的物理存越多,未分页合并存就越多。但未分页合并存被限制为256MB,因此添加超出这个限制的存对未分页合并存没有影响。
步骤5:提高分页性能。
在Windows 2000的安装过程中,将使用连续的磁盘空间自动创建分页文件(pagefile.sys) 。用户可以事先监视变化的存需求并正确配置分页文件,使得当系统必须借助于分页时的性能达到最高。
虽然分页文件一般都放在系统分区的根目录下面,但这并不总是该文件的最佳位置。要想从分页获得最佳性能,应该首先检查系统的磁盘子系统的配置,以了解它是否有多个物理硬盘驱动器。
1) 在“开始”菜单中单击“设置” – “控制面板”命令,双击“管理工具”图标,再双击“计算机管理”图标。
2) 在“计算机管理”窗口的左格选择“磁盘管理”管理单元来查看系统的磁盘配置。 请在表5-3中记录:
表5-3 实验记录 卷 C: D: E: 布局 磁盘分区 磁盘分区 磁盘分区 类型 基本 基本 基本 文件系统 FAT32 FAT FAT32 容量 19.52G 493M 10.29G 状态 状态良好(系统) 状态良好 状态良好 如果系统只有一个硬盘,那么建议应该尽可能为系统配置额外的驱动器。这是因为:Windows 2000最多可以支持在多个驱动器上分布的16个独立的分页文件。为系统配置多个分页文件可以实现对不同磁盘I/O请求的并行处理,这将大大提高I/O请求的分页文件性能。
步骤6:计算分页文件的大小。
要想更改分页文件的位置或大小配置参数,可按以下步骤进行: 1) 右键单击桌面上的“我的电脑”图标并选定“属性”。 2) 在“高级”选项卡上单击“性能选项”按钮。
3) 单击对话框中的“虚拟存”区域中的“更改”按钮。 请记录:
页脚
所选驱动器 (C: ) 的页面文件大小: 驱动器:C
可用空间:8160MB
初始大小 (MB) :384MB 最大值 (MB) :768MB
所有驱动器页面文件大小的总数: 允许的最小值:2MB 推荐:382MB
当前已分配:384MB
4) 要想将另一个分页文件添加到现有配置,在“虚拟存”对话框中选定一个还没有分页文件的驱动器,然后指定分页文件的初始值和最大值 (以兆字节表示) ,单击“设置”,然后单击“确定”。
5) 要想更改现有分页文件的最大值和最小值,可选定分页文件所在的驱动器。然后指定分页文件的初始值和最大值,单击“设置”按钮,然后单击“确定”按钮。
6) 在“性能选项”对话框中单击“确定”按钮。 7) 单击“确定”按钮以关闭“系统特性”对话框。 步骤7:使用任务管理器。
可以使用“任务管理器”来简单地检查分页文件是否配置了正确容量。这样可以实时提供系统正在使用分页文件的方式以及其他重要系统信息的准确描述。
通过右键单击任务栏运行“任务管理器”,选定“性能”选项卡查看实时的系统统计数据。与分页文件大小最有关的信息位于“认可用量”区域。这一区域显示了认可“峰值”是否达到或超过了认可“限制”,以及它是否超过了系统上的物理存数量。认可“峰值”是指系统迄今为止向进程分配的最大物理存和虚拟存数量。
请记录: 物理存 (K)
总数: 261616K 可用数: 38304K 系统缓存: 66840K 认可用量 (K)
总数: 367380K 限制: 632708K 峰值: 425612K
当系统遇到分页活动增加的情况时,提交的存数量 (“认可总数”) 就会增加。一旦它达到了“认可限制”值,系统就需要扩展分页文件。“认可限制”值指出在不必扩展分页文件的情况下可以向存提交的虚拟存数量。因为目标是避免扩展分页文件,所以必须保持“认可总数”和“认可限制”值相差较大。如果这两个值接近了,那么系统必须动态增加分页文件的大小。
“任务管理器”的“认可用量”区域显示的信息还说明了系统的主存是否足以满足系统执行的任务。如果认可“总数”值经常超过系统中的存数量,那么系统的物理存可能不足。
页脚
3.2 Windows 2000编程
(实验估计时间:120分钟)
? ? ? ?
背景知识 实验目的 工具/准备工作 实验容与步骤
背景知识
Windows 2000可以识别的应用程序包括控制台应用程序、GUI应用程序和服务应用程序。控制台应用程序可以创建GUI,GUI应用程序可以作为服务来运行,服务也可以向标准的输出流写入数据。不同类型应用程序间的惟一重要区别是其启动方法。
Windows 2000是以NT的技术构建的,它提供了创建控制台应用程序的能力,使用户可以利用标准的C++工具,如iostream库中的cout和cin对象,来创建小型应用程序。当系统运行时,Windows 2000的服务通常要向系统用户提供所需功能。
服务应用程序类型需要ServiceMail() 函数,由服务控制管理器 (SCM) 加以调用。SCM是操作系统的集成部分,负责响应系统启动以开始服务、指导用户控制或从另一个服务中来的请求。其本身负责使应用程序的行为像一个服务。通常,服务登录到特殊的LocalSystem账号下,此账号具有与开发人员创建的服务不同的权限。
当令C++ 编译器创建可执行程序时,编译器将源代码编译成OBJ文件,然后将其与标准库相。产生的EXE文件是装载器指令、机器指令和应用程序的数据的集合。装载器指令告诉系统从哪里装载机器代码。另一个装载器指令告诉系统从哪里开始执行进程的主线程。在进行某些设置后,进入开发者提供的main() 、ServiceMain() 或WinMain() 函数的低级入口点。机器代码中包括有控制逻辑,它所做的事包括跳转到Windows API函数,进行计算或向磁盘写入数据等。
Windows允许开发人员将大型应用程序分为较小的、互相有关系的服务模块,即动态库 (DLL) 代码块,在其中包含应用程序所使用的机器代码和应用程序的数据。 实验目的
通过对Windows 2000编程,进一步熟悉操作系统的基本概念,较好地理解Windows 2000的结构。 工具/准备工作
在开始本实验之前,请回顾教科书的相关容。 需要做以下准备:
1) 一台运行Windows 2000 Professional操作系统的计算机。 2) 计算机中需安装Visual C++ 6.0专业版或企业版。 实验容与步骤
页脚
1. 简单的控制台应用程序 2. GUI应用程序 3. 进程对象
1. 简单的控制台应用程序
我们先来创建一个名为“Hello,World”的应用程序。 步骤1:登录进入Windows 2000 Professional。
步骤2:在“开始”菜单中单击“程序”-“附件”-“记事本”命令,将清单3-l中的程序键入记事本中,并把代码保存为Hello.cpp。
清单3-1 一个简单的Windows 2000控制台应用程序 // hello项目
# include
void main() {
std::cout << “Hello, Windows 2000” << std :: endl ; }
步骤3:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows“命令提示符”窗口,并利用简单的标准命令行:
C:\\> CL Hello.cpp 来创建可执行的Hello.EXE。
操作能否正常进行?如果不行,则可能的原因是什么?
运行不正常。缺少MSPDB60.dll文件
步骤4:运行Hello.EXE程序,产生用户键入的一行文字。 运行结果 (如果运行不成功,则可能的原因是什么?) :
运行不成功,connot execute “clxx”. 2. GUI应用程序
在下面的实验中,C++ 编译器创建一个GUI应用程序,代码中包括了WinMain() 方法,这是GUI类型的应用程序的标准入口点。
步骤5:在“开始”菜单中单击“程序”-“附件”-“记事本”命令,将清单3-2中的程序键入记事本中,并把代码保存为3-2.cpp。
清单3-2 Windows 2000的GUI应用程序 // msgbox项目
# include
// 告诉连接器与包括MessageBox API函数的user32库进行连接 # pragma comment(lib, “user32.lib” )
// 这是一个可以弹出信息框然后退出的筒单的应用程序 int APIENTRY WinMain(HINSTANCE /* hInstance */ , HINSTANCE /* hPrevInstance */ , LPSTR /* lpCmdLine */ , int /* nCmdShow */ ) {
:: MessageBox( NULL, // 没有父窗口 页脚
“Hello, Windows 2000” , // 消息框中的文本 \ // 消息框标题 MB_OK) ; // 其中只有一个OK按钮
// 返回0以便通知系统不进入消息循环 return(0) ;
}
也可以利用任何其他文本编辑器键入程序代码,如果这样,例如使用WORD来键入和编辑程序,则应该注意什么问题?
标点符号的中英文切换。
步骤6:在“命令提示符”窗口运行CL.EXE,产生3-2.EXE文件: C:\\> CL 3-2.cpp
在清单3-2的GUI应用程序中,首先需要Windows.h头文件,以便获得传送给WinMain() 和MessageBox() API函数的数据类型定义。
接着的pragma指令指示编译器/连接器找到User32.LIB库文件并将其与产生的EXE文件连接起来。这样就可以运行简单的命令行命令CL MsgBox.CPP来创建这一应用程序,如果没有pragma指令,则MessageBox() API函数就成为未定义的了。这一指令是Visual Studio C++ 编译器特有的。
接下来是WinMain() 方法。其中有四个由实际的低级入口点传递来的参数。hInstance参数用来装入与代码相连的图标或位图一类的资源,无论何时,都可用GetModuleHandle() API函数将这些资源提取出来。系统利用实例句柄来指明代码和初始的数据装在存的何处。句柄的数值实际上是EXE文件映像的基地址,通常为0x00400000。下一个参数hPrevInstance是为向后兼容而设的,现在系统将其设为NULL。应用程序的命令行 (不包括程序的名称) 是lpCmdLine参数。另外,系统利用nCmdShow参数告诉应用程序如何显示它的主窗口 (选项包括最小化、最大化和正常) 。
最后,程序调用MessageBox() API函数并退出。如果在进入消息循环之前就结束运行的话,最后必须返回0。
运行结果 (试将其中的信息与清单3-1程序的运行结果进行比较) : Hello,Windows 2000 Greetings 3. 进程对象
操作系统将当前运行的应用程序看作是进程对象。利用系统提供的惟一的称为句柄 (HANDLE) 的,就可与进程对象交互。这一只对当前进程有效。
本实验表示了一个简单的进程句柄的应用。在系统中运行的任何进程都可调用GetCurrentProcess() API函数,此函数可返回标识进程本身的句柄。然后就可在Windows需要该进程的有关情况时,利用这一句柄来提供。
步骤7:将清单3-3.cpp程序键入记事本中,并把代码保存为3-3.cpp。 清单3-3 获得和使用进程的句柄
// prochandle项目 # include
// 确定自己的优先权的简单应用程序 void main() {
// 从当前进程中提取句柄
页脚