zoukankan      html  css  js  c++  java
  • 内存管理:虚拟地址空间以及编译模式

    虚拟地址空间:就是程序可以使用的虚拟地址的有效范围。虚拟地址空间的大小由操作系统决定,但还会受到编译模式的影响。

    • CPU的数据处理能力

      • 地址总线:用于在内存上定位数据,例如:地址总线有20根,寻址能力为2^20 = 1MB
      • 数据总线:位于主板之上,不在CPU中,用于在CPU和内存之间传输数据。决定了CPU单次的数据处理能力。(64位 = 寄存器的位数 = 数据总线的宽度)
      • 主频:决定了CPU单位时间内的数据处理次数。(4GHz)
      • 数据总线 × 主频 = CPU单位时间内的数据处理量。
    • 实际支持的物理内存

      • CPU支持的物理内存只是理论上的数据,实际应用中还会受到操作系统的限制。
    • 编译模式

      • 为了兼容不同的平台,现代编译器都支持两种编译模式:32位模式和64位模式

      • 32位编译模式:

        • 一个指针或地址占用4个字节的内存,共32位。理论上能够访问的虚拟内存空间大小为2^32 = 4GB,有效虚拟地址范围是0 - 0XFFFFFFFF。
        • 换句话说,程序能够使用的最大内存为4GB,跟物理内存没有关系。
        • 如果程序需要的内存大于物理内存,或者内存中剩余的空间不足,操作系统会将内存中暂时用不到的数据写入磁盘,等需要的时候再读取回来。
        • 如果物理内存大于4GB,程序也只能使用4GB
      • 64位编译模式:

        • 一个指针或地址占用8个字节的内存,共64位。理论上能够访问的虚拟内存空间大小为2^64。
        • 因为2^64的虚拟内存空间太大了,Windows和Linux都对虚拟地址进行了限制,仅使用虚拟地址的低48位(6个字节), 2^48 = 256TB
      • 注意:

        • 64位的CPU运行64位的程序才能发挥它的最大性能,运行32位的程序会白白浪费一部分资源。
        #include<iostream>
        using namespace std;
        
        int a;
        int main(){
            int *p = &a;
            cout << "p = " << p << " -> " << sizeof(int*) << "位" << endl;
            return 0;
        }
        
        /*运行结果*/
        p = 0x491020 -> 4位 //32位编译模式
        p = 0x4a7030 -> 8位 //64位编译模式
        
  • 相关阅读:
    Informix日期获取上周上月昨天去年SQL
    Oracle-创建一个DBLink的方法
    Kafka-Partitions与Replication Factor 调整准则
    Linux-删除文件空间不释放问题解决
    Redhat7-Oracle-sqlldr-安装配置
    Centos7-安装oracle客户端11.2.0.4
    Centos7-单机安装jumpserver
    Redhat6.4-yum本地源安装配置
    Linux-zip unzip 命令日常使用
    xxl-job日志
  • 原文地址:https://www.cnblogs.com/xiaobaizzz/p/12342107.html
Copyright © 2011-2022 走看看