操作系统实验报告 附思考题

上传人:干*** 文档编号:174684876 上传时间:2022-12-16 格式:DOCX 页数:21 大小:220.01KB
收藏 版权申诉 举报 下载
操作系统实验报告 附思考题_第1页
第1页 / 共21页
操作系统实验报告 附思考题_第2页
第2页 / 共21页
操作系统实验报告 附思考题_第3页
第3页 / 共21页
资源描述:

《操作系统实验报告 附思考题》由会员分享,可在线阅读,更多相关《操作系统实验报告 附思考题(21页珍藏版)》请在装配图网上搜索。

1、课程设计(综合实验)报告( 2015 - 2016 年度第 1 学期)名称:操作系统综合实验题目:oslab综合实验院系:计算机系班级:学号:学生姓名:指导教师:设计周数:分散进行成绩:日期:2015 年 10 月 29 日实验1实验环境的使用一、综合实验的目的与要求熟悉操作系统集成实验环境OS Lab的基本使用方法。 练习编译、调试EOS操作系统内核以及EOS应用程序。二、实验正文1. 启动 OS Lab执行项目Windows控制台窗口内容显示调试项目使用断点中断执行单步调试*血练习使用“逐语句”功能和“跳出”功能调用堆栈调用堆栈显示内容进入Func函数双击main函数所在的行表示此函数是当

2、前调用堆栈中的活动函数。3新建EOS内核项目4 EOS应用程序项目的生成和调试新建EOS应用程序项目调试项目添加断点后单步调试结果显示查看软盘镜像文件中的内容修改EOS应用程序项目名称5退出OS Lab6保存EOS内核项目三、综合实验总结或结论思考与练习:1. 在哪些情况下应该使用“逐过程”调试,在哪些情况下应该使用“逐语句”调试。答:逐语句为每执行一行语句,如果碰到函数调用它就会进入到函数里面。而逐过程碰到 函数时不进入函数,把函数调用当成一条语句去执行。2. 生成EOS SDK文件夹的目的和作用。明白文件夹的组织结构和各个文件的来源和作用。 查看EOS应用程序包含了 SDK文件夹中的哪些头

3、文件,是如何包含的(1) EOSSDK为应用程序调用系统API提供服务,可作为用户编程中使用的工具包集合。(2) 其主要包括INC头文件LIB文件夹、导入库文件和BIN文件夹、动态链接库、可执行 程序、二进制文件。实验应用程操在作系统的(3) 包含的头文件有:负责导出API函数,声明负责导出函数类型的定义,负责导出错误码。 含了文件,在文件中又包含了和文件。一、综合实验的目的与要求跟踪调试EOS在PC机上从加电复位到成功启动全过程,了解操作系统的启动过程。 查看EOS启动后的状态和行为,理解操作系统启动后的工作方式。二、实验正文1. 准备实验新建一个EOS Kernel项目。打开和 两个汇编文

4、件。生成项目。找到文件,记录下此文 件的大小 1566字节。2调试EOS操作系统的启动过程RiEhL使用Bochs做为远程目标机找到“远程目标机”属性,将此属性值修改为“ BochsDebug”调试BIOS程序在Console窗口中输入调试命令sreg后按回车,其中CS寄存器信息行中的“ s=0xf000 ”表示CS寄存器的值为OxfOOO。输入调试命令r后按回车,显示当前CPU中各个通用寄存器的值。其中“ rip:0x00000000:0000fff0”表示 IP 寄存器的值为 OxfffO。输入调试命令xp/1024b 0x0000,查看开始的1024个字节的物理内存。在Console中输

5、 出的这1K物理内存的值都为0,说明BIOS中断向量表还没有被加载到此处。输入调试命令xp/512b0x7c00,查看软盘引导扇区应该被加载到的内存位置。输出的内存 值都为 0,说明软盘引导扇区还没有被加载到此处。可以验证BIOS第一条指令所在逻辑地址中的段地址和CS寄存器值是一致的,偏移地址 和IP寄存器值是一致的。由于内存还没有被使用,所以其中的值都为0。调试软盘引导扇区程序输入调试命令vb 0x0000:0x7c00,添加断点输入调试命令c继续执行输入调试命令sreg验证CS寄存器(0x0000)的值。输入调试命令r验证IP寄存器(0x7c00)的值。输入调试命令xp /1024b 0x

