当前位置:文档之家› 操作系统内存管理原理

操作系统内存管理原理

操作系统内存管理原理
操作系统内存管理原理

内存分段和请求式分页

在深入i386架构的技术细节之前,让我们先返回1978年,那一年Intel 发布了PC处理器之母:8086。我想将讨论限制到这个有重大意义的里程碑上。如果你打算知道更多,阅读Robert L.的80486程序员参考(Hummel 1992)将是一个很棒的开始。现在看来这有些过时了,因为它没有涵盖Pentium处理器家族的新特性;不过,该参考手册中仍保留了大量i386架构的基本信息。尽管8086能够访问1MB RAM的地址空间,但应用程序还是无法“看到”整个的物理地址空间,这是因为CPU寄存器的地址仅有16位。这就意味着应用程序可访问的连续线性地址空间仅有64KB,但是通过16位段寄存器的帮助,这个64KB大小的内存窗口就可以在整个物理空间中上下移动,64KB逻辑空间中的线性地址作为偏移量和基地址(由16位的段寄存器给处)相加,从而构成有效的20位地址。这种古老的内存模型仍然被最新的Pentium CPU支持,它被称为:实地址模式,通常叫做:实模式。

80286 CPU引入了另一种模式,称为:受保护的虚拟地址模式,或者简单的称之为:保护模式。该模式提供的内存模型中使用的物理地址不再是简单的将线性地址和段基址相加。为了保持与8086和80186的向后兼容,80286仍然使用段寄存器,但是在切换到保护模式后,它们将不再包含物理段的地址。替代的是,它们提供了一个选择器(selector),该选择器由一个描述符表的索引构成。描述符表中的每一项都定义了一个24位的物理基址,允许访问16MB RAM,在当时这是一个很不可思议的数量。不过,80286仍然是16位CPU,因此线性地址空间仍然被限制在64KB。

1985年的80386 CPU突破了这一限制。该芯片最终砍断了16位寻址的锁链,将线性地址空间推到了4GB,并在引入32位线性地址的同时保留了基本的选择器/描述符架构。幸运的是,80286的描述符结构中还有一些剩余的位可以拿来使用。从16位迁移到32位地址后,CPU的数据寄存器的大小也相应的增加了两倍,并同时增加了一个新的强大的寻址模型。真正的32位的数据和地址为程序员带了实际的便利。事实上,在微软的Windows平台真正完全支持32位模型是在好几年之后。Windows NT的第一个版本在1993年7月26日发布,实现了真正意义上的Win32 API。但是Windows 3.x程序员仍然要处理由独立的代码和数据段构成的64KB内存片,Windows NT提供了平坦的4GB地址空间,在那儿可以使用简单的32位指针来寻址所有的代码和数据,而不需要分段。在内部,当然,分段仍然在起作用,就像我在前面提及的那样。不过管理段的所有责任都被移给了操作系统。

80386的另一个新特性是在硬件上支持分页,确切的来说是:请求式分页的虚拟内存。这种技术允许一个不同于RAM的存储介质----硬盘来为内存提供支持,例如,在允许分页时,CPU通过将最近最少访问的内存数据置换到备份存储器中,从而为新的数据腾出空间,这样就能访问比可用物理内存更大的内存空间。理论上来说,可以使用此种方式访问4GB的连续线性地址空间,提供的备份介质必须足够的大---即使只安装了非常少的物理内存。当然,分页并不是访问内存的最快方式,最好还是能提供尽可能多的物理内存。但是,这是处理大量数据的最好办法,即使这些数据超过了可用物理内存。例如,图形和数据库程序都需要一大块工作内存,如果没有分页机制的话,其中的某些程序就无法在低档的PC系统中运行。

80386分页的模式是将内存划分为4KB或4MB大小的页。操作系统的设计者可以在二者之间自由的选择,也可混合使用这两个大小的页面。稍后,我会介绍Windows 2000采用的混合大小方案:由操作系统使用4MB的页面,而4KB页面

由剩余的代码和数据使用。这些页面由分层结构的页表树管理,该页表树记录当前位于物理内存中的页,同时还记录了每个页是否实际的位于物理内存中。如果指定页已被置换到了硬盘上,而某些模块触及了位于这些页中的地址,CPU就会产生一个缺页中断(这与外围硬件产生的中断类似)。接下来,位于操作系统内核中的缺页中断处理例程会试图将该页再次调入物理内存,这可能需要将另一块内存中的数据写入硬盘以腾出空间。通常,系统采用最近最少(LRU)算法来确定哪个页可以被置换出去。现在可以很清楚地看到为什么有时将这个过程称为

----请求式分页(demand paging):即,由软件提出请求,然后根据操作系统和应用程序使用的内存的统计数据,将物理内存中的数据移动到后备存储设备中。

由页表提供的间接寻址方式蕴含着很有趣的两件事。第一,程序所使用的地址和CPU使用的物理地址总线上的地址之间并没有预设的关系。如果你知道你的程序所使用的数据结构位于某一地址,如,0x00140000,你可能仍然不想知道任何有关这些数据的物理地址的信息,除非你要检查页表树(page-table tree)。这需要操作系统来决定这些地址之间的映射关系。甚至当前有效的地址转换都是无法预测的,部分的来看,这是分页机制所固有的随机性导致的。幸运的是,在大多数应用程序中,并不需要有关物理地址的知识。不过,对于开发硬件驱动程序的人员来说还是需要某些这方面的知识。分页的另一个隐晦之处是:地址空间并不必须是连续的。实际上,根据页表的内容,4GB的空间可以包含大量的“空洞”,这些“空洞”既没有映射到物理内存也没有映射到后备存储器中。如果一

个应用程序试图读取或写入这样的一个地址,它将立即被系统中止掉。稍后,我会详细的说明Windows 2000是如何将可用内存扩展到4GB地址空间的。

80486和Pentium CPU使用的分段和分页机制与80386很相似,但一些特殊的寻址特性除外,如Pentium Pro采用的物理地址扩展(Physical Address Extension, PAE)机制。随同更高的时钟频率一起,Pentium CPU的另一特性就是其采用的双重指令流水线,这一特性允许它在同一时刻执行两个操作(只要这两个指令不互相依赖)。例如,如果指令A修改一个寄存器的值,而与其相邻的指令B需要这个修改后的值来进行计算,在A完成之前,B将无法执行。但是如果指令B使用另一个寄存器,CPU就可同时执行这两个指令。Pentium系列CPU 采用的多种优化方式为编译器的优化提供了广阔的空间。如果你对这方面的话题很感兴趣,请参考Rick的《Inner Loops》(Booth 1997)。

在i386的内存管理中,有三类地址非常有名,它们的术语---逻辑、线性和物理地址出现在Intel的系统编程手册(Intel 1999c)。

1.逻辑地址:这是内存地址的精确描述,通常表示为16进制:xxxx:YYYYYYYY,

这里xxxx为selector,而YYYYYYYY是针对selector所选择的段地址的线性偏移量。除了指定xxxx的具体数值外,还可使用具体的段寄存器的

