操作系统原理实验报告

上传人:re****.1 文档编号:495837423 上传时间:2023-10-08 格式:DOC 页数:92 大小:239KB
返回 下载 相关 举报
操作系统原理实验报告_第1页
第1页 / 共92页
操作系统原理实验报告_第2页
第2页 / 共92页
操作系统原理实验报告_第3页
第3页 / 共92页
操作系统原理实验报告_第4页
第4页 / 共92页
操作系统原理实验报告_第5页
第5页 / 共92页
点击查看更多>>
资源描述

《操作系统原理实验报告》由会员分享,可在线阅读,更多相关《操作系统原理实验报告(92页珍藏版)》请在金锄头文库上搜索。

1、-操作系统原理实验报告班级:*:指导教师:目录:实验题目:实验一线程创立与撤销2实验题目:实验二线程同步3实验题目:实验三线程互斥3实验题目:实验四进程通信3实验题目:实验五读者-写者问题3实验题目:实验六进程调度3实验题目:实验七存储管理之动态库3实验题目:实验八存储管理之内存分配3实验题目:实验九存储管理之页面置换算法3实验题目:实验十设备管理3实验题目:实验十一文件管理之文件读写3实验题目:实验一线程创立与撤销完成人:*报告日期:2018年3月31日一、 实验内容简要描述1熟悉VC+、Visual Studio开发环境。2使用相关函数创立和撤销线程。3在一个进程中创立3个线程,名字分别为

2、threada、threadb、threadc。threada输出hello world! 。threadb输出My name is 。threadc输出Please wait,然后sleep 5秒钟,接着输出I wake up。二、 程序设计1、 设计思路该函数创立一个在调用进程的地址空间中执行的线程。2、 主要数据构造HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter

3、, DWORD dwCreationFlags, LPDWORD lpThreadId );VOID E*itThread(DWORD dwE*itCode);VOID Sleep(DWORD dwMilliseconds);VOID Sleep(DWORD dwMilliseconds);三、实验结果1、根本数据lpThreadAttributes:指向一个SECURITY_ATTRIBUTES构造,该构造决定了返回的句柄是否可被子进程继承。假设lpThreadAttributes为NULL,则句柄不能被继承。在WindowsNT中该构造的lpSecurityDescriptor成员定义了新

4、进程的平安性描述符。假设lpThreadAttributes为NULL,则线程获得一个默认的平安性描述符。dwStackSize:定义原始堆栈提交时的大小(按字节计)。系统将该值舍入为最近的页。假设该值为0,或小于默认时提交的大小,默认情况是使用与调用线程同样的大小。更多的信息,请看ThreadStackSize。lpStartAddress:指向一个LPTHREAD_START_ROUTlNE类型的应用定义的函数,该线程执行此函数。该指针还表示溃程进程中线程的起始地址。该函数必须存在于远程进程中。lpParameter:定义一个传递给该迸程的32位值。dwCreationFIags:定义控制

5、进程创立的附加标志。假设定义了CREATE_SUSPENDED标志,线程创立时处于挂起状态,并且直到ResumeThread函数调用时d能运行。假设该值为0,则该线程在创立后立即执行。lpThreadId:指向一个32位值,它接收该线程的标识符。2.源程序代码行数完成该实验投入的时间小时数与其他同学讨论次数31113、 测试结果分析四、实验体会1、实验体会和收获深入理解了线程与进程的概念,熟悉了在Windows环境下何时使用进程,何时使用线程,怎么创立和撤销线程。五、源代码#include #include using namespace std;DWORD WINAPI ta(LPVOID

6、argv) coutHello World!n;DWORD WINAPI tb(LPVOID argv) cout我的名字:婷 n; cout我的*:141340209n;DWORD WINAPI tc(LPVOID argv) coutPlease wait.n; Sleep(5000); coutI wake up.n;int main() HANDLE threada,threadb,threadc; DWORD TEST; threada=CreateThread(NULL,0,ta,NULL,0,0); threadb=CreateThread(0,0,tb,0,0,0); thre

