河北工业大学操作系统实验报告推荐文档.docx

上传人:b****9 文档编号:25328285 上传时间:2023-06-07 格式:DOCX 页数:26 大小:146.11KB
下载 相关 举报
河北工业大学操作系统实验报告推荐文档.docx_第1页
第1页 / 共26页
河北工业大学操作系统实验报告推荐文档.docx_第2页
第2页 / 共26页
河北工业大学操作系统实验报告推荐文档.docx_第3页
第3页 / 共26页
河北工业大学操作系统实验报告推荐文档.docx_第4页
第4页 / 共26页
河北工业大学操作系统实验报告推荐文档.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

河北工业大学操作系统实验报告推荐文档.docx

《河北工业大学操作系统实验报告推荐文档.docx》由会员分享,可在线阅读,更多相关《河北工业大学操作系统实验报告推荐文档.docx(26页珍藏版)》请在冰豆网上搜索。

河北工业大学操作系统实验报告推荐文档.docx

河北工业大学操作系统实验报告推荐文档

 

河北工业大学

操作系统

2014版

实验报告

 

实验一进程控制与描述

一、实验目的

通过对Windows2000编程,进一步熟悉操作系统的基本概念,较好地理解Windows2000的结构。

通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows2000进程的“一生”。

三、实验内容和步骤

第一部分:

Windows2000Professional下的GUI应用程序,使用VisualC++编译器创建一个GUI应用程序,代码中包括了WinMain()方法,该方法GUI类型的应用程序的标准入口点。

程序1-1Windows2000的GUI应用程序

也可以利用任何其他文本编辑器键入程序代码,如果这样,例如使用WORD来键入和编辑程序,则应该注意什么问题?

保存时,将文件保存为扩展名为*.cpp的C++源文件。

在程序1-1的GUI应用程序中,首先需要Windows.h头文件,以便获得传送给WinMain()和MessageBox()API函数的数据类型定义。

接着的pragma指令指示编译器/连接器找到User32.LIB库文件并将其与产生的EXE文件连接起来。

这样就可以运行简单的命令行命令CLMsgBox.CPP来创建这一应用程序,如果没有pragma指令,则MessageBox()API函数就成为未定义的了。

这一指令是VisualStudioC++编译器特有的。

接下来是WinMain()方法。

其中有四个由实际的低级入口点传递来的参数。

hInstance参数用来装入与代码相连的图标或位图一类的资源,无论何时,都可用GetModuleHandle()API函数将这些资源提取出来。

系统利用实例句柄来指明代码和初始的数据装在内存的何处。

句柄的数值实际上是EXE文件映像的基地址,通常为0x00400000。

下一个参数hPrevInstance是为向后兼容而设的,现在系统将其设为NULL。

应用程序的命令行(不包括程序的名称)是lpCmdLine参数。

另外,系统利用nCmdShow参数告诉应用程序如何显示它的主窗口(选项包括最小化、最大化和正常)。

最后,程序调用MessageBox()API函数并退出。

如果在进入消息循环之前就结束运行的话,最后必须返回0。

运行结果:

弹出一个消息框,标题为Greetings,内容为Hello,WindowsXp,中间有一个确认按钮。

进程对象

操作系统将当前运行的应用程序看作是进程对象。

利用系统提供的惟一的称为句柄(HANDLE)的号码,就可与进程对象交互。

这一号码只对当前进程有效。

本实验表示了一个简单的进程句柄的应用。

在系统中运行的任何进程都可调用GetCurrentProcess()API函数,此函数可返回标识进程本身的句柄。

然后就可在Windows需要该进程的有关情况时,利用这一句柄来提供。

程序1-2:

获得和使用进程的句柄

程序1-2中列出的是一种获得进程句柄的方法。

对于进程句柄可进行的惟一有用的操作是在API调用时,将其作为参数传送给系统,正如程序1-2中对GetPriorityClass()API函数的调用那样。

在这种情况下,系统向进程对象内“窥视”,以决定其优先级,然后将此优先级返回给应用程序。

OpenProcess()和CreateProcess()API函数也可以用于提取进程句柄。

前者提取的是已经存在的进程的句柄,而后者创建一个新进程,并将其句柄提供出来。

1-2.cpp的运行结果:

进程优先权为Normal。

程序1-3显示如何找出系统中正在运行的所有进程,如何利用OpenProcess()API函数来获得每一个访问进程的进一步信息。