名字来替代之,如CS(代码段),DS(数据段),ES(扩展段),FS(附加数据段#1),GS(附加数据段#2)和SS(堆栈段)。这些符号都来自

旧的“段:偏移量”风格,在8086实模式下使用此种方式来指定“far

pointers”(远指针)。

2.线性地址:大多数应用程序和内核驱动程序都忽略虚拟地址。它们只对虚

拟地址的偏移量部分感兴趣,而这一部分通常称为线性地址。此种类型的

地址假定了一种默认的分段模型,这种模型由CPU的当前段寄存器确定。

Windows 2000使用flat segmentation(平滑段),此时CS、DS、ES和

SS寄存器都指向相同的线性地址空间;因此,程序可以认为所有的代码、

数据和堆栈指针都可安全的相互转化。例如,在任何时候,堆栈中的一个

地址都可以转化为一个数据指针,而不需要关心相应段寄存器的值。

3.物理地址:仅当CPU工作于分页模式时,此种类型的地址才会变得非常“有

趣”。本质上,一个物理地址是CPU插脚上可测量的电压。操作系统通过

设立页表将线性地址映射为物理地址。Windows 2000所用页表的布局的

某些属性,对于调试软件开发人员非常有用,本章稍后将讨论之。

图4-1. i386的内存分段

图4-2给出的内存模型被Windows 2000作为标准的代码、数据和堆栈段,这意味着,所有的逻辑地址将包括CS、DS、ES和SS段寄存器。FS和GS的处理方式有所不同。Windows 2000并不使用GS寄存器,而FS寄存器被专门用来保存位于线性地址空间中的系统数据区域的基地址。因此,FS的基地址远大于0,其大小不会超过4GB。有趣的是,Windows 2000为用户模式和内核模式分别维护两个不同的FS段。稍后我们将详细讨论这一问题。

图4-2. 平滑的4GB内存段

在图4-1和图4-2中,逻辑地址的selector指向描述符表,该描述符表由名为GDTR的寄存器指定。这是CPU的全局描述符表寄存器,该寄存器可由操作系统设置为任何适当的线性地址。GDT(全局描述符表)的第一项是保留的,该项对应的selector叫做“null segment selector”。Windows 2000将其GDT 保存在0x80036000。GDT可容纳多达8,19264位的条目,即其最大值为64KB。Windows 2000仅使用开始的128个项,并将GDT的大小限制为1,024字节。随GDT一起,i386 CPU还提供了一个本地描述符表(Local Descriptor Table,LDT)和一个中断描述符表(Interrupt Descriptor Table,IDT),这两个表的起始地址分别保存在LDTR和IDTR这两个寄存器中。GDTR和IDTR的值是唯一的,CPU 执行的每个任务都采用相同的值,而LDTR的值则是任务相关的,LDTR可容纳一个16位的selector。

图4-3示范了复杂的线性地址与物理地址的转换机制,如果在4KB分页模式下,并允许请求式分页,i386的内存管理单元就会采用此种转换机制。图中左上角的页目录基址寄存器(Page-Directory Base Register,PDBR)包含页目录的物理地址。PDBR由i386的CR3寄存器保存。仅用该寄存器的高20位来寻址。因此,页目录也是以页为边界的。PDBR的剩余位作为标志位或保留以便将来扩展使用。页目录占用一个完整的4KB页,由包含1024个页目录项(Page-Directory Entry)的数组构成,每个页目录项均为32位。和PDBR类似,每个PDE被划分为一个20位的页帧号(Page-Frame Number,PFN)和一个标志数组。PFN用来寻址页表。每个页表都是按页对齐的,包含1024个页表项(Page-Table Entry,PTE)。每个PTE的高20位作为一个指针指向一个4KB的数据页。通过将线性地址分为三段来实现地址转换:高10位用来选择一个PDE(属于页目录),接下来的10个位选择前面所选的PDE中的某个PTE,最后剩下的12个位用来指定在数据页中的偏移量,该数据页由前面所选的PTE确定。

图4-3. 两层间接模型(采用4KB页)

在4MB分页模式下,事情就变得很简单了,这是因为消除了一个间接层,如图4-4所示。此时,PDBR仍然指向页目录,但仅使用了每个PDE的高10位,这是因为目标地址采用4MB对齐。因为没有使用页表,这个地址同样也是4MB数据页的基地址。所以,此时的线性地址只包含两个部分:10个位用来选择PDE,其余的22位作为偏移量。4MB内存方案的开销没有4KB那么大,这是因为仅页目

录需要附加的内存。这1024个PDE中的每个都可寻址一个4MB页。这足够覆盖整个4GB地址空间了。所以,4MB分页的优势就是可以降低内存管理的开销,但结果就是寻址粒度较大。

4KB和4MB分页模型各有优缺点。幸运的是,操作系统的设计人员不必非要在二者之中选择一个,可以混合使用这两种模型。例如,Windows 2000在内存

范围0x80000000 --- 0x9FFFFFFF使用4MB大小的页,内核模块hal.dll和ntoskrnl.exe均被加载到该地址范围内。剩余的线性地址采用4KB页来管理。Intel大力推荐采用这种混合设计,以改进系统性能,这也因为4KB和4MB的页项(Page Entry)都会被高速缓存到不同的转换后备缓冲区(Translation Lookaside Buffers,TLBs)中,该TLB位于i386 CPU内部(Intel 1999c,pp.3-22f)。操作系统的内核通常比较大,而且需要常驻内存,因此,如果将它们保存在多个

4KB页中将会永久性的耗尽宝贵的TLB空间。

图4-4. 一层间接模型(采用4MB页)

注意,地址转换的所有步骤都在物理内存中进行。PDBR和所有的PDE、PTE 包含的都是物理地址指针。在图4-3和图4-4中可找到的线性地址位于左下角,该线性地址将转化为物理页中的偏移量。另一方面,应用程序却必须使用线性地址,它们对物理地址一无所知。不过,通过将页目录和其下属的所有页表映射到线性地址空间可以填补这一不足。在Windows 2000和Windows NT 4.0中,在线性地址范围0xC0000000----0xC03FFFFF可访问所有的PDE和PTE,这是一个采用4MB页的线性内存区域。可以简单的通过线性地址的高20位来查找与其相关联的PTE,这个高20位作为32位PTE数组的索引,PTE数组起始于0xC0000000。例如,地址0x00000000表示的PTE位于0xC0000000。假定有一线性地址

0x80000000,通过将该地址右移12位,可得到0x80000(即该地址的高20位),因为每个PTE占用4个字节,所以目标PTE的地址为:0xC0000000+(4*0x80000)=0xC0200000。这样的结果看起来很有趣,线性地址将4GB地址空间划分为相等的两部分,又映射为一个PTE的地址,从而将PTE数组也划分为了相等的两部分。

现在,让我们更进一步,通过 PTE自身来计算数据项在PTE数组中的地址。常规的映射公式为:((LinearAddress >> 12)*4)+0xC0000000。LinearAddress 取值范围为:0xC0000000----0xC0300000。位于线性地址0xC0300000的数据项指向PTE数组在物理内存中的起始位置。现在回去看一下图4-3,开始于地址

0xC0300000的1024个数据项肯定是页目录!这种特殊的PDE、PTE排列方式被多个内存管理函数使用,这些函数由ntoskrnl.exe导出。例如,有文档记载的API函数MmIsAddressValid()和MmGetPhysicalAddress()使用32位的线性地址来查找其PDE,如可用,还会查找其PTE,并会检查它们的内容。MmIsAddressValid()简单的检验目标页是否位于物理内存中。如果测试失败,就意味着线性地址或者无效或者该地址引用的页已经被置换到了后备存储器(由系统页面文件集表示)中。MmGetPhysicalAddress()首先从线性地址中提取相应的页帧计数器(PFN),该PFN就是与其相关的物理内存页(该页将按照页大小进行划分)的基地址。接下来,它通过线性地址中剩余的12个位,来计算在物理页中的偏移量,最后将PFN指出的物理页基地址和前面算出的偏移量相加即可得到该线性地址对应的物理地址。

更彻底的检查MmGetPhysicalAddress()的实现方式,会发现Windows 2000内存布局的另一个有趣的特性。MmGetPhysicalAddress()函数在开始之前,首先测试线性地址是否位于0x80000000-----0x9FFFFFFF。就像前面提到的,这里存放着hal.dll和ntoskrnl.exe,而且这也是Windows 2000使用4MB页的地址块。这个有趣的特性是,如果给定的线性地址位于这一范围,MmGetPhysicalAddress()将不会关心所有的PDE或PTE。替代的是,该函数简单的将线性地址的高3位设为零,然后加上字节偏移量,最后将得到地址作为物理地址返回。这意味着,物理地址范围:0x00000000----0x1FFFFFFF将按照1:1的比例映射到线性地址

0x80000000----0x9FFFFFFF!要知道ntoskrnl.exe总是被加载到线性地址

0x80400000,这意味着Windows 2000的内核总位于物理地址0x00400000,这种情况发生在第二个4MB页的基地址位于物理内存中。事实上,通过检查这些内存区域可以证明上面的假定是正确的。本章提供的Memory SPY将使你有机会看到这一点。

补充:

这部分内容选择自《Windows环境下32位汇编语言程序设计》

x86的内存分页机制

当x86 CPU工作在保护模式和虚拟8086模式时,可以使用全部32根地址线访问4GB的内存。因为80386的所有通用寄存器都是32位的,所以用任何一个通用寄存器来间接寻址,不必分段就可以访问到4GB的内存地址。

但这并不意味着,此时段寄存器就不再有用了。实际上,段寄存器更加有用了,虽然在寻址上没有分段的限制了,但在保护模式下,一个地址空间是否可以被写入,可以被多少优先级的代码写入,是不是允许执行等等涉及保护的问题就出来了。要解决这些问题,必须对一个地址空间定义一些安全上的属性。段寄存器这时就派上了用场。但是设计属性和保护模式下段的其他参数,要表示的信息太多了,要用64位长的数据才能表示。我们把这64位的属性数据叫做段描述符(Segment Descriptor)。

80386的段寄存器是16位的,无法放下保护模式下64位的段描述符。如何解决这个问题呢?方法是把所有段的段描述符顺序存放在内存中的指定位置,组成一个段描述符表(Descriptor Table);而段寄存器中的16位用来做索引信息,指定这个段的属性用段描述符表中的第几个描述符来表示。这时,段寄存器中的信息不再是段地址了,而是段选择器(Segment Selector)。可以通过它在段描述符表中“选择”一个项目已得到段的全部信息。

那么段描述符表存放在哪里呢?80386引入了两个新的寄存器来管理段描述符表。一个是48位的全局描述符表寄存器GDTR,一个是16位的局部描述符表寄存器LDTR。那么,为什么有两个描述符表寄存器呢?

GDTR指向的描述符表为全局描述符表GDT(Global Descriptor Table)。它包含系统中所有任务都可用的段描述符,通常包含描述操作系统所使用的代码段、数据段和堆栈段的描述符及各任务的LDT段等。全局描述符表只有一个。

LDTR指向局部描述符表LDT(Local Descriptor Table)。80386处理器设计成每个任务都有一个独立的LDT。它包含每个任务私有的代码段、数据段和堆栈段的描述符,也包含该任务所使用的一些门描述符,如任务门和调用门描述符等。

不同任务的局部描述符分别组成不同的内存段,描述这些内存段的描述符当作系统描述符放在全局描述符表中。和GDTR直接指向内存地址不同,LDTR和CS、

DS等段选择器一样只存放索引值,指向局部描述符内存段对应的描述符在全局描述符表中的位置。随着任务的切换,只要改变LDTR的值,系统当前的局部描述符表LDT也随之切换,这样便于个任务之间数据的隔离。但GDT并不随着任务的切换而切换。

16位的段选择器如何使用全局描述符表和局部描述符表这两个表呢?实际上,段选择器中只有高13位表示索引值。剩下的3个数据位中,第0,1位表示程序的当前优先级RPL;第2位TI位用来表示在段描述符的位置;TI=0表示在GDT中,TI=1表示在LDT中。

80386处理器把4KB大小的一块内存当作一“页”内存,每页物理内存可以根据“页目录”和“页表”,随意映射到不同的线性地址上。这样,就可以将物理地址不连续的内存的映射连到一起,在线性地址上视为连续。在80386处理器中,除了与CR3(保存当前页目录的地址)相关的指令使用的是物理地址外,其他所有指令都是使用线性地址寻址的。

是否启用内存分页机制是由80386处理器新增的CR0寄存器中的位31(PG 位)决定的。如果PG=0,则分页机制不启用,这时所有指令寻址的地址(线性地址)就是系统中实际的物理地址;当PG=1的时候,80386处理器进入内存分页管理模式,所有的线性地址要经过页表的映射才得到最后的物理地址。

2014-2015(1)操作系统实验

实验项目名称:进程的同步(实验一) 1、实验目的 (1) 掌握进程和线程基本概念和属性; (2) 掌握用PV操作解决并发进程的同步问题; (3) 掌握用于同步的信号量初值的设置; (4) 掌握如何处理共享资源的直接制约关系。 2、实验内容 (1) 设计一个模拟若干售票网点的售票程序。界面可以参考图1。还应设计多个后台售票线程并发运行。 图1售票 (2) 模拟:桌上有一只盘子,每次只能放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放桔子,一个女儿专等吃盘子里的苹果,一个儿子专等吃盘子里的桔子。只要盘子空则爸爸或妈妈都可以向盘子放一个水果,仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出水果。放-取水果的几种情况如图2(a)~(f)所示,可以参照进行设计。 (a)盘子空时取水果 (b)父亲放入苹果

(c) 儿子取水果 (d) 女儿取水果 (e)儿子取走桔子 (f)盘子满时放水果 图2 放-取水果 (3) 自选其它能反映进程互斥问题的应用。 实验项目名称:处理机调度(实验二) 1、实验目的 (1) 掌握几种处理机调度算法的基本思想和特点; (2) 理解并发与并行的区别; (3) 比较几种算法的特点。 2、实验内容 编写程序模拟处理机调度,参照图3。 (1) 时间片轮转 (2) 动态优先权调度 (3) 高响应比优先调度

图3 模拟处理机调度 实验项目名称:银行家算法(实验三) 1、实验目的 银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 2、实验内容 (1) 设计进程对各类资源最大申请表示及初值确定。 (2) 设定系统提供资源初始状况。 (3) 设定每次某个进程对各类资源的申请表示。 (4) 编制程序,依据银行家算法,决定其申请是否得到满足。 具体设计可参照图4(a)~(c) 进行。

操作系统内存管理复习过程

操作系统内存管理

操作系统内存管理 1. 内存管理方法 内存管理主要包括虚地址、地址变换、内存分配和回收、内存扩充、内存共享和保护等功能。 2. 连续分配存储管理方式 连续分配是指为一个用户程序分配连续的内存空间。连续分配有单一连续存储管理和分区式储管理两种方式。 2.1 单一连续存储管理 在这种管理方式中,内存被分为两个区域:系统区和用户区。应用程序装入到用户区,可使用用户区全部空间。其特点是,最简单,适用于单用户、单任务的操作系统。CP/M和 DOS 2.0以下就是采用此种方式。这种方式的最大优点就是易于管理。但也存在着一些问题和不足之处,例如对要求内

存空间少的程序,造成内存浪费;程序全部装入,使得很少使用的程序部分也占用—定数量的内存。 2.2 分区式存储管理 为了支持多道程序系统和分时系统,支持多个程序并发执行,引入了分区式存储管理。分区式存储管理是把内存分为一些大小相等或不等的分区,操作系统占用其中一个分区,其余的分区由应用程序使用,每个应用程序占用一个或几个分区。分区式存储管理虽然可以支持并发,但难以进行内存分区的共享。 分区式存储管理引人了两个新的问题:内碎片和外碎片。 内碎片是占用分区内未被利用的空间,外碎片是占用分区之间难以利用的空闲分区(通常是小空闲分区)。 为实现分区式存储管理,操作系统应维护的数据结构为分区表或分区链表。表中各表项一般包括每个分区的起始地址、大小及状态(是否已分配)。

分区式存储管理常采用的一项技术就是内存紧缩(compaction)。 2.2.1 固定分区(nxedpartitioning)。 固定式分区的特点是把内存划分为若干个固定大小的连续分区。分区大小可以相等:这种作法只适合于多个相同程序的并发执行(处理多个类型相同的对象)。分区大小也可以不等:有多个小分区、适量的中等分区以及少量的大分区。根据程序的大小,分配当前空闲的、适当大小的分区。 优点:易于实现,开销小。 缺点主要有两个:内碎片造成浪费;分区总数固定,限制了并发执行的程序数目。 2.2.2动态分区(dynamic partitioning)。 动态分区的特点是动态创建分区:在装入程序时按其初始要求分配,或在其执行过程中通过系统调用进行分配或改变分区大小。与固定分区相比较其优点是:没有内碎

操作系统实验内存分配

西安邮电大学 (计算机学院) 课内实验报告 实验名称:内存管理 专业名称:软件工程 班级: 学生姓名: 学号(8位): 指导教师: 实验日期:

实验五:进程 1.实验目的 通过深入理解区管理的三种算法,定义相应的数据结构,编写具体代码。充分模拟三种算法的实现过程,并通过对比,分析三种算法的优劣。 (1)掌握内存分配FF,BF,WF策略及实现的思路; (2)掌握内存回收过程及实现思路; (3)参考给出的代码思路,实现内存的申请、释放的管理程序,调试运行,总结程序设计中出现的问题并找出原因,写出实验报告。 2.实验要求: 1)掌握内存分配FF,BF,WF策略及实现的思路; 2)掌握内存回收过程及实现思路; 3)参考本程序思路,实现内存的申请、释放的管理程序,调试运行,总结程序设计中出现的问题并找出原因,写出实验报告。 3.实验过程: 创建进程:

