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

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

  • 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位编译模式

原文地址:https://www.cnblogs.com/xiaobaizzz/p/12342107.html

时间: 2024-10-28 18:34:42

内存管理:虚拟地址空间以及编译模式的相关文章

C#内存管理解析

前言:对于很多的C#程序员来说,经常会很少去关注其内存的释放,他们认为C#带有强大的垃圾回收机制,所有不愿意去考虑这方面的事情,其实不尽然,很多时候我们都需要考虑C#内存的管理问题,否则会很容易造成内存的泄露问题. 尽管.NET运行库负责处理大部分内存管理工作,但C#程序员仍然必须理解内存管理的工作原理,了解如何高效地处理非托管的资源,才能在非常注重性能的系统中高效地处理内存.C#编程的一个优点就是程序员不必担心具体的内存管理,垃圾回收器会自动处理所有的内存清理工作.用户可以得到近乎像C++语言

解析C#内存管理

C#内存管理解析 前言:对于很多的C#程序员来说,经常会很少去关注其内存的释放,他们认为C#带有强大的垃圾回收机制,所有不愿意去考虑这方面的事情,其实不尽然,很多时候我们都需要考虑C#内存的管理问题,否则会很容易造成内存的泄露问题. 尽管.NET运行库负责处理大部分内存管理工作,但C#程序员仍然必须理解内存管理的工作原理,了解如何高效地处理非托管的资源,才能在非常注重性能的系统中高效地处理内存.C#编程的一个优点就是程序员不必担心具体的内存管理,垃圾回收器会自动处理所有的内存清理工作.用户可以得

经典之计算机内存管理

操作系统内存管理 内存是计算机中须要我们认真管理的重要资源.程序大小的增长速度比内存容量的增长要快得多.帕金森定律指出:"无论存储器有多大,程序都能够把它填满". 人们提出一个非常重要的概念就是"分层存储体系",这个体系包含:快速缓存(cache),内存.磁盘.可移动存储装置. 操作系统的工作就是将这个存储体系抽象为一个实用的模型并管理这个抽象模型. 一:无存储器抽象 最简单的存储器抽象就是根本没有抽象.每个程序都直接訪问物理内存. 在这样的情况下,要想在内存中同一

【转】 linux内存管理

一 为什么需要使用虚拟内存 大家都知道,进程需要使用的代码和数据都放在内存中,比放在外存中要快很多.问题是内存空间太小了,不能满足进程的需求,而且现在都是多进程,情况更加糟糕.所以提出了虚拟内存,使得每个进程用于3G的独立用户内存空间和共享的1G内核内存空间.(每个进程都有自己的页表,才使得3G用户空间的独立)这样进程运行的速度必然很快了.而且虚拟内存机制还解决了内存碎片和内存不连续的问题.为什么可以在有限的物理内存上达到这样的效果呢? 二 虚拟内存的实现机制 首先呢,提一个概念,交换空间(sw

linux kernel学习笔记-5内存管理(转)

http://blog.sina.com.cn/s/blog_65373f1401019dtz.htmllinux kernel学习笔记-5 内存管理1. 相关的数据结构 相比用户空间而言,在内核中分配内存往往受到更多的限制,比如内核中很多情况下不能睡眠,此外处理内存分配失败也不像用户空间那么容易.内核使用了页和区两种数据结构来管理内存: 1.1 页 内核把物理页作为内存管理的基本单位.尽管CPU的最小可寻址单位通常为字(甚至字节),但是MMU(内存管理单元,管理内存并把虚拟地址转换为物理地址的

UNIX再学习 -- 死磕内存管理

malloc/free简化实现:malloc 和 sbrk 关系:虚拟内存机制. 一个内存管理 C 语言部分讲,UNIX部分讲,Linux部分还讲,死磕到底!! 一.mallc/free简化实现 上篇文章已经讲解了动态内存分配/释放函数,参看:UNIX再学习 – 内存管理下面来讲一下,它的自定义函数实现,其中有三个部分: 1.内存控制块 内存控制块用于管理每次分配的内存块,记录该内存块的字节大小.忙闲状态,以及相关内存控制块的首地址. 代码如下所示 typedef struct mem_cont

linux内存管理(repost)

一 为什么需要使用虚拟内存 大家都知道,进程需要使用的代码和数据都放在内存中,比放在外存中要快很多.问题是内存空间太小了,不能满足进程的需求,而且现在都是多进程,情况更加糟糕.所以提出了虚拟内存,使得每个进程用于3G的独立用户内存空间和共享的1G内核内存空间.(每个进程都有自己的页表,才使得3G用户空间的独立)这样进程运行的速度必然很快了.而且虚拟内存机制还解决了内存碎片和内存不连续的问题.为什么可以在有限的物理内存上达到这样的效果呢? 二 虚拟内存的实现机制 首先呢,提一个概念,交换空间(sw

C#编程(七十三)----------浅析C#中内存管理

浅析C#中内存管理 前言:个人觉得C#吸收了各种语言的优点,可谓集大成者,但是不知但,这种集所有语言于一身的情况是好是坏.C#编程的一个优点就是程序员不需要关心具体的内存管理,尤其是垃圾收集器会处理所有的内存清理工作.虽然不比手工管理内存,但是如果要编写高质量的代码,还是要理解后台发生的情况,理解C#的内存管理. 用户可以得到像C++语言那样的效率,而不需要考虑像在C++中那样内存管理工作的复杂性. 注意:这一章的许多内容,可以说全部,都是没有经过事实验证的.您应把这一届看做是一般规则的简化向导

Kernel那些事儿之内存管理(1)

有人的地方就有江湖.要介绍内存管理这个江湖,首先还得从这里面的主要人物讲起. 在NUMA结构中,物理内存首先被分成若干nodes.每一个node进一步被分成若干zones.每一个zone又关联了一个描述page frames的数组,该数组包含了属于该zone的所有page frame的描述符. 不难看出,在这个江湖里主要有三位重要人物:nodes, zones 和 page frames.这三者的关系和地位大体可以用下图来描述(该图取自"Professional Linux Kernel Arc