程序1-3利用句柄查出进程的详细信息

程序1-3程序首先利用Windows2000的新特性,即工具帮助库来获得当前运行的所有进程的快照。

然后应用程序进入快照中的每一个进程,得到其以PROCESSENTRY32结构表示的属性。

这一结构用来向OpenProcess()API函数提供进程的ID。

Windows跟踪每一进程的有关时间,示例中是通过打开的进程句柄和GetProcessTimes()API来直询得到有关时间的。

接下来,一个定制的帮助函数取得了几个返回的数值,然后计算进程在内核模式下消耗的时间占总时间的百分比。

程序的其余部分比较简单,只是将有关信息显示给用户,清除进程句柄,然后继续循环,直到所有进程都计算过为止。

运行结果:

第二部分:

进程的“一生”

1、创建进程

创建子进程

本程序展示的是一个简单的使用CreateProcess()API函数的例子。

首先形成简单的命令行,提供当前的EXE文件的指定文件名和代表生成克隆进程的号码。

大多数参数都可取缺省值,但是创建标志参数使用了:

行为像一个子进程的标志,指示新进程分配它自己的控制台,这使得运行示例程序时,在任务栏上产生许多活动标记。

然后该克隆进程的创建方法关闭传递过来的句柄并返回main()函数。

在关闭程序之前,每一进程的执行主线程暂停一下,以便让用户看到其中的至少一个窗口。

CreateProcess()函数有5个核心参数?

本实验程序中设置的各个参数的值是:

a.(LPCTSTRlpApplicationName)szFilename,//产生这个EXE的应用程序的名称;

b.(LPTSTRlpCommandLine)szCmdLine,//告诉其行为像一个子进程的标志;

c.(BOOLbInheritHandles)FALSE,//不继承句柄;

d.(LPSTARTUPINFOlpStartupInfo)&si,//启动信息;

e.(LPPROCESS_INFORMATIONlpProcessInformation)&pi);//返回的进程信息;

程序运行时屏幕显示的信息是:

2、正在运行的进程

使用进程和操作系统的版本信息

运行结果:

当前PID信息:

_4664

当前操作系统版本:

5.1(我的操作系统为WindowsXP)

系统提示信息:

TaskManagershouldnownowindicatethisprocessishighpriority.

程序向读者表明了如何获得当前的PID和所需的进程版本信息。

为了运行这一程序,系统处理了所有的版本不兼容问题。

接着,程序演示了如何使用GetVersionEx()API函数来提取OSVERSIONINFOEX结构。

这一数据块中包括了操作系统的版本信息。

其中,“OS:

5.0”表示当前运行的操作系统是:

Windows2000。

最后一段程序利用了操作系统的版本信息,以确认运行的是Windows2000。

代码接着将当前进程的优先级提高到比正常级别高。

单击Ctrl+Alt+Del键,进入“Windows任务管理器”,在“应用程序”选项卡中右键单击本任务,在快捷菜单中选择“转到进程”命令。

在“Windows任务管理器”的“进程”选项卡中,与本任务对应的进程映像名称是(为什么?

):

VCSPAWN.EXE

右键单击该进程名,在快捷菜单中选择“设置优先级”命令,可以调整该进程的优先级,如设置为“高”后重新运行程序,屏幕显示有变化吗?

没有。

3、终止进程

指令其子进程来“杀掉”自己的父进程

程序说明了一个进程从“生”到“死”的整个一生。

第一次执行时,它创建一个子进程,其行为如同“父亲”。

在创建子进程之前,先创建一个互斥的内核对象,其行为对于子进程来说,如同一个“自杀弹”。

当创建子进程时,就打开了互斥体并在其他线程中进行别的处理工作,同时等待着父进程使用ReleaseMutex()API发出“死亡”信号。

然后用Sleep()API调用来模拟父进程处理其他工作,等完成时,指令子进程终止。

当调用ExitProcess()时要小心,进程中的所有线程都被立刻通知停止。

在设计应用程序时,必须让主线程在正常的C++运行期关闭(这是由编译器提供的缺省行为)之后来调用这一函数。

当它转向受信状态时,通常可创建一个每个活动线程都可等待和停止的终止事件。

在正常的终止操作中,进程的每个工作线程都要终止,由主线程调用ExitProcess()。

