操作系统原理实验报告.doc
《操作系统原理实验报告.doc》由会员分享,可在线阅读,更多相关《操作系统原理实验报告.doc(106页珍藏版)》请在三一文库上搜索。
1、操作系统原理实验报告班级: 姓名: 学号: 指导老师: 目录: 实验题目:实验一 线程创建与撤销2实验题目:实验二 线程同步6实验题目:实验三 线程互斥11实验题目:实验四 进程通信17实验题目:实验五 读者-写者问题21实验题目:实验六 进程调度37实验题目:实验七 存储管理之动态链接库52实验题目:实验八 存储管理之内存分配56实验题目:实验九 存储管理之页面置换算法69实验题目:实验十 设备管理84实验题目:实验十一 文件管理之文件读写98实验题目:实验一 线程创建与撤销完成人:XXX报告日期:2018年3月31日一、 实验内容简要描述(1)熟悉VC+、Visual Studio开发环境
2、2)使用相关函数创建和撤销线程。(3)在一个进程中创建3个线程,名字分别为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_S
3、TART_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId );VOID ExitThread(DWORD dwExitCode);VOID Sleep(DWORD dwMilliseconds);VOID Sleep(DWORD dwMilliseconds);三、实验结果1、基本数据lpThreadAttributes:指向一个SECURITY_ATTRIBUTES结构,该结构决定了返回的句柄是否可被子进程继承。若lpThreadAttributes为NULL,则句柄不
4、能被继承。在WindowsNT中该结构的lpSecurityDescriptor成员定义了新进程的安全性描述符。若lpThreadAttributes为NULL,则线程获得一个默认的安全性描述符。dwStackSize:定义原始堆栈提交时的大小(按字节计)。系统将该值舍入为最近的页。若该值为0,或小于默认时提交的大小,默认情况是使用与调用线程同样的大小。更多的信息,请看ThreadStackSize。lpStartAddress:指向一个LPTHREAD_START_ROUTlNE类型的应用定义的函数,该线程执行此函数。该指针还表示溃程进程中线程的起始地址。该函数必须存在于远程进程中。lpPa
5、rameter:定义一个传递给该迸程的32位值。dwCreationFIags:定义控制进程创建的附加标志。若定义了CREATE_SUSPENDED标志,线程创建时处于挂起状态,并且直到ResumeThread函数调用时d能运行。若该值为0,则该线程在创建后立即执行。lpThreadId:指向一个32位值,它接收该线程的标识符。2.源程序代码行数完成该实验投入的时间(小时数)与其他同学讨论次数31113、 测试结果分析四、实验体会1、实验体会和收获深入理解了线程与进程的概念,熟悉了在Windows环境下何时使用进程,何时使用线程,怎么创建和撤销线程。五、源代码#include #include
6、 using namespace std;DWORD WINAPI ta(LPVOID 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
7、0,0); threadb=CreateThread(0,0,tb,0,0,0); threadc=CreateThread(0,0,tc,0,0,0); ExitThread(TEST); ExitThread(TEST); ExitThread(TEST); return 0;实验题目:实验二 线程同步完成人:XXX报告日期:2018年4月7日一、 实验内容简要描述1) 在程序中使用CreateSemaphore(NULL,0,1,”SemaphoreName1”)创建一个名为SemaphoreName1的信号量,其初值为0。2) 使用OpenSemaphore (SYNCHRONIZE
8、 SEMAPHORE_MODIFY_STATE, NULL,” SemaphoreName1”)打开该信号量。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(作业);Mutex(互斥对象);Process(进程);Semaphore(信号量);Thread(线程);Waitable timer(可等待定时器)。当使用等待函数或代码直接或间接创建窗口时,一定要小心。如果一个线程创建了
10、任何窗口,它必须处理进程消息。消息广播被发送到系统的所有窗口。一个线程用没有超时的等待函数也许会引起系统死锁。间接创建窗口的两个例子是DDE和COM CoInitialize。因此,如果用户有一个创建窗口的线程,用MsgWaitForMultipleObjects或MsgWaitForMultipleObjectsEx函数,而不要用SignalObjectAndWait函数。B)等待多个对象WaiForMultipleObjects函数当下列条件之一满足时返回:(1)任意一个或全部指定对象处于信号态;(2)超时间隔已过。C)创建信号量如果成功就传回一个handle,否则传回NULL。不论哪一种
11、情况,GetLastError都会传回一个合理的结果。如果指定的Semaphore名称已经存在,则函数还是成功的,GetLastError会传回ERROR_ ALREADY_EXISTS。D)打开信号量为现有的一个已命名信号机对象创建一个新句柄。E)增加信号量的值该函数将指定信号对象的计数增加一个指定的值。2、 主要数据结构DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);DWORD WaitForMultipleObjects(DWORD nCount,CONST HANDLE *lpHandles,BOOL fWa
12、itAll,DWORD dwMilliSeconds)HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpAttributes,LONG lInitialCount,LONG lMaximumCount,LPCTSTR lpName);HANDLE OpenSemaphore(DWORD dwDesiredAccess, /访问标志BOOL bInheritHandle, / 继承标志LPCTSTR lpName / 信号量名 );BOOL ReleaseSemaphore(HANDLE hSemaphore,LONG lReleaseCount,LP
13、LONG lpPreviousCount)三、实验结果1、基本数据源程序代码行数完成该实验投入的时间(小时数)与其他同学讨论次数61212、测试结果分析四、实验体会1、实验体会和收获进一步认识了线程同步的实质,学会使用信号量控制线程间的同步。五、源代码#include #include #include static HANDLE hThread1; /子进程的句柄,作为主线程的局部变量也行static HANDLE hHandle1=NULL; /信号量的句柄,全局变量void func();/子线程的声明int main(int argc,TCHAR* argv,TCHAR* envp)i
14、nt nRetCode=0;DWORD dwThreadID1;DWORD dRes,err;hHandle1=CreateSemaphore(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(S
15、emaphore Open Fail!n);else printf(Semaphore Open Success!n);hThread1=CreateThread(LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)func, (LPVOID)NULL,0,&dwThreadID1); /创建子线程if (hThread1=NULL) printf(Thread1 create Fail!n);else printf(Thread1 create Success!n);dRes=WaitForSingleObject(hHandle1,
16、INFINITE); /主线程等待子线程结束err=GetLastError();printf(WaitForSingleObject err=%dn,err);if(dRes=WAIT_TIMEOUT)printf(TIMEOUT!dRes=%dn,dRes);else if(dRes=WAIT_OBJECT_0)printf(WAIT_OBJECT!dRes=%dn,dRes);else if(dRes=WAIT_ABANDONED)printf(WAIT_ABANDONED!dRes=%dn,dRes);else printf(dRes=%dn,dRes);CloseHandle(hTh
17、read1);CloseHandle(hHandle1);printf(我的名字:孙婷n);printf(我的学号:141340209n);ExitThread(0);return nRetCode;/实现子线程void func()BOOL rc;DWORD err;printf(Now In Thread !n);printf(I am over.n);rc=ReleaseSemaphore(hHandle1,1,NULL); /子线程唤醒主线程err=GetLastError();printf(ReleaseSemaphore err=%dn,err);if(rc=0) printf(S
18、emaphore Release Fail!n);else printf(Semaphore Release Success!rc=%dn,rc);实验题目:实验三 线程互斥完成人:XXX报告日期:2018年4月14日三、 实验内容简要描述完成两个子线程之间的互斥。在主线程中使用系统调用CreateThread()创建两个子线程,并使两个子线程互斥的使用全局变量count。四、 程序设计3、 设计思路a使用临界区对象(Criticalsection)Critical Section Object ,A segment of code that is not reentrant and ther
19、efore does not support concurrent access by multiple threads. Often, a critical section object is used to protect shared resources。通过定义在数据段中的一个CRITICAL_SECTION 结构实现。CRITICAL_SECTION myCritical;并且在任何线程使用此临界区对象之前必须对它进行初始化。void InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection );之后,任何线程访问临
20、界区中数据的时候,必须首先调用EnterCriticalSection 函数,申请进入临界区(又叫关键代码段,使用共享资源的任何代码都必须封装在此)。在同一时间内,Windows 只允许一个线程进入临界区。所以在申请的时候,如果有另一个线程在临界区的话,EnterCriticalSection 函数会一直等待下去,直到其他线程离开临界区才返回。EnterCriticalSection 函数用法如下:void EnterCriticalSection( LPCRITICAL_SECTION lpCriticalSection);当操作完成的时候,还要将临界区交还给Windows,以便其他线程可以
21、申请使用。这个工作由LeaveCriticalSection 函数来完成。void LeaveCriticalSection( LPCRITICAL_SECTION lpCriticalSection);当程序不再使用临界区对象的时候,必须使用DeleteCriticalSection 函数将它删除。void DeleteCriticalSection( LPCRITICAL_SECTION lpCriticalSection);b使用互斥锁(Interlocked)提供一种手段来保证值的递增(减)能够以原子操作方式来进行,也就是不中断地进行。LONG InterlockedIncrement
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 原理 实验 报告