删除其中几个进程:(默认以ff首次适应算法方式排列) Bf最佳适应算法排列方式:

wf最差匹配算法排列方式: 4.实验心得: 这次实验实验时间比较长,而且实验指导书中对内存的管理讲的很详细,老师上课的时候也有讲的很详细,但是代码比较长,刚开始的时候也是不太懂,但是后面经过和同学一起商讨,明白几种算法的含义: ①首次适应算法。在采用空闲分区链作为数据结构时,该算法要求空闲分区链表以地址递增的次序链接。在进行内存分配时,从链首开始顺序查找,直至找到一个能满足进程大小要求的空闲分区为止。然后,再按照进程请求内存的大小,从该分区中划出一块内存空间分配给请求进程,余下的空闲分区仍留在空闲链中。 ②循环首次适应算法。该算法是由首次适应算法演变而形成的,在为进程分配内存空间时,从上次找到的空闲分区的下一个空闲分区开始查找,直至找到第一个能满足要求的空闲分区,并从中划出一块与请求的大小相等的内存空间分配给进程。 ③最佳适应算法将空闲分区链表按分区大小由小到大排序,在链表中查找第一个满足要求的分区。 ④最差匹配算法将空闲分区链表按分区大小由大到小排序,在链表中找到第一个满足要求的空闲分区。 实验中没有用到循环首次适应算法,但是对其他三种的描述还是很详细,总的来说,从实验中还是学到了很多。 5.程序源代码: #include #include #include