接着,管理层对进程增加的所有对象释放引用,并将用GetExitCodeProcess()建立的退出代码从STILL_ACTIVE改变为在ExitProcess()调用中返回的值。

最后,主线程对象也如同进程对象一样转变为受信状态。

等到所有打开的句柄都关闭之后,管理层的对象管理器才销毁进程对象本身。

还没有一种函数可取得终止后的进程对象为其参数,从而使其“复活”。

当进程对象引用一个终止了的对象时,有好几个API函数仍然是有用的。

进程可使用退出代码将终止方式通知给调用GetExitCodeProcess()的其他进程。

同时,GetProcessTimes()API函数可向主调者显示进程的终止时间。

运行结果:

1)_Creatingthechildprocess._

Childwaitingforsuicideinstructions.

表示:

_父进程正在创建子进程。

子进程等待父进程杀死子进程。

_

2)_Tellingthechildprocesstoquit.__

表示:

_父进程杀死子进程。

_

四、实验总结

请总结一下本次实验的收获、教训和感受,结合课本内容谈一下你对进程的理解。

本次实验让我明白进程是程序的一次执行过程,是系统进行处理机调度和资源分配的基本单位。

(未引入线程之前)。

进程是操作系统结构的基础;是一个正在执行的程序;计算机中正在运行的程序实例;可以分配给处理器并由处理器执行的一个实体;由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元,对父进程和子进程的关系有了进一步的了解。

实验二并发与调度

1、实验目的

在本实验中,通过对事件和互斥体对象的了解,来加深对Windows2000线程同步的理解。

通过分析实验程序,了解管理事件对象的API。

了解在进程中如何使用事件对象,在进程中如何使用互斥体对象,线程如何通过文件映射对象发送数据。

二、实验内容和步骤

第一部分:

互斥体对象

本程序中显示的类CCountUpDown使用了一个互斥体来保证对两个线程间单一数值的访问。

每个线程都企图获得控制权来改变该数值,然后将该数值写入输出流中。

创建者实际上创建的是互斥体对象,计数方法执行等待并释放,为的是共同使用互斥体所需的资源(因而也就是共享资源)。

1、利用互斥体保护共享资源

分析程序的运行结果,可以看到线程(加和减线程)的交替执行(因为Sleep()API允许Windows切换线程)。

在每次运行之后,数值应该返回初始值(0),因为在每次运行之后写入线程在等待队列中变成最后一个,内核保证它在其他线程工作时不会再运行。

1)请描述运行结果(如果运行不成功,则可能的原因是什么?

):

两个线程交替运行,不断改变value的值。

两个线程互斥访问Value的值。

2)根据运行输出结果,对照分析程序,可以看出程序运行的流程吗?

请简单描述:

线程1(5296)先运行,将value值增1,变为1。

然后,线程2(6016)运行,将value值减1,变为0.

第二部分:

线程通过文件对象发送数据

Windows2000提供的线程间通讯类内核对象允许同一进程或跨进程的线程之间互相发送信息,包括文件、文件映射、邮件位和命名管道等,其中最常用的是文件和文件映射。

这类对象允许一个线程很容易地向同一进程或其他进程中的另一线程发送信息。

1、演示线程通过文件对象发送数据

运行结果(如果运行不成功,则可能的原因是什么?

):

阅读和分析程序,请回答问题:

1)程序中启动了多少个单独的读写线程?

100

2)使用了哪个系统API函数来创建线程例程?

CreateThread()

3)文件的读和写操作分别使用了哪个API函数?

ReadFile()WriteFile()

每次运行进程时,都可看到程序中的每个线程从前面的线程中读取数据并将数据增加,文件中的数值连续增加。

这个示例是很简单的通讯机制。

可将这一示例用作编写自己的文件读/写代码的模板。

请注意程序中写入之前文件指针的重置。

重置文件指针是必要的,因为该指针在读取结束时将处于前四个字节之后,同一指针还要用于向文件写入数据。

如果函数向该处写入新数值,则下次进程运行时,只能读到原来的数值。

那么:

4)在程序中,重置文件指针使用了哪一个函数?

SetFilePointer()

5)从输出结果,对照分析程序,可以看出程序运行的流程吗?

请简单描述:

首先创建一个线程,读nValue的值,然后nValue值加一后,将nValue值重新写入文件。

重复上述过程100次。

