2024年2月2日发(作者:)
《操作系统教程》
实验报告书
专业班级
学 号
姓 名
指导教师
安徽工业大学计算机物141班
*********
程裕博
郭玉华
实验一 WINDOWS进程初识
1、 实验目的
(1) 学会使用VC编写基本的Win32 Consol Application(控制
(2) 台应用程序)。
(3) 掌握WINDOWS API的使用方法。
(4) 编写测试程序,理解用户态运行和核心态运行。
2、 实验内容和步骤
(1)编写基本的Win32 Consol Application
步骤1:登录进入Windows,启动VC++ 6.0。
步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32 Consol Application”,然后在“Project name”处输入工程名,在“Location” 处输入工程目录。创建一个新的控制台应用程序工程。
步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++ Source File”, 然后在“File” 处输入C/C++源程序的文件名。
步骤4:将清单1-1所示的程序清单复制到新创建的C/C++源程序中。编译成可执行文件。
步骤5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows“命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序:
E:课程os课os实验程序os11debug>
运行结果 (如果运行不成功,则可能的原因是什么?) :
运行成功,截图:
(2)计算进程在核心态运行和用户态运行的时间
步骤1:按照(1)中的步骤创建一个新的“Win32 Consol Application”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。
步骤2: 在创建一个新的“Win32 Consol Application”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。
步骤3:在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。
E:课程os课os实验程序os12debug>time
步骤4:运行结果 (如果运行不成功,则可能的原因是什么?):
process ID: 3716,EXE file:,%d in Kernel mode: 60
步骤5:分别屏蔽While循环中的两个for循环,或调整两个for循环的次数,写出运行结果。
屏蔽i循环:
2
process ID: 1412,EXE file:,%d in Kernel mode: 62
屏蔽j循环:
process ID: 1816,EXE file:,%d in Kernel mode: 34
调整循环变量i的循环次数:
process ID: 2616,EXE file:,%d in Kernel mode: 64
调整循环变量j的循环次数:
process ID: 1868,EXE file:,%d in Kernel mode: 50
3、 实验结论
对Win32 Consol Application有进一步的认识,WIN32 API也就是Windows
32平台的应用程序编程接口。用户态运行和核心态运行,核心态就是一个是直接的代码运行,即win32consol Application下代码运行;而用户态是在DOS下运行的,对编译好的程序进行的运行,核心态速度较快,没有太多的约束,而用户态的运行需要时间较长,由于有相应的约束。
实验二 进程管理
1、实验目的
1) 通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows进程的“一生”。
2) 通过阅读和分析实验程序,学习创建进程、观察进程、终止进程以及父子进程同步的基本程序设计方法。
2、实验内容和步骤
(1). 创建进程
本实验显示了创建子进程的基本框架。该程序只是再一次地启动自身,显示它的系统进程ID和它在进程列表中的位置。
步骤1:创建一个“Win32 Consol Application”工程,然后拷贝清单2-1中的程序,编译成可执行文件。
步骤2:在“命令提示符”窗口运行步骤1中生成的可执行文件。运行结果:
范例:E:课程os课os实验程序os11debug>os21
(假设编译生成的可执行文件是)
ProcessID:3012, Clone ID:0
Process ID:2748, Clone ID:1
Process ID:4044, Clone ID:2
Process ID:2896, Clone ID:3
Process ID:1588, Clone ID:4
3
Process ID:2144, Clone ID:5
按下ctrl+alt+del,调用windows的任务管理器,记录进程相关的行为属性:
步骤3:在“命令提示符”窗口加入参数重新运行生成的可执行文件。运行结果:
范例:E:课程os课os实验程序os11debug>os21 3
(假设编译生成的可执行文件是)
Process ID:3112, Clone ID:3
Process ID:1380, Clone ID:4
Process ID:3576, Clone ID:5
按下ctrl+alt+del,调用windows的任务管理器,记录进程相关的行为属性:
步骤4:修改清单2-1中的程序,将nClone的定义和初始化方法按程序注释中的修改方法进行修改,编译成可执行文件(执行前请先保存已经完成的工作)。再按步骤2中的方式运行,看看结果会有什么不一样。运行结果:
Process ID:3112, Clone ID:3
Process ID:1380, Clone ID:4
Process ID:3576, Clone ID:5
从中你可以得出什么结论:
nClone的作用:控制ID的起始值,并控制其输出窗口的数量。_
变量的定义和初始化方法(位置)对程序的执行结果有影响吗?为什么?有影响,变量的定义影响了程序的结果数目,还影响了ID的其实位置,由于变量的初始化使程序的循环次数发生改变,直接改变了结果,所以结果由变量的不同而不同。
(2). 父子进程的简单通信及终止进程
步骤1:创建一个“Win32 Consol Application”工程,然后拷贝清单2-2中的程序,编译成可执行文件。
步骤2:在VC的工具栏单击“Execute Program”(执行程序) 按钮,或者按Ctrl + F5键,或者在“命令提示符”窗口运行步骤1中生成的可执行文件。运行结果:
范例:E:课程os课os实验程序os11debug>os22
4
(假设编译生成的可执行文件是)
步骤3:按源程序中注释中的提示,修改源程序2-2,编译执行(执行前请先保存已经完成的工作)。运行结果:
死循环
在程序中加入跟踪语句,或调试运行程序,同时参考MSDN中的帮助文件CreateProcess()的使用方法,理解父子进程如何传递参数。给出程序执行过程的大概描述:
产生的应用程序的名称 (本EXE文件), 告诉其行为像一个子进程的标志,不继承句柄,使用新的控制台,新的环境,启动信息,返回的进程信息。
步骤4:填空
CreateProcess() 函数有__8个核心参数?本实验程序中设置的各个参数的值是:
a. szFilename;
b. szCmdLine,;
c. NULL;
d. NULL;
e. FALSE;
f. CREATE_NEW_CONSOLE;
g. NULL;
h. NULL。
步骤5:按源程序中注释中的提示,修改源程序2-2,编译执行。运行结果:
步骤6:参考MSDN中的帮助文件CreateMutex()、OpenMutex()、ReleaseMutex()和WaitForSingleObject()的使用方法,理解父子进程如何利用互斥体进行同步的。给出父子进程同步过程的一个大概描述:
首先,进程创建一个互斥体,打开互斥体,如遇到互斥,则进行处理,处理完后,释放互斥体,下面便是进程等待下一个要处理的项目。
5
3、 实验结论
每个进程都从调用CreateProcess() API函数开始,该函数的任务是在对象管理器子系统内初始化进程对象。每一进程都以调用ExitProcess() 或TerminateProcess()
API函数终止。通常应用程序的框架负责调用 ExitProcess() 函数。进程都是有始有终,其中有中断,还有处理进程间互斥的函数,已达到进程的完成后自然终止。
实验三 进程同步的经典算法
1、实验目的
1) 回顾系统进程、线程的有关概念,加深对Windows 2000线程的理解。
2) 了解互斥体对象,通过对生产者消费者等进程间同步与互斥经典算法的实现,加深对P、V原语以及利用P、V原语进行进程间同步与互斥操作的理解。
2、实验内容和步骤
(1). 生产者消费者问题
步骤1:创建一个“Win32 Consol Application”工程,然后拷贝清单3-1中的程序,编译成可执行文件。
步骤2:在“命令提示符”窗口运行步骤1中生成的可执行文件。运行结果:
范例:E:课程os课os实验程序os11debug>os31
(假设编译生成的可执行文件是)
步骤3:仔细阅读源程序,找出创建线程的WINDOWS API函数,回答下列问题:线程的第一个执行函数是什么(从哪里开始执行)?它位于创建线程的API
6
函数的第几个参数中?
第一个执行函数是:DWORD WINAPI Producer(LPVOID lpPara)
Produce();
它位于创建线程的API函数的第3个参数中。
步骤4:修改清单3-1中的程序,调整生产者线程和消费者线程的个数,使得消费者数目大与生产者,看看结果有何不同。运行结果:
从中你可以得出什么结论:
生产速度快,生产者经常等待消费者;反之,消费者经常等待。
步骤5:修改清单3-1中的程序,按程序注释中的说明修改信号量EmptySemaphore的初始化方法,看看结果有何不同。运行结果:
步骤6:根据步骤4的结果,并查看MSDN,回答下列问题
1)CreateMutex中有几个参数,各代表什么含义。
答:有三个参数.
1. LPSECURITY_ATTRIBUTES lpMutexAttributes 代表安全属性的指针
2. BOOL bInitialOwner代表布尔bInitialOwner
3. LPCTSTR lpName 代表LPCTSTR类型lpName
2)CreateSemaphore中有几个参数,各代表什么含义,信号量的初值在第几个参数中。
7
四个: lpSemaphoreAttributes SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值——表示采用不允许继承的默认描述符。该参数定义了信号机的安全特性 ;lInitialCount Long,设置信号机的初始计数。可设置零到lMaximumCount之间的一个值 ;lMaximumCount Long,设置信号机的最大计数 ;lpName String,指定信号机对象的名称。
3)程序中P、V原语所对应的实际Windows API函数是什么,写出这几条语句。
HANDLE Mutex; HANDLE FullSemaphore; HANDLE EmptySemaphore;
DWORD WINAPI Producer(LPVOID); DWORD WINAPI Consumer(LPVOID);
4)CreateMutex能用CreateSemaphore替代吗?尝试修改程序3-1,将信号量Mutex完全用CreateSemaphore及相关函数实现。写出要修改的语句:
可以
Mutex=CreateSemaphore(NULL,false,false,NULL);
(2). 读者写者问题
根据实验(1)中所熟悉的P、V原语对应的实际Windows API函数,并参考教材中读者、写者问题的算法原理,尝试利用Windows API函数实现第一类读者写者问题(读者优先)。
3、 实验结论
将信号量看作生产或消费的一个对象,对信号量的生成和销毁操作如同P操作和V操作一样,生成者消费者问题模拟的就是对信号量的生成和销毁,其中牵涉了信号量的同步,这也是该问题为何称为同步的经典问题的原因。
实验四 存储管理
1、 实验目的
(1) 通过对Windows 2000“任务管理器”、“计算机管理”、“我的电脑”属性、“系统信息”、“系统监视器”等程序的应用,学习如何察看和调整Windows的内存性能,加深对操作系统存储管理、虚拟存储管理等理论知识的理解。
(2) 了解Windows 2000的内存结构和虚拟内存的管理,理解进程的虚拟内存空间和物理内存的映射关系。
2、 实验内容和步骤
(1)观察和调整Windows 2000/XP的内存性能。
步骤1:阅读“背景知识”,请回答:
1) 什么是“分页过程”?
__分页就是将信息从主内存移动到磁盘进行临时存储的过程
8
2) 什么是“内存共享”?
__应用程序经常需要彼此通信和共享信息。_
3) 什么是“未分页合并内存”和“分页合并内存”?
Windows 2000中,未分页合并内存的最大限制是多少?
分页合并内存是存储迟早需要的可分页代码或数据的内存部分。
未分页合并内存包含必须驻留在内存中的占用代码或数据。
4) Windows 2000分页文件默认设置的最小容量和最大容量是多少?
Windows 2000使用内存数量的1.5倍作为分页文件的最小容量,这个最小容量的两倍作为最大容量。
步骤2:登录进入Windows 2000 Professional。
步骤3:查看包含多个实例的应用程序的内存需求。
1) 启动想要监视的应用程序,例如Word。
2) 右键单击任务栏以启动“任务管理器”。
3) 在“Windows任务管理器”对话框中选定“进程”选项卡。
4) 向下滚动在系统上运行的进程列表,查找想要监视的应用程序。
请在表4-3中记录:
映像名称
WINWORD
“内存使用”列显示了该应用程序的一个实例正在使用的内存数量。
5) 启动应用程序的另一个实例并观察它的内存需求。
请描述使用第二个实例占用的内存与使用第一个实例时的内存对比情况:
印像名称:__pid:1652__cpu:0:00:26___内存使用:29,028________
步骤4:未分页合并内存。
估算未分页合并内存大小的最简单方法是使用“任务管理器”。未分页合并内存的估计值显示在“任务管理器”的“性能”选项卡的“核心内存”部分。
总数 (K) :_________82076____________________
分页数:____________34900____________________
未分页 (K) :________47176___________________
表4-3 实验记录
PID CPU CPU时间
368 00 0:00:38
内存使用
23.440
还可以使用“任务管理器”查看一个独立进程正在使用的未分页合并内存数量和分页合并内存数量。操作步骤如下:
1) 单击“Windows任务管理器”的“进程”选项卡,然后从“查看”菜单中选择“选择列”命令,显示“进程”选项卡的可查看选项。
2) 在“选择列”对话框中,选定“页面缓冲池”选项和“非页面缓冲池”选
9
项旁边的复选框,然后单击“确定”按钮。
返回Windows 2000“任务管理器”的“进程”选项卡时,将看到其中增加显示了各个进程占用的分页合并内存数量和未分页合并内存数量。
仍以刚才打开观察的应用程序 (例如Word) 为例,请在表4-4中记录:
表4-4 实验记录
非页面缓冲映像名称 PID 内存使用 页面缓冲池
池
WINWORD 368 23.638 530 16
从性能的角度来看,未分页合并内存越多,可以加载到这个空间的数据就越多。拥有的物理内存越多,未分页合并内存就越多。但未分页合并内存被限制为256MB,因此添加超出这个限制的内存对未分页合并内存没有影响。
步骤5:提高分页性能。
在Windows 2000的安装过程中,将使用连续的磁盘空间自动创建分页文件() 。用户可以事先监视变化的内存需求并正确配置分页文件,使得当系统必须借助于分页时的性能达到最高。
虽然分页文件一般都放在系统分区的根目录下面,但这并不总是该文件的最佳位置。要想从分页获得最佳性能,应该首先检查系统的磁盘子系统的配置,以了解它是否有多个物理硬盘驱动器。
1) 在“开始”菜单中单击“设置” – “控制面板”命令,双击“管理工具”图标,再双击“计算机管理”图标。
2) 在“计算机管理”窗口的左格选择“磁盘管理”管理单元来查看系统的磁盘配置。
如果系统只有一个硬盘,那么建议应该尽可能为系统配置额外的驱动器。这是因为:Windows 2000最多可以支持在多个驱动器上分布的16个独立的分页文件。为系统配置多个分页文件可以实现对不同磁盘I/O请求的并行处理,这将大大提高I/O请求的分页文件性能。
请在表4-5中记录:
表4-5 实验记录
卷 布局 类型 文件系统 容量 状态
磁盘分 状态良好(系 C: 基本 FAT32 48.82G
区 统)
磁盘分 状态良好(页 D: 基本 FAT32 24.50G
区 面文件)
磁盘分 状态良好LENEVO_PART 基本 FAT32 305MB
区 (EISA配置)
步骤6:计算分页文件的大小。
要想更改分页文件的位置或大小配置参数,可按以下步骤进行:
1) 右键单击桌面上的“我的电脑”图标并选定“属性”。
2) 在“高级”选项卡上单击“性能选项”按钮。
3) 单击对话框中的“虚拟内存”区域中的“更改”按钮。
10
请记录:
所选驱动器 (C: ) 的页面文件大小:
驱动器: _C: [WINXP]_
可用空间: 23298MB
初始大小 (MB) : 1524
最大值 (MB) : 3048
所选驱动器 (D: ) 的页面文件大小:(如果有的话)
驱动器: D: [SOFTTWARE]
可用空间: 12925 MB
所有驱动器页面文件大小的总数:
允许的最小值: 2MB
推荐: 1522 MB
当前已分配: 1524MB
4) 要想将另一个分页文件添加到现有配置,在“虚拟内存”对话框中选定一个还没有分页文件的驱动器,然后指定分页文件的初始值和最大值 (以兆字节表示) ,单击“设置”,然后单击“确定”。
5) 要想更改现有分页文件的最大值和最小值,可选定分页文件所在的驱动器。然后指定分页文件的初始值和最大值,单击“设置”按钮,然后单击“确定”按钮。
6) 在“性能选项”对话框中单击“确定”按钮。
7) 单击“确定”按钮以关闭“系统特性”对话框。
步骤7:使用任务管理器。
可以使用“任务管理器”来简单地检查分页文件是否配置了正确容量。这样可以实时提供系统正在使用分页文件的方式以及其他重要系统信息的准确描述。
通过右键单击任务栏运行“任务管理器”,选定“性能”选项卡查看实时的系统统计数据。与分页文件大小最有关的信息位于“认可用量”区域。这一区域显示了认可“峰值”是否达到或超过了认可“限制”,以及它是否超过了系统上的物理内存数量。认可“峰值”是指系统迄今为止向进程分配的最大物理内存和虚拟内存数量。
请记录:
物理内存 (K)
总数: 1039724
可用数: 517644
系统缓存: 501940
认可用量 (K)
总数: 859572
11
限制: 2500780
峰值: 1238956
当系统遇到分页活动增加的情况时,提交的内存数量 (“认可总数”) 就会增加。一旦它达到了“认可限制”值,系统就需要扩展分页文件。“认可限制”值指出在不必扩展分页文件的情况下可以向内存提交的虚拟内存数量。因为目标是避免扩展分页文件,所以必须保持“认可总数”和“认可限制”值相差较大。如果这两个值接近了,那么系统必须动态增加分页文件的大小。
“任务管理器”的“认可用量”区域显示的信息还说明了系统的主内存是否足以满足系统执行的任务。如果认可“总数”值经常超过系统中的内存数量,那么系统的物理内存可能不足。
(2)了解和检测进程的虚拟内存空间。
步骤1:创建一个“Win32 Consol Application”工程,然后拷贝清单4-1中的程序,编译成可执行文件。
步骤2:在VC的工具栏单击“Execute Program”(执行程序) 按钮,或者按Ctrl + F5键,或者在“命令提示符”窗口运行步骤1中生成的可执行文件。
范例:E:课程os课os实验程序os11debug>os41
(假设编译生成的可执行文件是)
步骤3:根据运行结果,回答下列问题
虚拟内存每页容量为: 4.00KB
最小应用地址: 0x00010000
最大应用地址: 0x7ffeffff_
当前可供应用程序使用的内存空间为: 1.99GB
当前计算机的实际内存大小为: 0.99GB
理论上每个Windows应用程序可以独占的最大存储空间是: 0.99GB
提示:可供应用程序使用的内存空间实际上已经减去了开头与结尾两个64KB的保护区。虚拟内存空间中的64KB保护区是防止编程错误的一种Windows方式。任何对内存中这一区域的访问 (读、写、执行) 都将引发一个错误陷阱,从而导致错误并终止程序的执行。
按committed、reserved、free等三种虚拟地址空间分别记录实验数据。其中“描述”是指对该组数据的简单描述,例如,对下列一组数据:
00010000 – 00012000 <8.00KB> Committed, READWRITE, Private
可描述为:具有READWRITE权限的已调配私有内存区。
将系统当前的自由区 (free) 虚拟地址空间填入表4-6中。
表4-6 实验记录
虚拟地址
地址 大小 访问权限 描述
空间类型
00012 56.0 free NOACCESS
12
00021
00133
00276
002c1000-002d0000
00311
00326
00371
00391000-003a0000
003a1000-003b0000
003c3000-003d0000
003e
00485
00558
00663
00970000-62c20000
62c29000-73fa0000
7400b
7631d000-77be0000
77c38000-77d10000
77e49000-77e50000
77ee2000-77ef0000
KB
60.0
KB
52.0
KB
40.0
KB
60.0
KB
60.0
KB
40.0
KB
60.0
KB
60.0
KB
60.0
KB
52.0
KB
128
KB
44.0
KB
32.0
KB
52.0
KB
1.53
GB
275
MB
34.9
MB
24.7
MB
864
KB
28.0
KB
56.0
KB
free
free
free
free
free
free
free
free
free
free
free
free
free
free
free
free
free
free
free
free
free
NOACCESS
NOACCESS
NOACCESS
NOACCESS
NOACCESS
NOACCESS
NOACCESS
NOACCESS
NOACCESS
NOACCESS
NOACCESS
NOACCESS
NOACCESS
NOACCESS
NOACCESS
NOACCESS
NOACCESS
NOACCESS
NOACCESS
NOACCESS
NOACCESS
13
77f39000-77f40000
77fb6000-77fc0000
77fd1000-7c800000
28.0
KB
40.0
KB
72.1
MB
free
free
free
NOACCESS
NOACCESS
NOACCESS
提示:详细记录实验数据在实验活动中是必要的,但想想是否可以简化记录的办法?
将系统当前的已调配区 (committed) 虚拟地址空间填入表4-7中。
地址
0001
0002
0012c000-0012d000
0012d
0014
0024
0025
0026
00280000-002c1000
002d
0032
0033
0038
0039
大小
8.00
KB
4.00
KB
4.00
KB
12.0
KB
20.0
KB
24.0
KB
12.0
KB
88.0
KB
260
KB
260
KB
24.0
KB
260
KB
32.0
KB
4.00
KB
表4-7 实验记录
虚拟地址
访问权限
空间类型
committed
committed
committed
committed
committed
committed
committed
committed
committed
committed
committed
committed
committed
committed
READWRITE,
READWRITE,
GUARD,
READWRITE,
READWRITE,
READWRITE,
READWRITE,
READWRITE,
READONLY,
READONLY,
READONLY,
READONLY,
READONLY,
READWRITE,
READWRITE,
描述
Private
Private
Private
Private
Private
Private
Mapped
Mapped
Mapped
Mapped
Mapped
Mapped
Private
Private
14
003a0000-003a1000
003b0000-003b4000
003c0000-003c3000
003d0000-003d3000
0040
00401
0047
00478000-0047b000
0047b000-0047d000
0047d
00481
4.00
KB
16.0
KB
12.0
KB
12.0
KB
4.00
KB
444
KB
32.0
KB
12.0
KB
8.00
KB
16.0
KB
16.0
KB
committed
committed
committed
committed
committed
committed
committed
committed
committed
committed
committed
READWRITE,
READWRITE,
READONLY,
READWRITE,
READONLY,
EXECUTE_READ,
READONLY,
READWRITE,
WRITECOPY,
READWRITE,
READONLY,
Private
Private
Mapped
Private
Image, Module:
Image
Image
Image
Image
Image
Image
将系统当前的保留区 (reserved) 虚拟地址空间填入表4-8中。
表4-8 实验记录
虚拟地址
大小 访问权限
空间类型
0.98
reserved READONLY,
MB
0.98
reserved READONLY,
MB
40.0
reserved READONLY,
KB
52.0
reserved READONLY,
KB
32.0
reserved READONLY,
KB
48.0
reserved READONLY,
KB
52.0 reserved READONLY,
地址 描述
00030000-0012c000
00145
00246
00253
00388
003b4000-003c0000
003d3000-003e0000
Private
Private
Private
Mapped
Private
Private
Private
15
00496
00552
006f2
7f6f7000-7f7f0000
7ffe1000-7fff0000
KB
744
KB
24.0
KB
2.49
MB
996
KB
60.0
KB
reserved READONLY,
reserved READONLY,
reserved READONLY,
reserved READONLY,
reserved NOACCESS,
Mapped
Mapped
Mapped
Mapped
Private
3. 实验结论:
简单描述windows进程的虚拟内存管理方案:
虚拟地址是将逻辑地址映射到物理地址的一种手段,管理方案有:请求分页、请求分段和请求段页虚拟存储管理。请求分页:将进程的信息副本存放在辅助存储器中,当它被调度投入运行时,并不把程序和数据全部装入主存,仅装入当前使用的页面,进程在执行过程中访问到不在主存的页时,再把所需的信息动态的装入。请求分段:把作业的所有分段的副本都存放在辅助存储器上,当作业被调度投入运行时,首先把当前需要的段装入主存,在执行过程中访问到不在主存的段时再将其动态装入。请求段页式虚拟存储管理:对段式存储和页式存储的优点结合。
16


发布评论