操作系统实验之内存管理实验报告

学生学号 实验课成绩 武汉理工大学 学生实验报告书 实验课程名称 计算机操作系统 开 课 学 院 计算机科学与技术学院 指导老师姓名 学 生 姓 名 学生专业班级 2016 — 2017 学年第一学期

实验三 内存管理 一、设计目的、功能与要求 1、实验目的 掌握内存管理的相关内容,对内存的分配和回收有深入的理解。 2、实现功能 模拟实现内存管理机制 3、具体要求 任选一种计算机高级语言编程实现 选择一种内存管理方案:动态分区式、请求页式、段式、段页式等 能够输入给定的内存大小,进程的个数,每个进程所需内存空间的大小等 能够选择分配、回收操作 内购显示进程在内存的储存地址、大小等 显示每次完成内存分配或回收后内存空间的使用情况 二、问题描述 所谓分区,是把内存分为一些大小相等或不等的分区,除操作系统占用一个分区外,其余分区用来存放进程的程序和数据。本次实验中才用动态分区法,也就是在作业的处理过程中划分内存的区域,根据需要确定大小。 动态分区的分配算法:首先从可用表/自由链中找到一个足以容纳该作业的可用空白区,如果这个空白区比需求大,则将它分为两个部分,一部分成为已分配区,剩下部分仍为空白区。最后修改可用表或自由链,并回送一个所分配区的序号或该分区的起始地址。 最先适应法:按分区的起始地址的递增次序,从头查找,找到符合要求的第一个分区。

最佳适应法:按照分区大小的递增次序,查找,找到符合要求的第一个分区。 最坏适应法:按分区大小的递减次序,从头查找,找到符合要求的第一个分区。 三、数据结构及功能设计 1、数据结构 定义空闲分区结构体,用来保存内存中空闲分区的情况。其中size属性表示空闲分区的大小,start_addr表示空闲分区首地址,next指针指向下一个空闲分区。 //空闲分区 typedef struct Free_Block { int size; int start_addr; struct Free_Block *next; } Free_Block; Free_Block *free_block; 定义已分配的内存空间的结构体,用来保存已经被进程占用了内存空间的情况。其中pid作为该被分配分区的编号,用于在释放该内存空间时便于查找。size表示分区的大小,start_addr表示分区的起始地址,process_name存放进程名称,next指针指向下一个分区。 //已分配分区的结构体 typedef struct Allocate_Block { int pid; int size; int start_addr; char process_name[PROCESS_NAME_LEN]; struct Allocate_Block *next; } Allocate_Block; 2、模块说明 2.1 初始化模块 对内存空间进行初始化,初始情况内存空间为空,但是要设置内存的最大容量,该内存空间的首地址,以便之后新建进程的过程中使用。当空闲分区初始化

第四章 操作系统存储管理(练习题)

第四章存储管理 1. C存储管理支持多道程序设计,算法简单,但存储碎片多。 A. 段式 B. 页式 C. 固定分区 D. 段页式 2.虚拟存储技术是 B 。 A. 补充内存物理空间的技术 B. 补充相对地址空间的技术 C. 扩充外存空间的技术 D. 扩充输入输出缓冲区的技术 3.虚拟内存的容量只受 D 的限制。 A. 物理内存的大小 B. 磁盘空间的大小 C. 数据存放的实际地址 D. 计算机地址位数 4.动态页式管理中的 C 是:当内存中没有空闲页时,如何将已占据的页释放。 A. 调入策略 B. 地址变换 C. 替换策略 D. 调度算法 5.多重分区管理要求对每一个作业都分配 B 的内存单元。 A. 地址连续 B. 若干地址不连续 C. 若干连续的帧 D. 若干不连续的帧 6.段页式管理每取一数据,要访问 C 次内存。 A. 1 B. 2 C. 3 D. 4 7.分段管理提供 B 维的地址结构。 A. 1 B. 2 C. 3 D. 4 8.系统抖动是指 B。 A. 使用计算机时,屏幕闪烁的现象 B. 刚被调出内存的页又立刻被调入所形成的频繁调入调出的现象 C. 系统盘不干净,操作系统不稳定的现象 D. 由于内存分配不当,造成内存不够的现象 9.在 A中,不可能产生系统抖动现象。 A. 静态分区管理 B. 请求分页式管理 C. 段式存储管理 D. 段页式存储管理 10.在分段管理中 A 。 A. 以段为单元分配,每段是一个连续存储区 B. 段与段之间必定不连续 C. 段与段之间必定连续 D. 每段是等长的 11.请求分页式管理常用的替换策略之一有 A 。 A. LRU B. BF C. SCBF D. FPF 12.可由CPU调用执行的程序所对应的地址空间为 D 。 A. 名称空间 B. 虚拟地址空间 C. 相对地址空间 D. 物理地址空间 13. C 存储管理方式提供二维地址结构。 A. 固定分区 B. 分页

