安徽工业大学操作系统实验报告.docx
《安徽工业大学操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《安徽工业大学操作系统实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
安徽工业大学操作系统实验报告
《操作系统教程》
实验报告书
专业班级
学号
姓名
指导教师
2015年12月28号
实验一WINDOWS进程初识
1、实验目的
(1)学会使用VC编写基本的Win32ConsolApplication(控制
(2)台应用程序)。
(3)掌握WINDOWSAPI的使用方法。
(4)编写测试程序,理解用户态运行和核心态运行。
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:
运行结果(如果运行不成功,则可能的原因是什么?
):
processID:
3716,EXEfile:
3.exe,%dinKernelmode:
60
步骤5:
分别屏蔽While循环中的两个for循环,或调整两个for循环的次数,写出运行结果。
屏蔽i循环:
processID:
1412,EXEfile:
3.exe,%dinKernelmode:
62
屏蔽j循环:
processID:
1816,EXEfile:
3.exe,%dinKernelmode:
34
调整循环变量i的循环次数:
processID:
2616,EXEfile:
3.exe,%dinKernelmode:
64
调整循环变量j的循环次数:
processID:
1868,EXEfile:
3.exe,%dinKernelmode:
50
3、实验结论
对Win32ConsolApplication有进一步的认识,WIN32API也就是Windows32平台的应用程序编程接口。
用户态运行和核心态运行,核心态就是一个是直接的代码运行,即win32consolApplication下代码运行;而用户态是在DOS下运行的,对编译好的程序进行的运行,核心态速度较快,没有太多的约束,而用户态的运行需要时间较长,由于有相应的约束。
实验二进程管理
1、实验目的
1)通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows进程的“一生”。
2)通过阅读和分析实验程序,学习创建进程、观察进程、终止进程以及父子进程同步的基本程序设计方法。
2、实验内容和步骤
(1).创建进程
本实验显示了创建子进程的基本框架。
该程序只是再一次地启动自身,显示它的系统进程ID和它在进程列表中的位置。
步骤1:
创建一个“Win32ConsolApplication”工程,然后拷贝清单2-1中的程序,编译成可执行文件。
步骤2:
在“命令提示符”窗口运行步骤1中生成的可执行文件。
运行结果:
范例:
E:
\课程\os课\os实验\程序\os11\debug>os21
(假设编译生成的可执行文件是os21.exe)
ProcessID:
3012,CloneID:
0
ProcessID:
2748,CloneID:
1
ProcessID:
4044,CloneID:
2
ProcessID:
2896,CloneID:
3
ProcessID:
1588,CloneID:
4
ProcessID:
2144,CloneID:
5
按下ctrl+alt+del,调用windows的任务管理器,记录进程相关的行为属性:
步骤3:
在“命令提示符”窗口加入参数重新运行生成的可执行文件。
运行结果:
范例:
E:
\课程\os课\os实验\程序\os11\debug>os213
(假设编译生成的可执行文件是os21.exe)
ProcessID:
3112,CloneID:
3
ProcessID:
1380,CloneID:
4
ProcessID:
3576,CloneID:
5
按下ctrl+alt+del,调用windows的任务管理器,记录进程相关的行为属性:
步骤4:
修改清单2-1中的程序,将nClone的定义和初始化方法按程序注释中的修改方法进行修改,编译成可执行文件(执行前请先保存已经完成的工作)。
再按步骤2中的方式运行,看看结果会有什么不一样。
运行结果:
ProcessID:
3112,CloneID:
3
ProcessID:
1380,CloneID:
4
ProcessID:
3576,CloneID:
5
从中你可以得出什么结论:
nClone的作用:
控制ID的起始值,并控制其输出窗口的数量。
_
变量的定义和初始化方法(位置)对程序的执行结果有影响吗?
为什么?
有影响,变量的定义影响了程序的结果数目,还影响了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()的使用方法,理解父子进程如何传递参数。
给出程序执行过程的大概描述:
产生的应用程序的名称(本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()的使用方法,理解父子进程如何利用互斥体进行同步的。
给出父子进程同步过程的一个大概描述:
首先,进程创建一个互斥体,打开互斥体,如遇到互斥,则进行处理,处理完后,释放互斥体,下面便是进程等待下一个要处理的项目。
3、实验结论
每个进程都从调用CreateProcess()API函数开始,该函数的任务是在对象管理器子系统内初始化进程对象。
每一进程都以调用ExitProcess()或TerminateProcess()API函数终止。
通常应用程序的框架负责调用ExitProcess()函数。
进程都是有始有终,其中有中断,还有处理进程间互斥的函数,已达到进程的完成后自然终止。
实验三进程同步的经典算法
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函数的第几个参数中?
第一个执行函数是:
DWORDWINAPIProducer(LPVOIDlpPara)
Produce();
它位于创建线程的API函数的第3个参数中。
步骤4:
修改清单3-1中的程序,调整生产者线程和消费者线程的个数,使得消费者数目大与生产者,看看结果有何不同。
运行结果:
从中你可以得出什么结论:
生产速度快,生产者经常等待消费者;反之,消费者经常等待。
步骤5:
修改清单3-1中的程序,按程序注释中的说明修改信号量EmptySemaphore的初始化方法,看看结果有何不同。
运行结果:
步骤6:
根据步骤4的结果,并查看MSDN,回答下列问题
1)CreateMutex中有几个参数,各代表什么含义。
答:
有三个参数.
1.LPSECURITY_ATTRIBUTESlpMutexAttributes代表安全属性的指针
2.BOOLbInitialOwner代表布尔bInitialOwner
3.LPCTSTRlpName代表LPCTSTR类型lpName
2)CreateSemaphore中有几个参数,各代表什么含义,信号量的初值在第几个参数中。
四个:
lpSemaphoreAttributesSECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值——表示采用不允许继承的默认描述符。
该参数定义了信号机的安全特性;lInitialCountLong,设置信号机的初始计数。
可设置零到lMaximumCount之间的一个值;lMaximumCountLong,设置信号机的最大计数;lpNameString,指定信号机对象的名称。
3)程序中P、V原语所对应的实际WindowsAPI函数是什么