Windows实习报告模板.doc_第1页
Windows实习报告模板.doc_第2页
Windows实习报告模板.doc_第3页
Windows实习报告模板.doc_第4页
Windows实习报告模板.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

操作系统实习一实习报告 Windows实习报告模板 学号:_ 姓名:_ 组号:_一、 设计思路及主要代码分析:实习目的:通过本次实习了解操作系统中的进程、线程的区别与联系;掌握多进程、多线程的编程方法;深入了解操作系统原理;设计思路:1. 进、线程压力测试部分:用循环的办法产生所要求的进程(线程),循环的退出条件是不能产生进程时,即CreateProcess()返回0时,同时统计产生的进程(线程)数目;对于子进程的运行方式(子线程类似处理),有两种:(1)子进程挂起或睡眠(Process_One.exe就是为这种情况设计的),挂起操作在父进程通过CREATE_SUSPENDED选项完成;(2)子进程死循环(Process_Two.exe就是为了这种情况设计的),即父进程产生子进程后子进程立即执行,并且执行一个死循环;2. 进、线程性能测试部分:对于进程:考虑到进程的优先级,作了四组测试,即:HIGH_PRIORITY_CLASS、IDLE_PRIORITY_CLASS、NORMAL_PRIORITY_CLASS、REALTIME_PRIORITY;其中,Realtime优先级较高,其它依序次之;每组又作了三组测试得到三种进程时间:(1)产生单个进程所需要的时间;(2)产生500个进程后,计算每个进程的平均产生时间;(3)产生100个进程,并且打印出每个进程的创建时间(可以认为是在系统不同的负荷下,产生的进程的时间的变化);对于线程,与进程一样也用三种方法测试时间;以上两种情况,子进程(线程)都有两种运行方式:挂起或者立即返回(即子进程一运行便结束返回),用以测试这两种方式对时间的影响(后面有实验数据说明);3 时间的测试方法:用一个比较精确的时间测试程序(在文件夹中);4 源代码在problem1文件夹下,包括测试时间的程序和源代码; 主要代码:1进程(线程)压力测试: oPreciseTimer.StartTimer(); /时间计时开始while(true) /死循环产生进程if(!CreateProcess(NULL,Process_One.exe,NULL,NULL,FALSE,dMode,NULL,NULL,&info,&pinfo) /产生进程函数; /到达极限后退出oPreciseTimer.StopTimer(); /计时停止_int64 i64Diff = oPreciseTimer.GetTime();break; /退出 nProcess_Number +; /进程数加一2优先级选择:if(nChoice_One = 1) /通过输入选择优先级if(nChoice_Two = 1) /通过输入选择子进程运行方式dMode = HIGH_PRIORITY_CLASS|CREATE_SUSPENDED;elsedMode = HIGH_PRIORITY_CLASS;else if(nChoice_One = 2)if(nChoice_Two = 1)dMode = IDLE_PRIORITY_CLASS|CREATE_SUSPENDED;elsedMode = IDLE_PRIORITY_CLASS;else if(nChoice_One = 3)if(nChoice_Two = 1)dMode = NORMAL_PRIORITY_CLASS|CREATE_SUSPENDED;elsedMode = NORMAL_PRIORITY_CLASS;elseif(nChoice_Two = 1)dMode = REALTIME_PRIORITY_CLASS|CREATE_SUSPENDED;elsedMode = REALTIME_PRIORITY_CLASS;3进线程性能测试:if(nChoice_Three = 1) /产生单个进程;oPreciseTimer.StartTimer(); /计时CreateProcess(NULL,Process_Two.exe,NULL,NULL,FALSE,dMode,NULL,NULL,&info,&pinfo);oPreciseTimer.StopTimer();_int64 i64Diff = oPreciseTimer.GetTime();return;else if(nChoice_Three = 2) /产生多个进程求平均 oPreciseTimer.StartTimer(); /计时while(true)if(nTemp = 0)oPreciseTimer.StopTimer();_int64 i64Diff = oPreciseTimer.GetTime();cout 创建进程平均耗时: (double)i64Diff/nProcess_Number milliseconds endl;return;CreateProcess(NULL,Process_Two.exe,NULL,NULL,FALSE,dMode,NULL,NULL,&info,&pinfo); /产生进程nTemp -;nProcess_Number +;else /打印出每个进程的创建时间 while(true)if(nTemp = 0)return;oPreciseTimer.StartTimer();CreateProcess(NULL,Process_Two.exe,NULL,NULL,FALSE,dMode,NULL,NULL,&info,&pinfo);oPreciseTimer.StopTimer();if(nResult = 0)return;_int64 i64Diff = oPreciseTimer.GetTime();cout 创建进程 nProcess_Number : ;cout 耗时: (double)i64Diff endl;nTemp -;nProcess_Number +;二、 程序结果及问题分析:(注:第二台机器的测试数据只是作为映照证明,以第一台数据为主,另外,第二台机器的数据稳定性较第一台好)(一)、进程压力测试: 1实习要求:尽可能产生进程,得到进程数的最大极限;考虑两种子进程的运行方式:1.挂起或者睡眠;2.死循环; 2实验结果:试验次数第一台机器子进程挂起第一台机器子进程死循环第二台机器子进程挂起第二台机器子进程死循环第1次765(个)未知754(个)未知第2次721(个)未知754(个)未知第3次669(个)70754(个)未知第4次590(个)未知754(个)未知第5次555(个)未知754(个)未知第6次511(个)未知754(个)未知第7次470(个)43754(个)未知第8次423(个)32753(个)未知第9次360(个)未知753(个)未知第10次322(个)未知753(个)未知 3结果分析: 第一、任何操作系统的资源都是有限的,故而可以申请的进程的最大数目也是有限的,这可以从上表中两台机器的实验结果中得到结论; 第二、如果进程出现死循环状况,CPU占用率将持续100%,这时,便会出现诸如死机等状况,所以,这个时候所能够创建的进程数也会急剧减少,并且速度奇慢(由于多个进程抢占CPU);反之,如果将子进程挂起,则系统运行良好(只有一个进程抢占CPU); 第三、如果给进程赋予不同的优先级(对于子进程挂起的运行方式),产生的进程数是相同的; 第四、操作系统或者硬件的差异可能导致结果不同:第一台(笔记本)的数据依次下降,而第二台则相对稳定;经多次试验后发现:第一台每次重起后产生的进程数就恢复到上次重起的水平了,而第二台在经过多次试验后,数据也会下降,只是没有第一台下降的速度快罢了;下降的大趋势可能是由于操作系统的累加性等原因造成的;(二)、线程压力测试: 1实习要求:尽可能产生线程,得到线程数的最大极限;考虑两种子线程的运行方式:1.挂起或者睡眠;2.死循环; 2实验结果:试验次数第一台机器子线程挂起第一台机器子线程死循环第二台机器子线程挂起第二台机器子线程死循环第1次2028(个)未知2030(个)未知第2次2028(个)未知2030(个)未知第3次2028(个)1872030(个)未知第4次2028(个)未知2030(个)未知第5次2028(个)2012030(个)未知第6次2028(个)未知2030(个)未知第7次2028(个)1512030(个)未知第8次2028(个)未知2030(个)未知第9次2028(个)1932030(个)未知第10次2028(个)2442030(个)未知 3结果说明: 线程的死循环部分同样会造成死机等后果,但似乎比进程的要好得多; 4结果分析: 第一、从试验结果上看,即使现成的数目是进程数目的好几倍,但是线程的产生速度依然比进程快得多(从直感上就能感觉出来); 第二、线程的数目是绝对统一的(但各个机器不太一样),这可以从上表中得出结论;那么可以看出,线程是隶属于进程的,操作系统为每个进程规定了线程的数目,他不依赖于系统现在的资源情况,这一点与进程有很大不同;同时,这也从一个侧面说明了,用户线程级对系统内核是不可见的;总之,上述两表明显看出进线程的不同级别性; 第三、如果线程出现死循环状况,CPU占用率将持续100%,这时,也会出现诸如死机等状况,所以,这个时候所能够创建的线程数也会急剧减少,并且速度奇慢(由于多个线程抢占CPU);反之,如果将子线程挂起,则系统运行良好(只有一个线程抢占CPU);(三)、进程时间测试: 1实习要求:性能测试,测试系统创建单个进程的平均速率以及速率变化情况,并且对不同的优先级进行测试,研究优先级对其影响; 2实验结果: 我分了如下几种情况分别作了实验:(1)产生单个进程时间(考虑了两种子进程运行方式:1.子进程挂起;2.子进程立即返回;):子进程优先级为:HIGH_PRIORITY_CLASS试验次数第一台机器子进程挂起创建时间 (微妙)第一台机器子进程立返创建时间(微妙)第二台机器子进程挂起创建时间(微妙)第二台机器子进程立返创建时间(微妙)第1次25763533726822389第2次25951024713123310第3次24911020511973346第4次69021003111932587第5次2369650912114402第6次6006985212083712第7次59081839015874416第8次25271000412214409第9次2500994613474613第10次5836636912093926平均值3971126891416.73711子进程优先级为:IDLE_PRIORITY_CLASS试验次数第一台机器子进程挂起创建时间 (微妙)第一台机器子进程立返创建时间(微妙)第二台机器子进程挂起创建时间(微妙)第二台机器子进程立返创建时间(微妙)第1次2376601227141209第2次2501250412351188第3次2360251013471187第4次5851268011091356第5次2493239214571848第6次5930595415831551第7次2532621211391181第8次3400256813581193第9次5953235512001184第10次2513249714771201平均值3590.93559.31461.91309.8子进程优先级为:NORMAL_PRIORITY_CLASS试验次数第一台机器子进程挂起创建时间 (微妙)第一台机器子进程立返创建时间(微妙)第二台机器子进程挂起创建时间(微妙)第二台机器子进程立返创建时间(微妙)第1次2376608813321183第2次2480253412011193第3次7033279412471175第4次10616249311791164第5次5898239219831182第6次6094249012051192第7次5836249511981209第8次6017237011641183第9次2484704412401257第10次6128258512441079平均值5496.23328.51299.31181.7子进程优先级为:REALTIME_PRIORITY_CLASS试验次数第一台机器子进程挂起创建时间 (微妙)第一台机器子进程立返创建时间(微妙)第二台机器子进程挂起创建时间(微妙)第二台机器子进程立返创建时间(微妙)第1次25991035811032568第2次26881023112792109第3次2782993711742403第4次2676660110642221第5次25201032710692310第6次61581522611722490第7次2838692012032701第8次2651680212162338第9次27251002411242745第10次61066743112827143平均值3374.39316.91153.24907.8实验结果说明: 以上四个表格按照进程的四个优先级进行分别的测试,用两种子进程的运行方式进行测试(子进程立返指子进程一旦运行便返回),所得结果如上述四表所示;实验结果分析: 第一、从数据上来看,不论子进程以何种方式运行,数据都存在较明显的震荡性,即随机性的成分较大; 第二、从数据上来看,创建进程的时间根进程的优先级有关系,尤其是在子进程挂起时,创建进程的时间跟优先级有一一对应关系; 第三、子进程的运行方式的不同体现在了时间上,由于立即执行可能使得父进程被迫让出CPU(当然,这跟子进程的优先级有关系),这使得测得的时间不再是创建的时间,而更有可能是进程创建时间加上撤销时间加上运行时间,所以测得的时间较长;但具有IDLE和NORMAL优先级的进程有反常现象,这应该跟进程的优先级有关;(2)产生多个进程时间(考虑了两种子进程运行方式:1.子进程挂起;2.子进程立即返回;产生500个进程的平均时间),从而得到单个进程的平均时间:子进程优先级为:HIGH_PRIORITY_CLASS试验次数第一台机器子进程挂起平均时间 (微妙)第一台机器子进程立返平均时间(微妙)第二台机器子进程挂起平均时间(微妙)第二台机器子进程立返平均时间(微妙)第1次274087894621113760279034第2次2640173121114902028963第3次28166971168123347297160第4次2966278521312415830012第5次276669796312111923300456第6次301483741288124934301677第7次273433809823123378315743第8次29131371146912367932286第9次3011275423313576831977第10次2822976492113521331211平均值2842.6947700.7711265.1773057.661实验结果说明:只写出了Hign优先级下的两种实现,其他优先级类似; 实验结果分析:第一、从数据上来看,数据的震荡性有了明显的收敛,并且较之单个进程小了一些,这是大量数据所造成的,即将随机性与误差在大数量的测试中淡化的结果(逐渐趋于正确) 第二、从数据上来看,创建进程的时间跟优先级确有关系,如前所述; 第三、子进程的运行方式的不同体现在了时间上,如前所述;(3)产生多个进程时间(考虑了两种子进程运行方式:1.子进程挂起;2.子进程立即返回;产生100个进程的平均时间),输出每个进程创建的时间(即考虑不同系统负荷下的创建情况): Hign_Priority_Class下子进程挂起 Hign_Priority_Class下子进程立即返回 结果说明: 只画出了Hign优先级下的两种实现,其他优先级类似;用100个进程测试,画出了每个进程的产生时间如上两图所示;纵坐标为时间,单位为微妙,横坐标为组别,一组十个进程; 结果分析: 第一、从上两图图形中可以看出,第(2)个测试的结论基本属实,即子进程立即返回方式测得的时间要大于子进程挂起方式测得的时间,并且是比较明显的; 第二、从上两图图形中可以看出,往往在初始阶段(由于操作系统对进程的初始化等工作造成的)的几个数据较大,而以后的数据则呈现出规律的变化,这说明了一个问题:用第(2)种测试方法求平均时间时,若进程数目太小,则得出的结论是不精确的,甚至是错误的,即:用第(2)种测试方法时,当进程数趋于正无穷时,数据才会逐渐稳定下来; 第三、从上两图图形中可以看出进程时间的发展趋势:(1)在局部区域内有所震荡;(2)在不同的系统负荷下,在宏观区域上呈现规律性;(3)整体有见效的趋势(从第一个图中看更明显); (四)、线程时间测试: 1实习要求:性能测试,测试系统创建单个进程的平均速率以及速率变化情况; 2实验结果: 分如下几种情况分别作了实验: (1)产生单个线程时间(考虑了两种子线程运行方式:1.子线程挂起;2.子线程立即返回;): 试验次数第一台机器子线程挂起 (微妙)第一台机器子线程立返创建时间(微妙)第二台机器子线程挂起创建时间(微妙)第二台机器子线程立返创建时间(微妙)第1次113917878第2次1111047878第3次1151168079第4次1111168580第5次1091227779第6次1221127885第7次1123048177第8次2521075278第9次1131147981第10次1111167781平均值126.9130.276.579.6 结果说明: 产生单个线程的时间; 结果分析: 第一、从数据上来看,产生线程的时间远小于产生进程的时间,二者根本不在一个数量级上; 第二、从数据上看,不论是哪种子线程的运行方式,数据都相对稳定,但都有跳跃现象(如1的第8次和2的第7次); 第三、由于数据较小,所以误差情况可能会严重(如计时程序产生的误差等),这一点体现在:(1)数据相对稳定,起伏不大;(2)子线程的运行方式的不同没有体现在测试时间上;(2)产生多个线程时间(考虑了两种子线程运行方式:1.子线程挂起;2.子线程立即返回;产生500个线程的平均时间),从而得到单个线程的平均时间:试验次数第一台机器子进程挂起 (微妙)第一台机器子进程立返创建时间(微妙)第二台机器子进程挂起创建时间(微妙)第二台机器子进程立返创建时间(微妙)第1次16659622730615662814433第2次151672439261201142213第3次1420642561361012351339第4次1746282185981176714584第5次1589042220212333132667第6次1934782180511001137529第7次162521584812134138111第8次16533422270611678142108第9次1437762031881277612933第10次1808482062321191134785平均值163.9798223.401121.3953138.0813 结果分析: 第一、从平均数据上看,无论哪种运行方式,运行时间都比第(1)中测试方法长,究其原因,在于第(1)种方法中所说的跳跃现象,这在第(3)种方法中看得更为真切; 第二、从数据上可以看出,不同的运行方式产生了区别,可能的原因在于由于线程数的增多导致误差的比重下降,从而得出了区别;至于为何立即返回方式时间较多,我认为原因与进程相同;(3)产生多个线程时间(考虑了两种子线程运行方式:1.子线程挂起;2.子线程立即返回;产生100个线程的平均时间),输出每个线程创建的时间(即考虑不同系统负荷下的创建情况): 子线程挂起方式 子线程立即返回方式结果说明: 用100个线程测试,画出了每个线程的产生时间如上两图所示;纵坐标为时间,单位为微妙,横坐标为组别,一组十个线程;结果分析:第一、 从上述两图中可以清晰地看出剧烈的跳跃现象,鉴于线程的产生时间很短,加之跳跃现象剧烈,我认为,用平均值法计算现成的创建速度是不合理的;第二、 从上述两图中还可以看出,线程的产生非常均匀,在一段区域内呈现出相对平稳的现象; 三、 程序设计过程中的问题及解决:1 Windows编程经验不足,尤其是像CreateProces、CreateThread等的API函数,对于其参数等的设置并不熟练;2 对比试验的问题,在这次实习中,很多东西是建立在和同学讨论的基础之上的,例如:进程压力试验的数据下降问题等;3 测试问题;包括两个方面:(1)测试的数据量大,数据比较离散;(2)数据之间的关系不太容易把握;4 产生线程时的跳跃问题还没有解答;5 线程数与死循环、进程数与死循环等的关系还不太明朗;6 计算线程、进城的创建时间等问题个人感觉还不很精确;四、 总结及问题回答: 1Windows 2k/xp中进程和线程在表现上的差别: (1)进程创建的时间远大于线程的创建的时间; (2)进程数目远小于可创建的线程数目; (3)创建进程时,从系统的表现可以明显感知到速度变慢,但线程几乎没有这种现象; (4)从资源管理器中可以得知:创建进程时内存占用量较之创建线程有明显的增加; (5)不同的系统中能创建的进程数有很大区别,大线程数大体一致;同样,反复做同样的实验,创建的进程数有下降的趋势,但线程数没有;2导致对进程和线程测试结果的差异的原因: 进程是拥有资源的独立单位,而线程只拥有极少的资源,同一进程的线程都共享该进程的代码段、数据段和系统资源。所以在创建进程的时候,系统要为之分配系统资源,这远大于创建线程所需的资源,这样创建进程的系统开销就会远大于创建线程的系统开销,造成了进程和线程在创建时间上的差异。 另外,在撤销进程,挂起进程等方面,由于进程直接和操作系统联系,所以耗费时间较多,比较而言,说线程是轻量级的进程是合情合理的; 同样,作为进程的下属线程,其运行有许多优势,这就造成了上述的包括数目、速度等方面的差异;3在不同系统负荷下的结果: 在做这个程序之前,和同学们讨论过这个问题,结论如下: “在较低的系统负荷下,系统很容易找到空闲资源分配给要求创建的进程或线程,所以进程(线程)的创建时间会较短。而在较高的系统负荷下,系统找到空闲资源要困难一些,所以创建进程(线程)的时间会变长。” 这个结论是大家都同意的,但从面的结果来看,事情并非如此:从进程的创建速率变化情况来看,进程(线程)在宏观上有很强的规律性和相对稳定性,所以说上述结果不尽正确,具体原因有待进一步确定(当然也不排除结果的误差造成的错误); 4不同的运行方式所造成的问题: 子进程(线程)挂起和子进程(线程)立即返回式两种不同的测试方法,但结果大不相同,其原因如下: 个人认为子进

温馨提示

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

评论

0/150

提交评论