郑州春蕾网站建设仿站小工具下载
news/
2025/10/5 12:49:50/
文章来源:
郑州春蕾网站建设,仿站小工具下载,php做购物网站系统,泰安中推网络科技有限公司虚拟内存是一种对主存的抽象概念。 #xff08;1#xff09;将主存看作一个存储在磁盘上的地址空间的高速缓存#xff0c;在主存中只保存活动区域#xff0c;并根据需要在磁盘和主存之间来回传送数据#xff0c;通过这种方式高效地使用内存 #xff08;2#xff09;为每…虚拟内存是一种对主存的抽象概念。 1将主存看作一个存储在磁盘上的地址空间的高速缓存在主存中只保存活动区域并根据需要在磁盘和主存之间来回传送数据通过这种方式高效地使用内存 2为每个进程提供一致的地址空间从而简化内存管理。 3保护每个进程的地址空间不被其它进程破坏。
1、物理寻址 计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组。每字节都有一个唯一的物理地址。第一个字节的地址为0接下来的字节地址为1再下一个为2依此类推CPU访问内存的最自然的方式就是使用物理地址。这种方式称为物理寻址。
早期的PC使用物理寻址而且诸如数字信号处理器、嵌人式微控制器以及Cray超级计算机这样的系统仍然继续使用这种寻址方式。然而现代处理器使用的是一种称为虚拟寻址virtual addressing的寻址形式。
2、虚拟寻址 虚拟内存地址是指令用到的内存地址物理内存地址是实际在内存硬件中的空间地址。 CPU通过生成一个虚拟地址来访问主存这个虚拟地址在被送到内存之前先转换成适当的物理地址。将一个虚拟地址转换为物理地址的任务叫做地址翻译。就像异常处理一样地址翻译需要CPU硬件和操作系统之间的紧密合作。CPU芯片上叫做内存管理单元Memory Management UnitMMU的专用硬件利用**存放在主存中的查询表页表**来动态翻译虚拟地址该表的内容由操作系统管理。
3、虚拟页和物理页 虚拟内存被组织成一个由存放在磁盘上的N个连续的字节大小的单元组成的数组。每字节都有一个唯一的虚拟地址作为数组索引。磁盘上数组的内容被缓存在主存中。 虚拟内存被分割为虚拟页VP物理内存被分割为物理页PP。
在任意时刻虚拟页面的集合都分为三个不相交的子集
未分配的系统还未分配或者创建的页。未分配的块没有任何数据和它们相关联因此也就不占用任何磁盘空间。已分配但缓存的当前已缓存在物理内存中的已分配页在主存中。已分配但未缓存的未缓存在物理内存中的已分配页在磁盘中。
4、页表 同任何缓存一样虚拟内存系统必须有某种方法来判定一个虚拟页是否缓存在DRAM中的某个地方。如果是系统还必须确定这个虚拟页存放在哪个物理页中。如果不命中系统必须判断这个虚拟页存放在磁盘的哪个位置在物理内存中选择一个牺牲页并将虚拟页从磁盘复制到DRAM中替换这个牺牲页。
这些功能是由软硬件联合提供的包括操作系统软件、MMU内存管理单元中的地址翻译硬件和一个存放在物理内存中叫做页表page table的数据结构页表将虚拟页映射到物理页。每次地址翻译硬件将一个虚拟地址转换为物理地址时都会读取页表。操作系统负责维护页表的内容以及在磁盘与DRAM之间来回传送页。
页表就是一个页表条目Page Table EntryPTE的数组。虚拟地址空间中的每个页在页表中一个固定偏移量处都有一个PTE。 PTE中的有效位为0表示未分配地址字段为null或者已经分配了但是没有缓存到物理内存中地址字段指向磁盘地址为1时表示已经缓存到物理内存中地址字段指向物理页号。
页命中 CPU读取包含在虚拟内存中某虚拟页的一个字该虚拟页已经缓存在主存中使用PTE中的物理内存地址构造出这个字的物理地址。
缺页 物理内存不命中即缺页。地址翻译硬件从内存中读取PTE从有效位推断出该虚拟页未被缓存未分配的PTE没有联系任何数据不会被读取并且触发一个缺页异常。缺页异常调用内核中的处理程序该程序 1判断虚拟地址是否合法是否是某个区域结构定义的区域访问空白区域会触发段错误。 2内存访问是否合法是否有读取该地址空间的权限。 3对合法的虚拟地址进行合法的操作选择物理内存中的一个物理页作为牺牲页从磁盘上用虚拟页的副本取代该牺牲页。程序返回之后CPU重新启动导致缺页的指令正常读取不会产生异常。
页面分配 调用malloc的结果就是在磁盘上创建空间创建新的虚拟页并更新某个未分配的页表条目PTE使它指向磁盘上这个新创建的页面。
5、内存映射 linux将一个虚拟内存区域和一个磁盘上的对象关联起来初始化这个虚拟内存区域的内容这个过程称为内存映射映射为文件系统中的普通文件或者内核创建的匿名文件。 一个区域可以映射到一个普通磁盘文件的连续部分例如一个可执行目标文件。文件区被分为页大小的片每一片包含一个虚拟页面的初始内容。
共享对象和私有对象 一个对象可以被映射到虚拟内存的一个区域要么作为共享对象要么作为私有对象。 共享对象如果一个进程将一个共享对象映射到它的虚拟地址空间的一个区域内那么这个进程对这个区域的任何写操作对于那些也把这个共享对象映射到它们虚拟内存的其他进程而言也是可见的。而且这些变化也会反映在磁盘上的原始对象中。
私有对象另一方面对于一个映射到私有对象的区域做的改变对于其他进程来说是不可见的并且进程对这个区域所做的任何写操作都不会反映在磁盘上的对象中。
一个映射到共享对象的虚拟内存区域叫做共享区城。类似地也有私有区城。
写时复制 私有对象使用写时复制的技术映射到虚拟内存中。一个私有对象开始生命周期的方式和共享对象一样在物理内存中只保存私有对象的一份副本。当一个进程试图写私有区域的某个界面这个写操作会触发一个保护故障。处理程序会在物理内存中创建这个页面的一个新副本并更新页表条目。程序返回时CPU重新执行写操作即正常执行。
fork函数 用于创建一个进程所创建的进程复制父进程的代码段/数据段/BSS段/堆/栈等所有用户空间信息在内核中操作系统重新为其申请了一个PCB并使用父进程的PCB进行初始化
当fork函数被当前进程调用时内核为新进程创建各种数据结构并分配给它一个唯一的PID。为了给这个新进程创建虚拟内存它创建了当前进程的mmstruct、区域结构和页表的原样副本。它将两个进程中的每个页面都标记为只读并将两个进程中的每个区域结构都标记为私有的写时复制。
当 fork在新进程中返回时新进程现在的虚拟内存刚好和调用fork时存在的虚拟内存相同。当这两个进程中的任一个后来进行写操作时写时复制机制就会创建新页面因此也就为每个进程保持了私有地址空间的抽象概念。
execve函数 在当前进程中加载并运行包含在可执行目标文件中的程序用该程序替代当前程序。 1删除已存在的用户区域 2映射私有区域 3映射共享区域 4设置程序计数器
mmap函数 要求内核创建一个新的虚拟内存区域并将指定对象的一个连续的片映射到这个新的区域。munmap用来删除虚拟内存区域。
6、动态内存分配 运行时需要额外虚拟内存时用动态内存分配器更加方便移植性更好。动态内存分配器维护堆将堆视为一组不同大小的块的集合来维护。每个块就是一个连续的虚拟内存片要么是已分配的要么是空闲的。
C标准库提供一个称为malloc程序包的显式分配器程序通过调用malloc函数来从堆中分配块。 动态内存分配器如malloc可以通过使用mmap和munmap函数显式地分配和释放堆内存。
内存碎片 造成堆利用率很低的主要原因是一种称为碎片fragmentation的现象当虽然有未使用的内存但不能用来满足分配请求时就发生这种现象。有两种形式的碎片内部碎片internal fragmentation和外部碎片external fragmentation。
内部碎片是在一个已分配块比有效载荷大时发生的。很多原因都可能造成这个问题。例如一个分配器的实现可能对已分配块强加一个最小的大小值而这个大小要比某个请求的有效载荷大。或者分配器可能增加块大小以满足对齐约束条件。
内部碎片的量化是简单明了的。它就是已分配块大小和它们的有效载荷大小之差的和。因此在任意时刻内部碎片的数量只取决于以前请求的模式和分配器的实现方式。
外部碎片是当空闲内存合计起来足够满足一个分配请求但是没有一个单独的空闲块足够大可以来处理这个请求时发生的。那么如果不向内核请求额外的虚拟内存就无法满足这个请求即使在堆中仍然有足够多空闲的字。问题的产生是由于这些空闲字是分在多个空闲块中的。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/928266.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!