操作系统内存管理系统

操作系统存管理 1. 存管理方法 存管理主要包括虚地址、地址变换、存分配和回收、存扩充、存共享和保护等功能。 2. 连续分配存储管理方式 连续分配是指为一个用户程序分配连续的存空间。连续分配有单一连续存储管理和分区式储管理两种方式。 2.1 单一连续存储管理 在这种管理方式中,存被分为两个区域:系统区和用户区。应用程序装入到用户区,可使用用户区全部空间。其特点是,最简单,适用于单用户、单任务的操作系统。CP/M和DOS 2.0以下就是采用此种方式。这种方式的最大优点就是易于管理。但也存在着一些问题和不足之处,例如对要求存空间少的程序,造成存浪费;程序全部装入,使得很少使用的程序部分也占用—定数量的存。

2.2 分区式存储管理 为了支持多道程序系统和分时系统,支持多个程序并发执行,引入了分区式存储管理。分区式存储管理是把存分为一些大小相等或不等的分区,操作系统占用其中一个分区,其余的分区由应用程序使用,每个应用程序占用一个或几个分区。分区式存储管理虽然可以支持并发,但难以进行存分区的共享。 分区式存储管理引人了两个新的问题:碎片和外碎片。 碎片是占用分区未被利用的空间,外碎片是占用分区之间难以利用的空闲分区(通常是小空闲分区)。 为实现分区式存储管理,操作系统应维护的数据结构为分区表或分区链表。表中各表项一般包括每个分区的起始地址、大小及状态(是否已分配)。 分区式存储管理常采用的一项技术就是存紧缩(compaction)。

2.2.1 固定分区(nxedpartitioning)。 固定式分区的特点是把存划分为若干个固定大小的连续分区。分区大小可以相等:这种作法只适合于多个相同程序的并发执行(处理多个类型相同的对象)。分区大小也可以不等:有多个小分区、适量的中等分区以及少量的大分区。根据程序的大小,分配当前空闲的、适当大小的分区。 优点:易于实现,开销小。 缺点主要有两个:碎片造成浪费;分区总数固定,限制了并发执行的程序数目。 2.2.2动态分区(dynamic partitioning)。 动态分区的特点是动态创建分区:在装入程序时按其初始要求分配,或在其执行过程过系统调用进行分配或改变分区大小。与固定分区相比较其优点是:没有碎片。但它却引入了另一种碎片——外碎片。动态分区的分区分配就是寻找某个空闲分区,其大小需大于或等于程序的要求。若是大于要求,则将该分区分割成两个分区,其中一个分区为要

操作系统课程设计内存管理

内存管理模拟 实验目标: 本实验的目的是从不同侧面了解Windows 2000/XP 对用户进程的虚拟内存空间的管理、分配方法。同时需要了解跟踪程序的编写方法(与被跟踪程序保持同步,使用Windows提供的信号量)。对Windows分配虚拟内存、改变内存状态,以及对物理内存(physical memory)和页面文件(pagefile)状态查询的API 函数的功能、参数限制、使用规则要进一步了解。 默认情况下,32 位Windows 2000/XP 上每个用户进程可以占有2GB 的私有地址空间,操作系统占有剩下的2GB。Windows 2000/XP 在X86 体系结构上利用二级页表结构来实现虚拟地址向物理地址的变换。一个32 位虚拟地址被解释为三个独立的分量——页目录索引、页表索引和字节索引——它们用于找出描述页面映射结构的索引。页面大小及页表项的宽度决定了页目录和页表索引的宽度。 实验要求: 使用Windows 2000/XP 的API 函数,编写一个包含两个线程的进程,一个线程用于模拟内存分配活动,一个线程用于跟踪第一个线程的内存行为,而且要求两个线程之间通过信号量实现同步。模拟内存活动的线程可以从一个文件中读出要进行的内存操作,每个内存操作包括如下内容: 时间:操作等待时间。 块数:分配内存的粒度。 操作:包括保留(reserve)一个区域、提交(commit)一个区域、释放(release)一个区域、回收(decommit)一个区域和加锁(lock)与解锁(unlock)一个区域,可以将这些操作编号存放于文件。保留是指保留进程的虚拟地址空间,而不分配物理 存储空间。提交在内存中分配物理存储空间。回收是指释放物理内存空间,但在虚拟地址空间仍然保留,它与提交相对应,即可以回收已经提交的内存块。释放是指将物理存储和虚拟地址空间全部释放,它与保留(reserve)相对应,即可以释放已经保留的内存块。 大小:块的大小。 访问权限:共五种,分别为PAGE_READONLY,PAGE_READWRITE ,PAGE_EXECUTE,PAGE_EXECUTE_READ 和PAGE EXETUTE_READWRITE。可以将这些权限编号存放于文件中跟踪线程将页面大小、已使用的地址范围、物理内存总量,以及虚拟内存总量等信息显示出来。

windows操作系统内存管理方式综述

一页式管理 1 页式管理的基本原理将各进程的虚拟空间划分成若干个长度相等的页(page),页式管理把内存空间按页的大小划分成片或者页面(page frame),然后把页式虚拟地址与内存地址建立一一对应页表,并用相应的硬件地址变换机构,来解决离散地址变换问题。页式管理采用请求调页或预调页技术实现了内外存存储器的统一管理。 它分为 1 静态页式管理。静态分页管理的第一步是为要求内存的作业或进程分配足够的页面。系统通过存储页面表、请求表以及页表来完成内存的分配工作。静态页式管理解决了分区管理时的碎片问题。但是,由于静态页式管理要求进程或作业在执行前全部装入内存,如果可用页面数小于用户要求时,该作业或进程只好等待。而且作业和进程的大小仍受内存可用页面数的限制。 2 动态页式管理。动态页式管理是在静态页式管理的基础上发展起来的。它分为请求页式管理和预调入页式管理。 优点:没有外碎片,每个内碎片不超过页大小。一个程序不必连续存放。便于改变程序占用空间的大小(主要指随着程序运行而动态生成的数据增多,要求地址空间相应增长,通常由系统调用完成而不是操作系统自动完成)。 缺点:程序全部装入内存。 要求有相应的硬件支持。例如地址变换机构,缺页中断的产生和选择淘汰页面等都要求有相应的硬件支持。这增加了机器成本。增加了系统开销,例如缺页中断处理机,请求调页的算法如选择不当,有可能产生抖动现象。虽然消除了碎片,但每个作业或进程的最后一页内总有一部分空间得不到利用果页面较大,则这一部分的损失仍然较大。 二段式管理的基本思想 把程序按内容或过程(函数)关系分成段,每段有自己的名字。一个用户作业或进程所包含的段对应一个二维线形虚拟空间,也就是一个二维虚拟存储器。段式管理程序以段为单位分配内存,然后通过地址影射机构把段式虚拟地址转换为实际内存物理地址。 程序通过分段(segmentation)划分为多个模块,如代码段、数据段、共享段。其优点是:可以分别编写和编译。可以针对不同类型的段采取不同的保护。可以按段为单位来进行共享,包括通过动态链接进行代码共享。 三段页式管理的实现原理 1 虚地址的构成 一个进程中所包含的具有独立逻辑功能的程序或数据仍被划分为段,并有各自的段号s。这反映相继承了段式管理的特征。其次,对于段s中的程序或数据,则按照一定的大小将其划分为不同的页。和页式系统一样,最后不足一页的部分仍占一页。这反映了段页式管理中的页式特征。从而,段页式管理时的进程的虚拟地址空间中的虚拟地址由三部分组成:即段号s,页号P和页内相对地址d。虚拟空间的最小单位是页而不是段,从而内存可用区也就被划分成为着干个大小相等的页面,且每段所拥有的程序和数据在内存中可以分开存放。分段的大小也不再受内存可用区的限制。 2 段表和页表

