实验一-Windows进程初识

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

XX师范学院计算机系实验报告(2013—2014学年第2学期)课程名称操作系统实验名称实验一Windows进程初识专业计算机科学与技术年级2011级学号姓名指导教师实验日期2014.03.06实验目的与要求:(1)学会使用VC编写基本的Win32ConsolApplication(控制台应用程序)。(2)掌握WINDOWSAPI的使用方法。(3)编写测试程序,理解用户态运行和核心态运行。实验设备(环境):微机、C语言编程环境(VC++)。实验内容:(1)编写基本的Win32ConsolApplication。(2)计算进程在核心态运行和用户态运行的时间。实验步骤、实验结果及分析:(1)编写基本的Win32ConsolApplication步骤1:登录进入Windows,启动VC++6.0。步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32ConsolApplication”,然后在“Projectname”处输入工程名,在“Location”处输入工程目录。创建一个新的控制台应用程序工程。工程名为os11步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++SourceFile”,然后在“File”处输入C/C++源程序的文件名。文件名hello步骤4:将清单1-1所示的程序清单复制到新创建的C/C++源程序中。编译成可执行文件。步骤5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows“命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序:路径C:\ProgramFiles\MicrosoftVisualStudio\MyProjects\os11\DebugE:\课程\os课\os实验\程序\os11\debughello.exe运行结果(如果运行不成功,则可能的原因是什么?):程序清单如下:清单1-1//hello项目#includeiostreamvoidmain(){std::cout“Hello,Win32ConsolApplication”std::endl;}运行结果如图1所示:图1运行成功的结果如图2所示:图2(2)计算进程在核心态运行和用户态运行的时间步骤1:按照(1)中的步骤创建一个新的“Win32ConsolApplication”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。文件名Test2步骤2:在创建一个新的“Win32ConsolApplication”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。文件名Test3步骤3:在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。路径C:\ProgramFiles\MicrosoftVisualStudio\MyProjects\os12\debugtest2(test3).exe步骤4:运行结果(如果运行不成功,则可能的原因是什么?)程序清单如下:清单1-2核心态运行和用户态运行时间比计算//proclist项目#includewindows.h#includetlhelp32.h#includeiostream.h//当在用户模式机内核模式下都提供所耗时间时,在内核模式下进行所耗时间的64位计算的帮助方法DWORDGetKernelModePercentage(constFILETIME&ftKernel,constFILETIME&ftUser){//将FILETIME结构转化为64位整数ULONGLONGqwKernel=(((ULONGLONG)ftKernel.dwHighDateTime)32)+ftKernel.dwLowDateTime;ULONGLONGqwUser=(((ULONGLONG)ftUser.dwHighDateTime)32)+ftUser.dwLowDateTime;//将消耗时间相加,然后计算消耗在内核模式下的时间百分比ULONGLONGqwTotal=qwKernel+qwUser;DWORDdwPct=(DWORD)(((ULONGLONG)100*qwKernel)/qwTotal);return(dwPct);}//以下是将当前运行过程名和消耗在内核模式下的时间百分数都显示出来的应用程序voidmain(intargc,char*argv[]){if(argc2){cout请给出你要查询的程序名endl;exit(0);}//对当前系统中运行的过程拍取“快照”HANDLEhSnapshot=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,//提取当前过程0);//如果是当前过程,就将其忽略//初始化过程入口PROCESSENTRY32pe;::ZeroMemory(&pe,sizeof(pe));pe.dwSize=sizeof(pe);BOOLbMore=::Process32First(hSnapshot,&pe);BOOLfound=FALSE;while(bMore){//打开用于读取的过程if(!strcmp(pe.szExeFile,argv[1])){found=TRUE;HANDLEhProcess=::OpenProcess(PROCESS_QUERY_INFORMATION,//指明要得到信息FALSE,//不必继承这一句柄pe.th32ProcessID);//要打开的进程if(hProcess!=NULL){//找出进程的时间FILETIMEftCreation,ftKernelMode,ftUserMode,ftExit;::GetProcessTimes(hProcess,//所感兴趣的进程&ftCreation,//进程的启动时间&ftExit,//结束时间(如果有的话)&ftKernelMode,//在内核模式下消耗的时间&ftUserMode);//在用户模式下消耗的时间//计算内核模式消耗的时间百分比DWORDdwPctKernel=::GetKernelModePercentage(ftKernelMode,//在内核模式上消耗的时间ftUserMode);//在用户模式下消耗的时间//向用户显示进程的某些信息coutprocessID:pe.th32ProcessID,EXEfile:pe.szExeFile,%dinKernelmode:dwPctKernelendl;//消除句柄::CloseHandle(hProcess);}}//转向下一个进程bMore=::Process32Next(hSnapshot,&pe);}if(found==FALSE){cout当前系统没有这个可执行程序正在运行endl;exit(0);}}清单1-3核心态运行和用户态运行时间测试程序#includestdio.hvoidmain(){inti,j;//,k=1;while(1){//while(k2){for(i=0;i10;i++);for(j=1;j10;j++)printf(“enterkernelmoderunning.”);//k++;}}运行结果如下:运行不成功的结果如图3和图4所示:图3图4原因:‘test2.exe’不是内部文件,所以运行不成功。运行成功的结果如图5所示:图5步骤5:分别屏蔽While循环中的两个for循环,或调整两个for循环的次数,写出运行结果。屏蔽i循环:(运行结果如图6所示)图6屏蔽j循环:(运行结果如图7所示)图7把程序中的j循环注释掉,此时不进入printf函数,i循环只需在用户态运行,不需要进入核心态调整循环变量i的循环次数:将变量i的循环次数为5(运行结果如图8和图9所示)图8图9调整循环变量j的循环次数:将变量j的循环次数为5(运行结果如图10和图11所示)图10图11程序一旦进入死循环,改变循环次数对循环次数无用。(2)实验分析实验总结(包括过程总结、心得体会及实验改进意见等):过程总结及心得体会:指导教师评语:成绩评定B教师签字2014年3月10日备注:注:1、报告内的项目或设置,可根据实际情况加以补充和调整2、教师批改学生实验报告应在学生提交实验报告10日内

1 / 13
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功