《实验指导书》word版.doc_第1页
《实验指导书》word版.doc_第2页
《实验指导书》word版.doc_第3页
《实验指导书》word版.doc_第4页
《实验指导书》word版.doc_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

操 作 系 统实 验 指 导 书适用专业: 计算机科学技术 计算机应用 电 子 专 业 安徽建筑工业学院 电子与信息工程 学院2008 年 3 月前 言对计算机科学与技术及相关专业的学生而言,操作系统是一门重要的专业基础课程。要学好操作系统的设计原理,除了听课、看书、做习题外,最好的方法就是在实践中进行,包括使用操作系统、阅读和分析已有操作系统的源代码、自己设计小型系统/模块或模拟算法等。从个人的角度而言,如果能够完成MINUX源代码的阅读与分析,这将对掌握操作系统的原理与设计方法不无益处。这里,我没有向大家推荐Linux或者FreeBSD之类的操作系统(虽然我从1997年就一直向学生推荐FreeBSD),是因为这里的阅读源代码的目标是为了掌握操作系统的原理。孟子曰:“富贵不能淫,贫贱不能移,威武不能屈,此之谓大丈夫。”我的理解,即使不能够按照孟老夫子的话去做大丈夫,如果能够做到“时髦不能跟”,也就可以做真正的自己了。对我们课程的学习,也就是这个道理吧。对操作系统的实践,教学计划安排了8个课时的实验时间,这很不够,希望大家能够对自己狠一点,创造自己进行的操作系统实践的环境与机会。操作系统实践,按深度可分为使用级、观察级、系统管理级、源码阅读级和实现级等五个层次。具体地,1. 使用级:是指如何使用操作系统,包括对命令(以及菜单和shell)、系统调用和系统文件的使用。2. 观察级:是指通过使用级的接口,从外部观察操作系统的内部工作过程和结构。3. 系统管理级:是指系统或设备的安装、配置和性能调整。4. 源码阅读级:是指对现有操作系统部分内核源代码的阅读。5. 实现级:是指编程模拟实现操作系统某些功能模块。上述五个层次的实践,不同层次的实践者可以根据自己的实际情况自主安排,在我给的实验指导中,当前不会对各实验的层次明确区分,大家仁者见仁吧。由于条件限制,只能够提供Windows 2000 Professional/WindowsXP2作为大家实践时使用的操作系统。希望大家能够结合具体的实验要求以及实践环境提前做好试验准备。如果可能,给自己创造使用Unix或类Unix的实验环境。上机前应充分做好以下准备工作:1. 复习和掌握与本次实验有关的教学内容。2. 根据本次实验的内容,在纸上编写好准备上机调试的程序,并初步检查无误。3. 准备好对程序进行测试的数据。4. 对每种测试数据,给出预期的程序运行结果。5. 预习实验步骤,对实验步骤中提出的一些问题进行思考。上机实验后,应及时写出实验报告,实验报告应包括以下内容:1. 实验目的和内容。2. 程序说明,包括程序结构、各模块的算法。3. 调试正确的源程序。4. 程序运行记录(包括对不同测试数据的运行结果)。5. 针对实验中出现的问题,写出解决办法及对运行结果的分析。根据教学大纲与实验大纲的安排,本课程计划进行12课时上机试验。由于所有实验均涉及程序设计、数据结构与算法设计、操作系统等课程的多个知识点,相关实验均为综合实验。针对具体的实验要求,本指导书附录有大量的源代码,供对相关算法不是很熟悉的同学参考。本指导书适用于计算机科学技术、计算机应用、电子专业学生学习计算机操作系统课程时实验使用,也适用于上述专业软件实验课程中操作系统部分实验使用。- 57 -实验一:进程管理实验学时:2实验类型:(验证、综合)实验要求:(必修)一、实验目的Windows NT内核的操作系统是多任务操作系统,对程与线程提供完整支持。本次实验意图通过实践掌握进程的基本概念,理解进程控制、进程同步、经典进程的同步问题 、管程机制、进程通信、线程;初步熟悉多进程/多线程编程的特点。二、实验内容本次实验的实验内容包括:1)使用taskmgr.exe观察实验环境中的进程信息;2) 编程实现哲学家就餐问题或者读写者问题。三、实验组织运行要求根据本实验的特点、要求和具体条件,宜采用“以学生自主训练为主的开放模式组织教学”。相关材料可以以书面资料(或电子版本)的形式分发给学生。学生自主练习、提问;教师针对性的辅导。四、实验条件- 硬件环境:Pentium 300MHz以上的微型计算机;- 操作系统:Windows 2000或Windows XP;- 编程环境:Visual C+ 6.0 企业版(算法模拟可以使用其它合适的C/C+编译器或编程环境)。五、实验步骤具体实验步骤如下:1. 首先使用taskmgr.exe程序观察系统中运行进程的基本信息;2. 使用taskmgr.exe程序观察系统中运行进程的详细信息;3. 编码实现哲学家就餐问题或者读写者问题。六、思考题1. 如何编程实现获得进程的详细信息? 2. 编码实现哲学家就餐问题时哲学家获取筷子的策略是什么?3. 读写者问题的实现中,什么是读者优先,什么是写者优先?七、实验报告学生在实验结束后必须完成实验报告。实验报告必须包括实验预习、实验记录、思考题三部分内容。实验记录应该忠实的描述操作过程,并提供操作步骤以及调试程序的源代码。对思考题应该能够初步认识。具体实验报告的书写按照实验报告纸的要求逐项完成。八、其它说明要求学生在实验过程中遵循如下的要求:1. 准时到达实验室,严格签名方式的考勤制度。不允许代签;2. 遵循实验室的各种管理规定;3. 服从教师和实验员的管理;实验二:处理机调度实验学时:2实验类型:(验证、综合)实验要求:(必修)一、实验目的本实验模拟在单处理机情况下的处理机调度,以期加深了解处理机调度算法;同时,本次实验要求编程实现银行家算法,以期加深对避免死锁的理解。二、实验内容1)使用taskmgr.exe观察实验环境中的进程调度情况;2)编程实现一个调度算法,推荐实现ELLF算法。要求给出对随机测试序列能够给出调度次序;3) 编程实现银行家算法,要求在给定资源初始状态后能够动态处理进程的资源分配请求;三、实验组织运行要求根据本实验的特点、要求和具体条件,宜采用“以学生自主训练为主的开放模式组织教学”。相关材料可以以书面资料(或电子版本)的形式分发给学生。学生自主练习、提问;教师针对性的辅导。四、实验条件- 硬件环境:Pentium 300MHz以上的微型计算机;- 操作系统:Windows 2000或Windows XP;- 编程环境:Visual C+ 6.0 企业版(算法模拟可以使用其它合适的C/C+编译器或编程环境)。五、思考题1. ELLF算法与LLF算法的区别在什么地方?2. 安全性检查算法的逻辑基础是什么?六、实验报告学生在实验结束后必须完成实验报告。实验报告必须包括实验预习、实验记录、思考题三部分内容。实验记录应该忠实的描述操作过程,并提供操作步骤以及调试程序的源代码。对思考题应该能够初步认识。具体实验报告的书写按照实验报告纸的要求逐项完成。七、其它说明要求学生在实验过程中遵循如下的要求:1. 准时到达实验室,严格签名方式的考勤制度。不允许代签;2. 遵循实验室的各种管理规定;3. 服从教师和实验员的管理;实验三:存储器管理实验学时:2实验类型:(验证、综合)实验要求:(必修)一、实验目的本次实验旨在通过使用操作系统内存分配信息的动态观察以及存储器管理算法的实现,加深对内存分配原理的理解(重点加深对请求式分页存储管理方式的理解)。同时通过相关算法的实现,熟悉页面置换算法及其性能。二、实验内容1) 使用taskmgr.exe观察实验环境中的进程生命周期内系统内存分配变化情况;2) 编程实现请求分页管理方式时的地址变换过程;3) 编程实现OPT或者FIFO算法4) 编程实现LRU算法;三、实验组织运行要求根据本实验的特点、要求和具体条件,宜采用“以学生自主训练为主的开放模式组织教学”。相关材料可以以书面资料(或电子版本)的形式分发给学生。学生自主练习、提问;教师针对性的辅导。四、实验条件- 硬件环境:Pentium 300MHz以上的微型计算机;- 操作系统:Windows 2000或Windows XP;- 编程环境:Visual C+ 6.0 企业版(算法模拟可以使用其它合适的C/C+编译器或编程环境)。五、思考题1. OPT算法是否具备实用性?2. OPT算法与LRU算法的区别是什么?3. 虚拟存储器的主要特征有哪些?六、实验报告学生在实验结束后必须完成实验报告。实验报告必须包括实验预习、实验记录、思考题三部分内容。实验记录应该忠实的描述操作过程,并提供操作步骤以及调试程序的源代码。对思考题应该能够初步认识。具体实验报告的书写按照实验报告纸的要求逐项完成。七、其它说明要求学生在实验过程中遵循如下的要求:1. 准时到达实验室,严格签名方式的考勤制度。不允许代签;2. 遵循实验室的各种管理规定;3. 服从教师和实验员的管理;实验四:文件管理实验学时:2实验类型:(验证、综合)实验要求:(必修)一、实验目的本次实验旨在通过实践了解文件管理原理与方法,重点加深对外存分配方式和文件空闲存储空间的理解。二、实验内容1) 了解使用计算机系统的文件系统的格式;2) 编程实现连续分配、链接分配、索引分配等三种外存分配方式;2) 编程实现空闲表法、位示图法连续分配、成组链接法等三种文件存储空间管理方式三、实验组织运行要求根据本实验的特点、要求和具体条件,宜采用“以学生自主训练为主的开放模式组织教学”。相关材料可以以书面资料(或电子版本)的形式分发给学生。学生自主练习、提问;教师针对性的辅导。本次实验内容很多,阈于课时限制,编程可能无法全部完成。对实验内容中2)、3)(外存分配方式、文件存储空间管理方式)要求的6个编程要求,可以分成:a) 连续分配与链接分配、b) 索引分配、c) 空闲表法与位示图法连续分配、d) 成组链接法等四组,要求在实验课时内至少完成一组的编程。四、实验条件- 硬件环境:Pentium 300MHz以上的微型计算机;- 操作系统:Windows 2000或Windows XP;- 编程环境:Visual C+ 6.0 企业版(算法模拟可以使用其它合适的C/C+编译器或编程环境)。五、思考题1. 实验使用的计算机系用中,术语文件夹与文件管理中的概念一致?2. 连续分配、链接分配、索引分配等三种外存分配方式的特点以及彼此之间的差异是什么?3. 空闲表法、位示图法连续分配、成组链接法三种文件存储空间管理方式的特点以及彼此之间的差异有哪些? 六、实验报告学生在实验结束后必须完成实验报告。实验报告必须包括实验预习、实验记录、思考题三部分内容。实验记录应该忠实的描述操作过程,并提供操作步骤以及调试程序的源代码。对思考题应该能够初步认识。具体实验报告的书写按照实验报告纸的要求逐项完成。七、其它说明要求学生在实验过程中遵循如下的要求:1. 准时到达实验室,严格签名方式的考勤制度。不允许代签;2. 遵循实验室的各种管理规定;3. 服从教师和实验员的管理;附录一、读写者问题源代码#include windows.h#include #include #include #include #include #include #define READER R #define WRITER W#define INTE_PER_SEC 1000#define MAX_THREAD_NUM 64#define MAX_FILE_NUM 32#define MAX_STR_LEN 32int readcount=0;int writecount=0;CRITICAL_SECTION RP_Write;CRITICAL_SECTION cs_Write;CRITICAL_SECTION cs_Read;struct ThreadInfoint serial; char entity; double delay; double persist;/读者优先读者线程/ p 读者线程信息void RP_ReaderThread(void *p)/互斥变量HANDLE h_Mutex;h_Mutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,mutex for readcount);DWORD wait_for_mutex; /等待互斥变量所有权DWORD m_delay; /延迟时间DWORD m_persist; /读文件持续时间int m_serial; /线程序号/从参数中获得信息 m_serial=(ThreadInfo *)(p)-serial;m_delay=(DWORD)(ThreadInfo *)(p)-delay*INTE_PER_SEC); m_persist=(DWORD)(ThreadInfo *)(p)-persist*INTE_PER_SEC); Sleep(m_delay); /延迟等待printf(reader thread %d sends the reading require.n,m_serial);/等待互斥信号,保证对readcount的访问、修改互斥wait_for_mutex=WaitForSingleObject(h_Mutex,-1);/读者数目增加readcount+;if(readcount=1)/第一个读者,等待资源EnterCriticalSection(&RP_Write);ReleaseMutex(h_Mutex); /释放互斥信号 /读文件printf(reader thread %d begins to read file.n,m_serial);Sleep(m_persist);/退出线程printf(reader thread %d finished the reading file.n,m_serial);/等待互斥信号,保证对readcount的访问,修改互斥wait_for_mutex=WaitForSingleObject(h_Mutex,-1);/读者数目减少readcount-; if(readcount=0)/如果所有读者读完,唤醒写者LeaveCriticalSection(&RP_Write);ReleaseMutex(h_Mutex); /释放互斥信号/读者优先写者线程/ p 写者线程信息void RP_WriterThread(void *p)DWORD m_delay; /延迟时间DWORD m_persist; /读文件持续时间int m_serial; /线程序号/从参数中获得信息 m_serial=(ThreadInfo *)(p)-serial;m_delay=(DWORD)(ThreadInfo *)(p)-delay*INTE_PER_SEC); m_persist=(DWORD)(ThreadInfo *)(p)-persist*INTE_PER_SEC); Sleep(m_delay); /延迟等待printf(Writer thread %d sends the writing require.n,m_serial);/等待资源EnterCriticalSection(&RP_Write);/写文件printf(writer thread %d begins to write to the file.n,m_serial);Sleep(m_persist);/退出线程printf(writer thread %d finished the writting file.n,m_serial);/释放资源LeaveCriticalSection(&RP_Write);/读者优先处理函数/file 文件名void ReaderPriority(char *file)DWORD n_thread=0; /线程数目 DWORD thread_ID; /线程ID DWORD wait_for_all; /等待所有线程结束 /互斥对象 HANDLE h_Mutex; h_Mutex=CreateMutex(NULL,FALSE,mutex for read_counter); /线程对象的数组 HANDLE h_ThreadMAX_THREAD_NUM; ThreadInfo thread_infoMAX_THREAD_NUM; readcount=0; /初始化readcount InitializeCriticalSection(&RP_Write); /初始化临界区 ifstream inFile(file); /ifstream inFile; /inFile.open(file); /打开文件 printf(reader Priority:nn);/ if(!inFile) return;/如文件未打开,则返回 /while(!inFile.eof()/如文件未到文件尾,则读文件信息 while(inFile) /读入每一个读者、写者的信息 inFilethread_infon_thread.serial; inFilethread_infon_thread.entity; inFilethread_infon_thread.delay; inFilethread_infon_thread+.persist; inFile.get(); for(int i=0;iserial;m_delay=(DWORD)(ThreadInfo *)(p)-delay*INTE_PER_SEC); m_persist=(DWORD)(ThreadInfo *)(p)-persist*INTE_PER_SEC); Sleep(m_delay); /延迟等待printf(reader thread %d sends the reading require.n,m_serial);/等待互斥信号,保证对readcount的访问、修改互斥wait_for_mutex1=WaitForSingleObject(h_Mutex1,-1);/进入读者临界区EnterCriticalSection(&cs_Read);/阻塞互斥对象Mutex2,保证对readcount 的访问、修改互斥 wait_for_mutex2=WaitForSingleObject(h_Mutex2,-1);/修改读者数目readcount+;if(readcount=1)/如果是第一个读者,等待写者写完EnterCriticalSection(&cs_Write);ReleaseMutex(h_Mutex2); /释放互斥信号mutex2 /让其他读者进入临界区LeaveCriticalSection(&cs_Read);ReleaseMutex(h_Mutex1);/读文件printf(reader thread %d begins to read file.n,m_serial);Sleep(m_persist);/退出线程printf(reader thread %d finished the reading file.n,m_serial);/阻塞互斥对象mutex2,保证对readcount的访问,修改互斥wait_for_mutex2=WaitForSingleObject(h_Mutex2,-1);/读者数目减少readcount-; if(readcount=0)/最后一个读者,唤醒写者LeaveCriticalSection(&cs_Write);ReleaseMutex(h_Mutex2); /释放互斥信号/写者优先写者线程/ p 写者线程信息void WP_WriteThread(void *p)DWORD m_delay; /延迟时间DWORD m_persist; /读文件持续时间int m_serial; /线程序号 DWORD wait_for_mutex3 ;/互斥对象HANDLE h_Mutex3;h_Mutex3=OpenMutex(MUTEX_ALL_ACCESS,FALSE,mutex3);/从参数中获得信息 m_serial=(ThreadInfo *)(p)-serial;m_delay=(DWORD)(ThreadInfo *)(p)-delay*INTE_PER_SEC); m_persist=(DWORD)(ThreadInfo *)(p)-persist*INTE_PER_SEC); Sleep(m_delay); /延迟等待printf(Writer thread %d sends the writing require.n,m_serial);/阻塞互斥对象mutex3,保证对writecount的访问,修改互斥wait_for_mutex3=WaitForSingleObject(h_Mutex3,-1);writecount+;if(writecount=1)/第一个写者,等待读者读完 EnterCriticalSection(&cs_Read);ReleaseMutex(h_Mutex3);/进入写者临界区EnterCriticalSection(&cs_Write);/写文件printf(writer thread %d begins to write to the file.n,m_serial);Sleep(m_persist);/退出线程printf(writer thread %d finished the writting file.n,m_serial);/离开临界区LeaveCriticalSection(&cs_Write);/阻塞互斥对象mutex3,保证对writecount的访问,修改互斥wait_for_mutex3=WaitForSingleObject(h_Mutex3,-1);writecount-;if(writecount=0)/写者写完,读者可以读LeaveCriticalSection(&cs_Read);ReleaseMutex(h_Mutex3);/写者优先处理函数/file 文件名void WriterPriority(char *file)DWORD n_thread=0; /线程数目 DWORD thread_ID; /线程ID DWORD wait_for_all; /等待所有线程结束 /互斥对象 HANDLE h_Mutex1; h_Mutex1=CreateMutex(NULL,FALSE,mutex1); HANDLE h_Mutex2; h_Mutex2=CreateMutex(NULL,FALSE,mutex2);HANDLE h_Mutex3; h_Mutex3=CreateMutex(NULL,FALSE,mutex3); /线程对象的数组 HANDLE h_ThreadMAX_THREAD_NUM; ThreadInfo thread_infoMAX_THREAD_NUM; readcount=0; /初始化readcount writecount=0; /初始化writecount InitializeCriticalSection(&cs_Write); /初始化临界区 InitializeCriticalSection(&cs_Read); ifstream inFile(file); /ifstream inFile; /inFile.open(file); /打开文件 printf(writer Priority:nn); /while(inFile) while(inFile) /读入每一个读者、写者的信息 inFilethread_infon_thread.serial; inFilethread_infon_thread.entity; inFilethread_infon_thread.delay; inFilethread_infon_thread+.persist; inFile.get(); for(int i=0;i(int)(n_thread);i+) if(thread_infoi.entity=READER | thread_infoi.entity=r) /创建读者线程/ h_Threadi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) (RP_ReaderThread),&thread_infoi,0,&thread_ID); h_Threadi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) (WP_ReaderThread),&thread_infoi,0,&thread_ID); else /创建写者线程/ h_Threadi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) (RP_WriterThread),&thread_infoi,0,&thread_ID); h_Threadi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) (WP_WriteThread),&thread_infoi,0,&thread_ID); /等待所有线程结束 wait_for_all=WaitForMultipleObjects(n_thread,h_Thread,TRUE,-1); printf(All Reader and writer have finished operationg.n); int main(int argc,char *argv)char ch;while(true)/打印提示信息 printf( =n); printf( = 读者-写者实验模拟 =nn); printf( =n); printf(n); printf( *n); printf( 1:Reader Priorityn); printf( 2:Write Priorityn); printf( 3:Exit to Windowsn); printf( *n); printf( Enter your choice(1、2、3):n); /如果输入信息不正确,继续输入 do ch=(char)_getch(); while(ch!=1&ch!=2&ch!=3); /*system(cls);*/ /选择3,返回 if(ch=3) return 0; /选择1,读者 if(ch=1) ReaderPriority(thread.dat); /选择2,写者优先 else WriterPriority(thread.dat); /结束 printf(n press any key to continue:); _getch(); /*system(cls);*/return 0; 附录二、哲学家就餐问题/ PhilosopherDining.cpp : Defines the entry point for the console application.#include windows.h#include #include #include #include #include using namespace std;const unsigned int PHILOSOPHER_NUM=5;const char THINKING=1;const char HUNGRY=2;const char DINING=3;/ each fork has a semaphoreHANDLE semphPHILOSOPHER_NUM;/ Mutex for printingHANDLE mutex;void philosopherProc(void* param);int main(int argc, char* argv) int i; srand(time(0); mutex = CreateMutex(NULL, false, NULL); for (i=0; iPHILOSOPHER_NUM; i+) semphi = CreateSemaphore(NULL, 1, 1, NULL); _beginthread(philosopherProc, 0, (void*)&i); Sleep(10); Sleep(2000); return 0;void philosopherProc(void* param) int myid; char idStr128; char stateStr128; char mystate; int ret; unsigned int leftFork; unsigned int rightFork; myid = *(int*)(param); itoa(myid, idStr, 10); /cout philosopher myid begin. endl; Sleep(10); / initial state is THINKING mystate = THINKING; leftFork = (myid) % PHILOSOPHER_NUM; rightFork = (myid + 1) % PHILOSOPHER_NUM; while (true) switch(mystate) case THINKING: / changing my state mystate = HUNGRY; strcpy(stateStr, HUNGRY); break; case HUNGRY: strcpy(stateStr, HUNGRY); / first test the left fork . ret = WaitForSingleObject(semphleftFork, 0); if (ret = WAIT_OBJECT_0) / left fork is ok, take it up ! / then test the right fork . ret = WaitForSingleObject(semphrightFork, 0); if (ret = WAIT_OBJECT_0) / right fork is also ok ! / changing my state mystate = DINING; strcpy(stateStr, DINING); else / right fork is being used by others, so I must put down / the left fork. ReleaseSemaphore(semphleftFork, 1, NULL); break; case DINING: / put down both the left and right fork ReleaseSemaphore(semphleftFork, 1, NULL); ReleaseSemaphore(semphrightFork, 1, NULL); / changing my state mystate = THINKING; strcpy(stateStr, THINKING); break; / print my state WaitForSingleObject(mutex, INFINITE); cout philosopher myid is : stateStr endl; ReleaseMutex(mutex); / sleep a random time : between 1 - 5 s int sleepTime; sleepTime = 1 + (int)(5.0*rand()/(RAND_MAX+1.0); Sleep(sleepTime*10); 附录三、调度算法模拟#include stdio.h#define getjcb(type) (type*)malloc(sizeof(type)#define NULL 0int n=0,time=0;float eti,e

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论