2、演示使用映射文件的内存交换数据的线程

阅读和分析程序,请回答:

1)程序中用来创建一个文件映射对象的系统API函数是哪个?

CreateFileMapping();

2)在文件映射上创建和关闭文件视图分别使用了哪一个系统函数?

a.MapViewOfFile()

b.UnmapViewOfFile()

3)运行时,程序首先通过(MakeSharedFile();)函数创建一个小型的文件映射对象(hMapping),接着,使用系统API函数(CreateMutex();)再创建一个保护其应用的互斥体(g_hMutexMapping)。

然后,应用程序创建100个线程,每个都允许进行同样的进程,即:

通过互斥体获得访问权,这个操作是由语句:

_WaitForSingleObject(g_hMutexMapping,INFINITE);实现的。

再通过函数(MapViewOfFile();)操作将视图映射到文件,将高32位看作有符号整数,将该数值增加(即命令:

++(*pnData);),再将新数值显示在控制台上。

每个线程清除文件的视图并在退出之前释放互斥体的语句是ReleaseMutex(g_hMutexMapping);。

当线程完成时,应用程序关闭并退出。

4)将程序中的语句:

:

Sleep(500);删除(例如在语句前面加上“//”)后,重新编译运行,结果有变化吗?

为什么?

有变化。

100个线程一闪而过,不能看清结果。

因为Sleep(500)是为了放慢速度,方便观察。

四、实验总结

请总结一下本次实验的收获、教训和感受,结合课本内容谈一下你对进程间控制的理解。

本次实验让我明白了操作系统中的事件和互斥体对象,以及线程同步的概念。

学习了进程中如何使用事件对象,在进程中如何使用互斥体对象,线程如何通过文件映射对象发送数据。

当多个进程并发执行时,若我们不指定进程之间并发的顺序,则他们可以任意并发,当这些进程没有访问互斥元素时,运行结果不会出现错误,但是当多个进程访问同一个互斥体时,就会出现错误,这时我们必须通过某种手段来同步进程间并发的顺序,这便是进程间的同步问题。

还有,并发执行的进程或线程间,有时为了需要,会相互之间进行数据的交换,即进程间通信,Windows中,可以通过文件对象在线程间发送数据。

还可以使用映射文件的内存交换数据。

实验三生产者-消费者算法模拟实验

一、实验目的

1、掌握基本的互斥与同步算法,进一步理解“生产者-消费者”模型。

2、通过对“生产者-消费者”问题编程实现,了解线程创建、同步信号量、互斥信号量、临界区的创建和使用,初步了解并发程序设计方法。

3、进一步理解P、V原语和信号量在线程互斥和同步机制中的运用。

二、实验内容和步骤

1、在本次实验开始,以“生产者-消费者”模型为依据,提供了一个多线程“生产者-消费者”实例,有部分源程序代码,要求读者分析已编制的一个“生产者-消费者”实例,并将其缺失的程序代码补充完整,然后调试这段程序,得出最终的结果,并分析结果,得出相应的结论。

尝试改变一些参数,例如:

改变缓冲区数、增加(减少)线程数、改变延迟数、增加(减少)生产者进程、增加(减少)消费者进程、改变消费者进程的请求序列等内容,考察这些改变对于运行结果的影响。

3、参考部分源程序代码:

1、empty_semaphore=CreateSemaphore(NULL,n_Buffer_or_Critical,n_Buffer_or_Critical,

"semaphore_for_empty");

2、h_mutex=CreateMutex(NULL,FALSE,"mutex_for_update");

3、h_Semaphore[j+1]=CreateSemaphore(NULL,0,n_Thread,lp.c_str());

4、h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Produce),

&(Thread_Info[i]),0,NULL);

5、h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Consume),

&(Thread_Info[i]),0,NULL);

6、ReleaseMutex(h_mutex);

7、ReleaseSemaphore(h_Semaphore[m_serial],n_Thread,NULL);

8、EnterCritialSection(&PC_Critical[BufferPos]);

9、ReleaseSemaphore(empty_semaphore,1,NULL);

10、LeaveCriticalSection(&PC_Critical[BufferPos]);

4、请补全上述程序,写出程序的运行结果。

程序运行结果如下图所示。

 

5、分析程序的运行结果。

首先生产者3生产了产品3,然后生产者1生产了产品1,最后生产者4生产了产品4.