6、0000验证此时BIOS中断向量表已经被载入。fcl I HJSU Hunt OnHNteMHeeeicI 0 far r iHjQiiHJdfr UflxFihiBprr fhwrnftlFfB.M區円缶酬M67ksl 1rUHHKiB HMUl itZIP昭3UbfHMMUkFW聪3fl JintoFFn.r#T11 k-crOkHfcS3thhjlNxttaHeTW9jrrn.-nflH-rn9b*=M3盼Fi&d-時3OdaMbf rHkTU吻$r.巧鼻?KP4b63IH4H3-diUHrrHrHfl-HaTH-Uj3ft* 3fcfFR-ie-f4赛阴1H4P6 UMAd-a欣3输入

7、调试命令xp /512b 0x7c00显示软盘引导扇区程序的所有字节码。输入调试命令xp /512b 0x0600验证图3-2中第一个用户可用区域是空白的。HJ J 才百却甲”NtnUtIH11 .HdUUKUU H+r.Xa H fka 萌 u ” 由疵爾縮JB4nWWRWW4 叶 ii”4J-ZIestuNm?cMxl4HidJ罰5* I4Z-C-:fl.lHBmiHK4JS1n.-dHh|.J MSK-M.g耐QniCB-Jd4W-田ilxlaHdlb =e-H9-.W:SBOfe-Na俪BrMihM输入调试命令xp /512b 0x7e00验证图3-2中第二个用户可用区域是空白的。 n

8、d44l =inHH.HHVS4FUidWWnH吐5NUng1*3?-W.-Wr-wike1M=GB-iArdM!4.iMW/TjiH Thaa IMMbfl ?hMIMMMVUbHWdM Ch-iix 闿屈MSffflM砂HEM HBW 1M#W gHWIHHMKTbvfl 电Th ” fl-iwfl-ee04KijiummMirvr.ii 上”= aAAfiMAdHI04mwwB 知如 H&dw4iioiiikuM=flj-rCKfHnFME4h0x1000处的数据,验证节和 文件中的第一条的。根据之前记录的文件hIMljIIME34rs =p411? =1S* =AeMiMfdnltBi

9、frIfcriT-fl .4(faFFbdfTtflidfMVauirBattff UffFaidr和址fl Kirfarr砒fe任ArifHuTBidT如BvffMzJTHkTF时甲0x1000查看内存此块内存的前三个字指令的字节码是相同的大小,自己设计个查看内存的调试命令文件的大小为1566个字节,转换为十六进制的61E,所以程序最后八个字节在物理内存的 0x1616到0x161D的位置,所以调试命令为xp/8b 0x1616。经检验,程序结束位置字节码 与反汇编命令相同。注:查看文件的大小应在“属性”对话框中看。调试加载程序在“监视”窗口中可以看到KiSys temS tar tup函数

10、地址为 void (PVOID) 0x800* KiSystemStartupEOS启动后的状态和行为三、综合实验总结或结论1. 为什么EOS操作系统从软盘启动时要使用 和 两个程序使用一个可以吗它们各自的 主要功能是什么如果将 的功能移动到 文件中,则 文件的大小是否仍然能保持小于 512字节答:在IDE环境启动执行EOS操作系统时,会将,三个二进制写入软件镜像文件屯然后 让虚拟机来执行软盘中的EOS操作系统,使用其中一个是不能运行的。2为什么软盘引导扇区程序选择将加载到第一个可用区域的0x1000处呢这样做有什么好 处这样做会对 文件的大小有哪些限制。答:用户只用两个可用区域,加载位置非此

11、即彼。第一个可用用户区是低地址区,且空间 大小比较小,适合容纳小文件,所以我们选择将占用空加载到第一用户区。优点:低地址开 实始,验便于搜3索查进找小程文件的占用创小空建间,节约资源。限制:文件必须小于 1c00k。一、综合实验的目的与要求练习使用EOS API函数CreateProcess创建一个进程,掌握创建进程的方法,理解进程和程序的区别。调试跟踪CreateProcess函数的执行过程,了解进程的创建过程,理解进程 是资源分配的单位。二、实验正文准备实验练习使用控制台命令创建EOS应用程序的进程应用程序输出结果练习通过编程的方式让应用程序创建另一个应用程序的进程可知子进程结束后,父进程

12、继续执行4 调试 CreateProcess 函数在“反汇编”窗口的左侧显示的虚拟地址中匸心丄二二5 调试 PsCreateProcess 函数结kiello,uorld! 1|ielloruorld! 2Hel lo#uorld! 31licl lcfuorld! 4|riellOpUorld! 5Eye-tye*The process exit with 0.进程执行的结果:绘制一幅进程创建过程的流程图。6 练习通过编程的方式创建应用程序的多个进程 多个进程并发执行的结果:有结果显示可知有两个进程在执行三、综合实验总结或结论1. 在源代码文件 提供的源代码基础上进行修改,要求使用 同时创建

13、 10个进程修改结果如下图所示:I ellq.uarld! 3 ella,unrldt 4cllojuorld! 4ellojtnrldf 4elLq.world? 4el la rwarldf 4ello pinrId? 4ellojwar ldf 4Tht? precess tuo exit with 0.The precess 3 exit uttJi O,The precess 4 exit uitli O.TJie process 5 exit wltJi Q.部分修改代码如下图所示:(“”部分为相似的4-9进程代码)if (CreateProcess(A:, NULL, 0, &S

14、tartupInfo, &ProcInfoOne)& CreateProcess(A:, NULL, 0, &StartupInfo, &ProcInfoTwo)& CreateProcess(A:, NULL, 0, &StartupInfo, &ProcInfo3)& CreateProcess(A:, NULL, 0, &StartupInfo, &ProcInfo10) WaitForSingleObject, INFINITE);WaitForSingleObject, INFINITE);WaitForSingleObject, INFINITE);WaitForSingleObj

