虚拟内存是什么
虚拟内存是一个抽象的非常大的字节数组。主要包含两个重要的作用(参考这里)
扩展内存大小限制:放了防止内存被程序耗尽,虚拟内存会通过各种机制来扩展实际内存的大小,例如使用磁盘空间
-
简化寻址过程:参考文章中有个非常好的例子,见下方
学校里有N个学生,每个同学都有自己的名字(物理地址),但是当他们被分配到各个班里座位上的时候,老师并不需要知道他们的名字就可以用座位的几排几列(虚拟地址)来指代学生*
十六进制有什么作用
二进制用于表示较大值的数字时,非常冗长。例如,表示一个字节,也就是8位信息时,二进制的值域为[00000000,11111111]
,映射为现实中常用的十进制,也就是[0,255]
而已,我们需要用一种更为简单的方法来表示信息
那么为什么不考虑使用十进制呢?
因为,计算机中信息的最小载体是位
,位的本质也就是0或1(可以理解为‘是’或‘否’的含义)。用十进制来表示信息很难转换为计算机中用位
来表示信息的模式。
而比较方便的形式是八进制
和十六进制
(8=23,16=24),它们都能以较短长度的值来描述一定的信息,并且能够很轻易的将信息转换为计算机中的位模式
在这两者之间,表示同样的信息,十六进制的值长度是肯定小于八进制的值长度的
注:十六进制的数字都是以0x
开头作为标识的
字’大小的重要性
在第一章中,我们了解到了什么是’字‘(计算机总线总是传递定长的的字节块,这个字节块的容量被称为1字
)
常见的'字'有4字节和8字节的,也就是耳熟能详的32位
与64位
字长决定的最重要的系统参数就是虚拟空间的最大大小
为什么字长能够决定虚拟空间的大小?原因如下:
虚拟内存的每一个字节都由一个唯一的数字来标识,称为它的地址
,而地址
是用一个字来编码的。
对于32位系统而言,地址
的取值区间只有[0,(2^32)-1]
,那么我们就可以计算出虚拟地址空间
的最大大小为2^32字节 = 4GB
注意:我们称呼程序为32位程序
或64位程序
时,指的是程序编译时是32位的还是64位的,而不是由其运行时的机器类型决定的
寻址与字节顺序
对于跨越多字节的程序对象,我们必须确定两个存储规则:
- 这个对象的地址有是什么
- 在内存中如何排列这些字节
在几乎所有的机器上,跨越多字节的程序对象都是以连续的内存空间进行存储的
例如:一个int类型(32位)的变量x的地址值为0x100,那么x变量被存储在0x100、0x101、0x102和0x103这4个位置中
那么这么一个4字节的int类型变量每个字节的值是如何在内存中排列的呢?
通常来说有两种排列方法
- 把数据的地位值到高位值按照从左到右的方式依次排列,称为小端法
- 把数据的高位值到地位值按照从左到右的方式依次排列,称为大端法
例如:x变量的十六进制值为0x01234567
,那么大端法和小端法的存储方式如下:
类型 | 0x100 | 0x101 | 0x102 | 0x103 |
---|---|---|---|---|
大端法 | 01 | 23 | 45 | 67 |
小端法 | 67 | 45 | 23 | 01 |
大端法
和小端法
只是两个方式,本质上没有优劣之分,且在大多数情况下,机器所使用的字节排列顺序都是不可见的。但需要了解,有些时候,字节顺序可能会导致一些问题。