OS综合实验报告1.doc_第1页
OS综合实验报告1.doc_第2页
OS综合实验报告1.doc_第3页
OS综合实验报告1.doc_第4页
OS综合实验报告1.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

综合实验报告( 2013 - 2014 年度第 1 学期)名 称: 操作系统综合实验 题 目: 基于OS Lab的操作系统综合实验 院 系: 计算机系 班 级: 学 号: 学生姓名: 指导教师: 王德文,王 艳 设计周数: 1 成 绩: 日期: 2013 年 月 日一、课程设计(综合实验)的目的与要求1 正文为宋体,五号字 行间距为21 11 -12 -二、设计(实验)正文1 正文为宋体,五号字 行间距为21 11 -12 -三、课程设计(综合实验)总结或结论1 正文为宋体,五号字 行间距为21 11 -12 -四、参考文献 1 作者1, 作者2. 书名. 出版单位, 版本. 出版日期附录(设计流程图、程序、表格、数据等)一 实验环境的使用1.实验目的 l 熟悉操作系统集成实验环境OS Lab的基本使用方法。 l 练习编译、调试EOS操作系统内核以及EOS应用程序。 2.实验内容:. 学习OS Lab的基本使用方法a.启动OSlabb.新建windows控制台程序项目,eos内核项目,eos应用程序项目;c.生成项目d.执行项目e.调试项目f.项目名称的修改及项目的保存.实验中代码的修改:1)在 func.c 文件中添加函数: int Func (int n) n = n + 1; return n; 2)点击源代码编辑器上方的console.c标签,切换到console.c文件。将 main 函数修改为: int main (int argc, char* argv) int Func (int n); / 声明Func函数 int n = 0; n = Func(10); printf (Hello World!n); return 0; 问题答案:EOS SDk文件夹的目的和作用:主要供EOS应用程序使用。EOS内核提供的API函数及重要的数据类型都是通过将相关的头文件复制到SDK文件夹中,然后EOS应用程序再包含SDK文件夹中的头文件,使EOS应用程序可以调用这些函数或使用数据类型来定义变量。同时,SDK文件夹中还保存了Debug和Release版本的二进制文件,分别为两个版本的应用程序使用。 运行结果图示实验总结及体会:通过本次实验,对EOS操作系统和OS Lab集成实验环境有一个初步的了解,学会了创建三种项目,项目的调试,执行及保存,还有一些文件的含义。实验三.进程创建1.实验目的:练习使用EOS API函数CreateProcess创建一个进程,掌握创建进程的方法,理解进程和程序的区别。 试跟踪CreateProcess函数的执行过程,了解进程的创建过程,理解进程是资源分配的单位。 2.实验内容:练习使用控制台命令创建EOS应用程序的进程;练习通过编程的方式让应用程序创建另一个应用程序的进程;调试CreateProcess函数;调试PsCreateProcess函数;练习通过编程的方式创建应用程序的多个进程。实验中修改的代码:1.#include EOSApp.hint main(int argc, char* argv)int i;for (i = 1; i State) Status = STATUS_SUCCESS; else Status = STATUS_NOT_SUPPORTED;KeEnableInterrupts(IntState);/ 开中断ObDerefObject(Thread);return Status;问题解答:当在控制台2 中执行suspend命令时,实质上是优先级为24的控制台2线程抢占了处理器,也就是控制台2线程处于运行状态,所以此时loop线程处于就绪状态了。实验总结 通过本次实验,调试线程在各种状态间的转换过程,熟悉了线程的状态和转换。 通过为线程增加挂起状态,加深了对线程状态的理解。了解到 EOS 线程状态有就绪状态、阻塞状态、运行状态。以及其状态的转换过程有新建就绪、就绪运行 、运行就绪 、运行阻塞 、阻塞就绪 、任意状态结束状态六种, 以及Suspend 和Resume 原语操作使其进入挂起和唤醒状态。实验五.进程的同步1.实验目的使用EOS的信号量,编程解决生产者消费者问题,理解进程同步的意义。 调试跟踪EOS信号量的工作过程,理解进程同步的原理。 修改EOS 的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。2.实验内容准备实验使用EOS的信号量解决生产者消费者问题调试EOS信号量的工作过程修改EOS的信号量算法:STATUSPsWaitForSemaphore(IN PSEMAPHORE Semaphore,IN ULONG Milliseconds)返回值:STATUS_SUCCESS。当你修改信号量使之支持超时唤醒功能后,如果等待超时,应该返回 STATUS_TIMEOUT。 STATUS status;BOOL IntState;ASSERT(KeGetIntNesting() = 0);IntState = KeEnableInterrupts(FALSE); / 开始原子操作,禁止中断。if (Semaphore-Count 0) Semaphore-Count-;status=STATUS_SUCCESS;if (Semaphore-Count = 0) status=PspWait(&Semaphore-WaitListHead, Milliseconds);KeEnableInterrupts(IntState); / 原子操作完成,恢复中断。return status;在PsReleaseSemaphore函数中修改为:for(Semphore-Count+=RealeaseCount; Semphore-Count0&!ListisEmpty(&Semphore-WaitListHead); Semphore-Count-)PspWakeThread(&Semphore-WaitListHead, STATUS_SUCCESS)问题回答:Mutex对象只是用来保护临界资源的,放置生产者线程和消费者线程同时访问临界资源,从而造成混乱,Empty信号量和Full信号量是相互合作不可分割的,在生产者线程中,Empty信号量保证没有在空缓冲区的时候让生产者停止生产,Full信号量保证在生产完毕一个产品后增加一个满缓冲区;消费者线程中,full信号量保证在没有满缓冲区的时候让消费者停止消费,Empty信号量保证在消费完毕一个产品增加一个空缓冲区,所以顺序不能改变。实验总结通过本次实验我更加了解了进程的同步的主要任务是使并发执行的各进程之间能有效的共享资源和相互合作。并且对进程同步的原理理解的更加透彻,并且了解到可以使用互斥体(Mutex)、信 号 量 (Semophore)和事件(Event)等同步对象来解决一系列经典的进程同步问题。实验六. 时间片轮转调度1实验目的调试EOS的线程调度程序,熟悉基于优先级的抢先式调度。为 EOS添加时间片轮转调度,了解其它常用的调度算法。2.实验内容准备实验阅读控制台命令“rr”相关的源代码调试线程调度程序(1). 调试当前线程不被抢先的情况(2)、调试当前线程被抢先的情况为EOS添加时间片轮转调度(1)修改ps/sched.c文件中的PspRoundRobin函数VOIDPspRoundRobin(VOID)if (NULL != PspCurrentThread & Running = PspCurrentThread-State) PspCurrentThread-RemainderTicks-;if (0 = PspCurrentThread-RemainderTicks) PspCurrentThread-RemainderTicks = TICKS_OF_TIME_SLICE;if (BIT_TEST(PspReadyBitmap, PspCurrentThread-Priority) PspReadyThread(PspCurrentThread);问题解答: 如果使用互斥信号量,则那些由于访问临界区而被阻塞的线程,就会被放入互斥信号量的等待队列,就不会再相应优先级的就绪队列中了,而时间片轮转调度算法就是对就绪队列的线程进行轮转调度,而不是对被阻塞线程调度的。实验总结;通过本次实验了解到时间片的大小对时间片轮转调度有着一定的影响。当时间片过长时,调度算法退化为FCFS算法,不利于短作业的调用;而当时间片过短时,则会使进程的切换次数增加,时系统开销增大。所以说时间片的大小要根据实际情况划分,不可过长,也不可过短。在这次实验中我感悟到要验证结论必须要进行多次重复的实验,要有耐性,不能只是做几组,这样对结论的验证不具有代表性,应该在不同区域段选取多组值进行验证。实验七. 物理存储器与进程逻辑地址空间的管理1.实验目的通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的管理方法。 通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而掌握进程逻辑地址空间的管理方法。2.实验内容准备实验阅读控制台命令“pm”相关的源代码,并查看其执行的结果分配物理页和释放物理页阅读控制台命令“vm”相关的源代码,并查看其执行的结果在系统进程中分配虚拟页和释放虚拟页修改的代码#include EOSApp.hint main(int argc, char* argv)#ifdef _DEBUG_asm(int $3n nop);#endifprintf(Endless loop!n);for(;) return 0;Pm.c/PRIVATEVOIDConsoleCmdPhysicalMemory(IN HANDLE StdHandle)BOOL IntState;ULONG_PTR PfnArray1;IntState = KeEnableInterrupts(FALSE);/ 关中断fprintf(StdHandle, Page Count: %d.n, MiTotalPageFrameCount);fprintf(StdHandle, Memory Count: %d * %d = %d Byte.n,MiTotalPageFrameCount, PAGE_SIZE,MiTotalPageFrameCount * PAGE_SIZE);fprintf(StdHandle, nZeroed Page Count: %d.n, MiZeroedPageCount);fprintf(StdHandle, Free Page Count: %d.n, MiFreePageCount);fprintf(StdHandle, nUsed Page Count: %d.n, MiTotalPageFrameCount - MiZeroedPageCount - MiFreePageCount);MiAllocateAnyPages(1, PfnArray);fprintf(StdHandle, n* After Allocate One Page *n);fprintf(StdHandle, Zeroed Page Count: %d.n, MiZeroedPageCount);fprintf(StdHandle, Free Page Count: %d.n, MiFreePageCount);fprintf(StdHandle, Used Page Count: %d.n, MiTotalPageFrameCount - MiZeroedPageCount - MiFreePageCount);MiFreePages(1, PfnArray);fprintf(StdHandle, n* After Free One Page *n);fprintf(StdHandle, Zeroed Page Count: %d.n, MiZeroedPageCount);fprintf(StdHandle, Free Page Count: %d.n, MiFreePageCount);fprintf(StdHandle, Used Page Count: %d.n, MiTotalPageFrameCount - MiZeroedPageCount - MiFreePageCount);KeEnableInterrupts(IntState);/ 开中断问题解答; 从性能角度分析,调用MilAllocateAnyPages函数分配物理页在某些情况下比调用MiAllocateZeroedPages函数要快速。从安全角度分析,分配零页更加安全。实验总结 本次实验基本达到了实验目的,通过本次试验我学会了通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的分页式的管理方法。 以及通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而掌握进程逻辑地址空间的符号链管理方法。实验八. 分页存储器管理一、实验目的学习i386处理器的二级页表硬件机制,理解分页存储器管理原理。 查看EOS应用程序进程和系统进程的二级页表映射信息,理解页目录和页表的管理方式。 编程修改页目录和页表的映射关系,理解分页地址变换原理。2.实验内容准备实验查看EOS应用程序进程的页目录和页表查看应用程序进程和系统进程并发时的页目录和页表查看应用程序进程并发时的页目录和页表在二级页表中映射新申请的物理页代码:ULONG PfnArray2;*(PINT)0xE0000000) = 100;MiAllocateZeroedPages(2, PfnArray);OutputFormat = New page frame number: 0x%X, 0x%Xn;fprintf(StdHandle, OutputFormat, PfnArray0, PfnArray1);KdbPrint(OutputFormat, PfnArray0, PfnArray1);IndexOfDirEntry = (0xE0000000 22);(PMMPTE_HARDWARE)0xC0300000)IndexOfDirEntry.PageFrameNumber = PfnArray0;(PMMPTE_HARDWARE)0xC0300000)IndexOfDirEntry.Valid = 1;/ 有效(PMMPTE_HARDWARE)0xC0300000)IndexOfDirEntry.Writable = 1;/ 可写MiFlushEntireTlb();/ 刷新快表PageTableBase = 0xC0000000 + IndexOfDirEntry * PAGE_SIZE;IndexOfTableEntry = (0xE0000000 12) & 0x3FF; (PMMPTE_HARDWARE)PageTableBase)IndexOfTableEntry.PageFrameNumber = PfnArray1;(PMMPTE_HARDWARE)PageTableBase)IndexOfTableEntry.Valid = 1; (PMMPTE_HARDWARE)PageTableBase)IndexOfTableEntry.Writable = 1; MiFlushEntireTlb();IndexOfTableEntry = (0xE0001000 12) & 0x3FF;/ 虚拟地址的 12-22 位是 PTE 标号(PMMPTE_HARDWARE)PageTableBase)IndexOfTableEntry.PageFrameNumber = PfnArray1;(PMMPTE_HARDWARE)PageTableBase)IndexOfTableEntry.Valid = 1; (PMMPTE_HARDWARE)PageTableBase)IndexOfTableEntry.Writable = 1;MiFlushEntireTlb();/ 刷新快表OutputFormat = Read Memory 0xE0001000: %dn;fprintf(StdHandle, OutputFormat, *(PINT)0xE0001000);KdbPrint(OutputFormat, *(PINT)0xE0001000);*(PINT)0xE0000000) = 100;/ 写共享内存fprintf(StdHandle, OutputFormat, *(PINT)0xE0001000);KdbPrint(OutputFormat, *(PINT)0xE0001000);Memory.c/#include EOSApp.h#define CR3_SHIFT12#define PDE_BASE(ULONG_PTR)0xC0300000)拟地址空间的基址#define PTE_BASE(ULONG_PTR)0xC0000000)/ #define PTE_SIZE0x4/ 页目录项和页表项都是 4 字节#define PTE_PER_TABLE0x400/ 页目录中有 1024 个 PDE,页表中有 1024 个 PTE#define PAGE_SIZE 0x1000#define PDI_SHIFT 22 #define PTI_SHIFT 12 typedef struct _MMPTE_HARDWAREULONG Valid : 1;/ 存在位0ULONG DoNotCare : 11;/ 不关心这些位1-11ULONG PageFrameNumber : 20;/ 页框号12-31MMPTE_HARDWARE, *PMMPTE_HARDWARE;ULONG getcr3();int main(int argc, char* argv)ULONG PfnOfPageDirectory;ULONG PageTotal = 0;ULONG IndexOfDirEntry;ULONG IndexOfTableEntry;PMMPTE_HARDWARE pPde;PMMPTE_HARDWARE pPte;ULONG_PTR PageTableBase;ULONG_PTR VirtualBase;const char* OutputFormat = NULL;#ifdef _DEBUG/ _asm(int $3n nop); #endif/ Sleep(10000);/ 等待 10 秒_asm(cli);/ 关中断OutputFormat = nCR3-0x%Xn;PfnOfPageDirectory = (getcr3() CR3_SHIFT);printf(OutputFormat, PfnOfPageDirectory);KdbPrint(OutputFormat, PfnOfPageDirectory);for(IndexOfDirEntry = 0; IndexOfDirEntry Valid)continue;OutputFormat = PDE: 0x%X (0x%X)-0x%Xn;VirtualBase = (IndexOfDirEntry PageFrameNumber);KdbPrint(OutputFormat, IndexOfDirEntry, VirtualBase, pPde-PageFrameNumber);PageTableBase = PTE_BASE + IndexOfDirEntry * PAGE_SIZE;for(IndexOfTableEntry = 0; IndexOfTableEntry 0x%Xn;VirtualBase = (IndexOfDirEntry PDI_SHIFT) | (IndexOfTableEntry PageFrameNumber);KdbPrint(OutputFormat, IndexOfTableEntry, VirtualBase, pPte-PageFrameNumber);PageTotal+; / 第二层循环结束 / 第一层循环结束OutputFormat = nPhysical Page Total: %dn;printf(OutputFormat, PageTotal);KdbPrint(OutputFormat, PageTotal);OutputFormat = Physical Memory Total: %dnn;printf(OutputFormat, PageTotal * PAGE_SIZE);KdbPrint(OutputFormat, PageTotal * PAGE_SIZE);_asm(sti);/ 开中断/ Sleep(10000);/ 等待 10 秒return 0;问题解答: 页目录占用一个物理页,页框号0x409.页表占用5个物理页,页框号是0x41D,0x401,0x403,0x404,0x402。映射用户地址空间的页表的页框号是0x41D。实验结论 页式存储管理机制的优缺点:分页实现了离散分配方式,从而消减了外零头,提高了内存的利用率。页面大小确定,系统中只能有一种大小的页面。在这分页的作业地址空间是一维的,程序员只需利用一个记忆符就可以表示一个地址,但是由于也比较小,从而使系统查找时间比较长,可能需要多次调用查找页表。此次实验基本达到了实验目的,通过此次实验我理解分页存储器管理原理、理解页目录和页表的管理方式、理解分页地址变换原理。实验十. 磁盘调度算法1.实验内容及目的通过学习EOS实现磁盘调度算法的机制,掌握磁盘调度算法执行的条件和时机。 观察EOS实现的FCFS、SSTF和 SCAN磁盘调度算法,了解常用的磁盘调度算法。 编写CSCAN和N-Step-SCAN磁盘调度算法,加深对各种扫描算法的理解。2.实验内容验证先来先服务(FCFS)磁盘调度算法验证最短寻道时间优先(SSTF)磁盘调度算法验证SSTF算法造成线程的“饥饿“现象验证扫描(SCAN)磁盘调度算法改写SCAN算法PREQUESTIopDiskSchedule(VOID)PLIST_ENTRY pListEntry;PREQUEST pRequest;LONG Offset;ULONG InsideShortestDistance = 0xFFFFFFFF;ULONG OutsideShortestDistance = 0xFFFFFFFF;PREQUEST pNextRequest = NULL;while (TRUE) for (pListEntry = RequestListHead.Next; pListEntry != &RequestListHead; pListEntry = pListEntry-Next) pRequest = CONTAINING_RECORD(pListEntry, REQUEST, ListEntry);Offset = pRequest-Cylinder - CurrentCylinder;if (0 = Offset) pNextRequest = pRequest;goto RETURN; else if (ScanInside & Offset 0) if (Offset InsideShortestDistance) InsideShortestDistance = Offset;pNextRequest = pRequest; else if (!ScanInside & Offset 0) if (-Offset Next) pRequest = CONTAINING_RECORD(pListEntry, REQUEST, ListEntry);Offset = pRequest-Cylinder - CurrentCylinder;if (0 = Offset) pNextRequest = pRequest;goto RETURN; else if (Offset 0 & Offset InsideShortestDistance) InsideShortestDistance = Offset;pNextRequestInside = pRequest; else if (Offset OutsideLongestDistance) OutsideLongestDistance = -Offset;pNextRequestOutside = pRequest;pNextRequest = pNextRequestInside != NULL ? pNextRequestInside : pNextRequestOutside;RETURN:return pNextRequest;编写N-Step-SCAN磁盘调度算法PREQUESTIopDiskSchedule(VOID)ULONG SubQueueLenght = SubQueueRemainLength;PLIST_ENTRY pListEntry;PREQUEST pRequest;LONG Offset;ULONG InsideShortestDistance = 0xFFFFFFFF;ULONG OutsideShortestDistance = 0xFFFFFFFF;PREQUEST pNextRequest;PREQUEST pNextRequestInside = NULL;PREQUEST pNextRequestOutside = NULL;for (pListEntry = RequestListHead.Next; SubQueueLenght 0 & pListEntry != &RequestListHead;。 SubQueueLenght-, pListEntry = pListEntry-Next) pRequest = CONTAINING_RECORD(pListEntry, REQUEST, ListEntry);Offset = p

温馨提示

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

评论

0/150

提交评论