ImageVerifierCode 换一换
格式:DOCX , 页数:35 ,大小:315.79KB ,
资源ID:10655151      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-10655151.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统实验报告完全版.docx)为本站会员(b****3)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

操作系统实验报告完全版.docx

1、操作系统实验报告完全版计算机操作系统实验报告班级:姓名:学号: 实验一 进程控制与描述一、实验目的通过对Windows 2000编程,进一步熟悉操作系统的基本概念,较好地理解Windows 2000的结构。通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows 2000中进程的“一生”。二、实验环境硬件环境:计算机一台,局域网环境;软件环境:Windows 2000 Professional、Visual C+ 企业版。三、实验内容和步骤第一部分:程序1-1Windows 2000 的GUI 应用程序Windows 2000 Profe

2、ssional下的GUI应用程序,使用Visual C+编译器创建一个GUI应用程序,代码中包括了WinMain()方法,该方法GUI类型的应用程序的标准入口点。 # include # pragma comment(lib, “” ) int APIENTRY WinMain(HINSTANCE /* hInstance */ , HINSTANCE /* hPrevInstance */, LPSTR /* lpCmdLine */, int /* nCmdShow */ ) : MessageBox( NULL, “hello, Windows 2000” , “Greetings”,

3、MB_OK) ; return(0) ; 在程序1-1的GUI应用程序中,首先需要头文件,以便获得传送给WinMain() 和MessageBox() API函数的数据类型定义。接着的pragma指令指示编译器/连接器找到库文件并将其与产生的EXE文件连接起来。这样就可以运行简单的命令行命令CL 来创建这一应用程序,如果没有pragma指令,则MessageBox() API函数就成为未定义的了。这一指令是Visual Studio C+ 编译器特有的。接下来是WinMain() 方法。其中有四个由实际的低级入口点传递来的参数。hInstance参数用来装入与代码相连的图标或位图一类的资源,无

4、论何时,都可用GetModuleHandle() API函数将这些资源提取出来。系统利用实例句柄来指明代码和初始的数据装在内存的何处。句柄的数值实际上是EXE文件映像的基地址,通常为0x00400000。下一个参数hPrevInstance是为向后兼容而设的,现在系统将其设为NULL。应用程序的命令行 (不包括程序的名称) 是lpCmdLine参数。另外,系统利用nCmdShow参数告诉应用程序如何显示它的主窗口 (选项包括最小化、最大化和正常) 。最后,程序调用MessageBox() API函数并退出。如果在进入消息循环之前就结束运行的话,最后必须返回0。先分析程序功能,再写出运行结果:操

5、作系统将当前运行的应用程序看作是进程对象。利用系统提供的惟一的称为句柄 (HANDLE) 的号码,就可与进程对象交互。这一号码只对当前进程有效。在系统中运行的任何进程都可调用GetCurrentProcess() API函数,此函数可返回标识进程本身的句柄。然后就可在Windows需要该进程的有关情况时,利用这一句柄来提供。程序1-2: 获得和使用进程的句柄 # include # include void main() HANDLE hProcessThis = : GetCurrentProcess() ; DWORD dwPriority = : GetPriorityClass(hPr

6、ocessThis) ; std : cout “Current process priority: ” ; switch(dwPriority) case HIGH_PRIORITY_CLASS: std : cout “High” ; break; case NORMAL_PRIORITY_CLASS: std: cout “Normal” ; break; case IDLE_PRIORITY_CLASS: std : cout “Idle” ; break; case REALTIME_PRIORITY_CLASS: std : cout “Realtime” ; break; def

7、ault: std : cout “” ; break; std : cout std : endl; 程序1-2中列出的是一种获得进程句柄的方法。对于进程句柄可进行的惟一有用的操作是在API调用时,将其作为参数传送给系统,正如程序1-2中对GetPriorityClass() API函数的调用那样。在这种情况下,系统向进程对象内“窥视”,以决定其优先级,然后将此优先级返回给应用程序。OpenProcess() 和CreateProcess() API函数也可以用于提取进程句柄。前者提取的是已经存在的进程的句柄,而后者创建一个新进程,并将其句柄提供出来。先分析程序功能,再写出运行结果:程序1-

