东南大学操作系统实验报告.docx_第1页
东南大学操作系统实验报告.docx_第2页
东南大学操作系统实验报告.docx_第3页
东南大学操作系统实验报告.docx_第4页
东南大学操作系统实验报告.docx_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

操作系统课程设计操作系统实验 基于WRK的进程工作集实验实验目的1 掌握虚拟机和调试工具等的使用。2 阅读Windows源码中工作集管理相关部分。3 修改Windows内核中页面置换算法,深入理解工作集和页面置换算法如何在一个完整的操作系统中实现实验步骤1 搭建实验环境WRK v1.2Virtual PC 2007-Windows 2003 Sp1WinDbg搭建环境相对简单,只需按照下列步骤完成即可1)首先把实验需要的文件下载到本地d: WRK-CRK目录下。2)在cmd命令行中输入:a. mkdir c:wrk(建立一个新目录)b. set wrk=c:wrk(上面建立的目录)c. xcopy /crehkdq d: WRK-CRKWRK-v1.2 %wrk%(把WRK内核代码和工具拷到新建立的目录下)d. set arch=x86amd64(设置机器的CPU架构,x86还是amd64)指定编译目标结构e. set path=%wrk%tools%arch%;%path%(设置WRK平台编译工具路径)f. cd %wrk%basentos(进入编译工具目录)g. nmake nologo %arch%=(编译WRK内核)3)如果编译成功的话,%wrk%basentosbuildexe目录下会生成两个文件,wrkx86.exe和wrkx86.pdb。2 源码阅读及算法验证工作集代码分布文件名称模块功能ps.h工作集的部分结构声明mi.h存储器管理相关的数据结构和接口wslist.c包含操作系统工作集结构的系列函数wstree.c实现工作集管理中的一些辅助函数wsmanage.c包含操作活动状态进程工作集的函数,同时实现工作集管理线程Step1 编写测试程序程序内容:申请内存分配。代码如下:#include#define locsize 1024*1024void main()int i=6;i=i+;printf(%d,i);while (1)char * newplace= (char *) malloc(locsize);sprintf(newplace,%s,hello!);printf(%sn,newplace);/free (newplace);Step2 查看工作集在虚拟机中运行程序。在内核中设置断点,让内核停下来查看进程状态。在WinDbg的命令行输入命令查看工作集信息。1.!process 0 0显示的是当前所有进程信息,查找我们编写的程序的进程信息:据此地址查看EPROCESS信息2. dt eprocess 811d41c8从显示的EPROCESS信息中查找MMSUPPORT的地址0x1e8是相对地址。3. dt nt!_MMSUPPORT 811d41c8+ 0x1e8查看MMSUPPORT的信息4. dt nt!_MMWSL 0xc0502000查看MMWSL信息FirstFree 下次进行工作集页面添加的位置FirstDynamic 工作集页面中第一个可用页面的下标LastEntry 工作集页面中最后一个可用页面的下标NextSlot 进行页面修剪算法是据此搜索最有替换页面5. dd 0xc0502698 l 0x40查看MMWSLE的信息,即工作集页面项(所有页面虚拟地址)的详细信息Step3 验证页面置换算法在置换算法中设置断点,图中桃红色标识。此时的各个变量的值。其中TheNextSlot(0x2b)标识置换算法起始搜索的页面。本地local置换前置换完之后即TheNextSlot指向的页面被置换分析:源码:if (Flags = WsleAllocationReplace) | OldestAge = MI_IMMEDIATE_REPLACEMENT_AGE | NumberOfCandidates MM_WORKING_SET_LIST_SEARCH)三个条件:1 Flags 等于 WsleAllocationReplace(WsleAllocationReplace表示内存紧张,立即替换)2 页面年龄大于2(MI_IMMEDIATE_REPLACEMENT_AGE=2)3 搜索的页面数大于17(MM_WORKING_SET_LIST_SEARCH=17),满足一个即进行页面替换。我们可以看到置换前1 Flag = WsleAllocationAny2内存中从红色框标识页之后的17个页面年龄均为0所以页面置换算法会在搜索17个页面之后,立即进行置换,置换也为TheNextSlot指向的页。断点后单步执行的过程,也验证了这一分析。3 修改算法及验证Step1 修改页面置换算法修改代码basentosincps.h:typedef struct _MMSUPPORT LIST_ENTRY WorkingSetExpansionLinks; LARGE_INTEGER LastTrimTime; MMSUPPORT_FLAGS Flags; ULONG PageFaultCount; WSLE_NUMBER PeakWorkingSetSize; WSLE_NUMBER GrowthSinceLastEstimate; WSLE_NUMBER MinimumWorkingSetSize; WSLE_NUMBER MaximumWorkingSetSize; struct _MMWSL *VmWorkingSetList; WSLE_NUMBER Claim; WSLE_NUMBER NextEstimationSlot; WSLE_NUMBER NextAgingSlot; WSLE_NUMBER EstimatedAvailable; WSLE_NUMBER WorkingSetSize;EX_PUSH_LOCK WorkingSetMutex;ULONG num; / 新增加 MMSUPPORT, *PMMSUPPORT;修改代码basentosmmwslist.c: 272:MiDoReplacement():算法思想:碰见有效页面就进行替换,每次搜索的的起始索引依然为NextSlot。VOIDMiReplaceWorkingSetEntry ( IN PMMSUPPORT WsInfo, IN WSLE_ALLOCATION_TYPE Flags ) WSLE_NUMBER WorkingSetIndex; WSLE_NUMBER FirstDynamic; WSLE_NUMBER LastEntry; PMMWSL WorkingSetList; PMMWSLE Wsle; PMMPTE PointerPte; WSLE_NUMBER TheNextSlot; WorkingSetList = WsInfo-VmWorkingSetList; Wsle = WorkingSetList-Wsle; LastEntry = WorkingSetList-LastEntry; FirstDynamic = WorkingSetList-FirstDynamic; WorkingSetIndex = WorkingSetList-NextSlot; if (WorkingSetIndex LastEntry | WorkingSetIndex LastEntry) WorkingSetIndex = FirstDynamic; if (WorkingSetIndex = TheNextSlot) if (Flags = WsleAllocationAny) WsInfo-GrowthSinceLastEstimate += 1; return; PointerPte = MiGetPteAddress(WsleWorkingSetIndex.u1.VirtualAddress); if (MiFreeWsle (WorkingSetIndex, WsInfo, PointerPte) /直接替换 WorkingSetList-NextSlot = WorkingSetIndex + 1; break; WorkingSetIndex += 1; if (WorkingSetIndex LastEntry) WorkingSetIndex = FirstDynamic; if (WorkingSetIndex = TheNextSlot) if (Flags = WsleAllocationAny) WsInfo-GrowthSinceLastEstimate += 1; break; return;Step2 通过单步执行查看其执行过程。置换前:置换后:可以看出,即使NextSlot指示页年龄为0,之后的页面年龄为1,也替换当前页。即验证修改的“碰见有效页即替换”的策略。基于WRK平台的IPC实验实验背景:Inter-Process Communication(进程间通信)在现在通用的时分操作系统中的进程管理中扮演着重要的角色,可以说没有同步/互斥机制,就不会实现系统的多线程。在Windows中,内核提供了多种机制防止多个线程对同一个数据结构进行修改。通过对WRK平台的IPC实验,我们可以更加深入地了解到Windows内部是如何实现线程的同步/互斥的。一、了解WinDbg的一些常用命令在winDbg中常用到的WinDbg命令:Kd!processKddt nt!_kthreadKddt nt!_kwait_blockKddt nt!_dispatcher_headerKd!process 0 0 Kd!process #thread二、使用WinDbg联机查看一个线程等待的所有同步对象(1)在系统初始化时,按下debug的break,进入断点。并通过!process查看当前所有线程的状态。主要用于查看进程状态(如图)。!process 813f8020 2 (813f8020 是svchost)(2)选择其中一个线程查看,比如813f7380,可以看到它正在等待五个事件。(3)用dt nt!_kthread查看这个线程的全部信息。可以看到等待的列表头为0x80899b28 _KWAIT_BLOCKdt nt!_kthread 813e0020(4)查看下一个等待块信息。0x816dc640的具体信息如下:dt nt!_kwait_block 0x816dc640三、使用WinDbg联机查看等待一个同步对象的所有线程(1)用!process 命令,得到当前的线程信息,如图,看到8141e120 被3个线程同时等待!process 813f8020 2(2) 用dt命令来解释该对象(8089eb3c)的分发器头:可以看出有多个线程在等待这个对象。dt nt!_dispatcher_header 8141e120(3) 解释等待块0x813927b8.(4) 解释等待块0x813e00c8持续此过程直到自己等待自己四.生产者-消费者问题在WRK平台上的实现与调试1、充分理解“生产者-消费者”算法,编写“生产者-消费者”程序11 “生产者-消费者”问题描述如上图所示,生产者把产品生产出来,送入仓库队列中。给消费者发信号,消费者得到信号后,到仓库取产品,取走产品后给生产者发信号。某时刻,只允许有一个生产者或消费者访问仓库队列,同时在仓库队列中进行操作将导致不可预知的错误。1.2“生产者-消费者”算法。1.2.1 “生产者-消费者”问题分析生产者-消费者问题是相互合作进程关系的一种抽象,其中,生产者作为系统中释放资源的进程,而消费者作为系统中使用同类资源的进程。通过对该问题的分析,可知,消费者想接收数据时,有界缓冲区中至少有一个单元是满的,即对于“消费者”而言,缓冲区空则应等待。而生产者想发送数据时,有界缓冲区中至少有一个单元是空的,即对于“生产者”而言,缓冲区满则应等待。这便表现为一个同步问题。而由于缓冲区是临界资源,所以生产者和消费者之间必须互斥的访问临界资源。即任何时刻,只能有一个进程在临界区中操作。这便表现为一个互斥问题。为此,对于同步问题,引入同步信号量“empty”,为0表示缓冲区满及同步信号量“full”,为0表示缓冲区空,对于互斥问题,引入互斥信号量(二元信号量),信号量为0,表明已有进程进入临界区。1.2.2 “生产者-消费者”算法设:互斥信号量Mutex 表示进入缓冲区的个数 初值为1。(消费者)同步信号量(Semaphore) full 表示有界缓冲区中非空单元数 初值为0。(生产者)同步信号量(Semaphore) emptys表示有界缓冲区中空的单元数 初值为n。生产者:Product(data):beginP(emptys) 检查缓冲区中是否有空单元 执行后n-1P mutex) 检查缓冲区是否可用 送数据入缓冲区V(mutex) 释放缓冲区中的资源V full) 执行后,非空单元数加1 0+11end消费者: Consume(data):beginP(full)P(mutex)取缓冲区中某单元数据V(mutex)V(emptys )end3)在宿主机上编写“生产者-消费者”程序,并运行生成IPC.exe,放入主机共享的工作目录D:wrk下生产者消费者源码:#include#include #include #include #define buffersize 5HANDLE Mutex;HANDLE emptys;HANDLE full;int bufferdatabuffersize;void init_bufferdata()for (int i=0;ibuffersize;i+)bufferdatai=0;bool InsertInBuffer(int data)for(int i=0;ibuffersize;i+)if (bufferdatai=0)bufferdatai=data;return true;return false;bool RemoveFromBuffer()for (int i=0;ibuffersize;i+)if (bufferdatai!=0)bufferdatai=0;return true;return false;DWORD WINAPI produce()int produce_data=rand()%10+1;while(1)WaitForSingleObject(emptys,INFINITE);/wait emptyWaitForSingleObject(Mutex,INFINITE);/wait empty/data segmentInsertInBuffer(produce_data);/Sleep(500);printf(Producer has inserted a %d in data buffer ! n,produce_data);ReleaseMutex(Mutex);/signalReleaseSemaphore(full,1,NULL);/signal fullreturn 0;DWORD WINAPI consumer()while(1)WaitForSingleObject(full,INFINITE);/wait emptyWaitForSingleObject(Mutex,INFINITE);/wait empty/data segmentRemoveFromBuffer();/Sleep(500);printf(Consumer removed a data from buffer !n);ReleaseMutex(Mutex);/signalReleaseSemaphore(emptys,1,NULL);/signal fullreturn 0;int main()Mutex=CreateMutex(NULL,FALSE,NULL);/creat mutexemptys=CreateSemaphore(NULL,5,5,NULL);/creat emptyfull=CreateSemaphore(NULL,0,5,NULL);/creat fullint producernum=10,consumernum=10;HANDLE *ProducerThread=new HANDLEproducernum;HANDLE *ConsumerThread=new HANDLEconsumernum;init_bufferdata();/initialize bufferfor (int i=0;iproducernum;i+)ProducerThreadi=CreateThread(NULL,0,(LPTHREAD_START_ROUTI

温馨提示

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

评论

0/150

提交评论