操作系统实验报告.docx
- 文档编号:17720373
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:30
- 大小:478.81KB
操作系统实验报告.docx
《操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告.docx(30页珍藏版)》请在冰点文库上搜索。
操作系统实验报告
操作系统实验报告
班级:
软件1042
姓名:
******
学号:
101*****
指导老师:
***老师
安徽工业大学工商学院2012年12月
目录
实验一WINDOWS进程初识2
1、实验目的2
2、实验内容和步骤2
3、实验结论4
实验二进程管理4
1、实验目的4
2、实验内容和步骤4
3、实验结论9
实验三进程同步的经典算法9
1、实验目的9
2、实验内容和步骤10
3、实验结论12
实验四存储管理12
1、实验目的12
2、实验内容和步骤12
3、实验结论19
实验一WINDOWS进程初识
1、实验目的
(1)学会使用VC编写基本的Win32ConsolApplication(控制台应用程序)。
(2)掌握WINDOWSAPI的使用方法。
(3)编写测试程序,理解用户态运行和核心态运行。
2、实验内容和步骤
(1)编写基本的Win32ConsolApplication
步骤1:
登录进入Windows,启动VC++6.0。
步骤2:
在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32ConsolApplication”,然后在“Projectname”处输入工程名,在“Location”处输入工程目录。
创建一个新的控制台应用程序工程。
步骤3:
在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++SourceFile”,然后在“File”处输入C/C++源程序的文件名。
步骤4:
将清单1-1所示的程序清单复制到新创建的C/C++源程序中。
编译成可执行文件。
步骤5:
在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows“命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序:
E:
\课程\os课\os实验\程序\os11\debug>hello.exe
运行结果(如果运行不成功,则可能的原因是什么?
):
刚开始由于命令输入有误经改正后,正确调试出结果
(2)计算进程在核心态运行和用户态运行的时间
步骤1:
按照
(1)中的步骤创建一个新的“Win32ConsolApplication”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。
步骤2:
在创建一个新的“Win32ConsolApplication”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。
步骤3:
在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。
E:
\课程\os课\os实验\程序\os12\debug>timeTEST.exe
步骤4:
运行结果(如果运行不成功,则可能的原因是什么?
):
_______________________________________________________________________________
步骤5:
分别屏蔽While循环中的两个for循环,或调整两个for循环的次数,写出运行结果。
屏蔽i循环:
_______________________________________________________________________________屏蔽j循环:
_______________________________________________________________________________调整循环变量i的循环次数:
10
_______________________________________________________________________________调整循环变量j的循环次数:
10
______________________________________________________________________________
3、实验结论
程序一旦进入死循环,改变循环次数对循环次数无用。
实验二进程管理
1、实验目的
1)通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows进程的“一生”。
2)通过阅读和分析实验程序,学习创建进程、观察进程、终止进程以及父子进程同步的基本程序设计方法。
2、实验内容和步骤
(1).创建进程
本实验显示了创建子进程的基本框架。
该程序只是再一次地启动自身,显示它的系统进程ID和它在进程列表中的位置。
步骤1:
创建一个“Win32ConsolApplication”工程,然后拷贝清单2-1中的程序,编译成可执行文件。
步骤2:
在“命令提示符”窗口运行步骤1中生成的可执行文件。
运行结果:
范例:
E:
\课程\os课\os实验\程序\os11\debug>os21
(假设编译生成的可执行文件是os21.exe)
按下ctrl+alt+del,调用windows的任务管理器,记录进程相关的行为属性:
步骤3:
在“命令提示符”窗口加入参数重新运行生成的可执行文件。
运行结果:
范例:
E:
\课程\os课\os实验\程序\os11\debug>os213
(假设编译生成的可执行文件是os21.exe)
_______________________________________________________________________________
按下ctrl+alt+del,调用windows的任务管理器,记录进程相关的行为属性:
________________________________________________________________________________________________________
步骤4:
修改清单2-1中的程序,将nClone的定义和初始化方法按程序注释中的修改方法进行修改,编译成可执行文件(执行前请先保存已经完成的工作)。
再按步骤2中的方式运行,看看结果会有什么不一样。
运行结果:
第二次修改:
一直出现进程到760个进程被不断的重复调用nClone的值确定派生出几个进程,及派生进程在进程列表中的位置
从中你可以得出什么结论:
nClone的作用:
对(nClone 变量的定义和初始化方法(位置)对程序的执行结果有影响吗? 为什么? ______ 有影响,变量nClone的定义和初始化确定了从参数中提取克隆ID的个数即要派生出几个 进程,决定结果。 (2).父子进程的简单通信及终止进程 步骤1: 创建一个“Win32ConsolApplication”工程,然后拷贝清单2-2中的程序,编译成可执行文件。 步骤2: 在VC的工具栏单击“ExecuteProgram”(执行程序)按钮,或者按Ctrl+F5键,或者在“命令提示符”窗口运行步骤1中生成的可执行文件。 运行结果: 范例: E: \课程\os课\os实验\程序\os11\debug>os22 (假设编译生成的可执行文件是os22.exe) ____________________________________________________________________________________________________ 步骤3: 按源程序中注释中的提示,修改源程序2-2,编译执行(执行前请先保存已经完成的工作)。 运行结果: 不断地重复创建相同的可执行程序 在程序中加入跟踪语句,或调试运行程序,同时参考MSDN中的帮助文件CreateProcess()的使用方法,理解父子进程如何传递参数。 给出程序执行过程的大概描述: 创建的每个进程都从调用CreateProcess()API函数开始,接着正在运行的进程为了实现资源的共享利用互斥体来实现进程的同步,最后一进程都以调用ExitProcess()或TerminateProcess()API函数终止 步骤4: 填空 CreateProcess()函数有___10_____个核心参数? 本实验程序中设置的各个参数的值是: a.szFilename,//产生的应用程序的名称(本EXE文件); b.szCmdLine,//告诉我们这是一个子进程的标志; c.NULL,//用于进程的缺省的安全性; d.NULL,//用于线程的缺省安全性; e.FALSE,//不继承句柄; f.CREATE_NEW_CONSOLE,//创建新窗口; g.NULL,//新环境; h.NULL,//当前目录; i.&si,//启动信息结构; j.&pi);//返回的进程信息。 步骤5: 按源程序中注释中的提示,修改源程序2-2,编译执行。 运行结果: __________________________________________________________________________________________________ 步骤6: 参考MSDN中的帮助文件CreateMutex()、OpenMutex()、ReleaseMutex()和WaitForSingleObject()的使用方法,理解父子进程如何利用互斥体进行同步的。 给出父子进程同步过程的一个大概描述: 首先,想要访问调用的子线程可使用OpenMutex()API来获得指向对象的句柄;然后,父线程将这个句柄提供给一个等待子线程函数。 当内核将互斥体对象发送给等待子线程时,就表明该子线程获得了互斥体的拥有权。 当子线程获得拥有权时,子线程控制了对共享资源的访问——必须设法尽快地放弃互斥体。 放弃共享资源时需要在该对象上调用ReleaseMute()API。 然后系统负责将互斥体拥有权传递给下一个等待着的子线程(由到达时间决定顺序)。 3、实验结论 进程的生命期一般分为1.创建进程CreateProcess()2.正在运行的进程中一些函数3.终止进程ExitProcess()或者TerminateProcess() 进程同步对象来协调线程和进程的工作,以使其共享信息并执行任务。 此类对象包括互锁数据、临界段、事件、互斥体和信号等。 访问资源的线程创建互斥体互斥体其主要目的是引导对共享资源的访问。 问结束时立即释放互斥体,以允许下一个等待线程获得互斥体,然后接着进行下去,以实现资源的最高利用。 实验三进程同步的经典算法 1、实验目的 1)回顾系统进程、线程的有关概念,加深对Windows2000线程的理解。 2)了解互斥体对象,通过对生产者消费者等进程间同步与互斥经典算法的实现,加深对P、V原语以及利用P、V原语进行进程间同步与互斥操作的理解。 2、实验内容和步骤 (1).生产者消费者问题 步骤1: 创建一个“Win32ConsolApplication”工程,然后拷贝清单3-1中的程序,编译成可执行文件。 步骤2: 在“命令提示符”窗口运行步骤1中生成的可执行文件。 运行结果: 范例: E: \课程\os课\os实验\程序\os11\debug>os31 (假设编译生成的可执行文件是os31.exe) ____________________________________ 整个过程在不断地进行生产、消费过程,缓冲区的产品数也在不断的动态变化。 步骤3: 仔细阅读源程序,找出创建线程的WINDOWSAPI函数,回答下列问题: 线程的第一个执行函数是什么(从哪里开始执行)? 它位于创建线程的API函数的第几个参数中? 创建各个互斥信号Mutex=CreateMutex(NULL,FALSE,NULL)位于创建线程的API函数第一个参数中 步骤4: 修改清单3-1中的程序,调整生产者线程和消费者线程的个数,使得消费者数目大与生产者,看看结果有何不同。 运行结果: constunsignedshortPRODUCERS_COUNT=1;//生产者的个数 constunsignedshortCONSUMERS_COUNT=3;//消费者的个数 从中你可以得出什么结论: 调整下面的数值,可以发现,当生产者个数多于消费者个数时,生产速度快,生产者经常等待消费者;反之,消费者经常等待 步骤5: 修改清单3-1中的程序,按程序注释中的说明修改信号量EmptySemaphore的初始化方法,看看结果有何不同。 运行结果: 结果为空,不输出 _______________________________________________________________________________ 步骤6: 根据步骤4的结果,并查看MSDN,回答下列问题 1)CreateMutex中有几个参数,各代表什么含义。 Mutex=CreateMutex(NULL,FALSE,NULL); 里面共有三个参数, Null代表初始化Mutex=NULL; FALSE代表线程的释放 NULL参数的名字 2)CreateSemaphore中有几个参数,各代表什么含义,信号量的初值在第几个参数中。 EmptySemaphore=CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL); 共有四个信号量 NULL代表信号量的初始化 0信号量的初值也就是信号中可用的产品数 SIZE_OF_BUFFER-1信号量的大小 NULL初始化信号量的名称 3)程序中P、V原语所对应的实际WindowsAPI函数是什么,写出这几条语句。 P(mutex)take() V(mutex)append _________________________________________________________________________ 4)CreateMutex能用CreateSemaphore替代吗? 尝试修改程序3-1,将信号量Mutex完全用CreateSemaphore及相关函数实现。 写出要修改的语句: 不能,互斥信号量CreateMutex和同步信号量CreateSemaphore的定义方法不同,互斥信号量调用的是CreateMutex函数,同步信号量,调用的是CreateSemaphore函数,函数的返回值都是句柄。 CreateSemaphore(NULL,FALSE,NULL) (2).读者写者问题 根据实验 (1)中所熟悉的P、V原语对应的实际WindowsAPI函数,并参考教材中读者、写者问题的算法原理,尝试利用WindowsAPI函数实现第一类读者写者问题(读者优先)。 3、实验结论 Windows2000提供的常用对象可分成三类: 核心应用服务、线程同步和线程间通讯。 其中,开发人员可以使用线程同步对象来协调线程和进程的工作,以使其共享信息并执行任务。 此类对象包括互锁数据、临界段、事件、互斥体和信号等。 多线程编程中关键的一步是保护所有的共享资源,工具主要有互锁函数、临界段和互斥体等;另一个实质性部分是协调线程使其完成应用程序的任务,为此,可利用内核中的事件对象和信号。 实验四存储管理 1、实验目的 (1)通过对Windows2000“任务管理器”、“计算机管理”、“我的电脑”属性、“系统信息”、“系统监视器”等程序的应用,学习如何察看和调整Windows的内存性能,加深对操作系统存储管理、虚拟存储管理等理论知识的理解。 (2)了解Windows2000的内存结构和虚拟内存的管理,理解进程的虚拟内存空间和物理内存的映射关系。 2、实验内容和步骤 (1)观察和调整Windows2000/XP的内存性能。 步骤1: 阅读“背景知识”,请回答: 1)什么是“分页过程”? 当Windows2000/XP求助于硬盘以获得虚拟内存时,这个过程被称为分页(paging)。 分页就是将信息从主内存移动到磁盘进行临时存储的过程 ______________________________________________________________________ 2)什么是“内存共享”? 应用程序经常需要彼此通信和共享信息。 为了提供这种能力,Windows2000/XP必须允 许访问某些内存空间而不危及它和其他应用程序的安全性和完整性。 从性能的角度来 看,共享内存的能力大大减少了应用程序使用的内存数量。 运行一个应用程序的多个副 本时,每一个实例都可以使用相同的代码和数据,这意味着不必维护所加载应用程序代 码的单独副本并使用相同的内存资源。 无论正在运行多少个应用程序实例,充分支持应 用程序代码所需求的内存数量都相对保持不变。 3)什么是“未分页合并内存”和“分页合并内存”? Windows2000中,未分页合并内存的最大限制是多少? _分页合并内存是存储迟早需要的可分页代码或数据的内存部分。 虽然可以将分页合并 内存中的任何系统进程交换到磁盘上,但是它临时存储在主内存的这一部分,以防系统 立刻需要它。 在将系统进程交换到磁盘上之前,Windows2000/XP会交换其他进程。 未分页合并内存包含必须驻留在内存中的占用代码或数据。 这种结构类似于早期的 MS-DOS程序使用的结构,在MS-DOS中,相对较小的终止并驻留程序(Terminateand StayResident,TSR)在启动时加载到内存中。 这些程序在系统重新启动或关闭之前一 直驻留在内存的特定部分中。 例如,防病毒程序将加载为TSR程序,以预防可能的病 毒袭击 Windows2000/XP将未分页合并内存限制为256MB ___________________________________________________________________ 4)Windows2000分页文件默认设置的最小容量和最大容量是多少? ____________________________________________________________________ ________________________________________________________________________ 步骤2: 登录进入Windows2000Professional。 步骤3: 查看包含多个实例的应用程序的内存需求。 1)启动想要监视的应用程序,例如Word。 2)右键单击任务栏以启动“任务管理器”。 3)在“Windows任务管理器”对话框中选定“进程”选项卡。 4)向下滚动在系统上运行的进程列表,查找想要监视的应用程序。 请在表4-3中记录: 表4-3实验记录 映像名称 PID CPU CPU时间 内存使用 WINWORD.EXE Owner 00 0: 00: 54 62,672K “内存使用”列显示了该应用程序的一个实例正在使用的内存数量。 5)启动应用程序的另一个实例并观察它的内存需求。 请描述使用第二个实例占用的内存与使用第一个实例时的内存对比情况: 映像名称 PID CPU CPU时间 内存使用 QQ.EXE Owner 00 0: 00: 24 23,128K ____________________________________________________________________ _ 步骤4: 未分页合并内存。 估算未分页合并内存大小的最简单方法是使用“任务管理器”。 未分页合并内存的估计值显示在“任务管理器”的“性能”选项卡的“核心内存”部分。 总数(K): __69992___________________________ 分页数: ____56168____________________________ 未分页(K): _13824__________________________ 还可以使用“任务管理器”查看一个独立进程正在使用的未分页合并内存数量和分页合并内存数量。 操作步骤如下: 1)单击“Windows任务管理器”的“进程”选项卡,然后从“查看”菜单中选择“选择列”命令,显示“进程”选项卡的可查看选项。 2)在“选择列”对话框中,选定“页面缓冲池”选项和“非页面缓冲池”选项旁边的复选框,然后单击“确定”按钮。 返回Windows2000“任务管理器”的“进程”选项卡时,将看到其中增加显示了各个进程占用的分页合并内存数量和未分页合并内存数量。 仍以刚才打开观察的应用程序(例如Word)为例,请在表4-4中记录: 表4-4实验记录 映像名称 PID 内存使用 页面缓冲池 非页面缓冲池 WINWORD.EXE Owner 00 65,660 26 从性能的角度来看,未分页合并内存越多,可以加载到这个空间的数据就越多。 拥有的物理内存越多,未分页合并内存就越多。 但未分页合并内存被限制为256MB,因此添加超出这个限制的内存对未分页合并内存没有影响。 步骤5: 提高分页性能。 在Windows2000的安装过程中,将使用连续的磁盘空间自动创建分页文件(pagefile.sys)。 用户可以事先监视变化的内存需求并正确配置分页文件,使得当系统必须借助于分页时的性能达到最高。 虽然分页文件一般都放在系统分区的根目录下面,但这并不总是该文件的最佳位置。 要想从分页获得最佳性能,应该首先检查系统的磁盘子系统的配置,以了解它是否有多个物理硬盘驱动器。 1)在“开始”菜单中单击“设置”–“控制面板”命令,双击“管理工具”图标,再双击“计算机管理”图标。 2)在“计算机管理”窗口的左格选择“磁盘管理”管理单元来查看系统的磁盘配置。 如果系统只有一个硬盘,那么建议应该尽可能为系统配置额外的驱动器。 这是因为: Windows2000最多可以支持在多个驱动器上分布的16个独立的分页文件。 为系统配置多个分页文件可以实现对不同磁盘I/O请求的并行处理,这将大大提高I/O请求的分页文件性能。 请在表4-5中记录: 表4-5实验记录 卷 布局 类型 文件系统 容量 状态 (C: ) 磁盘分区 基本 NTFS 19.53GB 状态良好(系统) (D: ) 磁盘分区 基本 NTFS 19.53GB 状态良好 (F: ) 磁盘分区 基本 FAT32 34.27GB 状态良好 (H: ) 磁盘分区 基本 FAT32 7.45GB 状态良好(活动) 步骤6: 计算分页文件
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告