高速缓存

IE-LAB网络实验室:Cisco CEF浅析

半世苍凉 提交于 2019-12-04 02:56:06
CEF(Cisco Express Forwarding,Cisco特快交换)技术是思科公司推出的一种全新的路由交换方案,它具有良好的交换性能,增强的交换体系结构和极高的包转发速率。 传统路由器的基本作用是路由计算和包转发,通常基于共享存储器体系结构,采用集中式CPU,即单个CPU(或多个CPU,联结成路由器簇)控制共享总线,连接多个接口卡上,接口卡包含简单的队列等结构,与CPU通信,通过共享总线实现数据包转发。随着Internet的快速发展和大量新的服务需求的不断出现,对网络的路由和交换性能提出了更高的要求,要同时提高包转发速率和系统的性能,必须对传统路由器与交换设备的设计体系结构进行改进,并加入一些新的设计方案以完善系统性能。采用CEF技术的交换路由器,在体系结构,路由方式和接口卡性能等方面都有质的改变,特别适用于大业务量的ISP网络的核心层,同时也广泛应用于高速企业网的主干。 CEF有两种模式: (1)集中式: 允许一个路由处理模块运行特快交换,即FIB和邻接表驻留在路由处理模块中,当线路卡不可用或不具备分散CEF交换的功能时,就可使用集中CEF交换模式。 (2)分布式: (一般记作dCEF)允许路由器的多个线路卡(VIP)分别运行特快交换功能,前提是线路是VIP线路卡或GSR线路卡。中央路由处理器完成系统管理/路由选择和转发表计算等功能,并把CEF表分布到单个线路卡

内存映射

匿名 (未验证) 提交于 2019-12-02 23:43:01
内存映射文件和传统的I/o过程的区别 传统IO:块设备文件,磁盘文件 系统调用->页高速缓存->分配新页->磁盘->页高速缓存->用户进程空间的缓冲区 系统调用 read(),write() 系统调用read()将阻塞调用进程,知道数据被拷贝进用户态地址空间。规范模式但wirte()不同,它在数据被拷贝到页高速缓存(延迟写)后马上结束。同步模式完全写入磁盘 内存映射模式: mmap()将文件映射到内存中,文件就称为RAM中的一个字节数组,应用程序就可以直接访问数组元素,而不需用系统调用read(),write()或lseek() 可执行文件的加载 写页表->缺页异常->页高速缓存->新分配页->磁盘I/O->页高速缓存->更新页表项指向页高速缓存地址。 相关系统调用 以加载可执行文件的方式读文件,少了一次数据的拷贝。 页高速缓存: 内核缓冲区在linux下的实现: 历史: 旧版本页高速缓存和缓冲区高速缓存,前者用来存放访问磁盘文件内容时生成的磁盘数据项,后者把通过文件系统访问的块的内容保留在内存中。 后来,由于效率原因,不在单独分配块缓冲区,相反把它们存放在叫做“缓冲区页”的专门页中,而缓冲区页保存在页高速缓存中。 引用《深入理解linux内核》: 1.页高速缓存是Linux内核所使用的主要磁盘高速缓存,在绝大多数情况下,内核在读写磁盘时都应用页高速缓存

Java并发编程:volatile关键字解析

匿名 (未验证) 提交于 2019-12-02 21:53:52
Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。   volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用volatile关键字的场景。   以下是本文的目录大纲:   一.内存模型的相关概念   二.并发编程中的三个概念   三.Java内存模型   四..深入剖析volatile关键字   五.使用volatile关键字的场景   若有不正之处请多多谅解,并欢迎批评指正。   请尊重作者劳动成果,转载请标明原文链接:    http://www.cnblogs.com/dolphin0520/p/3920373.html 一.内存模型的相关概念   大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题

Java内存模型