实验操作系统存储管理实验报告

实验四操作系统存储管理实验报告 一、实验目的 存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。 本实验的目的是通过请求页式管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。 二、实验内容 (1)通过计算不同算法的命中率比较算法的优劣。同时也考虑了用户内存容量对命中率的影响。 页面失效次数为每次访问相应指令时,该指令所对应的页不在内存中的次数。 在本实验中,假定页面大小为1k,用户虚存容量为32k,用户内存容量为4页到32页。 (2)produce_addstream通过随机数产生一个指令序列,共320条指令。 A、指令的地址按下述原则生成: 1)50%的指令是顺序执行的 2)25%的指令是均匀分布在前地址部分 3)25%的指令是均匀分布在后地址部分 B、具体的实施方法是: 1)在[0,319]的指令地址之间随机选取一起点m; 2)顺序执行一条指令,即执行地址为m+1的指令; 3)在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m’; 4)顺序执行一条指令,地址为m’+1的指令 5)在后地址[m’+2,319]中随机选取一条指令并执行; 6)重复上述步骤1)~5),直到执行320次指令 C、将指令序列变换称为页地址流

在用户虚存中,按每k存放10条指令排列虚存地址,即320条指令在虚存中 的存放方式为: 第0条~第9条指令为第0页<对应虚存地址为[0,9]); 第10条~第19条指令为第1页<对应虚存地址为[10,19]); 。。。。。。 第310条~第319条指令为第31页<对应虚存地址为[310,319]); 按以上方式,用户指令可组成32页。 (3)计算并输出下属算法在不同内存容量下的命中率。 1)先进先出的算法

操作系统实验内存分配

精心整理西安邮电大学 (计算机学院) 课内实验报告 1. (1 (2 (3 原因,写出实验报告。 2.实验要求: 1)掌握内存分配FF,BF,WF策略及实现的思路; 2)掌握内存回收过程及实现思路; 3)参考本程序思路,实现内存的申请、释放的管理程序,调试运行,总结程序设计中出现的问题并找出原因,写出实验报告。

3.实验过程: 创建进程: 删除其中几个进程:(默认以ff首次适应算法方式排列) Bf最佳适应算法排列方式: wf最差匹配算法排列方式: 4.实验心得: 明 实验中没有用到循环首次适应算法,但是对其他三种的描述还是很详细,总的来说,从实验中还是学到了很多。 5.程序源代码: #include #include #include #include

#define PROCESS_NAME_LEN 32 //进程名长度 #define MIN_SLICE 10 //最小碎片的大小#define DEFAULT_MEM_SIZE 1024 //内存大小 #define DEFAULT_MEM_START 0 //起始位置 /*内存分配算法*/ #define MA_FF 1 #define MA_BF 2 #define MA_WF 3 /*描述每一个空闲块的数据结构*/ struct free_block_type { }; /* /* { }; /* /* void display_menu(); int set_mem_size(); void set_algorithm(); void rearrange(int algorithm); int rearrange_WF(); int rearrange_BF(); int rearrange_FF(); int new_process(); int allocate_mem(struct allocated_block *ab);

操作系统内存管理原理

内存分段和请求式分页 在深入i386架构的技术细节之前,让我们先返回1978年,那一年Intel 发布了PC处理器之母:8086。我想将讨论限制到这个有重大意义的里程碑上。如果你打算知道更多,阅读Robert L.的80486程序员参考(Hummel 1992)将是一个很棒的开始。现在看来这有些过时了,因为它没有涵盖Pentium处理器家族的新特性;不过,该参考手册中仍保留了大量i386架构的基本信息。尽管8086能够访问1MB RAM的地址空间,但应用程序还是无法“看到”整个的物理地址空间,这是因为CPU寄存器的地址仅有16位。这就意味着应用程序可访问的连续线性地址空间仅有64KB,但是通过16位段寄存器的帮助,这个64KB大小的内存窗口就可以在整个物理空间中上下移动,64KB逻辑空间中的线性地址作为偏移量和基地址(由16位的段寄存器给处)相加,从而构成有效的20位地址。这种古老的内存模型仍然被最新的Pentium CPU支持,它被称为:实地址模式,通常叫做:实模式。 80286 CPU引入了另一种模式,称为:受保护的虚拟地址模式,或者简单的称之为:保护模式。该模式提供的内存模型中使用的物理地址不再是简单的将线性地址和段基址相加。为了保持与8086和80186的向后兼容,80286仍然使用段寄存器,但是在切换到保护模式后,它们将不再包含物理段的地址。替代的是,它们提供了一个选择器(selector),该选择器由一个描述符表的索引构成。描述符表中的每一项都定义了一个24位的物理基址,允许访问16MB RAM,在当时这是一个很不可思议的数量。不过,80286仍然是16位CPU,因此线性地址空间仍然被限制在64KB。 1985年的80386 CPU突破了这一限制。该芯片最终砍断了16位寻址的锁链,将线性地址空间推到了4GB,并在引入32位线性地址的同时保留了基本的选择器/描述符架构。幸运的是,80286的描述符结构中还有一些剩余的位可以拿来使用。从16位迁移到32位地址后,CPU的数据寄存器的大小也相应的增加了两倍,并同时增加了一个新的强大的寻址模型。真正的32位的数据和地址为程序员带了实际的便利。事实上,在微软的Windows平台真正完全支持32位模型是在好几年之后。Windows NT的第一个版本在1993年7月26日发布,实现了真正意义上的Win32 API。但是Windows 3.x程序员仍然要处理由独立的代码和数据段构成的64KB内存片,Windows NT提供了平坦的4GB地址空间,在那儿可以使用简单的32位指针来寻址所有的代码和数据,而不需要分段。在内部,当然,分段仍然在起作用,就像我在前面提及的那样。不过管理段的所有责任都被移给了操作系统。

实验4内存管理资料讲解

实验 4 内存管理

实验4内存管理 学校:FJUT 学号:3131903229 班级:计算机1302姓名:姜峰 注:其中LFU和NRU算法运行结果可能与其他人不同,只是实现方式不同,基本思路符合就可以。 .实验学时与类型 学时:2,课外学时:自定 实验类型:设计性实验二.实验目的 模拟实现请求页式存储管理中常用页面置换算法,理会操作系统对内存的 调度管理。 三?实验内容 要求:各算法要给出详细流程图以及执行结果截图。 假设有一程序某次运行访问的页面依次是: 0,124,3,4,5,1,2,5,1,2,3,4,5,6 ,请给出采用下列各页面置换算法时页面的换进换出情况,并计算各调度算法的命中率(命中率二非缺页次数/总访问次数),初始物理内存为空,物理内存可在4?20页中选择。 (1)FIFO :最先进入的页被淘汰; (2)LRU :最近最少使用的页被淘汰; (3)OPT :最不常用的页被淘汰;(选做) ⑷LFU :访问次数最少的页被淘汰(LFU)。(选做)

