二、虚拟内存系统
他表示一个字节数,这8位值是从内存底部开始的字节数,从第一段内存一直到决定存储Test变量的位置,所以这个数就是我们在内存中存储Test的地址。
这8位数值是从内存底部开始的字节数,从第一段内存一直到决定存储Test 变量的位置。这就是我们在内存中存储的值,
1984年时,这个数值是真实机器上的物理地址引用,但在当下,他是一个虚拟内存地址。当下的虚拟内存技术,它是一种允许进程来管理运行的代码,使运行的代码具有交互性。
虚拟内存,似乎可以让正在运行代码段去查看机器的内存。简而言之,今天的虚拟内存技术,似乎可以让正在运行的代码去访问或查看机器的内存,但并不是内存的真实布局。这个技术把内存分成多个页,
那些页在本质上是一定范围内的块,例如4096字节。这些页存在于物理内存上,但是每个进程都有自己定义的页,并且进程认为内存是以特定方式进行布局,而那些正在访问的页只在必要时存在。
操作系统基本负责将物理内存转移到硬盘驱动器或类似的东西中,或者使用CPU上维护的表再重新排列事物的布局自动转换,可以将这些页的每个进程视图动态地映射到它们实际在物理内存中的位置,这就是OS中的虚拟内存系统。
所以,实际发生的是,当我的程序在使用一个特殊的内存地址时,这个地址实际上虚拟内存空间中的地址,对我而言,它看起来像是一个真实的内存空间,但实际上这个地址可能都被疯狂的映射到了物理内存的不同部分,有时这地址可能不存在于物理内存上,因为它已经换出到磁盘上了,于是,当我尝试用该内存单元时,OS实际上会将它换回到我尝试使用它的位置,然后正常工作。
因此,为了支持这种运行模式,在实际处理单元中有很多东西,比如,调用转译后备缓冲器(TLB),里面存放存储内存表(虚拟->物理转换表)之类的东西,让程序去访问内存,但是这个内存不是真实的位置,所以TLB就秘密的负责把真正位置给程序,但程序不知道有这个转换过程。
C语言可以对内存进行任何操作,但前提是那个操作的内存是事先与OS协商得到的,给进程虚拟的内存,这种在OS上的虚假地址空间会为我们分配并映射到虚拟内存,因此,接下来的会放到以后的章节解释。
总的来说,我们在使用内存时总要做的事是,告诉OS一些特定的信息以及开始使用的内存空间的起始地址,也就是一个特定了块内存。
一般在visual studio中,你写的程序存放在内存中的栈区,这是编译器为你申请的。
这是当下intel 的CPU内部结构,4个核中每个内核都有与内存相关的两样东西,一个称为L1缓存,一个称为L2缓存,L1代表最近的,L2的次近的。
这些cache,是因为内存延迟时间是如此之长,以至于要花费大量时间去找回东西,如今的CPU试图尽量减少实际与之对话的时间。
大端机器与小端机器的字节交换