操作系统实验报告
   
 

实验一 WINDOWS进程初识
1、 实验目的
(1) 学会使用VC编写基本的Win32 Consol Application(控制台应用程序)
(2) 掌握WINDOWS API的使用方法。
(3) 编写测试程序,理解用户态运行和核心态运行。
2、 实验内容和步骤
1)编写基本的Win32 Consol Application
步骤1:登录进入Windows,启动VC++ 6.0
步骤2在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“createprocessaWin32 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实验\程序\os11\debug&
运行结果 (如果运行不成功,则可能的原因是什么?)
运行成功;
2)计算进程在核心态运行和用户态运行的时间
步骤1按照(1)中的步骤创建一个新的“Win32 Consol Application工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。
步骤2 在创建一个新的“Win32 Consol Application工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。
步骤3:在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。
E:\课程\os\os实验\程序\os12\debug>
步骤4:运行结果:
步骤5:分别屏蔽While循环中的两个for循环,或调整两个for循环的次数,写出运行结果。
屏蔽i循环:
屏蔽j循环:
调整循环变量i的循环次数:
调整循环变量j的循环次数:
3、 实验结论
当调用printf函数时,要进入核心态,因此运行占用的时间比较多                    而当把j循环屏蔽掉,即不进入printf时,i循环只需在用户态运行,不需要进入核心态,因此占用时间就为0%;当改变i循环的次数时,并不改变进入核心态时所占用的时间,所以运行时间没有改变;当改变j循环次数时,printf的次数改变,因此在核心态运行的时间就相对改变,可以看出运行时间随j的增大而增大,成正比关系。
实验二  进程管理
1、实验目的
1) 通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows进程的“一生”。
2) 通过阅读和分析实验程序,学习创建进程、观察进程、终止进程以及父子进程同步的基
本程序设计方法。
2、实验内容和步骤
    1. 创建进程
本实验显示了创建子进程的基本框架。该程序只是再一次地启动自身,显示它的系统进程ID和它在进程列表中的位置。
步骤1创建一个“Win32 Consol Application工程,然后拷贝清单2-1中的程序,编译成可执行文件。
步骤2:在“命令提示符”窗口运行步骤1中生成的可执行文件。运行结果:
范例:E:\课程\os\os实验\程序\os11\debug>os21
(假设编译生成的可执行文件是)
按下ctrl+alt+del,调用windows的任务管理器,记录进程相关的行为属性:
步骤3:在“命令提示符”窗口加入参数重新运行生成的可执行文件。运行结果:
范例:E:\课程\os\os实验\程序\os11\debug>os21 3
(假设编译生成的可执行文件是)
按下ctrl+alt+del,调用windows的任务管理器,记录进程相关的行为属性:
步骤4:修改清单2-1中的程序,将nClone的定义和初始化方法按程序注释中的修改方法进行修改,编译成可执行文件(执行前请先保存已经完成的工作)。再按步骤2中的方式运行,看看结果会有什么不一样。运行结果:
第一次修改:结果不变。
第二次修改:是一个死循环,不断的弹出此窗口:
从中你可以得出什么结论:
nClone的作用_设置进程的起始ID号,控制程序的执行,当nClone大于等于5时可跳出程序。
变量的定义和初始化方法(位置)对程序的执行结果有影响吗?为什么?________________
答:有影响,因为变量的定义和初始化的不同可能导致进程的克隆的次数及克隆进程的ID号不同
2. 父子进程的简单通信及终止进程
步骤1创建一个“Win32 Consol Application工程,然后拷贝清单2-2中的程序,编译成可执行文件。
步骤2在VC的工具栏单击“Execute Program”(执行程序) 按钮,或者按Ctrl + F5键,或者在“命令提示符”窗口运行步骤1中生成的可执行文件。运行结果:
步骤3按源程序中注释中的提示,修改源程序2-2,编译执行(执行前请先保存已经完成的工作)。运行结果:
在程序中加入跟踪语句,或调试运行程序,同时参考MSDN中的帮助文件CreateProcess()的使用方法,理解父子进程如何传递参数。给出程序执行过程的大概描述:
通过main(int argc, char* argv[])传递参数,每次运行时先检测argc的值,若小于1,程序运行结束,否则继续往下执行。
BOOL CreateProcess(   
LPCTSTR lpApplicationName,;      // pointer to name of executable module 
LPTSTR lpCommandLine,  // pointer to command line string    LPSECURITY_ATTRIBUTES lpProcessAttributes,  // process security attributes  LPSECURITY_ATTRIBUTES lpThreadAttributes,  // thread security attributes 
BOOL bInheritHandles,  // handle inheritance flag 
DWORD dwCreationFlags, // creation flags   
LPVOID lpEnvironment,  // pointer to new environment block   
LPCTSTR lpCurrentDirectory,  // pointer to current directory name 
LPSTARTUPINFO lpStartupInfo,  // pointer to STARTUPINFO  LPPROCESS_INFORMATION lpProcessInformation  /pointer to PROCESS_INFORMATION
步骤4填空
CreateProcess() 函数有   6  个核心参数?本实验程序中设置的各个参数的值是:
a  szFilename,    产生的应用程序的名称 (EXE文件).
b.    szCmdLine,    告诉我们这是一个子进程的标志;
c.  FALSE,    不继承句柄;
dCREATE_NEW_CONSOLE,  创建新窗口;
e. &si,    启动信息结构;
f.  &pi    返回的进程信息;
步骤5按源程序中注释中的提示,修改源程序2-2,编译执行。运行结果:
步骤6参考MSDN中的帮助文件CreateMutex()、OpenMutex()、ReleaseMutex()和WaitForSingleObject()的使用方法,理解父子进程如何利用互斥体进行同步的。给出父子进程同步过程的一个大概描述:
答: CreateMutex()创建互斥体,OpenMutex()打开互斥体,ReleaseMutex()释放互斥体,WaitForSingleObject()检测hHandle事件的信号状态,通过这些方法可实现当前只有一个进程被创建或使用,实现进程的同步。
3、 实验结论
通过对进程的操作,如创建进程,实现对进程的简单控制使我对进程的概念有了更深一步的了解。
实验三 进程同步的经典算法
1、实验目的
1) 回顾系统进程、线程的有关概念,加深对Windows 2000线程的理解。
2) 了解互斥体对象,通过对生产者消费者等进程间同步与互斥经典算法的实现,加深对P、V原语以及利用P、V原语进行进程间同步与互斥操作的理解。
2、实验内容和步骤
    1. 生产者消费者问题
步骤1创建一个“Win32 Consol Application工程,然后拷贝清单3-1中的程序,编译成可执行文件。
步骤2:在“命令提示符”窗口运行步骤1中生成的可执行文件。运行结果:
范例:E:\课程\os\os实验\程序\os11\debug>os31
(假设编译生成的可执行文件是)
步骤3:仔细阅读源程序,出创建线程的WINDOWS API函数,回答下列问题:线程的第一个执行函数是什么(从哪里开始执行)?它位于创建线程的API函数的第几个参数中?

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。