15、ect, INFINITE);GetExitCodeProcess, &ulExitCode);GetExitCodeProcess, &ulExitCode);printf(nThe process 3 exit with %d.n, ulExitCode);GetExitCodeProcess, &ulExitCode);printf(nThe process 10 exit with %d.n, ulExitCode);CloseHandle;CloseHandle;CloseHandle;CloseHandle;CloseHandle;CloseHandle;2. 在 PsCreate

16、Process 函数中调用了 PspCreateProcessEnvironment 函数后又 先后调用了 PspLoadProcessImage和PspCreateThread函数,学习这些函数的主要 功能。能够交换这些函数被调用的顺序吗答:PspCreateProcessEnvironment创建了进程控制块,地址空间和分配了句柄表, PspLoadProcessImage将进程的可执行映象加载的到了进程的地址空间中,PspCreateThread创建了进程的主线程。这三个函数知道自己从哪里开始执行,执行哪些实指令验,因此4不能线交换程它们的的顺状序。态和转换一、综合实验的目的与要求 调试

17、线程在各种状态间的转换过程,熟悉线程的状态和转换 通过为线程增加挂起状态,加深对线程状态的理解。二、实验正文1 准备实验2调试线程状态的转换过程Loop thread ID 31 : 269342线程由阻塞状态进入就绪状态“ *Thread” State 域的值为 3 ( Wai ting)扎二,双向链表项 Stat eLis tEntry险就=mac启见的Next和Prev指针的值都不为0 一 -,说明这个线程还处于阻塞状态,并在某个同步对象的等待队列中;StartAddr域的值为j*uin* 4i/_rKr n* bjt 亠甩 jIopConsoleDispatchThread,说明这个线

18、程就是控制台派遣线程。在“调用堆栈”窗口中双击PspUnwaitThread函数对应的堆栈项,按F10调试,此时State域的值为0( Zero) y :,双向链表项StateListEntry的Next和Prev指StamUEtEnlrv 彳Next 针的值都为0,说明这个线程已经处于游离状态。按F5继续执行,在PspReadyThread函数中的断点处中断。按F10单步调试直到此函数 B J1的最后。此时State域的值为1( Ready)山扛=二叫,双向链表项StateListEntry的Next = QM9nJ39ErNext和Prev指针的值都不为0-,说明这个线程已经处于就绪状态,

19、并已经被放入优先级为 24 的就绪队列中。线程由运行状态进入就绪状态线程由就绪状态进入运行状态线程由运行状态进入阻塞状态3 为线程增加挂起状态三、综合实验总结或结论1. 思考一下,在本实验中,当loop线程处于运行状态时,EOS中还有哪些线程,它们分 别处于什么状态。可以使用控制台命令pt查看线程的状态。答:有一个优先级为0的空闲线程处于就绪状态,8个优先级为24的控制台线程处于阻塞 状态,1个优先级的24的控制台派遣线程处于阻塞状态。2. 当loop线程在控制台1中执行,并且在控制台2中执行suspend命令时,为什么控 制台1中的loop线程处于就绪状态而不是运行状态答:在控制台2中执行s