源代码: #i nclude #include #in elude #i nclude #defi ne MAXNUM 100 struct Phy_Memory{ //定义一个物理内存结构体 char Page; int time; }; char *OutPut; struct Phy_Memory *Phy_Page; void Print(char *PageStr,int Phy_PageNum,int absence){ // 打印图解函数int i,j; for(i=0;iPage!=*Temp;i++); if(i

操作系统 内存管理实验报告

同组同学学号: 同组同学姓名: 实验日期:交报告日期: 实验(No. 4 )题目:编程与调试:内存管理 实验目的及要求: 实验目的: 操作系统的发展使得系统完成了大部分的内存管理工作,对于程序员而言,这些内存管理的过程是完全透明不可见的。因此,程序员开发时从不关心系统如何为自己分配内存,而且永远认为系统可以分配给程序所需的内存。在程序开发时,程序员真正需要做的就是:申请内存、使用内存、释放内存。其它一概无需过问。本章的3个实验程序帮助同学们更好地理解从程序员的角度应如何使用内存。 实验要求: 练习一:用vim编辑创建下列文件,用GCC编译工具,生成可调试的可执行文件,记录并分析执行结果,分析遇到的问题和解决方法。 练习二:用vim编辑创建下列文件,用GCC编译工具,生成可调试的可执行文件,记录并分析执行结果。 练习三:用vim编辑创建下列文件,用GCC编译工具,生成可调试的可执行文件,记录并分析执行结果。 改编实验中的程序,并运行出结果。 实验设备:多媒体电脑 实验内容以及步骤: 在虚拟机中编写好以下程序: #include #include #include int main(void) { char *str; /* 为字符串申请分配一块内存*/ if ((str = (char *) malloc(10)) == NULL) { printf("Not enough memory to allocate buffer\n"); return(1); /* 若失败则结束程序*/ } /* 拷贝字符串“Hello”到已分配的内存空间*/ strcpy(str, "Hello"); /* 显示该字符串*/ printf("String is %s\n", str); /* 内存使用完毕,释放它*/ free(str); return 0; } 调试过后得出的结果截图如下:(由图可看出我将此程序以aa.c为文件名保存,调试后出现aa1文件,调试结果出现语句“String is Hello”)

计算机操作系统试题库new

计算机操作系统试题 一填空: 1.操作系统为用户提供三种类型的使用接口,它们是命令方式和系统调用和图形用户界面。 2.主存储器与外围设备之间的数据传送控制方式有程序直接控制、中断驱动方式、DMA方式和通道控制方式。 3.在响应比最高者优先的作业调度算法中,当各个作业等待时间相同时,运行时间短的作业将得到优先调度;当各个作业要求运行的时间相同时,等待时间长的作业得到优先调度。 4.当一个进程独占处理器顺序执行时,具有两个特性:封闭性和可再现性。 5.程序经编译或汇编以后形成目标程序,其指令的顺序都是以零作为参考地址,这些地址称为逻辑地址。 6.文件的逻辑结构分流式文件和记录式文件二种。 7.进程由程度、数据和FCB组成。 9.操作系统是运行在计算机裸机系统上的最基本的系统软件。11.文件系统中,用于文件的描述和控制并与文件一一对应的是文件控制块。 12.段式管理中,以段为单位,每段分配一个连续区。由于各段长度不同,所以这些存储区的大小不一,而且同一进程的各段之间不要求连续。 13.逻辑设备表(LUT)的主要功能是实现设备独立性。

17.文件的物理结构分为顺序文件、索引文件和索引顺序文件。18.所谓设备控制器,是一块能控制一台或多台外围设备与CPU并行工作的硬件。 20分页管理储管理方式能使存储碎片尽可能少,而且使存利用率较高,管理开销小。 20.计算机操作系统是方便用户、管理和控制计算机软硬件资源的系统软件。 21.操作系统目前有五大类型:批处理操作系统、分时操作系统、实时操作系统、网络操作系统和分布式操作系统。 22.按文件的逻辑存储结构分,文件分为有结构文件,又称为记录式文件和无结构文件,又称流式文件。 23.主存储器与外围设备之间的信息传送操作称为输入输出操作。 24、在设备管理中,为了克服独占设备速度较慢、降低设备资源利用率的缺点,引入了虚拟分配技术,即用共享设备模拟独占设备。 25、常用的存管理方法有分区管理、页式管理、段式管理和段页 式管理。 26、动态存储分配时,要靠硬件地址变换机构实现重定位。 27、在存储管理中常用虚拟存储器方式来摆脱主存容量的限制。 28、在请求页式管理中,当硬件变换机构发现所需的页不在存时,产生缺页中断信号,中断处理程序作相应的处理。 30、在段页式存储管理系统中,面向用户的地址空间是段式划分,面向物理实现的地址空间是页式划分。

操作系统内存管理

操作系统内存管理 1. 内存管理方法 内存管理主要包括虚地址、地址变换、内存分配和回收、内存扩充、内存共享和保护等功能。 2. 连续分配存储管理方式 连续分配是指为一个用户程序分配连续的内存空间。连续分配有单一连续存储管理和分区式储管理两种方式。 2.1 单一连续存储管理 在这种管理方式中,内存被分为两个区域:系统区和用户区。应用程序装入到用户区,可使用用户区全部空间。其特点是,最简单,适用于单用户、单任务的操作系统。CP /M和DOS 2.0以下就是采用此种方式。这种方式的最大优点就是易于管理。但也存在着一些问题和不足之处,例如对要求内存空间少的程序,造成内存浪费;程序全部装入,使得很少使用

的程序部分也占用—定数量的内存。 2.2 分区式存储管理 为了支持多道程序系统和分时系统,支持多个程序并发执行,引入了分区式存储管理。分区式存储管理是把内存分为一些大小相等或不等的分区,操作系统占用其中一个分区,其余的分区由应用程序使用,每个应用程序占用一个或几个分区。分区式存储管理虽然可以支持并发,但难以进行内存分区的共享。 分区式存储管理引人了两个新的问题:内碎片和外碎片。 内碎片是占用分区内未被利用的空间,外碎片是占用分区之间难以利用的空闲分区(通常是小空闲分区)。 为实现分区式存储管理,操作系统应维护的数据结构为分区表或分区链表。表中各表项一般包括每个分区的起始地址、大小及状态(是否已分配)。 分区式存储管理常采用的一项技术就是内存紧缩

(compaction)。 2.2.1 固定分区(nxedpartitioning)。 固定式分区的特点是把内存划分为若干个固定大 小的连续分区。分区大小可以相等:这种作法只适合于多个相同程序的并发执行(处理多个类型相同的对象)。分区大小也可以不等:有多个小分区、适量的中等分区以及少量的大分区。根据程序的大小,分配当前空闲的、适当大小的分区。 优点:易于实现,开销小。 缺点主要有两个:内碎片造成浪费;分区总数固定,限制了并发执行的程序数目。 2.2.2动态分区(dynamic partitioning)。 动态分区的特点是动态创建分区:在装入程序时按其初始要求分配,或在其执行过程中通过系统调用进行分配或改变分区大小。与固定分区相比较其优点是:没有内碎片。但它却引入了另一种碎片——外碎片。动态分区的分区分配就是寻找某个空闲分区,其大小需大于或等于程序的要求。

操作系统实验报告--内存管理

操作系统课程设计 实验报告 学院:信息学院 班级:计1109班 姓名:林海慧 学号:XXXXXXXXXXXXX 指导老师:XXXX

