操作系统原理实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

《操作系统原理》实验报告班级:姓名:学号:指导老师:目录:实验题目:实验一线程创建与撤销...................................................................2实验题目:实验二线程同步............................................................................6实验题目:实验三线程互斥..........................................................................11实验题目:实验四进程通信............................................................................17实验题目:实验五读者-写者问题..................................................................21实验题目:实验六进程调度............................................................................37实验题目:实验七存储管理之动态链接库....................................................52实验题目:实验八存储管理之内存分配........................................................56实验题目:实验九存储管理之页面置换算法................................................69实验题目:实验十设备管理............................................................................84实验题目:实验十一文件管理之文件读写....................................................98实验题目:实验一线程创建与撤销完成人:XXX报告日期:2018年3月31日一、实验内容简要描述(1)熟悉VC++、VisualStudio开发环境。(2)使用相关函数创建和撤销线程。(3)在一个进程中创建3个线程,名字分别为threada、threadb、threadc。threada输出“helloworld!”。threadb输出“Mynameis…”。threadc输出“Pleasewait…”,然后sleep5秒钟,接着输出“Iwakeup”。二、程序设计1、设计思路该函数创建一个在调用进程的地址空间中执行的线程。2、主要数据结构HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,DWORDdwStackSize,LPTHREAD_START_ROUTINElpStartAddress,LPVOIDlpParameter,DWORDdwCreationFlags,LPDWORDlpThreadId);VOIDExitThread(DWORDdwExitCode);VOIDSleep(DWORDdwMilliseconds);VOIDSleep(DWORDdwMilliseconds);三、实验结果1、基本数据lpThreadAttributes:指向一个SECURITY_ATTRIBUTES结构,该结构决定了返回的句柄是否可被子进程继承。若lpThreadAttributes为NULL,则句柄不能被继承。在WindowsNT中该结构的lpSecurityDescriptor成员定义了新进程的安全性描述符。若lpThreadAttributes为NULL,则线程获得一个默认的安全性描述符。dwStackSize:定义原始堆栈提交时的大小(按字节计)。系统将该值舍入为最近的页。若该值为0,或小于默认时提交的大小,默认情况是使用与调用线程同样的大小。更多的信息,请看ThreadStackSize。lpStartAddress:指向一个LPTHREAD_START_ROUTlNE类型的应用定义的函数,该线程执行此函数。该指针还表示溃程进程中线程的起始地址。该函数必须存在于远程进程中。lpParameter:定义一个传递给该迸程的32位值。dwCreationFIags:定义控制进程创建的附加标志。若定义了CREATE_SUSPENDED标志,线程创建时处于挂起状态,并且直到ResumeThread函数调用时d能运行。若该值为0,则该线程在创建后立即执行。lpThreadId:指向一个32位值,它接收该线程的标识符。2.源程序代码行数完成该实验投入的时间(小时数)与其他同学讨论次数31113、测试结果分析四、实验体会1、实验体会和收获深入理解了线程与进程的概念,熟悉了在Windows环境下何时使用进程,何时使用线程,怎么创建和撤销线程。五、源代码#includewindows.h#includeiostreamusingnamespacestd;DWORDWINAPIta(LPVOIDargv){coutHelloWorld!\n;}DWORDWINAPItb(LPVOIDargv){cout我的名字:孙婷\n;cout我的学号:141340209\n;}DWORDWINAPItc(LPVOIDargv){coutPleasewait...\n;Sleep(5000);coutIwakeup.\n;}intmain(){HANDLEthreada,threadb,threadc;DWORDTEST;threada=CreateThread(NULL,0,ta,NULL,0,0);threadb=CreateThread(0,0,tb,0,0,0);threadc=CreateThread(0,0,tc,0,0,0);ExitThread(TEST);ExitThread(TEST);ExitThread(TEST);return0;}实验题目:实验二线程同步完成人:XXX报告日期:2018年4月7日一、实验内容简要描述1)在程序中使用CreateSemaphore(NULL,0,1,”SemaphoreName1”)创建一个名为SemaphoreName1的信号量,其初值为0。2)使用OpenSemaphore(SYNCHRONIZE|SEMAPHORE__MODIFY_STATE,NULL,”SemaphoreName1”)打开该信号量。3)创建一个子线程,主线程创建子线程后调WaitForSingleObject(hHandle,INFINITE),这里等待时间设置为INFINITE表示要一直等待下去,直到该信号量被唤醒为止。4)子线程sleep5秒钟,然后输出“Iamover.”结束,调用ReleaseSemaphore(hHandle1,1,NULL)释放信号量,使信号量的值加1。二、程序设计1、设计思路A)等待一个对象WaitForSingleObjects函数决定等待条件是否被满足。如果等待条件并没有被满足,调用线程进人一个高效的等待状态,当等待满足条件时占用非常少的处理器时间。在运行前,一个等待函数修改同步对象类型的状态。修改仅发生在引起函数返回的对象身上。例如,信号的计数减l。WaitForSingleObject函数能等待的对象包括:Changenotification(改变通告);Consoleinput(控制台输入);Event(事件);Job(作业);Mutex(互斥对象);Process(进程);Semaphore(信号量);Thread(线程);Waitabletimer(可等待定时器)。当使用等待函数或代码直接或间接创建窗口时,一定要小心。如果一个线程创建了任何窗口,它必须处理进程消息。消息广播被发送到系统的所有窗口。一个线程用没有超时的等待函数也许会引起系统死锁。间接创建窗口的两个例子是DDE和COMCoInitialize。因此,如果用户有一个创建窗口的线程,用MsgWaitForMultipleObjects或MsgWaitForMultipleObjectsEx函数,而不要用SignalObjectAndWait函数。B)等待多个对象WaiForMultipleObjects函数当下列条件之一满足时返回:(1)任意一个或全部指定对象处于信号态;(2)超时间隔已过。C)创建信号量如果成功就传回一个handle,否则传回NULL。不论哪一种情况,GetLastError都会传回一个合理的结果。如果指定的Semaphore名称已经存在,则函数还是成功的,GetLastError会传回ERROR_ALREADY_EXISTS。D)打开信号量为现有的一个已命名信号机对象创建一个新句柄。E)增加信号量的值该函数将指定信号对象的计数增加一个指定的值。2、主要数据结构DWORDWaitForSingleObject(HANDLEhHandle,DWORDdwMilliseconds);DWORDWaitForMultipleObjects(DWORDnCount,CONSTHANDLE*lpHandles,BOOLfWaitAll,DWORDdwMilliSeconds)HANDLECreateSemaphore(LPSECURITY_ATTRIBUTESlpAttributes,LONGlInitialCount,LONGlMaximumCount,LPCTSTRlpName);HANDLEOpenSemaphore(DWORDdwDesiredAccess,//访问标志BOOLbInheritHandle,//继承标志LPCTSTRlpName//信号量名);BOOLReleaseSemaphore(HANDLEhSemaphore,LONGlReleaseCount,LPLONGlpPreviousCount)三、实验结果1、基本数据源程序代码行数完成该实验投入的时间(小时数)与其他同学讨论次数61212、测试结果分析四、实验体会1、实验体会和收获进一步认识了线程同步的实质,学会使用信号量控制线程间的同步。五、源代码#includestdio.h#includestdlib.h#includewindows.hstaticHANDLEhThread1;//子进程的句柄,作为主线程的局部变量也行staticHANDLEhHandle1=NULL;//信号量的句柄,全局变量voidfunc();//子线程的声明intmain(intargc,TCHAR*argv[],TCHAR*envp[]){intnRetCode=0;DWORDdwThreadID1;DWORDdRes,err;hHandle1=CreateSemaphore(NULL,0,1,SemaphoreName1);//创建一个信号量if(hHandle1==NULL)printf(SemaphoreCreateFail!\n);elseprintf(SemaphoreCreateSuccess!\n);hHandle1=OpenSemaphore(SYNCHRONIZE|SEMAPHORE_MODIFY_STATE,NULL,SemaphoreName1);if(hHandle1==NULL)printf(SemaphoreOpenFail!\n);elseprintf(SemaphoreOpenSuccess!\n);hThread1=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)func,(LPVOID

1 / 108
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功