• 内存管理:虚拟地址空间以及编译模式


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

    • 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位编译模式
        
  • 相关阅读:
    mysql之SQL入门与提升(三)
    DROOLS通过URL访问changset
    drools规则管理Guvnor的安装
    kafka offset manage
    kafka comsumer
    kafka与zookeeper
    kafka数据祸福和failover
    kafka一些问题点的分析
    近期开发storm遇到一些问题的解决点
    关于大数据平台ETL可行性方案
  • 原文地址:https://www.cnblogs.com/xiaobaizzz/p/12342107.html
Copyright © 2020-2023  润新知