每个程序员都应该了解的内存知识1——内存概述
来源:互联网 发布:怎样在淘宝买东西 编辑:程序博客网 时间:2024/05/21 11:39
英文原文:https://lwn.net/Articles/250967/
1、概述
早期的计算机很简单,它的各种组件如CPU、内存、大容量存储和网络接口都是一起开发的,所以性能差不多。举个例子来说,内存和网络接口提供数据的速度不会比CPU快多少。
这种情况随着计算机基本结构的固化和各子系统的优化慢慢地发生了改变。其中一些组件的性能开始落后,成为系统的瓶颈。特别是大容量存储和内存子系统,由于成本的原因,它们的发展严重滞后了。
大容量存储的性能问题往往靠软件来改善:操作系统将最常用(且最有可能被用到)的数据放在主存中,因为后者的速度要比硬盘快上几个数量级。存储设备中增加了缓存,这样就可以在不修改操作系统的前提下提升性能。(但是为了在使用缓存时保证数据的完整性,仍然要作出一些修改。)这些内容不在本文的谈论范围之内,就不作赘述了。
与大容量存储不同,解决内存的瓶颈问题更为困难,几乎每种方案都需要对硬件作出修改。目前,这些修改主要包括以下这些方式:
- RAM的硬件设计(速度与并发度)
- 内存控制器的设计
- CPU缓存
- 设备的直接内存访问(DMA)
本文主要关心的是CPU缓存和内存控制器的设计。在讨论这些问题的过程中,我们还会研究DMA。不过,我们首先会从当今商用硬件的设计谈起。这有助于我们理解目前在使用内存子系统时可能遇到的问题和限制。我们还会详细介绍RAM的分类,并说明为什么会存在这么多不同类型的内存。
本文并不会包括所有内容,也不是最终版本。我们的讨论范围仅止于商用硬件,而且只限于其中的一小部分。另外,本文中的许多论题只会点到为止。大家可以阅读关于这些论题的其它文档,以获得更详细的说明。
当本文提到操作系统特定的细节和解决方案时,针对的都是Linux,不会包含其他操作系统的信息,作者无意讨论其他操作系统的情况。如果读者认为他/她不得不使用别的操作系统,那么必须去要求供应商提供其操作系统类似于本文的文档。
在开始之前最后的一点说明,本文包含大量的“经常”和别的类似的限定词。这里讨论的技术在现实中有很多不同的实现,所以本文只阐述使用得最广泛最主流的版本,在阐述中很少用到绝对的限定词。
1.1 文档结构
- 每个程序员都应该了解的内存知识1——内存概述
- 每个程序员都应该了解的内存知识-1
- 每个程序员都应该了解的内存知识(1)
- 每个程序员都应该了解的内存知识
- 每个程序员都应该了解的内存知识【第一部分】
- 每个程序员都应该了解的内存知识
- 每个程序员都应该了解的内存知识
- 每个程序员都应该了解的内存知识【第一部分】
- 每个程序员都应该了解的内存知识 part1
- 每个程序员都应该了解的内存知识【第一部分】
- 每个程序员都应该了解的内存知识
- 每个程序员都应该了解的内存知识(一)
- 每个程序员都应该了解的内存知识(二)
- 每个程序员都应该了解的内存知识(3)-虚拟内存
- 每个程序员都应该了解的内存知识
- 每个程序员都应该了解的内存知识
- 每个程序员都应该了解的内存知识
- 每个程序员都应该了解的内存知识
- 30+的人学Java,数组是啥玩意?
- 三维扫描仪[3]——标定·理论
- innobackupex: Error: Failed to connect to MySQL server as DBD::mysql module is not installed
- 团体程序设计天梯赛-练习集 L2-010. 排座位
- 为什么选择Chrome浏览器
- 每个程序员都应该了解的内存知识1——内存概述
- Sicily LIS |动态规划
- SpringBoot+SpringDataJpa后台常用注解
- myBatis连接MySQL初级应用_01
- windows下的mongodb的安装+将mongodb 做成windows service方式
- XON/XOFF
- strange IOC框架 塔防游戏实例应用 (一)
- c++primer 第二章(18-38)
- LeetCode笔记:144. Binary Tree Preorder Traversal