8、3显示如何找出系统中正在运行的所有进程,如何利用OpenProcess() API函数来获得每一个访问进程的进一步信息。程序1-3 利用句柄查出进程的详细信息 _NULL_;d_NULL_;e. _FALSE_;f_CREATE NEW CONSOLE_;g_szCmdLine_;h. _NULL_;i_&si_;j. _&pi_;程序运行时屏幕显示的信息是:*(此图是最后出现的一个图,在此之前连续出现几个图。)1、正在运行的进程.使用进程和操作系统的版本信息 = 5) : SetPriorityClass( : GetCurrentProcess() , HIGH_PRIORITY_CLAS

9、S) ; std : cout “Task Manager should now now indicate this” “process is high priority” std : endl; 分析程序,写出运行结果:当前PID信息:_1492_当前操作系统版本:_Running on OS:系统提示信息:Task Manager should now indiate this process is high priority._程序向读者表明了如何获得当前的PID和所需的进程版本信息。为了运行这一程序,系统处理了所有的版本不兼容问题。接着,程序演示了如何使用GetVersionEx()

10、API函数来提取OSVERSIONINFOEX结构。这一数据块中包括了操作系统的版本信息。其中,“OS : ”表示当前运行的操作系统是:_Windows2000_当前版本为_OS:最后一段程序利用了操作系统的版本信息,以确认运行的是Windows 2000。代码接着将当前进程的优先级提高到比正常级别高。单击Ctrl + Alt + Del键,进入“Windows任务管理器”,在“应用程序”选项卡中右键单击本任务,在快捷菜单中选择“转到进程”命令。在“Windows任务管理器”的“进程”选项卡中,与本任务对应的进程映像名称是 (为什么) :_ 右键单击该进程名,在快捷菜单中选择“设置优先级”命令

11、,可以调整该进程的优先级,如设置为“高”后重新运行程序,屏幕显示有变化吗为什么_屏幕显示有变化。Process ID值由1492变为:3152_2、终止进程指令其子进程来“杀掉”自己的父进程 std : endl; : StartClone() ; : Sleep(5000) ; std : cout “Telling the child process to quit. ” std : endl; : ReleaseMutex(hMutexSuicide) ; : CloseHandle(hMutexSuicide) ;void Child()” std : endl; : WaitForS

12、ingleObject(hMutexSuicide, INFINITE) ; std : cout “Child quiting. ” 1& : strcmp(argv1 , “child” ) = 0) Child() ; else Parent() ; return 0; 程序说明了一个进程从“生”到“死”的整个一生。第一次执行时,它创建一个子进程,其行为如同“父亲”。在创建子进程之前,先创建一个互斥的内核对象,其行为对于子进程来说,如同一个“自杀弹”。当创建子进程时,就打开了互斥体并在其他线程中进行别的处理工作,同时等待着父进程使用ReleaseMutex() API发出“死亡”信号。然

13、后用Sleep() API调用来模拟父进程处理其他工作,等完成时,指令子进程终止。当调用ExitProcess() 时要小心,进程中的所有线程都被立刻通知停止。在设计应用程序时,必须让主线程在正常的C+ 运行期关闭 (这是由编译器提供的缺省行为) 之后来调用这一函数。当它转向受信状态时,通常可创建一个每个活动线程都可等待和停止的终止事件。在正常的终止操作中,进程的每个工作线程都要终止,由主线程调用ExitProcess()。接着,管理层对进程增加的所有对象释放引用,并将用 GetExitCodeProcess() 建立的退出代码从STILL_ACTIVE改变为在ExitProcess() 调用

14、中返回的值。最后,主线程对象也如同进程对象一样转变为受信状态。等到所有打开的句柄都关闭之后,管理层的对象管理器才销毁进程对象本身。还没有一种函数可取得终止后的进程对象为其参数,从而使其“复活”。当进程对象引用一个终止了的对象时,有好几个API函数仍然是有用的。进程可使用退出代码将终止方式通知给调用GetExitCodeProcess() 的其他进程。同时,GetProcessTimes() API函数可向主调者显示进程的终止时间。先分析程序功能,再写出运行结果:1) _第一次执行时,它创建一个子进程,其行为如同“父亲”。表示:_ Creating the child process.2) _用

15、Sleep() API调用来模拟父进程处理其他工作,等完成时,指令子进程终止。表示:Telling the child process to quit在熟悉源代码的基础上,利用本实验介绍的API函数来尝试改进本程序 (例如使用GetProcessTimes() API函数) 并运行。请描述你所做的工作:_GetProcessTimes() API 可向主调者显示进程终止时间_四、实验总结进程具有的特征:结构特征、动态性、并发性、独立性和异步性。对于进程的定义可以从不同的角度来说,其中较为典型的定义有:(1)进程是程序的一次执行(2)进程是一个程序及其数据在处理机上顺序执行时发生的活动(3)进程

16、是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。 对于传统os中的进程定义为:进程是进程实体的运行过程,使系统进行资源分配和调度的一个独立单位。 进程有三种基本状态:就绪状态、执行状态、阻塞状态。 创建一个进程:(1)、申请空白的PCB(2)为进城分配资源(3)初始化进程控制块(4)将进程插入就绪队列 终止一个进程: (1)根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从中读出该进程的状态 (2)若终止进程正处于执行状态,应立即中止该进程的执行,并置调度标志为真,用于指示该进程被终止进程的后应该重新进行调度 (3)若该进程还有子孙进程,还应该将其所有的