匿名 (未验证) 提交于 2019-12-02 21:40:30
CPU的缓存模型 CPU的缓存模型: CPU缓存模型下会存在并发问题: 1、线程1读取flag=0,并存在CPU缓存,线程2读取flag=0,并存在CPU缓存。 2、线程1将flag=0修改为flag=1,并刷新到到CPU缓存中,但不会立刻刷新到主内存中。 3、线程2感知不了flag已经修改为1,仍然认为flag=0。 缓存一致性协议(MESI协议) MESI协议 : 保证在cpu缓存模型下不会出现多线程并发读写变量,没有办法及时的感知问题出现的机制。 对内存数据访问的控制类似于读写锁,它针对同一地址的读内存操作是并发的,而针对同一地址的写内存操作是独占的,一个处理器往内存中写数据时必须持有该数据的所有权。 处理器高速缓存的底层数据结构 : 拉链散列表的结构,每个bucket挂了很多的cache entry,每个cache entry由三个部分组成:tag、cache line和flag,其中的cache line就是缓存的数据(可以包含多个变量的值),tag指向了这个缓存数据在主内存中的数据的地址,flag标识了缓存行的状态。 处理器在读写高速缓存的时候,实际上会根据变量名执行一个内存地址解码的操作,解析出来index、tag和offset。index用于定位到拉链散列表中的某个bucket,tag是用于定位cache entry,offset是用于定位一个变量在cache

对缓存的思考——提高命中率

混江龙づ霸主 提交于 2019-12-01 03:36:07
开篇 编写高效的程序并不只在于算法的精巧,还应该考虑到计算机内部的组织结构,cpu微指令的执行,缓存的组织和工作原理等。 好的算法在实际中不见得有高效率,如果完全没有考虑缓存、微指令实现的话。 前两篇博文 局部性原理浅析 介绍了程序的局部性原理,如何写出局部性良好代码。 提高程序性能、何为缓存 讨论了存储器层次结构,计算机内部的存储结构、缓存的概念,简单的介绍了缓存的工作机制。 建议先阅读前两篇博文,虽然他们之间联系不大,在前面也有一些对本文的铺垫。而且,这是一个系列的文章。旨在优化程序性能。 这篇博文主要介绍的是缓存的组织、工作原理。拨开迷雾,让你更加清晰的认识缓存。 通用缓存结构 回顾 在 提高程序性能、何为缓存 中提到:早起的cpu存储层次只有三层,即cup的寄存器,DRAM主存和磁盘存储。因为寄存器和主存之间的访问时间开销差距很大,于是设计者在寄存器(一个时钟周期)和主存之间加入了L1缓存(2——4个时钟周期),后来由于L1缓存和主存之间的差距,又在主存和L1之间加入了L2缓存,当然后面还有L3缓存,,,等等。 在这里为了简单起见,假设CPU寄存器和主存之间只有一个L1缓存。 下图是高速缓存存储器的典型总线结构: 缓存结构 下图清晰的说明了通用缓存的组织结构: 可以看到,缓存内部是以组的形式组织的。图中的每一块代表一组,每组由一到多行组成(当然图中的是每组有多行)。

计算机基础知识

独自空忆成欢 提交于 2019-11-29 00:57:54
一、为何要学习计算机基础? 好多人觉得自己有点基础就都想着直接敲代码,觉得基础知识很容易,很简单,就不怎么用心去学。然而,我觉得基础知识很重要。就像盖一栋楼房一样,你先要打好地基,再去盖房。       Python是一门编程语言,即通俗一点说就是语言。    我们都知道世界上有很多种语言,比如:汉语,英语,阿拉伯语等等众多的语言。要想用这些语言去和人沟通,如果你想和英国人说话,你必须得会英语吧。而我们的计算机也有它自己的语言,你要想让计算机帮助我们做事情,你就需要和它沟通吧。那你就得懂得计算机语言吧,也就是编程。当然计算机也有很多语言,比如:C,Java,PHP,Python,C#等。所以我们就先从学习基础知识开始。也有人说学习基础理论知识很枯燥,但是,那还是得学。你要把它当成自己的兴趣,一点一点的去投入它,相信你会是很棒的。    程序用编程语言来写程序,最终开发的结果就是一个软件。就像大家都知道的QQ,腾讯视频,酷狗音乐等一系列软件。这些软件要想运行必须得有系统控制它吧。当然,有人会问:为什么要用操作系统呢?当然,很久以前的那些程序员确实是在没有操作环境下,编程语言是操作硬件来编写的。你可能觉得没问题,但是其实问题很严重。如果一直像以前那样会严重影响效率的。操作系统是出现在硬件之上的,是用来控制硬件的。所以,我们开发时只需要调用操作系统为我们提供的简单的接口就可以了。  

ioctl操作

