operating-system - 操作系统中逻辑地址的用途是什么?为什么生成它们
问题描述
我想知道为什么CPU生成逻辑地址然后在内存管理器的帮助下将它们映射到物理地址?为什么我们需要它们。
解决方案
在计算机上运行多个程序需要虚拟地址。
假设没有虚拟地址机制。编译器和链接编辑器生成具有给定模式的内存布局。指令(文本段)从地址 0 开始位于内存中。然后是初始化或未初始化数据(数据和 bss)和动态内存(堆和堆栈)的段。(例如,如果您对内存布局一无所知,请参见https://www.geeksforgeeks.org/memory-layout-of-c-program/ )
当你运行这个程序时,它会以一种完全不可预知的方式占用一部分不再可供其他进程使用的内存。比如0到1M的地址会被占用,或者0到16k,或者0到128M,这完全取决于程序的特性。如果你现在想同时运行第二个程序,它的指令和数据将在哪里存储?内存地址由编译器生成,显然在编译时不知道什么是空闲内存。并记住内存地址(用于指令或数据)在程序代码中以某种方式硬编码。
当您想要运行许多进程并且内存不足时,会出现第二个问题。在这种情况下,一些进程被换出到磁盘并稍后恢复。但是当恢复时,一个进程会去内存空闲的地方,而且这是不可预测的,需要修改程序的内部地址。
虚拟内存简化了所有这些任务。当运行一个进程(或在交换后恢复它)时,系统查看空闲内存并填充页表以创建虚拟地址(由处理器操作且始终不变)和物理地址(取决于空闲内存)之间的映射计算机在给定时间)。
推荐阅读
- android - 如何在不使用带有 Volley 的 OkHttp 层的情况下使用 Stetho 检查 volley 网络请求
- sql - 对重复行求和而不使用 group by
- javascript - 鉴于这种情况,在 JavaScript 中使用 async/await 的正确方法是什么
- java - 添加 spring-boot-starter-parent 删除 javax.validation.*
- javascript - React Dropzone FileReader - 无法读取为文件:{}
- javascript - 将树枝模板中的 JS 脚本转换为简单的 js 文件
- oop - MVP 或 MVC 模式中的代表性数据放在哪里?
- php - AWS Elastic Beanstalk - Laravel Artisan 命令
- javascript - 滚动条上的产品照片滑块
- python - python for循环中的性能优化