17、子孙进程终止,以防止他们成为不可控的进程(4)将终止进程所拥有的全部资源,或者归还给其父进程,或者归还给系统(5)将终止进程PCB从所在队列中移除,等待其他程序来搜索信 通过实验更清楚的了解了进程,理解了进程的创建过程和终止过程实验二 并发与调度一、实验目的在本实验中,通过对事件和互斥体对象的了解,来加深对Windows 2000线程同步的理解。通过分析实验程序,了解管理事件对象的API。了解在进程中如何使用事件对象,在进程中如何使用互斥体对象,线程如何通过文件映射对象发送数据。在Linux Redhat 操作系统平台上,用pipe()创建一个管道文件,然后用fork()创建两个生产进程和两个

18、消费进程,它们之间通过pipe()传递消息。二、实验环境硬件环境:计算机一台,局域网环境;软件环境:Windows 2000 Professional,Linux Redhat 操作系统平台,Visual C+ 企业版。三、实验内容和步骤第一部分:互斥体对象本程序中显示的类CCountUpDown使用了一个互斥体来保证对两个线程间单一数值的访问。每个线程都企图获得控制权来改变该数值,然后将该数值写入输出流中。创建者实际上创建的是互斥体对象,计数方法执行等待并释放,为的是共同使用互斥体所需的资源 (因而也就是共享资源) 。利用互斥体保护共享资源 . (低32位) 0) ; . (低32位) NU

19、LL) ; . (低32位) 0 ) ; . 0 ; - nTotal) . (低32位) 0 ) ; hread_requestk = -1; Thread_Infoj.n_request = 0; erial; inFile Thread_Infon_Thread.entity; inFile Thread_Infon_Thread.delay; char c; (c); while(c!=n& !() inFile Thread_Infon_Thread.thread_requestThread_Infon_Thread.n_request+; (c); n_Thread+; erial

20、; char Temp_entity = Thread_Infoj.entity; double Temp_delay = Thread_Infoj.delay; printf( n thread%2d %c %f ,Temp_serial,Temp_entity,Temp_delay); int Temp_request = Thread_Infoj.n_request; for(int k=0;kTemp_request;k+) printf( %d , Thread_Infoj.thread_requestk); cout10;14、ad=laddress&0x3FF;if(lnumbe

21、r=page_length) printf(不存在该页n);15、page_interrupt(lnumber);if(pagelnumber.flag=1)16、pnumber=pagelnumber.pnumber;17、paddress=pnumber10|ad;rite=1;else 18、page_interrupt(lnumber);goto kk;main() int lnumber,flag,pnumber,write,dnumber;unsigned laddress;int i;printf(输入页表的信息,创建页表(若页号为1,则结束输入)n);printf(输入页号和辅

22、存地址:);scanf(%d%d,&lnumber,&dnumber);i=0;while(lnumber!=-1)19、pagelnumber.lnumber=lnumber; 20、pagelnumber.dnumber=dnumber;21、i+;printf(输入页号和辅存地址:);scanf(%d%d,&lnumber,&dnumber);page_length=i;printf(输入主存块号,主存块数要小于%d,(以1结束):,i);scanf(%d,&pnumber);m=0;head=0;while(pnumber!=-1) if(m=i)24、pm=m; 25、pagem.p

23、number=pnumber; 26、pagem.flag=1;27、m+; Scanf7d,&pnumber);printf(输入指令性质(1-修改,0-不需要,其他-结束程序运行)和逻辑地址:);scanf(%d%x,&write,&laddress);while(write=0|write=1) 28、command(laddress,write);printf(输入指令性质(1-修改,0-不需要,其他-结束程序运行)和逻辑地址:);scanf(%d%x,&write,&laddress);5、程序运行结果及简要分析 首先,通过键盘依次输入了4个主存块,块号为4,6,8,3,同时,将第0,1,2,3个页面依次调入块4,6,8,3中,将这4个页面的页号相应地存入数组p0,p1,p2,p3中,然后再通过键盘依次输入逻辑地址:23,456,abc,2000,然后分离出逻辑地址高六位的页号和低10位的页内地址,由于前3个逻辑地址对应的页号在主存中,所以将这3个页号对应的主存块号和页内地址合成为物理地址;对于最后1个逻辑地址,由于对应的页号不在主存中,所以要进行缺页处理,采用FIFO算法。实验总结:通过本次实验让我明白了许多,做事

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2