【译】Getting Physical With Memory
当我们试图去了解复杂系统时,去除其抽象层,直接关注最底层,我们会更容易去理解。使用这种方法,我们来看一下内存和 I/O 接口的最简单和基础的层:处理器和总线的接口。这些细节是更上层问题的基础,例如线程同步、Core i7 的需求等。然而,由于我是一个程序员,我将忽略一些 EE 人关注的问题。下面展示的是典型的 Core 2 架构:

Core 2 处理器有 775 个引脚,大约一半仅仅提供电力,并不传输数据。当你按功能对这些引脚进行分组时,你会惊奇地发现处理器的物理接口非常简单。图示的是涉及到内存或 I/O 口操作的关键引脚:地址线、数据线以及请求引脚。这些操作都发生在前端总线(Front Side Bus)事务(Transation)上下文中。FSB 事务经历五个阶段:仲裁、请求、侦听、响应以及数据传输。在这些不同的阶段,FSB 上的组件分别扮演了不同的角色,我们称之为代理(agents)。通常这些代理是所有的处理器单元加上北桥。
这篇文章中我们仅仅看一下 请求阶段 —— 由 请求代理 (通常是处理器)发送两个数据包。下面是第一个数据包的数据位,由地址和请求引脚发出:

地址线输出的是事务的起始物理地址,33 位地址引脚线对应的是一个地址的的 3~35 位,地址的 0~2 位为零。因此,对于寻址范围为 64GB 的物理内存,我们得到一个 8 字节对齐的 36 位的地址,这是从 Pentium Pro 处理器之后就这样的。请求引脚表示需要初始化的事务类型,而在 I/O 请求事务中,地址引脚给出的是 I/O 端口而不是内存地址。在第一个数据包输出之后,在接下来的总线时钟周期内又传送了第二个数据包:

属性信号位(Attribute Signals)非常有意思:在 Intel 处理器中,它们代表的了 5 种可用的内存 cache 行为。通过将这个信息传送到 FSB 上,请求代理让其它处理器知道该事务如何影响 cache 的,以及内存控制器(北桥)应该做什么。处理器通过查看页表来决定给定内存区块的类型,页表是由内核来维护的。
通常内核将所有的内存视作写回类型(Write-Back),会获得最好的性能。在写回模式下,内存单元访问的是 cache 行,在 Core 2 中是 64 字节。如果程序读内存的一个字节,处理器加载包含该字节的整个 cache 行到 L2 和 L1 cache 中。当程序写回到内存中,处理器仅仅修改 cahce 行上的数据,而不立刻更新主存。接下来,当它需要将修改的行提交到总线上时,一致性地将整个 cache 行写回。所以,大多请求引脚在 Length 域填写 11,表示请求 64 个字节, 。下面是一个读不在 cache 中的数据的实例:

在 Intel 计算机中将一些物理内存直接映射到硬盘和网卡等设备上,这就允许驱动器通过直接读写内存来与它们的设备通信。内核在页表中将这些内存区域标记为 不可缓存的( uncacheable)。程序或者驱动器请求访问不可缓存的内存区域直接作用在总线上。读写一个字节、一个字等等都是有可能的,这是通过填写上面的数据包 B 的 Byte Enable 字段来完成的。
这里讨论的有很多隐式含义,例如:
- 性能敏感的应用应该尝试将数据打包到同一个 cache 行,这样可以一起被访问。一旦 cache 行加载后,接下来的读就避免了从 RAM 中访问,访问速度更快!
- 任何对同一 cache 行的内存访问都确保要是原子操作(假设是写回内存模式),这样的一次访问由处理器的 L1 cache 来完成,数据读或写都是一次完成的,不可被其它的处理器或线程来干扰。通常,32 位和 64 位不跨 cahe 行的访存操作都是原子的。
- 前端总线由所有的代理共享,在开始一个事务之前需要仲裁总线的所有者。另外,所有的代理为了维护数据的一致性,必须侦听总线上的所有事务。因此,在越来越多的处理器核的添加到 Intel 计算机中,争夺总线资源将成为一个很严重的问题。在 Core i7 处理器中,通过将处理器直接关联到内存上,点对点的通信代替广播来解决这个问题。
这些都是请求物理内存需要关注的重点问题。在接下来将锁、多线程以及内存一致性联系起来之后,总线问题又会浮现出来。我第一次看到 FSB 包描述时,我恍然大悟!我希望你们可有同样的感受。在下一篇文章中,我们爬上抽象层的梯子,看看虚拟内存的全貌。
注:
- 偶尔看到作者博客,里面的文章我很是喜欢,翻译也只是我来理解作者文章的内容,不建议你们看我翻译,直接看 原文。
- 如果大家发现我哪地方理解有偏差,欢迎指正。
- 这是一篇关于在处理器体系层次上如何实现访问物理内存的文章,作为一名程序员,我们确实很少关心这个层次的东西,而了解这些对于我们提升自己代码质量有很多帮助。
- 下一篇我将阅读作者的 Anatomy of a Program in Memory,这是比处理器层次更上一层,讲述一个进程的虚拟内存如何布局的。
【译】Getting Physical With Memory的更多相关文章
- Getting Physical With Memory.CPU如何操作内存
原文标题:Getting Physical With Memory 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限,只好挑一些国外高手的精彩文章翻译一下 ...
- [hadoop] - Container [xxxx] is running beyond physical/virtual memory limits.
当运行mapreduce的时候,有时候会出现异常信息,提示物理内存或者虚拟内存超出限制,默认情况下:虚拟内存是物理内存的2.1倍.异常信息类似如下: Container [pid=13026,cont ...
- (译)关于使用Eclipse Memory Analyzer的10点小技巧
作者 Rave_Tian 2016.02.01 17:56* 字数 2988 阅读 520评论 0喜欢 0 分析和理解应用的内存使用情况是开发过程中一项不小的挑战.一个微小的逻辑错误可能会导致监听器没 ...
- linux memory dump--http://www.forensicswiki.org/wiki/Tools:Memory_Imaging
Linux provides two virtual devices for this purpose, '/dev/mem' and '/dev/kmem', though many distrib ...
- Virtual address cache memory, processor and multiprocessor
An embodiment provides a virtual address cache memory including: a TLB virtual page memory configure ...
- PatentTips - Method to manage memory in a platform with virtual machines
BACKGROUND INFORMATION Various mechanisms exist for managing memory in a virtual machine environment ...
- Tagging Physical Resources in a Cloud Computing Environment
A cloud system may create physical resource tags to store relationships between cloud computing offe ...
- SAP NOTE 1999997 - FAQ: SAP HANA Memory
Symptom You have questions related to the SAP HANA memory. You experience a high memory utilization ...
- CPU与内存的那些事
下面是网上看到的一些关于内存和CPU方面的一些很不错的文章. 整理如下: 转: CPU的等待有多久? 原文标题:What Your Computer Does While You Wait 原文地址: ...
随机推荐
- 帮我做个APP,给你20万,做不做?
一.为什么要写这篇文章 前段时间,有个辞职 创业的同事(做法务的) 问我 开发一个 新闻类的APP要多少钱,产品.UI.接口.后台管理页 他们啥都没有,想全部外包. 我 并没有在外包公司做过,也没 ...
- git常用操作命令
使用git进行版本控制,分为两部分: 一: 服务端 1.1 首先要申请一个git的账号,方便团队协作.推荐开源中国(www.oschina.net),相对于github来说,有两个优点:1.访问速度很 ...
- 多线程同步工具——LockSupport
用例1:子线程等待主线程发放许可! public static void main(String[] args) { Thread thread = new Thread(){ public void ...
- Java对象序列化剖析
对象序列化的目的 1)希望将Java对象持久化在文件中 2)将Java对象用于网络传输 实现方式 如果希望一个类的对象可以被序列化/反序列化,那该类必须实现java.io.Serializable接口 ...
- 基于trie树的具有联想功能的文本编辑器
之前的软件设计与开发实践课程中,自己构思的大作业题目.做的具有核心功能,但是还欠缺边边角角的小功能和持久化数据结构,先放出来,有机会一点点改.github:https://github.com/chu ...
- 浅谈UML的概念和模型之UML九种图
1.用例图(use case diagrams) [概念]描述用户需求,从用户的角度描述系统的功能 [描述方式]椭圆表示某个用例:人形符号表示角色 [目的]帮组开发团队以一种可视化的方式理解系统的功能 ...
- DNS报文格式(RFC1035)
一.域名和资源记录的定义 1.Name space definitions 2.资源记录定义(RR definitions) 2.1 格式 后面分析报文的时候详细解释. ...
- .NET 实现并行的几种方式(四)
本随笔续接:.NET 实现并行的几种方式(三) 八.await.async - 异步方法的秘密武器 1) 使用async修饰符 和 await运算符 轻易实现异步方法 前三篇随笔已经介绍了多种方式.利 ...
- 类型“System.Data.Linq.DataContext”在未被引用的程序集中定义。必须添加对程序集“System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”的引用。
解决方法:添加System.Data.Linq.dll引用 http://www.cnblogs.com/m84641693/archive/2010/07/26/1785100.html http: ...
- ASP.NET MVC——URL路由
在MVC之前,ASP.NET假设请求的URL与服务器上的文件之间有关联,服务器接受请求,并输出相应的文件.而在引入MVC后,请求是由控制器的动作方法来处理的.为了处理URL,便引入了路由系统. 首先我 ...