7、adc=CreateThread(0,0,tc,0,0,0); E*itThread(TEST); E*itThread(TEST); E*itThread(TEST); return 0;实验题目:实验二线程同步完成人:*报告日期:2018年4月7日一、 实验内容简要描述1) 在程序中使用CreateSemaphore(NULL,0,1,SemaphoreName1)创立一个名为SemaphoreName1的信号量,其初值为0。2) 使用OpenSemaphore (SYNCHRONIZE| SEMAPHORE_MODIFY_STATE, NULL, SemaphoreName1)翻开该信号

8、量。3) 创立一个子线程,主线程创立子线程后调WaitForSingleObject(hHandle,INFINITE),这里等待时间设置为INFINITE表示要一直等待下去,直到该信号量被唤醒为止。4) 子线程sleep 5秒钟,然后输出I am over.完毕,调用ReleaseSemaphore(hHandle1,1,NULL)释放信号量,使信号量的值加1。二、 程序设计1、 设计思路A等待一个对象WaitForSingleObjects函数决定等待条件是否被满足。如果等待条件并没有被满足,调用线程进人一个高效的等待状态,当等待满足条件时占用非常少的处理器时间。在运行前,一个等待函数修改

9、同步对象类型的状态。修改仅发生在引起函数返回的对象身上。例如,信号的计数减l。WaitForSingleObject函数能等待的对象包括:Change notification(改变通告);Console input(控制台输入);Event(事件);Job(作业);Mute*(互斥对象);Process(进程);Semaphore(信号量);Thread(线程);Waitable timer(可等待定时器)。当使用等待函数或代码直接或间接创立窗口时,一定要小心。如果一个线程创立了任何窗口,它必须处理进程消息。消息播送被发送到系统的所有窗口。一个线程用没有超时的等待函数也许会引起系统死锁。间接

10、创立窗口的两个例子是DDE和 CoInitialize。因此,如果用户有一个创立窗口的线程,用MsgWaitForMultipleObjects或MsgWaitForMultipleObjectsE*函数,而不要用SignalObjectAndWait函数。B等待多个对象WaiForMultipleObjects函数当以下条件之一满足时返回:(1)任意一个或全部指定对象处于信号态;(2)超时间隔已过。C创立信号量如果成功就传回一个handle,否则传回NULL。不管哪一种情况,GetLastError都会传回一个合理的结果。如果指定的Semaphore名称已经存在,则函数还是成功的,GetLa

11、stError会传回ERROR_ ALREADY_E*ISTS。D翻开信号量为现有的一个已命名信号机对象创立一个新句柄。E增加信号量的值该函数将指定信号对象的计数增加一个指定的值。2、 主要数据构造DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);DWORD WaitForMultipleObjects(DWORD nCount,CONST HANDLE *lpHandles,BOOL fWaitAll,DWORD dwMilliSeconds)HANDLE CreateSemaphore(LPSECURITY_ATT

12、RIBUTES lpAttributes,LONG lInitialCount,LONG lMa*imumCount,LPCTSTR lpName);HANDLE OpenSemaphore(DWORD dwDesiredAccess, /访问标志BOOL bInheritHandle, / 继承标志LPCTSTR lpName / 信号量名);BOOL ReleaseSemaphore(HANDLE hSemaphore,LONG lReleaseCount,LPLONG lpPreviousCount)三、实验结果1、根本数据源程序代码行数完成该实验投入的时间小时数与其他同学讨论次数612

13、12、测试结果分析四、实验体会1、实验体会和收获进一步认识了线程同步的实质,学会使用信号量控制线程间的同步。五、源代码#include #include #include static HANDLE hThread1; /子进程的句柄,作为主线程的局部变量也行static HANDLE hHandle1=NULL; /信号量的句柄,全局变量void func();/子线程的声明int main(int argc,TCHAR* argv,TCHAR* envp)int nRetCode=0;DWORD dwThreadID1;DWORD dRes,err;hHandle1=CreateSemap

14、hore(NULL,0,1,SemaphoreName1); /创立一个信号量if(hHandle1=NULL) printf(Semaphore Create Fail!n);else printf(Semaphore Create Success!n);hHandle1=OpenSemaphore(SYNCHRONIZE|SEMAPHORE_MODIFY_STATE,NULL,SemaphoreName1);if(hHandle1=NULL)printf(Semaphore Open Fail!n);else printf(Semaphore Open Success!n);hThread1=CreateThread(LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)func,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号