高速缓存

linux free 命令详解

☆樱花仙子☆ 提交于 2020-01-28 08:34:57
free 命令显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存。 如果加上 -h 选项,输出的结果会友好很多: 有时我们需要持续的观察内存的状况,此时可以使用 -s 选项并指定间隔的秒数: $ free -h -s 3 上面的命令每隔 3 秒输出一次内存的使用情况,直到你按下 ctrl + c。 由于 free 命令本身比较简单,所以本文的重点会放在如何通过 free 命令了解系统当前的内存使用状况。 输出简介 下面先解释一下输出的内容: Mem 行(第二行)是内存的使用情况。 Swap 行(第三行)是交换空间的使用情况。 total 列显示系统总的可用物理内存和交换空间大小。 used 列显示已经被使用的物理内存和交换空间。 free 列显示还有多少物理内存和交换空间可用使用。 shared 列显示被共享使用的物理内存大小。 buff/cache 列显示被 buffer 和 cache 使用的物理内存大小。 available 列显示还可以被应用程序使用的物理内存大小。 我想只有在理解了一些基本概念之后,上面的输出才能帮助我们了解系统的内存状况。 buff/cache 先来提一个问题: buffer 和 cache 应该是两种类型的内存,但是 free 命令为什么会把它们放在一起呢?要回答这个问题需要我们做些准备工作。让我们先来搞清楚 buffer 与

第七周