消费时,消费者5消费产品3,然后消费2消费产品1,最后消费者5消费产品4.

四、实验总结

请总结一下本次实验的收获、教训和感受,结合课本内容谈一下你对进程间控制的理解。

深刻了解了生产者消费者进程,进一步理解了“生产者-消费者”模型。

进一步理解P、V原语和信号量在线程互斥和同步机制中的运用,我进一步明白了进程间同步的概念。

我也进一步掌握了基本的互斥与同步算法,特别是生产者消费者算法。

我也学会了如何通过Windows中的同步信号量、互斥信号量的创建和使用,来实现进程之间或线程之间的同步与互斥。

还有临界区的创建和使用,线程的创建。

实验四页式存储管理部分功能模拟

一、实验目的

(1)了解存储器的管理任务和功能

(2)了解Windows存储器管理模式和特点

(3)深入了解页式存储管理如何实现地址转换

(4)进一步认识页式存储管理中如何处理缺页中断

(5)掌握几种页面置换算法的实现方法

二、实验内容和步骤

1、实验内容

1、j=p[head];

2、p[head]=lnumber;

3、head=(head+1)%m;

4、if(page[j].write==1)

5、page[j].flag=0;

6、page[lnumber].flag=1;

7、page[lnumber].write=0;

8、page[lnumber].pnumber=page[j].pnumber;

9、page[j].pnumber,

10、j,

11、page[lnumber].dnumber,

12、Lnumber

13、lnumber=laddress>>10;//分离逻辑地址

14、ad=laddress&0x03FF;

15、page_interrupt(lnumber);

16、pnumber=page[lnumber].pnumber;

17、paddress=pnumber<<10|ad;

18、page_interrupt(lnumber);

19、page[i].lnumber=lnumber;

20、page[i].flag=0;

21、page[i].write=0;

22、page[i].dnumber=dnumber;

23、i++;

24、page[m].pnumber=pnumber;

25、page[m].flag=1;

26、p[m]=m;

27、m++;

28、command(laddress,write);

2、程序运行结果及简要分析

结果分析:

首先输入页号和辅存地址,如上图,输入1、1000,2、2000,3、3000,4、4000,5、5000.

然后输入主存块号,确定主存块数为2,主存块数分别是1、2.

最后,我们就可以模拟程序运行了,首先输入了一条需要修改内存的指令,逻辑地址为1000,因为没有在内存里,因此发生缺页中断,执行中断服务程序,淘汰主存块1中的页,从磁盘第5000块中调入页4。

第二次输入02000,依然发生缺页中断。

第三次时,输入13000,此时淘汰的页4修改过,因此要将页4写回磁盘第5000块。

其他类似。

三、实验总结

请总结一下本次实验的收获、教训和感受,结合课本相关内容谈一下你对Windows2000

内存管理的理解。

通过本实验我了解了请求页式存储的基本实现,用户应用进程以32位虚拟地址方式编址,每个虚拟地址与一个称作“页表端”的结构有关,它包含了虚拟地址映射的物理地址,了解了虚拟存储器的工作原理,以及虚存如何在操作系统中实现的。

还有就是,当发生缺页中断时,操作系统如何将外部磁盘中的信息调入内存中,在调入内存中之前,先用页面置换算法将每一页置换出去。

内存管理,是指软件运行时对计算机内存资源的分配和使用的技术。

其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。

实验五设备管理模拟实验

一、实验目的

(1)了解Windows操作系统中设备驱动程序的组成

(2)理解Windows操作系统的设备管理机制

(3)掌握Windows操作系统关于设备管理的API函数的使用方法

(4)了解并掌握Windows中鼠标、键盘等简单设备的检测方法

二、实验内容和步骤

1、SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP,0,NULL,NULL);//鼠标改为右手习惯

2、SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP,1,NULL,NULL);//鼠标改为左手习惯

3、iFunctionKeynum=GetKeyboardType

(2);

4、Beep(iFreq[j],300);

三、程序运行结果及简要分析

结果分析:

通过输入1、2、3、4、分别选择鼠标改为右手习惯,鼠标改为左手习惯,获得键盘类型和功能键个数,喇

叭播放音乐等功能。

如上图,我选择了选项3,图显示我的键盘类型为IBM增强型(101或101键)键盘,功能键

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工作范文 > 制度规范

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1