前言:
送书,本周日开奖,今天最后还可以参与,送出5本,想参与评论如下文章参与:1024程序员节送书了!读很久都不过时的计算机神作,本本经典!
书单如下:
《C++ Primer 中文版(第5版)》
《C++ Primer习题集(第5版)》
《Essential C++中文版》
《C++标准库(第2版)》
《深度探索C++对象模型》
《剑指Offer:名企面试官精讲典型编程题(第2版)》
《剑指Offer(专项突破版):数据结构与算法名企面试题精讲》
《Effective C++:改善程序与设计的55个具体做法(第3版 中文版)》
《More Effective C++:35个改善编程与设计的有效方法(中文版)》
《C++之美:代码整洁、安全又跑得快的30个要诀》
《C++之旅(第3版)》
《程序员的自我修养—链接、装载与库》
《编码》
面试题:讲一下逻辑地址、线性地址、物理地址都有什么区别?逻辑地址唯一吗?
逻辑地址、线性地址和物理地址是内存管理中涉及的三种不同类型的地址。它们之间的主要区别在于处理方式以及它们所处的抽象层次。
1. 逻辑地址
定义:逻辑地址是程序编译或链接阶段生成的地址,由CPU产生,是用户态程序能直接访问的地址。
生成方式:在程序运行时,逻辑地址由CPU通过指令产生,是进程所感知的地址空间。
作用:逻辑地址是程序代码、变量、堆栈等内存分配的基本单位,与进程的虚拟地址空间直接对应。
映射过程:通过段式地址转换,逻辑地址被映射为线性地址。
逻辑地址主要用于用户的视角,即程序员或编译器看待内存的方式。
段基址+逻辑地址=线性地址。
2. 线性地址
定义:线性地址是逻辑地址经过段式管理后得到的中间地址。
生成方式:逻辑地址通过段基址(如CS、DS寄存器)和偏移量组合成线性地址。
作用:线性地址是为分页机制服务的中间地址。在分页机制下,它被分割为多个页,方便映射到物理内存。
映射过程:线性地址通过分页机制映射到实际的物理地址。
如果CPU没有分页机制,那么线性地址=物理地址。
3. 物理地址
定义:物理地址是内存条上的实际地址,是CPU访问内存硬件时的最终地址。
生成方式:线性地址通过页表映射(如通过页目录和页表),最终得到物理地址。
作用:物理地址直接映射到内存单元,是操作系统实际操作的地址空间。
特点:物理地址空间是全局共享的,不同进程最终访问的物理内存是受操作系统控制的。物理地址通常是唯一的,并且与内存的实际物理布局相对应。
4.示例:分段和分页机制的地址转换
假设有一个32位的CPU和虚拟内存系统,分段+分页的内存管理方式。
场景
假设一个程序访问的地址是逻辑地址0x1234:5678。
0x1234是段号
0x5678是段内偏移
程序会将逻辑地址0x1234:5678转换为线性地址,然后再转换为物理地址。
转换过程:
第一步 分段转换(逻辑地址到线性地址)
系统先查找段表,找到段号0x1234对应的段基址。假设段表中存储的基址是0x20000000。
将段基址与段内偏移相加得到线性地址:
text{线性地址} = 0x20000000 + 0x5678 = 0x20005678
这样,逻辑地址0x1234:5678被转换为线性地址0x20005678。
第二步 分页转换(线性地址到物理地址)
系统会将线性地址0x20005678分成页号和页内偏移。假设页面大小是4KB(即12位偏移),那么线性地址0x20005678的高20位0x20005是页号,低12位0x678是页内偏移。
CPU通过页表找到页号0x20005在内存中的物理页框。假设页表中该页号映射到物理页框0x3000。
最后,将物理页框地址0x3000和页内偏移0x678组合,得到物理地址:
text{物理地址} = 0x30000000 + 0x678 = 0x30000678
因此,逻辑地址0x1234:5678经过转换后,最终的物理地址为0x30000678。
5.逻辑地址唯一吗?
逻辑地址在同一个进程中是唯一的,但在不同的进程中可以是相同的。
这是因为每个进程有各自独立的逻辑地址空间,即使两个进程使用相同的逻辑地址,它们会被映射到不同的物理地址。
在同一进程中:逻辑地址是唯一的,不会有重叠。一个进程的逻辑地址空间由该进程独占,逻辑地址中的每个段和偏移对应到该进程中的唯一数据位置。
在不同进程间:逻辑地址不一定唯一。不同进程的地址空间是独立的,两个进程可能使用相同的逻辑地址,但各自的内存映射将它们指向不同的物理地址。
操作系统通过内存管理单元(MMU)和进程隔离机制来确保不同进程的逻辑地址不会相互干扰,从而实现安全性和稳定性。
6.总结
整体映射流程:逻辑地址 -> 线性地址 -> 物理地址。
逻辑地址是进程和CPU之间的接口,通常会通过内存管理单元转换成线性地址,线性地址为分页机制准备中间地址,然后再转换为物理地址,物理地址是最终操作系统和硬件内存访问的实际地址。
end
CppPlayer
关注,回复【电子书】珍藏CPP电子书资料赠送
精彩文章合集
专题推荐