- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
为什么必须管理内存
内存管理是计算机编程最为基木的领域Z—。在很多脚木语言屮,您不必担心内存是如何管 理的,这并不能使得内存管理的重要性有一点点降低。对实际编程来说,理解您的内存管理 器的能力与局限性至关重要。在大部分系统语言中,比如c和C++,您必须进行内存管理。 木文将介绍手工的、半手工的以及自动的内存管理实践的基木概念。
追溯到在Apple II上进行汇编语言编程的时代,那时内存管理还不是个大问题。您实际上 在运行整个系统。系统有多少内存,您就有多少内存。您英至不必费心思去弄明白它有多少 内存,因为每一台机器的内存数量都相同。所以,如果内存需要非常固定,那么您只需要选 择一个内存范围并使用它即可。
不过,即使是在这样一个简单的计算机屮,您也会有问题,尤其是当您不知道程序的毎个部 分将需要多少内存时。如果您的空间有限,而内存需求是变化的,那么您需要一些方法来满 足这些需求:
?确定您是否有足够的内存來处理数据。
?从可用的内存屮获取一部分内存。
?向可用内存池(pool)屮返冋部分内存,以使其可以由程序的其他部分或者其他程 序使用。
实现这些需求的稈序库称为 (allocators因为它们负责分配和I川收内存。稈序 的动态性越强,内存管理就越重要,您的内存分配程序的选择也就更重要。让我们来了解可 用于内存管理的不同方法,它们的好处与不足,以及它们最适用的情形。
冋页首
C风格的内存分配程序
C编程语言提供了两个函数來满足我们的三个需求:
malloc:该函数分配给定的字节数,并返冋一个指向它们的指针。如果没有足够的 可用内存,那么它返回一个空指针。
free:该函数获得指向由malloc分配的内存片段的指针,并将其释放,以便以后的 程序或操作系统使用(实际上,一些malloc实现只能将内存归还给程序,而无法将内 存归还给操作系统)。
物理内存和虚拟内存
要理解内存在程序屮是如何分配的,首先需要理解如何将内存从操作系统分配给程序。计算 机上的每一个进程都认为H己可以访问所有的物理内存。显然,由于同时在运行多个稈序, 所以每个进稈不可能拥有全部内存。实际上,这些进稈使用的是虚拟内存。
只是作为一个例了,让我们假定您的程序正在访问地址为629的内存。不过,虚拟内存系 统不需要将其存储在位置为629的RAM屮。实际上,它甚至可以不在RAM屮——如 果物理RAM已经满了,它茯至可能已经被转移到驶盘上!由于这类地址不必反映内存所 在的物理位置,所以它们被称为虚拟内存。操作系统维持着一个虚拟地址到物理地址的转换 的表,以便计算机换件可以正确地响应地址请求。并且,如果地址在硬盘上而不是在RAM 屮,那么操作系统将暂时停止您的进程,将其他内存转存到便盘屮,从硬盘上加载被请求的 内存,然麻再重新启动您的进程。这样,每个进程都获得了自己可以使用的地址空间,可以 访问比您物理上安装的内存更多的内存。
在32■位x86系统上,每一个进稈可以访问4GB内存。现在,大部分人的系统上并没有4 GB内存,即使您将swap也算上,每个进稈臥镇用的内存也肯定少于4 GBo因此,当 加载一个进程时,它会得到一个取决于某个称为系统屮断点(system break丿的特定地址的 初始内存分配。该地址Z后是未被映射的内存一一用于在RAM或者硬盘屮没有分配相 应物理位置的内存。因此,如果一个进稈运行超出了它初始分配的内存,那么它必须请求操 作系统“映射进来(unpin)更多的内存。(映射是一个表示一一对应关系的数学术语 —— 当内存的虚拟地址有一个对应的物理地址来存储内存内容时,该内存将被映射。) 基于UNIX的系统有两个可映射到附加内存中的基木系统调用:
brk: brk()是一个非常简单的系统调用。还记得系统屮断点吗?该位置是进稈映射的 内存边界。b「k()只是简单地将这个位置向前或者向后移动,就可以向进程添加内存或 者从进程取走内存。
mmap: mmap(),或者说是“内存映像”,类似于brk(),但是更为灵活。首先,它可 以映射任何位置的内存,而不单单只局限于进程。其次,它不仅可以将虚拟地址映射到 物理的RAM或者swap,它还可以将它们映射到文件和文件位置,这样,读写内存将 对文件屮的数据进行读写。不过,在这里,我们貝关心mmap向进稈添加被映射的内 存的能力。munmapO所做的事情与mmap()相反。
如您所见,b「k()或者mmap() 以用来向我们的进程添加额外的虚拟内存。在我们的
例了屮将使用b「k(),因为它更简单,更通用。
实现一个简单的分配程序
如果您曾经编写过很多C程序,那么您可能曾多次使用过malloc()和free()o不过,您可 能没有用一些时间去思考它们在您的操作系统中是如何实现的。木节将向您展示malloc和 free的一个最简化
您可能关注的文档
- 水平使用时建议使用塑料或铝的支撑环.doc
- 水切割机投资项目建议书.doc
- 水上乐园项目可行性建议书.doc
- 水上乐园项目投资建议书.doc
- 水上摩托艇市场发展调查研究报告.doc
- 水上水下安全施工方案.doc
- 水上娱乐中心项目可行性研究报告.doc
- 水射流技术原理.doc
- 水塔预制构件施工方案.doc
- 水体中油类污染物的综述.doc
- 2025河南师范大学招聘第二批员额制工作人员4人(硕士)笔试历年题库附答案解析.docx
- 2025宁波市民政局所属事业单位招聘5人参考题库附答案.docx
- 2025年宁波市奉化区人民政府锦屏街道办事处编外用工公开招聘1人备考题库附答案.docx
- 2025年哈尔滨木兰县公益性岗位公开招聘备考题库附答案.docx
- 2025云南芒市城投建设工程有限公司招聘13人考前自测高频考点模拟试题附答案.docx
- 2025江西南昌安义县城市管理和综合执法局招聘编外工作人员8人备考题库带答案解析(夺冠).docx
- 2025年广东广州花都城投西城经济开发有限公司第二次招聘项目考前自测高频考点模拟试题附答案.docx
- 2025四川宜宾市叙州区事业单位第二次考试选调43人备考题库附答案.docx
- 2025安徽亳州公用事业发展有限公司因古井供水工程项目运营需模拟试卷附答案.docx
- 2025四川宜宾市屏山县纪委监委机关考调公务员5人备考题库附答案.docx
原创力文档


文档评论(0)