第八章 实验2_内存管理.pdf

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验二 内存管理 实验内容 1. 分析用户程序虚拟地址空间分布 2. 模拟实现可变分区管理,存储分配算法 采用最佳适配算法。 User-Level Memory Managment • 操作系统把一个可执行的程序载入内存中, 这个可执行程序可称为一个进程。 • 进程的内存可分为以下五个区域: ①代码段 (文本段-text segment ) ②数据段 (data segment ) ③BSS 段(Block Started by Symbol) ④堆 (Heap) ⑤栈 (Stack ) 代码段: 代码段是用来存放可执行文件的操 作指令,也就是说是它是可执行程序在 内存中的镜像。代码段需要防止在运行 时被非法修改,所以只准许读取操作, 而不允许写入(修改)操作——它是不 可写的。 数据段: 数据段用来存放可执行文件中已初始化全局 变量,换句话说就是存放程序静态分配的变量和 全局变量。 静态分配内存就是编译器在编译程序的时候 根据源程序来分配内存。动态分配内存就是在程 序编译之后,运行时调用运行时刻库函数来分配 内存的。静态分配由于是在程序运行之前,所以 速度快,效率高,但是局限性大。动态分配在程 序运行时执行, 所以速度慢, 但灵活性高。 BSS段 • BSS段包含了程序中未初始化的全局变量, 在内存中bss段全部置零。 堆 堆是用于存放进程运行中被动态分配 的内存段,它的大小并不固定,可动态扩 张或缩减。当进程调用malloc等函数分配 内存时,新分配的内存就被动态添加到堆 上(堆被扩张);当利用free等函数释放 内存时,被释放的内存从堆中被剔除(堆 被缩减) 。 栈 栈是用户存放程序临时创建的局部变量,也 就是说我们函数括弧“{}”中定义的变量(但不包 括static声明的变量,static意味着在数据段中存 放变量)。除此以外,在函数被调用时,其参数 也会被压入发起调用的进程栈中,并且待到调用 结束后,函数的返回值也会被存放回栈中。由于 栈的先进先出特点,所以栈特别方便用来保存/恢 复调用现场。从这个意义上讲,我们可以把堆栈 看成一个寄存、交换临时数据的内存区。 进程如何组织这些区域? 栈 • 当程序运行的时候,初始化 数据、BSS和堆栈区域通常 放在一个单独的连续区域: 堆 BSS 数据段。堆栈段和代码段与 数据段 数据段是分隔开的。 代码段 • 示例程序运行结果: 相关调用说明 【brk/sbrk系统调用】 功能描述: 改变一个进程数据段的大小。当使用者提供合理的参数,系统有足够 的内存,并且进程没有超出允许它的最大数据段,操作会得到实现。 用法: #include unistd.h int brk(void *end_data_segment); void *sbrk(intptr_t increment); 参数: end_data_segment:数据段的新终点 increment:当前进程数据段将会被增加的量 返回说明: 成功执行时,b

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档