北大操作系统高级课程-陈向群作业-虚拟内存管理实习报告
操作系统实验实验报告 虚拟内存
操作系统实验实验报告虚拟内存一、实验目的本次操作系统实验的目的是深入理解虚拟内存的概念、原理和实现机制,通过实际操作和观察,掌握虚拟内存的相关技术,包括页面置换算法、内存分配策略等,并分析其对系统性能的影响。
二、实验环境操作系统:Windows 10 专业版开发工具:Visual Studio 2019编程语言:C++三、实验原理1、虚拟内存的概念虚拟内存是一种计算机系统内存管理技术,它使得应用程序认为自己拥有连续的可用内存(一个连续完整的地址空间),而实际上,这些内存可能是被分散存储在物理内存和外部存储设备(如硬盘)中的。
虚拟内存通过将程序使用的内存地址映射到物理内存地址,实现了内存的按需分配和管理。
2、页面置换算法当物理内存不足时,操作系统需要选择一些页面(内存中的固定大小的块)换出到外部存储设备,以腾出空间给新的页面。
常见的页面置换算法有先进先出(FIFO)算法、最近最少使用(LRU)算法、时钟(Clock)算法等。
3、内存分配策略操作系统在分配内存时,需要考虑如何有效地利用有限的物理内存资源。
常见的内存分配策略有连续分配、分页分配和分段分配等。
四、实验内容与步骤1、实现简单的虚拟内存系统使用 C++编写一个简单的虚拟内存模拟程序,包括内存页面的管理、地址映射、页面置换等功能。
2、测试不同的页面置换算法在虚拟内存系统中,分别实现 FIFO、LRU 和 Clock 算法,并对相同的访问序列进行测试,比较它们的页面置换次数和缺页率。
3、分析内存分配策略的影响分别采用连续分配、分页分配和分段分配策略,对不同大小和类型的程序进行内存分配,观察系统的性能(如内存利用率、执行时间等)。
具体步骤如下:(1)定义内存页面的结构,包括页面号、标志位(是否在内存中、是否被修改等)等。
(2)实现地址映射函数,将虚拟地址转换为物理地址。
(3)编写页面置换算法的函数,根据不同的算法选择要置换的页面。
(4)创建测试用例,生成随机的访问序列,对不同的算法和分配策略进行测试。
虚拟内存的设计实训报告
一、实训背景随着计算机技术的发展,计算机系统的内存容量需求越来越大。
然而,由于物理内存(RAM)的成本较高,且受限于物理空间的限制,很难满足用户对大内存的需求。
为了解决这个问题,虚拟内存技术应运而生。
虚拟内存是一种将部分硬盘空间虚拟化为内存的技术,可以有效扩充计算机系统的内存容量,提高系统的运行效率。
本实训旨在设计并实现一个虚拟内存系统,通过对虚拟内存的设计、实现和测试,加深对虚拟内存原理和技术的理解。
二、实训目标1. 理解虚拟内存的基本原理和设计方法;2. 掌握虚拟内存的硬件和软件实现技术;3. 设计并实现一个简单的虚拟内存系统;4. 对虚拟内存系统进行测试和分析,评估其性能。
三、实训内容1. 虚拟内存基本原理虚拟内存的核心思想是将计算机的物理内存与硬盘空间进行映射,使得计算机在访问内存时,可以将部分数据存储到硬盘上,从而实现内存的扩充。
虚拟内存的主要技术包括:(1)页式存储管理:将内存划分为固定大小的页,硬盘空间也划分为同样大小的块(或称为页框)。
当程序需要访问内存时,虚拟内存管理系统会将所需的页加载到物理内存中。
(2)置换算法:当物理内存不足时,虚拟内存管理系统需要选择一部分页从内存中移出,并将它们存储到硬盘上。
常用的置换算法有FIFO、LRU、OPT等。
(3)地址映射:虚拟内存管理系统需要将虚拟地址转换为物理地址,以便计算机可以访问到正确的内存位置。
2. 虚拟内存硬件实现虚拟内存的硬件实现主要包括以下部分:(1)内存控制器:负责控制物理内存的读写操作。
(2)地址转换逻辑:将虚拟地址转换为物理地址。
(3)页面缓存:用于缓存频繁访问的页,以提高系统性能。
3. 虚拟内存软件实现虚拟内存的软件实现主要包括以下部分:(1)虚拟内存管理系统:负责管理虚拟内存的分配、回收和页面置换等操作。
(2)页面置换算法实现:根据不同的置换算法实现相应的页面置换逻辑。
(3)地址映射表:用于存储虚拟地址与物理地址的映射关系。
实习五虚拟存储器实验报告
实习五虚拟存储器实验报告一、实验目的本次虚拟存储器实验旨在深入理解虚拟存储器的工作原理,掌握页面置换算法的实现和性能评估,以及观察虚拟存储器对系统性能的影响。
二、实验环境本次实验在装有 Windows 操作系统的计算机上进行,使用了专门的虚拟存储器实验软件,包括模拟系统内存和磁盘存储的工具。
三、实验原理1、虚拟存储器的概念虚拟存储器是一种通过硬件和软件的结合,为用户提供一个比实际物理内存大得多的逻辑地址空间的技术。
它允许程序在运行时,仅将部分数据和代码装入内存,而其余部分则存储在磁盘上,当需要时再进行调入和调出。
2、页面置换算法常见的页面置换算法有先进先出(FIFO)算法、最近最少使用(LRU)算法和最佳置换(OPT)算法等。
这些算法用于决定当内存空间不足时,哪些页面应该被替换出去,以腾出空间给新的页面。
四、实验内容与步骤(一)实验内容1、实现 FIFO 页面置换算法,并对其性能进行测试。
2、实现 LRU 页面置换算法,并对其性能进行比较。
3、观察不同页面访问序列和内存大小对页面置换算法性能的影响。
(二)实验步骤1、启动虚拟存储器实验软件,设置系统内存大小和页面大小。
2、输入页面访问序列,分别运行 FIFO 和 LRU 页面置换算法。
3、记录每次页面置换的情况,包括被置换的页面、缺页次数等。
4、改变页面访问序列和内存大小,重复上述实验过程。
五、实验结果与分析(一)FIFO 页面置换算法结果当使用 FIFO 算法时,对于给定的页面访问序列,随着内存大小的增加,缺页次数逐渐减少。
但在某些情况下,由于先进先出的特性,可能会出现将即将使用的页面置换出去的情况,导致缺页率较高。
(二)LRU 页面置换算法结果LRU 算法在大多数情况下表现优于 FIFO 算法。
因为它基于页面的最近使用情况进行置换,更能保留近期可能会再次使用的页面,从而减少缺页次数。
(三)不同页面访问序列的影响不同的页面访问序列对页面置换算法的性能有显著影响。
虚拟内存管理——操作系统课程大作业虚拟内存管理报告
2011年操作系统大作业1.虚拟内存管理实验。
在Linux环境下编写一个内核模块,分别实现如下几个函数:●static void mtest_dump_vma_list(void):依次列出当前进程所占用的虚拟内存空间各段的读、写或执行权限。
●static void mtest_find_vma(unsigned long addr):查找出虚拟地址addr所在的vma,并通过printk打印该段的起始地址、终止地址和段标志等信息。
●static void mtest_find_page(unsigned long addr):找到虚拟地址addr对应的物理地址并打印。
为了测试和使用以上函数,需要在内核模块的初始化函数中创建一个名为mtest的/proc 文件。
mtest文件绑定的写函数mtest_write允许用户程序写入一串字符串:●如果写入的字符串是listvma则调用函数mtest_dump_vma_list(void);●如果写入的字符串是findvma0xffffffff则调用函数mtest_find_vma(0xffffffff),字符串的后几个字符是传递给函数的参数;●如果写入的字符串是findpage0xffffffff则调用函数mtest_find_page(0xffffffff),同样字符串的后几个字符是参数。
实验要求:为了测试以上模块的正确性,需要编写一个小型的test应用程序,它打开/proc/mtest文件,并向其中写入字符串调用模块中的相关函数并给出相应的反馈信息。
知识储备:●虚拟存储空间管理的相关数据结构vm_area_struct和mm_struct●/proc文件系统的相关知识●内核模块的相关知识实验思路及过程:相关知识储备:1.可以使用/proc文件系统和pmap工具查看给定进程的内存空间和其中所包含的内存区域mmap描述的该地址空间中的全部内存区域。
内核使用内存描述符结构表示进程的地址空间,由结构体mm_struct结构体表示,定义在linux/sched.h中,同时linux操作系统采用虚拟内存技术,所有进程之间以虚拟方式共享内存。
北大操作系统高级课程陈向群作业线程调度实习报告
北大操作系统高级课程陈向群作业线程调度实习报告一、引言本报告旨在对北大操作系统高级课程中陈向群老师布置的线程调度实习进行总结和反思。
通过本次实习,我深入了解了操作系统中线程调度的原理和技术,并在实践中掌握了相关算法和方法。
二、实习内容1. 实践环境本次实践使用了一台基于Linux系统的虚拟机。
在虚拟机中,我编写了一个简单的多线程应用程序,并通过调整线程调度参数来观察不同调度策略下的线程行为与性能。
2. 理论知识回顾在开始实践之前,我对线程调度的理论知识进行了回顾。
线程调度是操作系统中相当重要的一项功能,其主要目的是合理地分配CPU时间片给不同的线程,以实现最大化系统的性能和资源利用率。
3. 实践过程我首先编写了一个简单的多线程应用程序,其中包含了几个线程并发执行的任务。
然后,我通过修改代码中的调度策略和参数来观察线程的执行顺序和总运行时间。
4. 实践结果和分析通过对不同线程调度策略的尝试,我观察到了不同线程调度策略下线程行为和系统性能的差异。
比如,在FIFO调度策略下,线程按照它们创建的先后次序执行,而在RR(Round-Robin)调度策略下,线程按照时间片的轮转方式进行执行。
5. 总结与反思通过实践,我深刻理解了线程调度的重要性和影响因素。
合理的线程调度策略能够最大化地发挥系统性能,提高计算资源的利用率。
在实践过程中,我也遇到了一些问题和困难,如如何选择最合适的线程调度策略以及如何调整合适的调度参数。
这些问题需要深入研究和探索。
三、实践总结通过这次线程调度实习,我收获了很多。
首先,我深入了解了操作系统中线程调度的原理和技术。
其次,我掌握了一些常见的线程调度算法和方法,并能够通过实践来判断和选择适当的调度策略。
此外,我还掌握了一些调整调度策略和参数的技巧,并能够通过观察线程行为和系统性能的变化来验证和分析调度效果。
然而,这次实习也暴露出了我一些不足之处。
首先,我对于一些现代高级线程调度算法和技术还不够了解,需要进一步学习和研究。
虚拟存储管理实验报告
虚拟存储管理实验报告实验概述虚拟存储管理实验是操作系统课程中的一项重要实验,旨在通过模拟内存管理中的分页机制和页面置换算法,深入理解操作系统中的虚拟内存管理技术。
本实验主要包括以下几个关键点:- 模拟内存的分页机制- 实现页面置换算法- 分析不同页面置换算法的性能指标实验环境本次实验基于C语言和Linux操作系统进行实现,使用gcc编译器进行编译和调试。
实验过程及实现细节在本次实验中,我们实现了一个简单的虚拟内存系统,主要包括以下几个模块:页面管理、页面分配、页面置换和性能分析。
下面对每个模块的实现细节进行详细描述。
页面管理页面管理模块主要负责管理虚拟内存和物理内存之间的映射关系。
我们采用了分页机制进行管理,将虚拟内存和物理内存划分为固定大小的页面。
页面的大小由实验设置为4KB。
页面分配页面分配模块负责分配物理内存空间给进程使用。
我们使用一个位图作为物理内存管理的数据结构,记录每个页面的使用情况。
在每次页面分配时,我们会查找位图中第一个空闲的页面,并将其分配给进程。
页面置换页面置换模块是虚拟存储管理中的核心算法,主要用于解决内存中页面不足时的页面置换问题。
本次实验中我们实现了两种常用的页面置换算法:FIFO(先进先出)和LRU(最近最少使用)算法。
FIFO算法是一种简单的页面置换算法,它总是选择最早被加载到物理内存的页面进行置换。
LRU算法是一种基于页面访问历史的算法,它总是选择最长时间未被访问的页面进行置换。
性能分析性能分析模块主要用于评估不同的页面置换算法的性能指标。
我们使用了缺页率(Page Fault Rate)和命中率(Hit Rate)作为评价指标。
缺页率表示物理内存中的页面不能满足进程请求的比例,命中率表示进程请求的页面已经在物理内存中的比例。
实验结果为了评估不同的页面置换算法的性能,在实验过程中,我们通过模拟进程的页面访问序列,统计页面置换次数、缺页率和命中率等指标。
以一个包含100个页面访问请求的序列为例,我们分别使用FIFO算法和LRU 算法进行页面置换。
操作系统实习报告
操作系统实习报告在大学的学习生涯中,操作系统作为计算机科学的核心课程,为我们揭示了计算机系统运行的神秘面纱。
为了更深入地理解操作系统的原理和机制,我参加了一次操作系统的实习。
这次实习不仅让我将理论知识应用到实际中,更让我对计算机系统的运行有了全新的认识。
实习的开始,我们首先对操作系统的基本概念进行了回顾。
操作系统是管理计算机硬件与软件资源的程序,同时也是计算机系统的内核与基石。
它负责诸如进程管理、内存管理、文件系统管理、设备管理等重要任务。
这些概念在课堂上虽然已经学习过,但在实际操作中,才真正感受到它们的重要性和复杂性。
在进程管理方面,我们通过编程实现了进程的创建、调度和终止。
进程是操作系统中最基本的执行单元,理解其工作原理对于优化系统性能至关重要。
通过实际编写代码,我学会了如何使用系统调用创建新的进程,以及如何设置进程的优先级和调度策略。
例如,在多任务环境中,合理地分配 CPU 时间片可以确保各个进程都能得到及时的处理,从而提高系统的整体响应速度。
内存管理是操作系统的另一个关键领域。
我们学习了如何实现内存的分配和回收,以及虚拟内存的概念。
在实际编程中,使用动态内存分配函数(如malloc 和free)时,需要特别注意内存泄漏和碎片问题。
虚拟内存技术使得计算机能够运行比物理内存更大的程序,通过将暂时不使用的内存页面交换到磁盘上,有效地扩展了内存空间。
然而,这也带来了页面置换算法的挑战,如何选择最优的页面进行置换,以减少磁盘 I/O 操作,提高系统性能,是一个需要深入思考的问题。
文件系统是操作系统用于组织和管理数据的重要机制。
我们实现了简单的文件创建、读写和删除操作。
了解文件的存储结构、目录的组织方式以及文件权限的设置,对于保证数据的安全性和完整性非常重要。
同时,文件系统的缓存机制和磁盘调度算法也会影响文件操作的性能,需要在设计和实现中进行优化。
设备管理方面,我们学习了如何与外部设备进行通信和控制。
实习五-虚拟存储器实验报告
实习五-虚拟存储器实验报告实习五虚拟存储器实验报告一、实验目的本次虚拟存储器实验的主要目的是深入理解虚拟存储器的工作原理和机制,通过实际操作和观察,掌握虚拟存储器的地址转换、页面置换算法等关键概念,以及它们对系统性能的影响。
二、实验环境本次实验在_____操作系统下进行,使用了_____开发工具和_____模拟软件。
三、实验原理虚拟存储器是一种将主存和辅存结合起来使用的技术,它为用户提供了一个比实际物理内存大得多的逻辑地址空间。
虚拟存储器的实现基于分页或分段机制,将逻辑地址空间划分为固定大小的页或段,然后通过页表或段表将逻辑地址映射到物理地址。
在虚拟存储器中,当访问的页面不在主存中时,会发生页面缺失,此时需要从辅存中将所需页面调入主存。
页面置换算法则用于决定在主存已满时,将哪些页面换出主存,以腾出空间调入新的页面。
常见的页面置换算法有先进先出(FIFO)算法、最近最少使用(LRU)算法和最佳置换(OPT)算法等。
四、实验内容与步骤1、初始化实验环境启动操作系统和模拟软件。
设置相关参数,如页面大小、主存容量、辅存容量等。
2、生成访问序列使用随机数生成器或特定的模式生成一系列的逻辑地址访问序列。
3、地址转换根据页表,将逻辑地址转换为物理地址。
记录地址转换的过程和结果,包括是否发生页面缺失。
4、页面置换算法实现分别实现 FIFO、LRU 和 OPT 页面置换算法。
在发生页面缺失时,根据相应的算法选择换出的页面。
5、性能评估统计不同页面置换算法下的页面缺失次数、缺页率等性能指标。
分析不同算法对系统性能的影响。
五、实验结果与分析1、地址转换结果展示部分逻辑地址转换为物理地址的示例,说明转换的过程和正确性。
2、页面置换算法的性能比较给出 FIFO、LRU 和 OPT 算法在相同访问序列下的页面缺失次数和缺页率。
绘制图表直观地比较不同算法的性能差异。
例如,以下是三种算法在某一特定访问序列下的性能数据:|算法|页面缺失次数|缺页率||||||FIFO|_____|_____%||LRU|_____|_____%||OPT|_____|_____%|从上述数据可以看出,OPT 算法的性能最优,其页面缺失次数和缺页率最低;FIFO 算法的性能最差,页面缺失次数和缺页率相对较高;LRU 算法的性能介于两者之间。
虚拟内存管理实习报告
虚拟内存管理实习报告姓名李炜学号**********日期4月10日目录内容一:总体概述 (3)内容二:任务完成情况 (3)任务完成列表(Y/N) (3)具体Exercise的完成情况 (3)内容三:遇到的困难以及解决方法 (9)内容四:收获及感想 (9)内容五:对课程的意见和建议 (9)内容六:参考文献 (10)内容一:总体概述这次实习主要是加入对tlb和虚拟内存的进一步支持,并且实验一下在原理课上学到过的各种替换策略,tlb是为了加速从虚拟地址到物理地址的翻译过程,而虚拟内存更是肩负着提供比实际物理内存更大的虚拟内存的重任,有了虚拟内存,才可以运行比实际内存更大的程序。
内容二:任务完成情况任务完成列表(Y/N)具体Exercise的完成情况TLB异常处理部分:Exercise 1:这个文件中和本次实习相关的主要是StartProcess这个函数,在这个函数中,首先打开一个文件,判断这个文件是否是可执行文件,如果是的话,为这个文件开辟一块地址空间来运行一个新线程,之后初始化和这个线程相关的寄存器,初始化完成之后运行这个程序。
其中在开辟新的地址空间的时候,为这个地址空间中的page table的每一项进行了初始化。
所以在后面对translationEntry增加内容的时候,最好还是在这个初始化过程中加入相应的初始化操作。
在构造可执行文件的空间时,首先读入这个文件的开始部分,即noffH,这个部分包含了文件的magic number(表示是否是可执行文件),文件中代码,数据,栈等各部分的位置、大小等。
之后根据这个大小,按照页大小分配内存页数量,初始化page table,将可执行文件的代码段和数据段按照虚存与内存一一对应的方式读入内存中。
(h)在这个文件中,主要是针对虚拟机整体的操作,其中在构造函数中,首先初始化了寄存器和内存,这个部分和本次实习没有关系,下面初始化了tlb中的项。
开始的时候,我认为对于每个地址空间都应该有自己的tlb,每次切换线(进)程的时候都要同时切换tlb内容,这个方案在nachos这样的虚拟机上实际上时可以实现的,而且tlb的miss可能会比只有一个tlb 要少很多,但是这种情况不符合计算机系统的实际情况,因为对于实际的计算机体系结构来说,tlb是一个硬件不见,每个cpu的核心应该具备一个tlb,因为多超标量等优化机制的存在,线程切换十分频繁,如果每次都要同时按照线程切换tlb,那样代价太大了,tlb本身是用来利用局部性来减少对page table的访问的,如果频繁改变tlb内容开销上太大,得不偿失。
北大操作系统高级课程-陈向群作业-系统调用实习报告
系统调用实习报告目录内容一:总体概述 (3)内容二:任务完成情况 (3)任务完成列表(Y/N) (3)具体Exercise的完成情况 (3)内容三:遇到的困难以及解决方法 (6)内容四:收获及感想 (6)内容五:对课程的意见和建议 (7)内容六:参考文献 (7)内容一:总体概述通过这次实习,更加深入地了解了Nachos 系统调用的实现。
巩固了原理课上学习的关于Linux 系统调用的实现细节。
这次试验也主要是系统调用的相关实现涉及了syscall.h,,start.s 的原理部分和相关调用部分的再实现。
内容二:任务完成情况任务完成列表(Y/N)Exercise1 Exercise2 Exercise3 Exercise4 Exercise5 完成情况Y Y Y Y Y具体Exercise的完成情况一、理解Nachos系统调用Exercise 1 源代码阅读阅读与系统调用相关的源代码,理解系统调用的实现原理。
code/userprog/syscall.h解答:该文件是nachos 系统调用的头文件,里面声明了一些nachos 的内核操作,可以被用户程序通过syscall 调用,在用户程序和内核文件中都需包含本文件,其中包含了Halt,Exit,Exec,Join,Create,Open,Read,Write,Close,Fork,Yield 调用方法的声明。
code/userprog/解答:Exception.h 和 是专门用来检测和处理异常信息的类,原始的nachos给出了syscall 异常的处理方式,并通过ExceptionHandler对各种异常进行处理。
code/test/start.s解答:start.s 文件中用汇编语言协助用户程序在nachos 中运行,以避免使用完整的c 库,我们定义了用户程序所需要的东西以便进行系统调用。
二、文件系统相关的系统调用Exercise 2系统调用实现类比Halt的实现,完成与文件系统相关的系统调用:Create, Open,Close,Write,Read。
虚拟储存管理实验报告
一、实验目的1. 理解虚拟存储管理的基本概念和原理。
2. 掌握分页式虚拟存储管理的地址转换和缺页中断处理过程。
3. 学习并分析几种常见的页面置换算法,如FIFO、LRU、OPT等。
4. 比较不同页面置换算法的性能,提高对虚拟存储管理的认识。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3. 虚拟存储器模拟工具:虚拟机(VirtualBox)三、实验内容1. 模拟分页式虚拟存储器(1)定义分页式虚拟存储器的参数,如页大小、内存大小、虚拟地址空间大小等。
(2)创建页表,记录每个页在内存中的位置和是否已加载。
(3)模拟进程的指令序列,生成虚拟地址。
(4)根据虚拟地址进行地址转换,得到物理地址。
(5)处理缺页中断,选择合适的页面置换算法。
2. 页面置换算法模拟(1)实现FIFO(先进先出)页面置换算法。
(2)实现LRU(最近最少使用)页面置换算法。
(3)实现OPT(最优页面置换)算法。
3. 比较不同页面置换算法的性能(1)设置不同的页面置换算法,模拟进程运行。
(2)记录每次缺页中断时的页面命中率。
(3)比较不同页面置换算法的页面命中率,分析其性能。
四、实验结果与分析1. 分页式虚拟存储器模拟(1)通过模拟,成功实现了分页式虚拟存储器的地址转换和缺页中断处理过程。
(2)实验结果表明,分页式虚拟存储器能够有效地提高内存利用率,减少内存碎片。
2. 页面置换算法模拟(1)实现了FIFO、LRU和OPT三种页面置换算法。
(2)通过模拟,比较了三种算法在不同进程下的页面命中率。
3. 页面置换算法性能比较(1)FIFO算法的页面命中率较低,适用于进程较稳定的情况。
(2)LRU算法的页面命中率较高,适用于进程频繁访问同一页面的情况。
(3)OPT算法的页面命中率最高,但实现复杂度较高,适用于进程访问序列可预测的情况。
五、实验结论1. 通过本次实验,加深了对虚拟存储管理的基本概念和原理的理解。
操作系统管理_-_虚拟存储器_实验报告_代码
淮海工学院计算机工程学院实验报告书课程名:《操作系统原理》题目:虚拟存储器班级:学号:姓名:评语:成绩:指导教师:批阅时间:年月日一、目的与要求(一)目的由于超大规模集成电器电路(VLSI)技术的发展,使存贮器的容量不断扩大,价格大幅度下降。
但从应用角度看,存贮器的容量和成本总会受到一定的限制。
所以,提高存贮器的使用效率始终是操作系统研究的重要课题之一,虚拟存贮器技术是用来扩大主存容量的一种重要的方法。
本实习要求学生独立地用高级语言编写几个常用的存贮器分配算法,并能设计一个存贮管理的模拟程序,能对各种算法进行分析比较,评测其性能优劣,从而加深对这些算法的了解。
(二)要求为了比较真实地模拟存贮器管理,可预先生成一个大致符合实际情况的指令地址流。
然后,通过模拟这样一种指令序列的执行来计算和分析比较各种算法的访问命中率。
二、示例1.题目本示例给出采用页式分配存贮器管理方案,并通过分析、计算不同页面淘汰算法情况下的访问命中率来比较各种算法的优劣,另外也考虑改变页面尺寸大小和实际存贮器容量对计算结果的影响,从而可为选择好的算法、合适的页面尺寸和存贮器实际容量提供依据。
本程序是按下述原则生成指令序列的:(1)50%的指令是顺序执行的。
(2)25%的指令是均匀分布在前地址部分。
(3)25%的指令是均匀分布在后地址部分。
示例中选用最佳淘汰算法(OPT)和最近最少使用页面淘汰算法(LRU)计算页面命中率。
公式为:页面失败次数命中率=1-───────页地址流长度假定虚拟存贮容量为32K,页面尺寸从1K到8K,实存容量从4页到32页。
2.算法与框图(1)最佳淘汰算法(OPT)。
这是一种理想的算法,可用来作为衡量其他算法优劣的依据,在实际系统中是难以实现的,因为它必须先知道指令的全部地址流。
由于本示例中已生成了全部地址流,故可计算最佳命中率。
该算法的准则是淘汰已满页表中以后不再访问或是最迟访问的页。
这就要求将页表中的页逐个与后继指令访问的所有页比较,如后继指令不再访问此页,则把此页淘汰,不然得找出后继指令中最迟访问的页面予以淘汰。
操作系统管理-虚拟存储器-实验报告-代码7页
操作系统管理-虚拟存储器-实验报告-代码7页一、实验目的学习操作系统中虚拟存储器的概念,掌握虚拟存储器的实现思路和方式。
二、实验要求在C语言环境下,实现基于分页机制的虚拟存储和页表管理。
三、实验内容1.实现一个虚拟存储器,其中分页大小为4KB,虚拟地址空间大小为4GB(每个进程可以使用的虚拟地址空间)。
物理内存大小为512MB,即实际内存中有128个物理页面。
2.实现页表管理,将虚拟地址映射到物理地址。
3.实现页面替换算法,当物理内存不足时,需要将某些页面从内存中置换出来。
4.实现程序的运行,能够根据页面缺失率输出性能参数。
四、实验步骤1.确定程序设计思路和数据结构。
2.实现虚拟存储器和页表管理。
3.实现页面替换算法。
五、实验代码及解析对于程序设计思路,首先需要确定虚拟存储器和物理内存的大小,以及页面大小。
虚拟存储器大小默认为4GB,物理内存大小为512MB,页面大小为4KB。
其次,需要设计页表数据结构。
页表可以使用一个二维数组表示,其中第一维表示页表项,第二维表示页内地址。
页表项有四个字段,分别为标志位(是否在内存中)、页框号(页面所在的物理页框号)、保护(页面的读写权限)、计数(页面使用情况的计数器)。
第三,需要设计页面替换算法。
本程序采用最近最少使用算法(LRU)作为页面替换算法,当物理内存不足时,选择使用最近最少使用的页面进行替换。
#define PAGE_SIZE 4096 // 页面大小#define VIRTUAL_MEM_SIZE 4 * 1024 * 1024 * 1024 // 虚拟存储器大小#define PHYSICAL_MEM_SIZE 512 * 1024 * 1024 // 物理内存大小#define PAGE_NUM (VIRTUAL_MEM_SIZE / PAGE_SIZE) // 页面总数#define PHYSICAL_PAGE_NUM (PHYSICAL_MEM_SIZE / PAGE_SIZE) // 物理页面数struct page_table_entry {int present; // 是否在内存中(1为在,0为不在)int page_frame; // 页面所在的物理页框号int protect; // 页面的读写权限int count; // 页面使用情况的计数器}struct page_table_entry page_table[PAGE_NUM][PAGE_SIZE]; // 页表虚拟存储器和页表管理需要掌握的是页表的相关数据结构,还有一个重要的点,就是如何将虚拟地址映射到物理地址。
操作系统虚拟内存管理实验报告
操作系统虚拟内存管理实验报告一、引言操作系统中的虚拟内存管理是一种将主存作为cache使用,将物理内存扩展到硬盘等外部存储设备的技术。
本实验旨在研究和实践虚拟内存管理的相关知识,并探讨不同策略在虚拟内存管理中的应用与效果。
二、实验目的本实验的主要目的有以下几点:1.了解并掌握操作系统中虚拟内存的概念和作用;2.基于已有的实验系统,实现并比较不同的虚拟内存管理策略;3.通过实验,深入理解虚拟内存管理对计算机系统性能的影响。
三、实验环境本次实验使用的虚拟机环境配置如下:操作系统:Windows 10开发工具:Visual Studio Code编程语言:C++四、实验步骤1.实验系统设计本实验使用C++语言编写一个简单的模拟系统,实现虚拟内存管理的各项功能。
该系统包含一个进程管理器、一个虚拟内存管理器以及一个页面置换算法模块。
2.进程管理器实现进程管理器负责管理进程的创建、调度和撤销等操作。
在本实验中,我们选择了最简单的时间片轮转调度算法。
3.虚拟内存管理器实现虚拟内存管理器负责将虚拟地址映射为物理地址,并进行合理的页面置换操作。
在本实验中,我们采用了两种常见的虚拟内存管理策略,分别为页面置换算法FIFO和LRU。
4.页面置换算法实现页面置换算法模块主要针对物理内存不足时进行页面置换,并合理选择待置换的页面。
本实验中,我们实现了先进先出(FIFO)和最近最久未使用(LRU)两种页面置换算法,并对其进行性能比较。
五、实验结果与分析1.实验数据收集我们通过运行不同规模的任务,并记录其执行时间、内存占用等数据,以便后续进行性能分析。
2.性能分析通过实验数据的对比分析,我们可以得出不同虚拟内存管理策略的优缺点。
FIFO算法适用于执行时间较长的任务,而LRU算法则适用于要求较高内存使用效率的任务。
六、实验总结通过本次实验,我们了解了虚拟内存管理的基本概念和主要作用,并实践了不同策略的虚拟内存管理系统。
通过对实验数据的分析,我们对不同策略的性能特点有了更深入的了解。
操作系统实习报告
操作系统实习报告在大学的学习生活中,操作系统这门课程一直被视为计算机科学领域的核心基础之一。
为了更深入地理解和掌握操作系统的原理和应用,我参加了一次操作系统的实习。
通过这次实习,我不仅巩固了课堂上学到的理论知识,还获得了许多宝贵的实践经验。
一、实习目的操作系统是管理计算机硬件与软件资源的程序,是计算机系统的内核与基石。
本次实习的主要目的是通过实际操作和项目实践,深入了解操作系统的工作原理、进程管理、内存管理、文件系统等核心内容,提高自己的编程能力和问题解决能力,为今后的学习和工作打下坚实的基础。
二、实习环境本次实习使用的操作系统是Windows 10 和Linux(Ubuntu 2004)。
编程环境包括 Visual Studio Code、GCC 编译器等。
同时,还使用了一些相关的工具和软件,如 Process Explorer、Wireshark 等,用于观察和分析系统的运行状态和网络通信。
三、实习内容(一)进程管理进程是操作系统中最基本的概念之一,它是程序的一次执行过程。
在实习过程中,我通过编程实现了进程的创建、终止、挂起和恢复等操作。
同时,还学习了进程的同步和互斥机制,使用信号量、互斥锁等工具来解决进程之间的资源竞争问题。
例如,我使用 C 语言编写了一个简单的生产者消费者问题的程序。
在这个程序中,生产者进程不断地生产产品,并将其放入一个缓冲区中;消费者进程则从缓冲区中取出产品进行消费。
为了保证生产者和消费者进程之间的协调工作,使用了信号量来实现同步和互斥。
通过这个程序的编写和调试,我深刻理解了进程同步和互斥的重要性,以及如何使用相关的工具来解决实际问题。
(二)内存管理内存管理是操作系统的重要组成部分,它负责为进程分配和回收内存空间,提高内存的利用率。
在实习中,我学习了内存分配算法,如首次适应算法、最佳适应算法和最坏适应算法,并通过编程实现了这些算法。
此外,还学习了虚拟内存的概念和实现机制,了解了页表、页置换算法等。
操作系统实验实验报告虚拟内存
操作系统实验实验报告虚拟内存实验报告:虚拟内存一、引言虚拟内存是现代操作系统中一种重要的内存管理技术。
它允许将物理内存与硬盘上的存储空间结合起来,扩大了计算机系统的内存容量。
本实验旨在深入学习和实践虚拟内存的相关知识,包括虚拟地址到物理地址的转换及页面置换算法的实现。
二、实验原理2.1虚拟地址与物理地址转换虚拟内存通过将程序的虚拟地址空间划分为大小相等的页面,每个页面对应物理内存或硬盘上的一个页面帧。
通过页表来建立虚拟地址到物理地址的映射关系。
当程序访问一个虚拟地址时,系统会通过查找页表得到该虚拟地址对应的物理地址。
2.2页面置换算法当物理内存不足以存放所有需要运行的程序时,需要使用页面置换算法将一部分页面调出到硬盘上,以便为新的页面腾出空间。
常见的页面置换算法有FIFO(先进先出)、LRU(最近最久未使用)和LFU(最少使用)等。
三、实验过程3.1虚拟地址到物理地址的转换首先,在操作系统中,我们设计了一个简单的页表结构,用来存储虚拟地址到物理地址的映射关系。
我们将虚拟地址空间划分为大小为4KB的页面,页表中的每一项对应一个页面,包含了页面的有效位、物理页帧号等信息。
当程序访问一个虚拟地址时,首先通过虚拟地址的高位几位确定页表的索引,然后根据索引找到对应的页表项。
如果该页面已经在物理内存中,可以直接从页表项中获取物理页帧号,然后加上页内偏移量,得到物理地址。
如果该页面不在内存中,则需要将其从硬盘上调入内存,更新页表项中的信息,并得到物理地址。
3.2页面置换算法的实现在本实验中,我们选择了FIFO页面置换算法。
该算法简单、实现容易。
我们使用一个先进先出的队列来存储页面的序号。
当需要置换页面时,我们选择队列中的第一个页面进行替换,并将新的页面插入队列的末尾。
四、实验结果我们通过编写一个简单的程序来模拟实验过程,包括对虚拟地址到物理地址的转换以及页面置换算法的实现。
通过对程序的运行和输出结果的观察,我们验证了虚拟内存和页面置换算法的正确性。
操作系统实验(四)实验报告--虚拟内存
操作系统实验(四)实验报告--虚拟内存操作系统实验(四)虚拟内存1、实验题目页面置换算法模拟——OPT、FIFO和LRU算法2、实验目的了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法,如最佳(Optimal)置换算法、先进先出(Fisrt In First Out)置换算法和最近最久未使用(Least Recently Used)置换算法3、实验内容1)OPT算法:需要发生页面置换时,算法总是选择在将来最不可能访问的页面进行置换。
2)FIFO算法:算法总是选择在队列中等待时间最长的页面进行置换。
3)LRU算法:如果某一个页面被访问了,它很可能还要被访问;相反,如果它长时间不被访问,那么,在最近未来是不大可能被访问的。
4、程序代码#include<iostream>#include <cstdlib>#include <time.h>#include <cstdio>#define L 30///页面走向长度最大为30using namespace std;int M=4; ///内存块struct P///定义一个结构体{int num,time;}p[30];int Input(int m,P p[L])///打印页面走向状态{m=30;int i,j;j=time(NULL);///取时钟时间srand(j);///以时钟时间x为种子,初始化随机数发生器cout<<"页面走向: ";for(i=0; i<m; i++){p[i].num=rand( )%10;///产生1到10之间的随即数放到数组p中p[i].time=0;cout<<p[i].num<<" ";}cout<<endl;return m;}void print(P *page1)///打印当前的页面{P *page=new P[M];page=page1;for(int i=0; i<M; i++)cout<<page[i].num<<" ";cout<<endl;}int Search(int e,P *page1 )///寻找内存块中与e相同的块号{P *page=new P[M];page=page1;for(int i=0; i<M; i++)if(e==page[i].num)return i; ///返回i值return -1;}int Max(P *page1)///寻找最近最长未使用的页面用于OPT算法{P *page=new P[M];page=page1;int e=page[0].time,i=0;while(i<M) ///找出离现在时间最长的页面{if(e<page[i].time) e=page[i].time;i++;}for( i=0; i<M; i++)if(e==page[i].time)return i; ///找到离现在时间最长的页面返回其块号return -1;}int Count(P *page1,int i,int t,P p[L])///记录当前内存块中页面离下次使用间隔长度用于OPT算法{P *page=new P[M];page=page1;int count=0;for(int j=i; j<L; j++){if(page[t].num==p[j].num )break;///当前页面再次被访问时循环结束else count++;///否则count+1}return count;///返回count的值}int main(){int c=1;int m=0,t=0;float n=0;///缺页次数m=Input(m,p);///调用input函数,返回m值M=4;P *page=new P[M];///dowhile(c==1||c==2||c==3){int i=0;for(i=0; i<M; i++) ///初试化页面基本情况{page[i].num=0;page[i].time=m-1-i;}cout<<"1:FIFO页面置换"<<endl;cout<<"2:LRU页面置换"<<endl;cout<<"3:OPT页面置换"<<endl;cout<<"按其它键结束程序;"<<endl;cin>>c;if(c==1)///FIFO页面置换///FIFO();{n=0;cout<<" FIFO算法页面置换情况如下: "<<endl;cout<<endl;while(i<m){if(Search(p[i].num,page)>=0) ///当前页面在内存中{cout<<p[i].num<<" "; ///输出当前页p[i].numcout<<" "<<endl;i++; ///i加1}else ///当前页不在内存中{if(t==M)t=0;else{n++; ///缺页次数加1page[t].num=p[i].num; ///把当前页面放入内存中cout<<p[i].num<<" ";print(page); ///打印当前页面t++; //下一个内存块i++; ///指向下一个页面}}}cout<<"缺页次数:"<<n<<" 缺页率:"<<n<<"/"<<m<<" ="<<n/m<<endl;}if(c==2)///LRU页面置换,最近最久未使用{n=0;cout<<" LRU算法页面置换情况如下: "<<endl;cout<<endl;while(i<m){int a;t=Search(p[i].num,page);if(t>=0)///如果已在内存块中{page[t].time=0;///把与它相同的内存块的时间置0for(a=0; a<M; a++)if(a!=t)page[a].time++;///其它的时间加1cout<<p[i].num<<" ";cout<<"不缺页"<<endl;}else ///如果不在内存块中{n++; ///缺页次数加1t=Max(page); ///返回最近最久未使用的块号赋值给tpage[t].num=p[i].num; ///进行替换page[t].time=0; ///替换后时间置为0cout<<p[i].num<<" ";print(page);for(a=0; a<M; a++)if(a!=t)page[a].time++; ///其它的时间加1}i++;}cout<<"缺页次数:"<<n<<" 缺页率:"<<n<<"/"<<m<<" = "<<n/m<<endl;}if(c==3)///OPT页面置换{n=0;cout<<" OPT算法置换情况如下:"<<endl;cout<<endl;while(i<m){if(Search(p[i].num,page)>=0)///如果已在内存块中{cout<<p[i].num<<" ";cout<<" "<<endl;i++;}else///如果不在内存块中{int a=0;for(t=0; t<M; t++)if(page[t].num==0)a++;///记录空的内存块数if(a!=0) ///有空内存块{int q=M;for(t=0; t<M; t++)if(page[t].num==0&&q>t)q=t;///把空内存块中块号最小的找出来page[q].num=p[i].num;///把缺页换过来n++; ///缺页次数加一cout<<p[i].num<<" ";print(page);i++;}else{int temp=0,s;for(t=0; t<M; t++) ///寻找内存块中下次使用离现在最久的页面if(temp<Count(page,i,t,p)){temp=Count(page,i,t,p);s=t;}///把找到的块号赋给spage[s].num=p[i].num;n++;cout<<p[i].num<<" ";print(page);i++;}}}cout<<"缺页次数:"<<n<<" 缺页率:"<<n<<"/"<<m<<" = "<<n/m<<endl;}}///while(c==1||c==2||c==3);return 0;}5、心得体会通过该实验,是我对虚拟内存更加了解,对最佳置换算法、先进先出算法、最近最久算法更加了解。
虚拟内存_实验报告
一、实验目的1. 理解虚拟内存的概念及其在操作系统中的作用。
2. 掌握虚拟内存的组成和工作原理。
3. 熟悉虚拟内存的管理算法,如页置换算法。
4. 通过实验验证虚拟内存对提高系统性能的影响。
二、实验内容1. 虚拟内存的基本概念虚拟内存是操作系统为了解决物理内存不足问题而设计的一种内存管理技术。
它将物理内存和磁盘空间统一管理,使得应用程序可以访问比实际物理内存更大的虚拟地址空间。
2. 虚拟内存的组成虚拟内存由以下几部分组成:(1)页表:用于记录虚拟地址与物理地址的映射关系。
(2)内存:包括物理内存和磁盘空间。
(3)交换文件:用于存放未被访问或频繁访问的页面。
3. 虚拟内存的工作原理虚拟内存的工作原理如下:(1)应用程序在执行过程中,请求访问虚拟地址空间。
(2)操作系统通过页表查找虚拟地址对应的物理地址。
(3)如果物理地址对应的页面已在内存中,则直接访问;否则,发生缺页中断。
(4)操作系统将内存中不常用的页面写入交换文件,并从交换文件中读取所需页面。
(5)更新页表,记录新的虚拟地址与物理地址映射关系。
4. 虚拟内存的管理算法虚拟内存的管理算法主要包括以下几种:(1)先进先出(FIFO)算法:按照页面进入内存的顺序进行置换。
(2)最近最少使用(LRU)算法:根据页面最近使用情况判断是否进行置换。
(3)最不经常使用(LFU)算法:根据页面使用频率判断是否进行置换。
5. 实验步骤(1)选择一个操作系统,如Linux。
(2)在Linux系统中,查看虚拟内存配置信息。
(3)编写实验程序,模拟应用程序访问虚拟内存的过程。
(4)通过实验程序,观察不同页置换算法对系统性能的影响。
(5)记录实验结果,分析实验数据。
三、实验结果与分析1. 实验结果通过实验,我们得到了以下结果:(1)不同页置换算法对系统性能的影响。
(2)虚拟内存对系统性能的影响。
2. 实验分析(1)页置换算法对系统性能的影响:实验结果表明,LRU算法在多数情况下优于FIFO算法和LFU算法。
操作系统实习报告
操作系统实习报告在大学的学习生涯中,操作系统这门课程一直被视为计算机科学领域的核心基础之一。
为了更深入地理解操作系统的原理和实际应用,我参加了一次操作系统的实习。
通过这次实习,我不仅巩固了课堂上学到的理论知识,还获得了宝贵的实践经验。
实习的开始阶段,我们首先对操作系统的整体架构和主要功能有了一个全面的回顾。
操作系统作为计算机系统的核心管理软件,负责管理计算机的硬件资源和软件资源,为用户提供一个方便、高效、安全的工作环境。
它的主要功能包括进程管理、内存管理、文件管理、设备管理和用户接口等。
在进程管理方面,我们学习了进程的概念、进程的状态转换、进程的调度算法以及进程间的通信方式。
通过实际编程实现了简单的进程创建、终止和进程间的消息传递,深刻理解了进程的并发执行和资源共享所带来的复杂性和挑战。
内存管理是操作系统的另一个重要组成部分。
我们研究了内存分配算法,如首次适应算法、最佳适应算法和最坏适应算法,并通过模拟程序观察了不同算法在内存分配和回收过程中的性能表现。
此外,还了解了虚拟内存的概念和实现机制,认识到虚拟内存技术在解决内存不足问题和提高系统性能方面的重要作用。
文件管理部分,我们学习了文件的组织方式、目录结构以及文件的读写操作。
通过实际编写文件操作的程序,掌握了文件的创建、打开、读取、写入和关闭等基本操作,体会到了文件系统在数据存储和管理中的重要性。
设备管理方面,我们了解了设备的分类、设备驱动程序的结构和工作原理。
通过模拟设备的输入输出操作,对设备的控制和数据传输有了更直观的认识。
在实习过程中,我们使用了多种工具和技术来辅助学习和实践。
例如,使用 C 或 C++编程语言来实现操作系统的相关功能模块,利用调试工具来跟踪程序的执行过程和查找错误,使用性能分析工具来评估算法的效率和系统的性能。
同时,我们还参与了一些实际的操作系统案例分析。
通过研究现有的操作系统,如 Windows、Linux 等,了解它们在实际应用中的特点和优势,以及它们是如何解决各种系统管理问题的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
虚拟内存管理实习报告目录内容一:总体概述 (3)内容二:任务完成情况 (3)任务完成列表(Y/N) (3)具体Exercise的完成情况 (3)内容三:遇到的困难以及解决方法 (11)内容四:收获及感想 (11)内容五:对课程的意见和建议 (11)内容六:参考文献 (11)内容一:总体概述本次lab主要是针对操作系统内存管理的学习,内存管理主要有固定分区、可变分区、页式和段式管理。
现代操作系统主要采用页式内存管理,它把用户程序地址空间划分成大小相等的部分,称为页。
内存空间按页的大小划分为大小相等的区域,称为内存块(物理页面,页框,页帧)。
以页为单位进行分配,逻辑上相邻的页,物理上不一定相邻。
虚拟内存的基本思想:每个程序拥有自己的地址空间,这个空间被分割成多个块,每一块称作一页或者页面,每一页有连续的地址范围。
这些页被映射到物理内存,但并不是所有页都必须在内存中才能运行。
当程序引用到一部分在物理内存中的地址空间时,由硬件立即执行必要的映射。
当程序引导到一部分不在物理内存中德的地址空间时,由操作系统负责将缺失的部分装入屋里内存并重新执行失效的指令。
内容二:任务完成情况任务完成列表(Y/N)Exercise1 Exercise2 Exercise3 Exercise4 Exercise5 Exercise6 Exercise7 Challange 完成情况Y Y Y Y Y Y N N具体Exercise的完成情况一、TLB异常处理目前,Nachos系统对于内存的管理是基于软件模拟的TLB机制。
其工作原理、异常处理、替换算法等方面,与分页式内存管理非常相像。
Exercise 1 源代码阅读Ø阅读code/userprog/,着重理解nachos执行用户程序的过程,以及该过程中与内存管理相关的要点。
Ø阅读code/machine目录下的machine.h(cc),translate.h(cc)文件和code/userprog目录下的exception.h(cc),理解当前Nachos系统所采用的TLB机制和地址转换机制。
解答:中有2个主要的方法,分别是StartProcess和ConsoleTest,它们的作用是给用户进程分配内存空间并且执行用户进程和测试控制台输入。
StartProcess方法中首先通过OpenFile *executable = fileSystem->Open(filename);打开文件,然后通过space = new AddrSpace(executable);currentThread->space = space;为文件分配内存空间并且把内存空间给当前进程。
然后通过space->InitRegisters();初始化寄存器的值,继而通过space->RestoreState();加载页表寄存器,然后就可以开始运行用户程序了。
对于machine.h中定义了页的大小为128,页的数量为32,内存大小为128*32,快表的大小为4。
Exception.h 和 是专门用来检测和处理异常信息的类,原始的nachos 只给出了syscall 异常的处理方式。
实验要做的就是在这里添加对缺页异常的处理工作。
下面的translate 函数将会根据情况返回PageFaulteException,这样便会进入到异常处理函数当中。
Machine.h 和 这个类定义和实现了对机器本身的抽象,run 方法运行一条指令,两套读写函数分别是读写内存和读写寄存器。
RaiseException 函数是抛出一个异常信息。
另外,nachos 的Mainmemory是一个char 类型的数组。
还有一些页大小,主存大小,快表大小也再这里进行了声明。
构造函数对寄存器和内存内容进行初始化。
读写寄存器状态等方法也是在这里。
Translate.h 和 是tlb 和页表声明的类型定义。
这个类中,最为重要的方法是translate 方法,这个方法将用户的虚拟地址addr 转化为物理地址。
Exercise 2 TLB MISS异常处理修改code/userprog目录下中的ExceptionHandler函数,使得Nachos系统可以对TLB异常进行处理(TLB异常时,Nachos系统会抛出PageFaultException,详见code/machine/)。
解答:在中Translate方法中判断了是否使用了TLB表,如果使用了TLB表则循环查找TLB页表,如果没有找到一个TLB表项,使得表项信息有效,表项所存储的虚页号与所传入的VPN号一致,则会返回PageFaultException异常,表明此时TLB发生错误,所要查找的虚拟地址并没有在TLB的页表内。
在中的ExceptionHandler方法中增加如下代码段,判断是否PageFaultException异常,获得BadVaddrReg寄存器内所存储的当出错陷入(Exception)时用户程序的逻辑地址。
Exercise 3 置换算法为TLB机制实现至少两种置换算法,通过比较不同算法的置换次数可比较算法的优劣。
解答:这里实现LRU算法和FIFO算法。
修改TranslationEntry对象添加属性用来记录页面的上次使用时间(LRU算法寻找最早未使用页面时使用)和创建时间(FIFO方法寻找最早创建页面时使用)。
在TranslationEntry初始化时添加对新增属性的初始化动作。
修改Machine构造函数修改Addrspace构造函数在TLB命中时更新TranslationEntry属性lastUseTime。
修改中的Translate方法。
修改ExceptionHandler对PageFaultException的处理逻辑,当在出现PageFaultException 异常时,系统获得出错程序的虚拟地址,并尝试调用页面置换算法(算法实现分别为Machine 中的LRUSwap和FIFOSwap两个方法)。
中添加两个方法:修改 的ReadRem和WriteRem函数,当进行了转换后所得到的exception不是NoException时,首先用machine调用RaiseException函数,执行完此函数后,判断之前所获得异常是否是PageFaultException,如果是PageFaultException则此时通过RaiseException 函数所调用的ExceptionHandler函数已经进行了TLB的调度,但是并没有写入到内存中,所以,还需要再次进行一下Translate,这时如果exception如果不是NoException时,则直接退出ReadMem或WriteMem函数。
二、分页式内存管理目前Nachos系统中,类Class Thread的成员变量AddrSpace* space中使用TranslationEntry* pageTable来管理内存。
应用程序的启动过程中,对其进行初始化;而在线程的切换过程中,亦会对该变量进行保存和恢复的操作(使得类Class Machine中定义的Class Machine::TranslationEntry* pageTable始终指向当前正在运行的线程的页表)。
Exercise 4内存全局管理数据结构设计并实现一个全局性的数据结构(如空闲链表、位图等)来进行内存的分配和回收,并记录当前内存的使用状态。
解答:在全局系统文件中声明一个全局位图文件变量,对内存的物理地址进行分配。
在system.h中加入中添加之后在Nachos的main文件中对memoryBitMap对象进行初始化,初始化位图文件的大小为4096Bytes。
在Addrespace类中对TLB页表项的物理地址分配中,不再将页表项的物理地址分配为循环数i,而是通过memoryBitMap对位图文件中的标志信息的查找来对物理地址进行分配。
Exercise 5多线程支持目前Nachos系统的内存中同时只能存在一个线程,我们希望打破这种限制,使得Nachos 系统支持多个线程同时存在于内存中。
解答:在Thread类中增加InitUserRegister方法修改Exercise 6缺页中断处理基于TLB机制的异常处理和页面替换算法的实践,实现缺页中断处理(注意!TLB机制的异常处理是将内存中已有的页面调入TLB,而此处的缺页中断处理则是从磁盘中调入新的页面到内存)、页面替换算法等。
解答:修改中的AddrSpace构造方法三、Lazy-loadingExercise 7 我们已经知道,Nachos系统为用户程序分配内存必须在用户程序载入内存时一次性完成,故此,系统能够运行的用户程序的大小被严格限制在4KB以下。
请实现Lazy-loading 的内存分配算法,使得当且仅当程序运行过程中缺页中断发生时,才会将所需的页面从磁盘调入内存。
解答:四、Challenges(至少选做1个)Challenge 1为线程增加挂起SUSPENDED状态,并在已完成的文件系统和内存管理功能的基础之上,实现线程在“SUSPENDED”,“READY”和“BLOCKED”状态之间的切换。
Challenge2多级页表的缺陷在于页表的大小与虚拟地址空间的大小成正比,为了节省物理内存在页表存储上的消耗,请在Nachos系统中实现倒排页表。
内容三:遇到的困难以及解决方法困难首先,还是对C++熟悉程度,尽管通过几次的lab对于代码结构已经有了基本的认识,但是在调试代码的时候还是会出现很多的问题。
其次,是时间的问题,这次了lab内容比较多,另外本周还有一份xv6的阅读报告,同时白天还要上班,所以感觉这部分内容的时间非常的紧张。
但是在工作之余尽量抽出时间把本次lab完成了。
内容四:收获及感想通过对nachos虚拟内存算法的实现,使我更加深入的了解了操作系统内存的内存实现机制。
学以致用,使得我们学习的过程更加简单,记忆印象更加深刻。
我也学会了不少os 方面的细节问题,原来学习操作系统只是宏观的概念层面的理解,说是理解,也不是非常明白,比如每个线程究竟是如何执行的,如何调度的,但是通过对nachos源码的阅读,和对其中部分代码进行这些exercise里面要求的改写之后,发现原来模糊的概念开始变的具体明朗,其内部是如何真实运行的,机理是如何在其中发挥作用的,都清楚了不少。
我在这个实习的过程中,不断翻阅老师课上的课件,了解其中的原理,再结合网上大牛们的技术博客,慢慢研读,自觉收货不少,以后在课堂的学习中我当更加认真的听讲,及时的完成每一节课的任务作业,认真总结,这样才能到最后事半功倍,不会捉襟见肘。
内容五:对课程的意见和建议我觉得课堂上讲解的偏重一些理论,在实践或者说是编码这方面还可以适当的增加一些,比如在一些关键代码或者功能的实现上,可以找一些功力较好的同学上台上演示编码,这样的同学可以在平时分上给一些加分,或者由老师带领同学对其中比较困难或者关键性的代码演示编写,觉得这种对实践上的一点倾斜,可能对课后的lab 完成有相当的促进作用。