实验三、内存管理 一、[问题描述] 设计一个请求页式存储管理方案,为简单起见。页面淘汰算法采用FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中修改状态位。而不再判断它是否被改写过,也不将它写回到辅存。 二、[基本要求] 页面尺寸1K,输入进程大小(例如5300bytes),对页表进行初始化, 页表结构: ,块号分别为0、1、2,页框管理表(空闲块表): 任意输入一个需要访问的指令地址流(例如:3635、3642、1140、0087、1700、5200、4355,输入负数结束),打印页表情况。 每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页框未满,则调入该页并修改页表,打印页表情况;如果该页不在主存且页框已满,则按FIFO页面淘汰算法淘汰一页后调入所需的页,修改页表,打印页表情况; 存储管理算法的流程图如下:

三、源代码 #include #include #define BUSY 1 #define NOTBUSY 0 struct PageB{ int PNumber; //页号

int BNumber; //物理块号 int Count; //计数器,在内存驻留时间 bool State; //状态位 } ; PageB Page[6]={{0,-1,0,false},{1,-1,0,false},{2,-1,0,false},{3,-1,0,false},{4,-1,0,false},{5,-1,0,false}}; int queye=0; struct Physical{ int BNumber; //物理块号 int State; //状态位 }Physical[3]={{0,0},{1,0},{2,0}}; int MaxSzie, MaxCount = 0; bool IsInPage(int P)//判断是否在内存 { int i=0; int flag=0; for (i = 0; i <= 5; i++) { if (Page[i].PNumber == P && Page[i].State == true) { printf("\n页在主存,打印页表:"); printf("\n页号:%d 物理块号:%d 状态:%d(true)",Page[i].PNumber,Page[i].BNumber,Page[i].State); flag=1; } } if(flag==1) return true; else return false; } void FIFO(int P)//FIFO页面置换算法 { int i, j, k; int BNumber;//暂存物理块号 for(i = 0; i <= 5; i++) { if (Page[i].PNumber == P && Page[i].State == false) { printf("页号%d在辅存\n",P); //分配给该进程的物理块均被占

实验五 Windows XP 虚拟内存管理 结果

实验五 Windows XP 虚拟内存管理 一实验目的 1) 了解存储器管理以及虚拟存储器管理的基本原理 2)了解和学习Windows系统管理工具中关于内存管理的设置和使用; 二实验环境 需要准备一台运行Windows XP操作系统的计算机。 三背景知识 虚拟存储器技术是当代计算机中广泛采用的内存管理方案,在Windows XP中合理的进行虚拟内存的设置,可以更有效的提高系统的工作效率。利用系统自带的系统监视器可以查看虚拟内存的使用情况,根据使用情况可以灵活的进行虚拟内存的管理。 四实验内容与步骤 启动并进入Windows环境,单击Ctrl + Alt + Del键,或者右键单击任务栏,在快捷菜单中单击“任务管理器”命令,打开“任务管理器”窗口。 步骤1:当前机器中由你打开,正在运行的应用程序有: 1) 实验五Windows XP虚拟内存管理 步骤2:单击“进程”选项卡,一共显示了41个进程。请试着区分一下,其中: 系统 (SYSTEM) 进程有25个 服务 (SERVICE) 进程有4个 用户进程有12个。 图2-0 实验记录

步骤3:查看本机的物理内存容量为 3144812K,点击任务管理器中性能标签,再查看一下,物理内存可用数,核心内存总数58200K,核心内存为操作系统所占的内存,可将以上表格中所填写的各进程所占内存数与步骤3中填写的数字做下比较。 步骤4:用鼠标右键点击“我的电脑”,选择“属性”,弹出系统属性窗口,选择“高级”标签,点击“性能”下面的“设置”按钮,再选择高级标签,查看本机的虚拟内存大小为 2048M,点击更改按钮,本系统所用的虚拟内存设置在E分区,初始大小2048MB,最大值2048MB,当前已分配2048MB,页面大小4606MB。 步骤5:请在Windows2000(XP)目录下查找一个名为pagefile.sys的系统文件(Windows98下为Win386.swp),它的大小经常自己发生变动,小的时候可能只有几十兆,大的时候则有数百兆,pagefile.sys 是Windows下的一个虚拟内存,请观察一下目前该文件大小为 1560576KB 。 步骤6:观察虚拟内存的使用情况,并进行重新设置 1)在控制面板中的管理工具中打开性能监视器,展开左侧的性能日志和警报,并点击选择记数器日志,在右侧的面板中空白处点击鼠标右键,选择新建日志设置,并命名为Pagefile,然后回车确认。 2)在常规选项卡下,点击添加记数器按钮,在新弹出的窗口的性能对象下拉菜单中选择Paging File,并选择“从列表选择记数器”,然后点击% Usage Peak,在范例中选择“_Total”,并接着点击“添加”按钮。 3)然后关闭这个窗口,并点击图三中的“确定”按钮。点击“是”创建日志文件。接着打开“日志文件”选项卡,在日志文件类型下拉菜单中选则“文本文件(逗号分隔)”,然后记住“例如”框中显示的日志文件的路径。 4)这样,点击确定后这个记数器已经开始运行了,你可以在电脑上进行你的日常操作,并尽可能多

操作系统原理实验报告(终版)

操作系统原理实验报告(终版)

————————————————————————————————作者:————————————————————————————————日期:

[键入文字] XX学校 实验报告 课程名称: 学院: 专业班: 姓名: 学号: 指导教师: 2011 年3 月

目录 实验1 进程管理 (3) 一、实验目的 (3) 二、实验内容 (3) 三、实验要求 (3) 四、程序说明和程序流程图 (4) 五、程序代码 (5) 六、程序运行结果及分析 (7) 七.指导教师评议 (8) 实验2 进程通信 (9) 一、实验目的 (9) 二、实验内容 (9) 三、实验要求 (9) 四、程序说明和程序流程图 (9) 五、程序代码 (11) 七.指导教师评议 (14) 实验3 存储管理 (15) 一、实验目的 (15) 二、实验内容 (15) 三、实验要求 (15) 四、程序说明和程序流程图 (16) 六、程序运行结果及分析 (23)

七.指导教师评议 (23) 实验4 文件系统 (24) 一、实验目的 (24) 二、实验内容 (24) 三、实验要求 (24) 四、程序说明和程序流程图 (24) 五、程序代码 (26) 六、程序运行结果及分析 (26) 七.指导教师评议 (27)

实验1 进程管理 一、实验目的 1. 弄清进程和程序的区别,加深对进程概念的理解。 2. 了解并发进程的执行过程,进一步认识并发执行的实质。 3. 掌握解决进程互斥使用资源的方法。 二、实验内容 1. 管道通信 使用系统调用pipe( )建立一个管道,然后使用系统调用fork( )创建2个子进程p1和p2。这2个子进程分别向管道中写入字符串:“Child process p1 is sending message!”和“Child process p2 is sending message!”,而父进程则从管道中读出来自两个子进程的信息,并显示在屏幕上。 2. 软中断通信 使用系统调用fork( )创建2个子进程p1和p2,在父进程中使用系统调用signal( )捕捉来自键盘上的软中断信号SIGINT(即按Ctrl-C),当捕捉到软中断信号SIGINT后,父进程使用系统调用kill( )分别向2个子进程发出软中断信号SIGUSR1和SIGUSR2,子进程捕捉到信号后分别输出信息“Child process p1 is killed by parent!”和“Child process p2 is killed by parent!”后终止。而父进程等待2个子进程终止后,输出信息“Parent process is killed!”后终止。 三、实验要求 1. 根据实验内容编写C程序。 2. 上机调试程序。 3. 记录并分析程序运行结果。

相关主题
文本预览
相关文档 最新文档