随声附和 提交于 2019-11-28 05:14:17
  在本书中有两个地方都对这个函数进行了介绍,其实还有很多地方需要这个函数。ioclt函数传统上一直作为纳西而不适合归入其他精细定义类别的特性的系统接口。网络程序(特别是服务器程序)经常在程序启动执行后使用ioctl获取所在主机全部网络接口的信心,包括:接口地址、是否支持广播、是否支持多播。 #include <unistd.h> int ioctl(int fd,int request,...../* void *arg /); //返回:若成功则为0.失败则我-1 套接字操作 文件操作 接口操作 ARP高速缓存操作 路由表操作 流系统   不但某些ioclt操作和某些fcntl操作功能重叠(譬如把套接字设置为非阻塞),而且某些操作可以使用ioctl以不止一种方式制定(譬如设置套接字的进程组属主)。下表列出了网络相关ioctl请求的request参数以及arg地址必须指向的数据类型。 套接字操作   明确要求套接字ioctl请求有三个,它们都要求ioctl的第三个参数是指向某个整数的一个指针。 SIOCATMARK:如果本套接字的读指针当前位于带外标记,那就通过由第三个参数指向的帧数放回一个非0值,否则返回一个0值。 SIOCGPGRP:通过由第三个参数指向的整数返回本套接字的进程ID或进程组ID,该ID指定针对本套接字的SIGIO或SIGURG信号的接受进程。 SIOCSPGR

并发之原子性、可见性、有序性

若如初见. 提交于 2019-11-27 23:27:04
volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。   volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用volatile关键字的场景。   以下是本文的目录大纲:   一.内存模型的相关概念   二.并发编程中的三个概念   三.Java内存模型   四..深入剖析volatile关键字   五.使用volatile关键字的场景   若有不正之处请多多谅解,并欢迎批评指正。   请尊重作者劳动成果,转载请标明原文链接:   http://www.cnblogs.com/dolphin0520/p/3920373.html 一.内存模型的相关概念   大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快

彻底搞懂volatile关键字

让人想犯罪 __ 提交于 2019-11-27 15:52:08
对于volatile这个关键字,相信很多朋友都听说过,甚至使用过,这个关键字虽然字面上理解起来比较简单,但是要用好起来却不是一件容易的事。 这篇文章将从多个方面来讲解volatile,让你对它更加理解。 计算机中为什么会出现线程不安全的问题 volatile既然是与线程安全有关的问题,那我们先来了解一下计算机在处理数据的过程中为什么会出现线程不安全的问题。 大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中会涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。 为了处理这个问题,在CPU里面就有了高速缓存(Cache)的概念。当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。 我举个简单的例子,比如cpu在执行下面这段代码的时候, t = t + 1; 会先从高速缓存中查看是否有t的值,如果有,则直接拿来使用,如果没有,则会从主存中读取

并发数据结构:谈谈volatile变量

不问归期 提交于 2019-11-26 21:44:40
由来 在 CLR 2.0 Memory Model 中,我们知道现代CPU架构从CPU到Memory Controller每一级都有速度,容量不同的高速缓存。之所以这样设计,主要是因为性能。为了进一步提升性能,当线程读取内存中所期望的元素值时,CPU并不是只读取我们所期望的元素值,它实际上会同时读取该值周围的若干字节,并将其放入高速缓存中。这是因为应用程序通常读取的字节在内存中彼此相邻。当应用程序又读取该值周围的字节时,这些字节已经在高速缓存中了,这样就避免了应用程序再次访问内存,也提升了性能。 应用程序在单核CPU的机器上运行时,高速缓存不会有什么影响。但是当应用程序跑在多CPU/多核CPU的机器上时,我们就要考虑高速缓存所带来的显著影响了(请参考 CLR 2.0 Memory Model )。更槽糕的是,C#或JIT编译器编译代码时,会将指令重新排序。因此,应用程序的执行顺序可能会跟编写的顺序不同,而且现代CPU本身也支持乱序执行CPU指令。 这样,我们就不得不考虑如何来处理高速缓存一致性。不同的CPU处理方式也不尽相同。比如在 CLR 2.0 Memory Model 中讲到的x86架构的CPU就会维持高速缓存一致性,而x64架构向后兼容x86架构,所以也有此特性。但是IA64架构的CPU则被设计用来充分利用每个CPU的高速缓存,而且为了提升性能,尽量避免高速缓存一致性问题。