os课程设计指导书.doc_第1页
os课程设计指导书.doc_第2页
os课程设计指导书.doc_第3页
os课程设计指导书.doc_第4页
os课程设计指导书.doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

os课程设计指导书 1、实验目的 (1)学会使用VC编写基本的Win32Consol Application(控制台应用程序)。 (2)掌握WINDOWS API的使用方法。 (3)编写测试程序,理解用户态运行和核心态运行。 2、实验内容和步骤 (1)编写基本的Win32Consol Application步骤1登录进入Windows,启动VC+6.0。 步骤2在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32Consol 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实验程序os11debughello.exe运行结果(如果运行不成功,则可能的原因是什么?)_ (2)计算进程在核心态运行和用户态运行的时间步骤1按照 (1)中的步骤创建一个新的“Win32Consol Application”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。 步骤2在创建一个新的“Win32Consol Application”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。 步骤3在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。 E:课程os课os实验程序os12debugtime TEST.exe步骤4运行结果(如果运行不成功,则可能的原因是什么?)_步骤5分别屏蔽While循环中的两个for循环,或调整两个for循环的次数,写出运行结果。 屏蔽i循环_屏蔽j循环_调整循环变量i的循环次数_调整循环变量j的循环次数_ 3、实验结论_ 4、程序清单清单1-1一个简单的Windows控制台应用程序/hello项目#includevoid main()std:cout“Hello,Win32Consol Application”#include#include/当在用户模式机内核模式下都提供所耗时间时,在内核模式下进行所耗时间的64位计算的帮助方法DWORD GetKernelModePercentage(const FILETIME&ftKernel,const FILETIME&ftUser)/将FILETIME结构转化为64位整数ULONGLONG qwKernel=(ULONGLONG)ftKernel.dwHighDateTime)32)+ftKernel.dwLowDateTime;ULONGLONG qwUser=(ULONGLONG)ftUser.dwHighDateTime)32)+ftUser.dwLowDateTime;/将消耗时间相加,然后计算消耗在内核模式下的时间百分比ULONGLONG qwTotal=qwKernel+qwUser;DWORD dwPct=(DWORD)(ULONGLONG)100*qwKernel)/qwTotal);return(dwPct);/以下是将当前运行过程名和消耗在内核模式下的时间百分数都显示出来的应用程序void main(int argc,char*argv)if(argc2)cout请给出你要查询的程序名 (0);/对当前系统中运行的过程拍取“快照”HANDLE hSnapshot=:CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,/提取当前过程0);/如果是当前过程,就将其忽略/初始化过程入口PROCESSENTRY32pe;:ZeroMemory(&pe,sizeof(pe);pe.dwSize=sizeof(pe);BOOL bMore=:Process32First(hSnapshot,&pe);BOOL found=FALSE;while(bMore)/打开用于读取的过程if(!strcmp(pe.szExeFile,argv1)found=TRUE;HANDLE hProcess=:OpenProcess(PROCESS_QUERY_INFORMATION,/指明要得到信息FALSE,/不必继承这一句柄pe.th32ProcessID);/要打开的进程if(hProcess!=NULL)/找出进程的时间FILETIME ftCreation,ftKernelMode,ftUserMode,ftExit;:GetProcessTimes(hProcess,/所感兴趣的进程&ftCreation,/进程的启动时间&ftExit,/结束时间(如果有的话)&ftKernelMode,/在内核模式下消耗的时间&ftUserMode);/在用户模式下消耗的时间/计算内核模式消耗的时间百分比DWORD dwPctKernel=:GetKernelModePercentage(ftKernelMode,/在内核模式上消耗的时间ftUserMode);/在用户模式下消耗的时间/向用户显示进程的某些信息coutprocess ID: (0);清单1-3核心态运行和用户态运行时间测试程序#includemain()int i,j;while (1)for(i=0;i1000;i+);for(j=1;jos21(假设编译生成的可执行文件是os21.exe)_按下ctrl+alt+del,调用windows的任务管理器,记录进程相关的行为属性_步骤3在“命令提示符”窗口加入参数重新运行生成的可执行文件。 运行结果范例E:课程os课os实验程序os11debugos213(假设编译生成的可执行文件是os21.exe)_按下ctrl+alt+del,调用windows的任务管理器,记录进程相关的行为属性_步骤4修改清单2-1中的程序,将nClone的定义和初始化方法按程序注释中的修改方法进行修改,编译成可执行文件(执行前请先保存已经完成的工作)。 再按步骤2中的方式运行,看看结果会有什么不一样。 运行结果_从中你可以得出什么结论nClone的作用_变量的定义和初始化方法(位置)对程序的执行结果有影响吗?为什么?_ (2).父子进程的简单通信及终止进程步骤1创建一个“Win32Consol Application”工程,然后拷贝清单2-2中的程序,编译成可执行文件。 步骤2在VC的工具栏单击“Execute Program”(执行程序)按钮,或者按Ctrl+F5键,或者在“命令提示符”窗口运行步骤1中生成的可执行文件。 运行结果范例E:课程os课os实验程序os11debugos22(假设编译生成的可执行文件是os22.exe)_步骤3按源程序中注释中的提示,修改源程序2-2,编译执行(执行前请先保存已经完成的工作)。 运行结果_在程序中加入跟踪语句,或调试运行程序,同时参考MSDN中的帮助文件CreateProcess()的使用方法,理解父子进程如何传递参数。 给出程序执行过程的大概描述_步骤4填空CreateProcess()函数有_个核心参数?本实验程序中设置的各个参数的值是a._;b._;c._;d._;e._;f._;g._;h._。 步骤5按源程序中注释中的提示,修改源程序2-2,编译执行。 运行结果_骤步骤6参考MSDN中的帮助文件CreateMutex()、OpenMutex()、ReleaseMutex()和WaitForSingleObject()的使用方法,理解父子进程如何利用互斥体进行同步的。 给出父子进程同步过程的一个大概描述_ 3、实验结论_ 4、程序清单清单2-1创建子进程/proreate项目#include#include#include/创建传递过来的进程的克隆过程并赋于其ID值void StartClone(int nCloneID)/提取用于当前可执行文件的文件名TCHAR szFilenameMAX_PATH;GetModuleFileName(NULL,szFilename,MAX_PATH);/格式化用于子进程的命令行并通知其EXE文件名和克隆ID TCHAR szCmdLineMAX_PATH;sprintf(szCmdLine,%s%d,szFilename,nCloneID);/用于子进程的STARTUPINFO结构STARTUPINFO si;ZeroMemory(&si,sizeof(si);si.cb=sizeof(si);/必须是本结构的大小/返回的用于子进程的进程信息PROCESS_INFORMATION pi;/利用同样的可执行文件和命令行创建进程,并赋于其子进程的性质BOOL bCreateOK=:CreateProcess(szFilename,/产生这个EXE的应用程序的名称szCmdLine,/告诉其行为像一个子进程的标志NULL,/缺省的进程安全性NULL,/缺省的线程安全性FALSE,/不继承句柄CREATE_NEW_CONSOLE,/使用新的控制台NULL,/新的环境NULL,/当前目录&si,/启动信息&pi);/返回的进程信息/对子进程释放引用if(bCreateOK)CloseHandle(pi.hProcess);CloseHandle(pi.hThread);int main(int argc,char*argv)/确定派生出几个进程,及派生进程在进程列表中的位置int nClone=0;/修改语句int nClone;/第一次修改nClone=0;if(argc1)/从第二个参数中提取克隆ID:sscanf(argv1,%d,&nClone);/第二次修改nClone=0;/显示进程位置std:coutProcess ID:GetCurrentProcessId(),Clone ID:#include#includestatic LPCTSTRg_szMutexName=w2kdg.ProcTerm.mutex.Suicide;/创建当前进程的克隆进程的简单方法void StartClone()/提取当前可执行文件的文件名TCHAR szFilenameMAX_PATH;GetModuleFileName(NULL,szFilename,MAX_PATH);/格式化用于子进程的命令行,字符串“child”将作为形参传递给子进程的main函数TCHARszCmdLineMAX_PATH;/实验2-2步骤3将下句中的字符串child改为别的字符串,重新编译执行,执行前请先保存已经完成的工作sprintf(szCmdLine,%schild,szFilename);/子进程的启动信息结构STARTUPINFO si;ZeroMemory(&si,sizeof(si);si.cb=sizeof(si);/应当是此结构的大小/返回的用于子进程的进程信息PROCESS_INFORMATION pi;/用同样的可执行文件名和命令行创建进程,并指明它是一个子进程BOOL bCreateOK=CreateProcess(szFilename,/产生的应用程序的名称(本EXE文件)szCmdLine,/告诉我们这是一个子进程的标志NULL,/用于进程的缺省的安全性NULL,/用于线程的缺省安全性FALSE,/不继承句柄CREATE_NEW_CONSOLE,/创建新窗口NULL,/新环境NULL,/当前目录&si,/启动信息结构&pi);/返回的进程信息/释放指向子进程的引用if(bCreateOK)CloseHandle(pi.hProcess);CloseHandle(pi.hThread);void Parent()/创建“自杀”互斥程序体HANDLE hMutexSuicide=CreateMutex(NULL,/缺省的安全性TRUE,/最初拥有的g_szMutexName);/互斥体名称if(hMutexSuicide!=NULL)/创建子进程std:coutCreating thechild process.os31(假设编译生成的可执行文件是os31.exe)_步骤3仔细阅读源程序,找出创建线程的WINDOWS API函数,回答下列问题线程的第一个执行函数是什么(从哪里开始执行)?它位于创建线程的API函数的第几个参数中?_步骤4修改清单3-1中的程序,调整生产者线程和消费者线程的个数,使得消费者数目大与生产者,看看结果有何不同。 运行结果_从中你可以得出什么结论_步骤5修改清单3-1中的程序,按程序注释中的说明修改信号量EmptySemaphore的初始化方法,看看结果有何不同。 运行结果_步骤6根据步骤4的结果,并查看MSDN,回答下列问题1)CreateMutex中有几个参数,各代表什么含义。 _2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论