僤鯓⒐⒋嵵緔 提交于 2020-01-28 04:56:04
第六章,存储器层次结构 存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。 局部性是计算机程序的一个基本属性。 存储器山:一种描绘某台机器上存储器层次结构的性能的方法。 6.1 存储技术 6.1.1 随机访问存储器(RAM) 分为两类:①静态(SRAM)      ②动态(DRAM) ①SRAM将每个位存储在一个双稳态存储器单元里。它可以无限期地保存在两个不同的电压配置或状态之一。 ②DRAM将每个位存储为对一个电容的充电。它对干扰非常敏感。 ③传统的DRAM ④存储器模块 168引脚的双列直插存储器模块,64位;72引脚的单列直插存储器模块,32位。 ⑤增强的DRAM(快页模式、扩展数据输出、双倍数据速率同步、同步、Rambus、视频) ⑥非易失性存储器 RAM断电即丢失他们的信息,他们是易失的,所以有ROM只读存储器。 ⑦访问主页 数据流通过总线在处理器和DRAM主存之间来来回回,分为总线事物、读事物、写事物。 6.1.2 磁盘存储 磁盘是广为应用的保存大量数据的存储设备。 ①磁盘构造 盘片构成,每个盘片分为两面或叫表面,覆盖着磁性记录材料。盘中央是一个可以旋转的主轴,它让盘片以固定的旋转速率旋转。 每个表面由磁道组成,我们通常说的磁盘是指磁盘驱动器整个装置。 ②磁盘容量 一个磁盘上可以记录的最大位数 ③磁盘操作 磁盘用读写头来读写存储在磁性表面的位。(寻道时间

计算机缓存Cache以及Cache Line详解

谁说胖子不能爱 提交于 2020-01-26 06:22:24
目录 1、计算机存储体系简介 2、计算机缓存 Cache 2.1、Cache 概述 2.2、Cache 结构 3、计算机缓存行 ChaceLine 1、计算机存储体系简介 存储器是分层次的,离CPU越近的存储器,速度越快,每字节的成本越高,同时容量也因此越小。寄存器速度最快,离CPU最近,成本最高,所以个数容量有限,其次是高速缓存(缓存也是分级,有L1,L2等缓存),再次是主存(普通内存),再次是本地磁盘。 寄存器的速度最快,可以在一个时钟周期内访问,其次是高速缓存,可以在几个时钟周期内访问,普通内存可以在几十个或几百个时钟周期内访问。 存储器分级,利用的是局部性原理。我们可以以经典的阅读书籍为例。我在读的书,捧在手里(寄存器),我最近频繁阅读的书,放在书桌上(缓存),随时取来读。当然书桌上只能放有限几本书。我更多的书在书架上(内存)。如果书架上没有的书,就去图书馆(磁盘)。我要读的书如果手里没有,那么去书桌上找,如果书桌上没有,去书架上找,如果书架上没有去图书馆去找。可以对应寄存器没有,则从缓存中取,缓存中没有,则从内存中取到缓存,如果内存中没有,则先从磁盘读入内存,再读入缓存,再读入寄存器。 2、计算机缓存 Cache 本系列的文章重点介绍缓存cache。了解如何获取cache的参数,了解缓存的组织结构。 2.1、Cache 概述 cache,中译名高速缓冲存储器

ARP(地址解析协议)

不打扰是莪最后的温柔 提交于 2020-01-25 10:13:04
目录 1. ARP 概述 2. ARP 协议工作原理 3. ARP 缓存 4. ARP 报文格式 5. 抓包分析 5.1. ARP 请求报文 5.2. ARP 应答报文 6. 免费 ARP 7. ARP 代理 8. ARP 攻击 [参考文献] 1. ARP 概述 地址解析协议 ,即 ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。 它是IPv4中网络层必不可少的协议,不过在IPv6中已不再适用,并被邻居发现协议(NDP)所替代。 主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机 ARP缓存 中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。 地址解析协议是建立在网络中各个主机互相信任的基础上的 ,网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。相关协议有RARP、代理ARP。 网络层使用的是 IP 地址

第十一章多线程编程的硬件基础与Java内存模型

允我心安 提交于 2020-01-24 23:55:54
高速缓存内部结构示意图 缓存条目的结构 Data Block也被称为缓存行,它是高速缓存与主内存之间的数据交换最小单元,用于存储从主内存中读取或准备写往内存的数据。Tag则包含了与缓存行中数据相应的内存地址的部分信息(内存地址的高位部分比特)。Flag则用于表示响应缓存行的状态信息。 内存地址的解码结果包括tag、index以及offset三部分,index相当于桶号,tag相当于缓存条目的相对编号,offset是缓存行内的位置偏移。 MESI协议中一个缓存条目的Flag值有以下四种可能:Invalid(无效的,记为I)、shared(共享的,记为S),Exclusive(独占的,记为E)和Modified(更改过的,记为M)。 Processor 0读取数据S的实现 Processor 0写数据S的实现 写缓冲器 写缓冲器是处理器内部的一个容量比高速缓存还小的私有高速存储部件。一个处理器无法读取另外一个处理器的写缓冲器中的内容。 内存写操作的执行处理器在将写操作的相关数据写入写缓冲器之后便认为该写操作已经完成,一个处理器接收到其他处理器所回复的针对同一个缓存条目的所有Invalidate Acknowledge消息的时候,该处理器会将写缓冲器中针对相应地址的写操作的结果写入相应的缓冲行中。 无效化队列 引入无效化队列后

Linux性能监控-内存-free命令

元气小坏坏 提交于 2020-01-15 01:41:31
1 简介 free 命令显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存。 2 free 命令格式 free [参数] 参数说明 -b:以Byte为单位显示内存使用情况; -k:以KB为单位显示内存使用情况; -m:以MB为单位显示内存使用情况; -h: 以合适的单位显示内存使用情况 -o:不显示缓冲区调节列; -s<间隔秒数>:持续观察内存使用状况; -t:显示内存总和列; -V:显示版本信息。 3 命令使用 3.1 free -h 说明:以合适的单位显示内存使用情况 [root@localhost ~]# free -h total used free shared buff/cache available Mem: 15G 11G 212M 164M 4.0G 3.5G Swap: 3.9G 4.8M 3.9G 3.2 free -h -s 3 说明:有时我们需要持续的观察内存的状况,此时可以使用 -s 选项并指定间隔的秒数 [root@localhost ~]# free -h total used free shared buff/cache available Mem: 15G 11G 212M 164M 4.0G 3.5G Swap: 3.9G 4.8M 3.9G 输出简介 下面先解释一下输出的内容: Mem 行(第二行)是内存的使用情况。

CAS原理

冷暖自知 提交于 2020-01-10 00:51:06
1、什么是CAS? CAS:Compare and Swap,即比较再交换。 jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同步的,这是一种独占锁,也是是悲观锁。 2、CAS算法理解 对CAS的理解,CAS是一种无锁算法,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。 CAS比较与交换的伪代码可以表示为: do{ 备份旧数据; 基于旧数据构造新数据; }while(!CAS( 内存地址,备份的旧数据,新数据 )) 注:t1,t2线程是同时更新同一变量56的值 因为t1和t2线程都同时去访问同一变量56,所以他们会把主内存的值完全拷贝一份到自己的工作内存空间,所以t1和t2线程的预期值都为56。 假设t1在与t2线程竞争中线程t1能去更新变量的值,而其他线程都失败。(失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次发起尝试)。t1线程去更新变量值改为57,然后写到内存中。此时对于t2来说,内存值变为了57,与预期值56不一致,就操作失败了(想改的值不再是原来的值)。 (上图通俗的解释是:CPU去更新一个值

CPU高速缓存与内存屏障

你离开我真会死。 提交于 2020-01-10 00:25:35
1. CPU缓存 cpu高速缓存的由来 在CPU的全部取指令周期中(程序计算),至少需要访问一次存储器(也就是我们所说物理内存上的数据) 通常需要多次访问存储器的取操作数或者保存结果,CPU处理计算的速度明显受限于访问存储器的限制 因此解决方案就是利用局部性原理,在CPU与物理内存之间提供一个容量小并且速度快的存储器,称为高速缓存 高速缓存概述 缓存是分“段”(line)的,一个段对应一块存储空间,大小是 32(较早的 ARM、90 年代 /2000 年代早期的 x86 和 PowerPC)、64(较新的 ARM 和 x86)或 128(较新的 Power ISA 机器)字节 高速缓存包含物理内存部分数据副本 cpu读取数据时将会先检查高速缓存中的数据是否存在,存在就返回,不存在就读取物理内存数据 高速缓存和内存 高速缓存分为L1-L3 Cache L1 Cache: 一级缓存是CPU第一层高速缓存,分为指令缓存和数据缓存,一般服务器的CPU的L1缓存容量在32-4096kb,现在的L1 Cache都不能直接与内存直连传输数据 L2 Cache: 由于L1级别高速缓存容量的限制,为了再次提高CPU的运算速度,在CPU外部放置一个高速存储器,即二级缓存 L3 Cache: 现在的L3缓存都是内置的,主要是进一步降低内存延迟,提升处理器运算能力,一般是多核共享一个L3缓存

volatile底层原理

独自空忆成欢 提交于 2020-01-07 17:41:37
前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.concurrent包的核心,没有volatile就没有这么多的并发类给我们使用。 本文详细解读一下volatile关键字如何保证变量在多线程之间的可见性,在此之前,有必要讲解一下CPU缓存的相关知识,掌握这部分知识一定会让我们更好地理解volatile的原理,从而更好、更正确地地使用volatile关键字。 CPU缓存 CPU缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾 ,因为CPU运算速度要比内存读写速度快得多,举个例子: 一次主内存的访问通常在几十到几百个时钟周期 一次L1高速缓存的读写只需要1~2个时钟周期 一次L2高速缓存的读写也只需要数十个时钟周期 这种访问速度的显著差异,导致CPU可能会花费很长时间等待数据到来或把数据写入内存。 基于此,现在CPU大多数情况下读写都不会直接访问内存(CPU都没有连接到内存的管脚),取而代之的是CPU缓存,CPU缓存是位于CPU与内存之间的临时存储器,它的容量比内存小得多但是交换速度却比内存快得多。而缓存中的数据是内存中的一小部分数据,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可先从缓存中读取,从而加快读取速度。 按照读取顺序与CPU结合的紧密程度,CPU缓存可分为: 一级缓存:简称L1

Linux 虚拟内存和物理内存的理解

血红的双手。 提交于 2020-01-07 12:11:15
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 首先,让我们看下虚拟内存: 第一层理解 1. 每个进程都有自己独立的4G内存空间,各个进程的内存空间具有类似的结构 2. 一个新进程建立的时候,将会建立起自己的内存空间,此进程的数据,代码等从磁盘拷贝到自己的进程空间,哪些数据在哪里,都由进程控制表中的task_struct记录,task_struct中记录中一条链表,记录中内存空间的分配情况,哪些地址有数据,哪些地址无数据,哪些可读,哪些可写,都可以通过这个链表记录 3. 每个进程已经分配的内存空间,都与对应的磁盘空间映射 Linux 使用虚拟地址空间,大大增加了进程的寻址空间, 由低地址到高地址分别为 : 只读段: 该部分空间 只能读,不可写 ;(包括: 代码段、rodata 段(C常量字符串和#define定义的常量) ) 数据段: 保存 全局变量、静态变量 的空间; 堆 : 就是平时所说的动态内存, malloc/new 大部分都来源于此。其中堆顶的位置可通过函数 brk 和 sbrk 进行动态调整。 文件映射区域 : 如 动态库、共享内存 等映射物理空间的内存,一般是 mmap 函数所分配的虚拟地址空间 。 栈: 用于维护函数调用的上下文空间,一般为 8M ,可通过 ulimit –s 查看。 内核虚拟空间: 用户代码不可见的内存区域,由内核管理