20、uspend命令时,优先级为24的控制台2线程抢占处理器,即控 制台2线程处于运行状态,因此此时loop处于就绪状态。3. 总结一下在图 5-3 中显示的转换过程,哪些需要使用线程控制块中的上下文,哪些不需 要使用,并说明原因。答:就绪f运行,运行f就绪,运行f阻塞需要使用TCB因为这些过程有线程调进或调出 处理机的过程,新建f就绪,阻塞f就绪不需要使用TCB上下文,因为没有占用处理机资 源。4. 请读者找出这些转换过程的原语操作(关中断和开中断)是在哪些代码中完成的。答:IntState=KeEnableInterrupts(FALSE);:用虫5皿曲二 Semaphore 二(PSEMAP

21、HORE) 0xSD3fbafC . PsTnitializeSemaphore s PspOnCreateSemaphoreCbjectfSemaphore-Count = Oxc SemaphoreCount (h Count = CbcfiHffff匚一释放信号量(唤醒)Consumer函数中变量i的值为4,说明已经消费了 4号产品。查看 PsReleaseSemaphore 函数中 Empty 信号量计数(Semaphore-Count)的值为T,和 生产者线程被阻塞时的值是一致的。上屮S 单步调试PsReleaseSemaphore函数,Empty计数的值已经由T增加为了 0 4修改

22、EOS的信号量算法(1)修改 PsWaitForSemaphore 函数:if(Semaphore-Count0)Semaphore-Count-;flag=STATUS_SUCCESS;elseflag=PspWait(&Semaphore-WaitListHead,Milliseconds);KeEnableInterrupts(IntState);returnflag;(2)修改 PsReleaseSemaphore 函数:while(!ListIsEmpty(&Semaphore-WaitListHead)&(ReleaseCount)PspWakeThread(&Semaphore-

23、WaitListHead,STATUS_SUCCESS);PspThreadSchedule();ReleaseCount-;Semaphore-Count=Semaphore-Count+ReleaseCount;Status=STATUS_SUCCESS;KeEnableInterrupts(IntState);returnStatus;测试结果:根据文档中的测试方法可看到结果中有两个消费者 三、综合实验总结或结论1. 思考在ps/文件内的PsWaitForSemaphore和PsReleaseSemaphore函数中,为什么要 使用原子操作答:EOS内核中维护了大量内核数据,正是这些数据

24、描述了 EOS操作系统的状态如果有一 组相互关联的内核数据共同描述了这个操作系统的某个状态,那么在修改这样一组内核数 据时就必须保证一致性。这就要求修改这部分数据的代码在执行过程中不能被打断,这种 操作叫做“原语操作”。2. 根据本实验 节中设置断点和调试的方法,自己设计一个类似的调试方案来验证消费者 线程在消费 24号产品时会被阻塞,直到生产者线程生产了 24号产品后,消费者线程才被唤醒并继续执行的过程。答:实Cuiiuirrie; a 17 Consumf? ii 1Rcocococo置2223验常时间片轮转调度一、综合实验的目的与要求调试EOS的线程调度程序,熟悉基于优先级的抢先式调度。

25、为EOS添加时间片轮转调度,了解其它常用的调度算法。二、实验正文 1 准备实验 2阅读控制台命令“rr”相关的源代码3 调试线程调度程序调试当前线程不被抢先的情况Priority = 0x8State = QkTjRemainderTidtg = 0j(6rWaitStatus = OsO,查看ThreadFunction函数中变量pThreadParameter-Y的值应该为0,说明正在调试的 是第o个新建的线程。士土m 按2次F5的循环输出的内容:严7=.三三 厂以二进制格式查看就绪位图的值 BitScanReverse函数会从就绪位图中扫描最高优先级,并保存在变量HighestPrior

26、ity 中。查看变量HighestPriority的值为8。响治护品诃.。鱼thread 0 (8): 304396调试当前线程被抢先的情况激活虚拟机窗口,可以看到第0个新建的线程正在执行。显示 0x18=24继续调试优先级24的线程已经进入了“运行”状态。4为EOS添加时间片轮转调度 修改部分代码:VOIDPspRoundRobin(VOID)if(NULL!=PspCurrentThread&Running=PspCurrentThread-State)PspCurrentThread-RemainderTicks-;if(0=PspCurrentThread-RemainderTicks

27、)PspCurrentThread-RemainderTicks=TICKS_OF_TIME_SLICE;if(BIT_TEST(PspReadyBitmap,PspCurrentThread-Priority) PspReadyThread(PspCurrentThread);测试:能看到 20个线程轮流执行的效果5修改线程时间片的大小执行的效果:参数=20参数=100时间片1. 结合 和“开 答:EOS就绪队oiTJSsnn2. 为什么 验 验 ” 设置法便退 法便退 结或结 结或结执行 法来保 22t2d CPU停成为先进先出空制台这翩机,说切应外10I关12國14中16區W霭(ID:

28、E10?中断 Q 了处理21706进程22花5ZZ043 22552m。需要将被中 (0) EZ7J3 样可以结合在这段时间屏步不会改变线戋程转入“就jpRouqdfiobifl法。1 OD:E (6):3 OD:jeadF界资源界资源8:生的10 (81 蔽了1995? 26966Z0535 20276 nctio:结合/结合遊宠20583界所有中,度的12 (8): 19413 程状态,可以保14 CB): 2936915 (8)It CO): 20171203Z3绪”状态如果此W (0): 0154 函数和ipspse不会在由硬 些臓获 被中断线 extThrSQ些没01Z34a10无坨

29、处111516转1B函;:::使使;这样:断触(6):法占(6):理器: :(G1: 入了(6):的2235?Z261Z逊刃ZZ263“关1“关22030做的原ZZ399线程223HE用资源22027的资源ZZZ51Z23Z&ZZ47Z“就绪224B6程进行考,并使用抢先和不抢先两种情况进行说明。答:(1)因为其他优先队列的线程等待时间不能过长。(2)若将中断线程转入就绪队列,只有当此线程执行完毕之后,其他队列的线程才有机会进 入就绪队列,尤其是当其他就绪队列中的线程关于人机交互的时候,会严重影响用户体验。3. EOS内核时间片大小取60ms,在线程比较多时,就可以观察出线程轮流执行的情况,但

30、 是在Windows、Linux等操作系统启动后,正常情况下都有上百个线程在并发执行,为什么 觉察不到它们被轮流执行,并且每个程序都运行的很顺利呢实验为时间片物理存储器与进现程逻辑性地址空间的管理一、综合实验的目的与要求通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的管理 方法。通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而掌握进 程逻辑地址空间的管理方法。二、实验正文1 准备实验2阅读控制台命令“pm”相关的源代码,并查看其执行的结果3 分配物理页和释放物理页按F10单步调试MiAllocateAnyPages函数的执行过程,结果如图Taqe

31、Count: 617b.Rletwry Cninit : 817fc - 409fc 二 33438896 Byte.2eroed Paje fount; 0 *free Page Count: 7126LIJsed Paffe Cmj毗:1050.可知其空闲页为7126,零页链表为0,已用表为1050.按F10单步调试MiFreePages函数的执行过程,结果如图可知其再分配1页后,空闲页为7125,零页链表为0,已用表为1051,即用空闲页分配, 没用零页链表分配。4阅读控制台命令“vm”相关的源代码,并查看其执行的结果输入命令“A: ”后按回车。此时就使用EOS应用程序文件 创建了一个应

32、用程序进程, 由于此进程执行了一个死循环,所以此进程不会结束执行,除非关闭虚拟机。Endless loop5在系统进程中分配虚拟页和释放虚拟页、_ue,亠八 BaseAddrs = (PVOID) OxdOOOCKJO 卄亠调试释放虚拟页的过程:BaseAddress由初始化的变成了-和 RegionSize由初始化的 变成了Reg ionize=Oxa DOOBa lc,在调用MmAllocateVirtualMemory函数时将RegionSize参数的值设置为 PAGE_SIZE*2+1,观察“输出”窗口中转储的信息,输出文本略。三、综合实验总结或结论1. 在本实验 中,如果分配了物理页

33、后,没有回收,会对EOS操作系统造成什么样的影响 目前 EOS 操作系统内核函数 MiAllocateAnyPages 能处理所有物理页被分配完毕的情况吗 答:(1)会造成自由页链表和零链表不断减少,甚至为空。所有物理页都分配完毕的现象。 (2)不能。2. 尝试从性能的角度分析内核函数 MiAllocateAnyPages 和 MiAllocateZeroedPages。 尝试 从安全性的角度分析分配零页的必要性。答: MiAllocateAnyPages 分配物理页。首先从空闲页链表中分配,如果分配空闲链表不足 则再从零页链表分配。MiAllocateZeroedPages首先从零页链表中分

34、配,如果零页不足则从 空闲链表分配。3. 观察本实验 中使用“ vm” 命令输出的系统进程的虚拟地址描述符,可以看到在 2 号 描述符和 3 号描述符之间有两个虚拟页的空隙,尝试结合虚拟页的分配和释放说明产生这 个空隙的原因。答:产生空隙是由于虚拟页被释放而造成的。在启动时会有一个初始化线程在初始化完毕 之后就退出了,线程的堆栈所占用的虚拟页也就被释放了。4. 在本实验 中,调用 MmAllocateVirtualMemory 函数分配虚拟页时只使用了 MEM_RESERVE 标志,没有使用 MEM_COMMIT 标志,尝试说明这两个标志的区别。MMTT分分配存储时器!其理答:使用MEM_RE

35、SERVE标志分配虚拟页时,没有为其映射实际的物理页。使用 实际的物理页。一、综合实验的目的与要求学习i386处理器的二级页表硬件机制,理解分页存储器管理原理。查看EOS应用程序进程和系统进程二级页表映射信息,理解页目录和页表的管理方式。 编程修改页目录和页表的映射关系,理解分页地址变换原理。二、实验正文1 准备实验2查看EOS应用程序进程的页目录和页表 验证结果与指导教程的二级页表映射信息结果相同。(输出文本略)3 查看应用程序进程和系统进程并发时的页目录和页表(输出文本略)4 查看应用程序进程并发时的页目录和页表(输出文本略)5 在二级页表中映射新申请的物理页(输出文本略)三、综合实验总结

36、或结论1. 观察之前输出的页目录和页表的映射关系,可以看到页目录的第0x300个PDE映射的 页框号就是页目录本身,说明页目录被复用为了页表。而恰恰就是这种映射关系决定了 4K 的页目录映射在虚拟地址空间的0xC0300000-0xC0300FFF,4M的页表映射在 0xC0000000-0xC03FFFFF。现在,假设修改了页目录,使其第0x100个PDE映射的页框号 是页目录本身,此时页目录和页表会映射在4G虚拟地址空间的什么位置呢答:页目录占用1个物理页,页框号是0x409.页表占用5个物理页,页框号是0x41D,0x401, 0x403,0x404,0x402.2. 思考页式存储管理机

37、制的优缺点。 答:优点:虚存量大,适合多道程序运行,动态页式管理提供了内外存统一管理的虚存实现 方式。内存利用率高,不要求作业连续存放,有效地解决了内存碎片问题。缺点:要进行页面中断缺页中断等处理,系统开销较大,有可能产生”抖动”现象。地址实变换验机构复1杂0,一磁般采盘用硬调件实度现,算添加法了机器成本一、综合实验的目的与要求通过学习EOS实现磁盘调度算法的机制,掌握磁盘调度算法执行的条件和时机。 观察EOS实现的FCFS、SSTF和SCAN磁盘调度算法,了解常用的磁盘调度算法。 编写CSCAN和N-Step-SCAN磁盘调度算法,加深对各种扫描算法的理解。二、实验正文1准备实验验证先来先服

38、务(FCFS )磁盘调度算法:目前磁头初始停留在磁道 10,其它被阻塞的线程依次访问磁道 8、21、9、78、0、41、10、67、12、10。调试结果如下:输出Start Cylinder: 10TID: 31 Cylinder: 8 Offset: 2 -TID: 32 Cylinder: 21 Offset: 13 +TID: 33 Cylinder: 9 Offset: 12 -TID: 34 Cylinder: 78 Offset: 69 +TID: 35 Cylinder: 0 Offset: 78 -TID:36Cylinder:41Offset:41+TID:37Cylinde

39、r:10Offset:31-TID:38Cylinder:67Offset:57+TID:39Cylinder:12Offset:55-TID:40Cylinder:10Offset:2 -Start Cylinder: 10 TID: 31 Cylinder: 8 TID: 32 Cylinder; Z1TID: 33 Cylinder: 3 TID: 34 Cylinder: 78TID: 35 Cylinder: 0TID: 36 Cylinder: 41TID: 37 Cylinder: IOTID; 30 Cylinder; 67TID: 39 Cylinder: 12 TID: 4

40、0 Cylinder: 103验证最短寻道时间优先(SSTF)磁盘调度算法输出结果Start Cylinder: 10TID:37Cylinder:10 Offset:0 =TID:40Cylinder:10 Offset:0 =TID:33Cylinder:9 Offset:1 -TID:31Cylinder:8 Offset:1 -TID:39Cylinder:12 Offset:4 +TID:32Cylinder:21 Offset:9 +TID:36Cylinder:41Offset:20+TID:38Cylinder:67Offset:26+TID:34Cylinder:78Offs

41、et:11+TID:35Cylinder:0 Offset: 78 -即以10 9 8 12 21 41 67 78 0的顺序寻道4验证SSTF算法造成的线程“饥饿”现象修改函数中的源代码,使磁头初始停留在磁道 10,而让其它线程依次访问磁道 78、9、8、11、41、10、67、12、10。输出结果:Start Cylinder: 10TID: 37 Cylinder: 10 Offset: 0 =TID: 40 Cylinder: 10 Offset: 0 =TID: 33 Cylinder: 9 Offset: 1 -TID: 34 Cylinder: 8 Offset: 1 -TID:

42、 35 Cylinder: 11 Offset: 3 +TID: 39 Cylinder: 12 Offset: 1 +TID: 32 Cylinder: 21 Offset: 9 +TID: 36 Cylinder: 41 Offset: 20 +TID: 38 Cylinder: 67 Offset: 26 +TID: 31 Cylinder: 78 Offset: 11 +即以10 9 8 11 12 21 41 67 78的顺序寻道可以发现,虽然访问 78号磁道的线程的请求第一个被放入请求队列,但却被推迟到最后 才被处理,出现了“饥饿”现象。如果不断有新线程的请求到达并被优先满足,则访

43、问 78 号磁道的线程的“饥饿”情况就会更加严重。5验证扫描(SCAN)磁盘调度算法输出结果:Start Cylinder: 10TID: 37 Cylinder: 10 Offset: 0 =TID: 40 Cylinder: 10 Offset: 0 =TID: 39 Cylinder: 12 Offset: 2 +TID: 32 Cylinder: 21 Offset: 9 +TID: 36 Cylinder: 41 Offset: 20 +TID: 38 Cylinder: 67 Offset: 26 +TID: 34 Cylinder: 78 Offset: 11 +TID: 33

44、Cylinder: 9 Offset: 69 -TID: 31 Cylinder: 8 Offset: 1 -TID: 35 Cylinder: 0 Offset: 8 -即以10 12 21 41 67 78 9 8 0的顺序寻道6改写SCAN算法改写代码(部分):PREQUESTpNextRequest=NULL,pNextRequest1=NULL,pNextRequest2 = NULL;for (pListEntry = ; pListEntry != &RequestListHead;pListEntry = pListEntry-Next)pRequest = CONTAININ

45、G_RECORD(pListEntry, REQUEST, ListEntry);Offset = pRequest-Cylinder - CurrentCylinder;if (0 = Offset) pNextRequest = pRequest;goto RETURN; if (Offset 0) if (Offset InsideShortestDistance) InsideShortestDistance = Offset;pNextRequest1 = pRequest;if (Offset 0) if (-Offset Next) pRequest = CONTAINING_R

46、ECORD(pListEntry, REQUEST, ListEntry);Offset = pRequest-Cylinder - CurrentCylinder;if (Offset=0)pNextRequest = pRequest;goto RETURN; else if (Offset 0 & Offset InsideShortestDistance) InsideShortestDistance = Offset;pNextRequestInside = pRequest; else if (Offset OutsideLongestDistance) OutsideLonges

47、tDistance = -Offset; pNextRequestOutside = pRequest; ScanInside=1;if(pNextRequestInside != NULL) pNextRequest = pNextRequestInside; elsepNextRequest = pNextRequestOutside;RETURN: return pNextRequest; 输出结果:Start Cylinder: 10TID: 37 Cylinder: 10 Offset: 0 =TID: 40 Cylinder: 10 Offset: 0 =TID: 39 Cylin

48、der: 12 Offset: 2 +TID: 32 Cylinder: 21 Offset: 9 +TID: 36 Cylinder: 41 Offset: 20 +TID: 38 Cylinder: 67 Offset: 26 +TID: 34 Cylinder: 78 Offset: 11 +TID: 35 Cylinder: 0 Offset: 78 -TID: 31 Cylinder: 8 Offset: 8 +TID: 33 Cylinder: 9 Offset: 1 + 即以10 12 21 41 67 78 0 8 9的顺序寻道8验证SSTF、SCAN及CSCAN算法中的“磁臂

49、粘着”现象输出结果:Start Cylinder: 10TID: 32 Cylinder: 10 Offset: 0 =TID: 33 Cylinder: 10 Offset: 0 =TID: 34 Cylinder: 10 Offset: 0 =TID: 35 Cylinder: 10 Offset: 0 =TID: 36 Cylinder: 10 Offset: 0 =TID: 37 Cylinder: 10 Offset: 0 =TID: 38 Cylinder: 10 Offset: 0 =TID: 39 Cylinder: 10 Offset: 0 =TID: 40 Cylinder

50、: 10 Offset: 0 =TID: 31 Cylinder: 78 Offset: 68 +即以10 10 10 10 10 10 10 10 10 78的顺序寻道使用SSTF、SCAN和CSCAN算法调度这组数据,输出结果相同可以发现,虽然访问78号 磁道的线程的请求第一个被放入请求队列,但却被推迟到最后才被处理,出现了“磁臂粘 着”现象。9编写N-Step-SCAN磁盘调度算法改写代码(部分):IopDiskSchedule( VOID )if(SubQueueRemainLength = 0)SubQueueRemainLength = SUB_QUEUE_LENGTH;for (

51、pListEntry=;pListEntry!=&RequestListHead &counter0;stEntry= pListEntry-Next) pRequest = CONTAINING_RECORD(pListEntry, REQUEST, ListEntry);Offset = pRequest-Cylinder - CurrentCylinder;if (0 = Offset) pNextRequest = pRequest; return pNextRequest; else if ( Offset 0 & Offset InsideShortestDistance ) In

52、sideShortestDistance = Offset; INpNextRequest = pRequest; else if ( Offset 0 & -Offset OutsideShortestDistance ) OutsideShortestDistance = -Offset; OUTpNextRequest = pRequest; counter-;输出结果:Start Cylinder: 10TID: 32 Cylinder: 21 Offset: 11 +TID: 36 Cylinder: 41 Offset: 20 +TID: 34 Cylinder: 78 Offse

53、t: 37 +TID: 33 Cylinder: 9 Offset: 69 -TID: 31 Cylinder: 8 Offset: 1 -TID: 35 Cylinder: 0 Offset: 8 -TID: 37 Cylinder: 10 Offset: 10 +TID: 40 Cylinder: 10 Offset: 0 =TID: 39 Cylinder: 12 Offset: 2 +TID: 38 Cylinder: 67 Offset: 55 +即以21 41 78 9 8 0 10 10 12 67的顺序寻道将宏定义sub_queue_length的值修改为100,算法性能接近于

54、scan算法的性能,输出结果:10、10、12、21、41、67、78、9、8、0将宏定义SUB_QUEUE_LENGTH的值修改为1,算法退化为FCFS算法,输出结果:8、21、9、78、0、41、10、67、12、10三、综合实验总结或结论1.在执行SCAN、N-Step-SCAN磁盘调度算法时,如果在EOS控制台中多次输入“ ds” 命令,调度的顺序会发生变化,说明造成这种现象的原因尝试修改源代码,使这两种算法在 多次执行时,都能确保调度的顺序一致。答:SCAN算法使用了全局变量Scaninside记录磁头的移动方向,在第一次执行ds命令时, 开始磁头是由外向内移动的,结束时磁头变为由内

55、向外移动,所以在下次执行ds命令时, 开始磁头就继续从内向外移动了。N-STtep-SCAN算法是由于使用了全局变量 subqueueremainleng th记录第一个子队列剩余的长度,道理与上相同。修改方法:可以在函数IopProcessNextRequest中,每次检测到磁盘调度算法结束工作时, 将这些全局变量恢复为默认值。四、参考文献1海西慧2 EOS操作系统实验教程.五、思想与感悟在实验五中没有仔细阅读代码注释,找了很久的empty信号量(emptysemaphorehandle) full信号量等的代码名称,浪费了时间。实验八为验证性实验,由于篇幅限制,输出文本没有列在实验报告中。 由于时间紧,任务重,有些实验没有细细体味其中含义,部分修改代码的题目也没有来 的及做。但是从这十个实验中,我可以更深刻的理解操作系统的组成,任务,作用等知识最后,感谢老师的悉心指导,帮助我解决了只从书本上自学不到的知识,令我受益匪浅。

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!