1. cpu中的cache结构及cache一致性算法
一. 引子浏览器
在多线程环境中,常常会有一些计数操做,用来统计线上服务的一些qps、平均延时、error等。为了完成这些统计,能够实现一个多线程环境下的计数器类库,方便记录和查看用户程序中的各种数值。在实现这个计数器类库时,能够利用thread local存储来避免cache bouncing,从而提升效率。注意,这种实现方式的本质是把写时的竞争转移到了读:读得合并全部写过的线程中的数据,而不可避免地变慢了。当你读写都很频繁并得基于数值作一些逻辑判断时,你不该该用前述的实现方式。那么,cache bouncing是什么?下面详细说明一下。缓存
二. 什么是cache bouncing?安全
为了以较低的成本大幅提升性能,现代CPU都有cache。cpu cache已经发展到了三级缓存结构,基本上如今买的我的电脑都是L3结构。其中L1和L2cache为每一个核独有,L3则全部核共享。为了保证全部的核看到正确的内存数据,一个核在写入本身的L1 cache后,CPU会执行Cache一致性算法把对应的cacheline(通常是64字节)同步到其余核。这个过程并不很快,是微秒级的,相比之下写入L1 cache只须要若干纳秒。当不少线程在频繁修改某个字段时,这个字段所在的cacheline被不停地同步到不一样的核上,就像在核间弹来弹去,这个现象就叫作cache bouncing。因为实现cache一致性每每有硬件锁,cache bouncing是一种隐式的的全局竞争。
服务器
cache bouncing使访问频繁修改的变量的开销陡增,甚至还会使访问同一个cacheline中不常修改的变量也变慢,这个现象是false sharing。按cacheline对齐能避免false sharing,但在某些状况下,咱们甚至还能避免修改“必须”修改的变量。当不少线程都在累加一个计数器时,咱们让每一个线程累加私有的变量而不参与全局竞争,在读取时咱们累加全部线程的私有变量。虽然读比以前慢多了,但因为这类计数器的读多为低频展示,慢点无所谓。而写就快多了,从微秒到纳秒,几百倍的差距。网络
三. cachesession
1. cache的意义多线程
为何须要CPU cache?由于CPU的频率太快了,快到主存跟不上,这样在处理器时钟周期内,CPU经常须要等待主存,浪费资源。因此cache的出现,是为了缓解CPU和内存之间速度的不匹配问题(结构:cpu -> cache -> memory)。架构
CPU cache有什么意义?cache的容量远远小于主存,所以出现cache miss在所不免,既然cache不能包含CPU所须要的全部数据,那么cache的存在真的有意义吗?固然是有意义的——局部性原理。工具
A. 时间局部性:若是某个数据被访问,那么在不久的未来它极可能被再次访问;
B. 空间局部性:若是某个数据被访问,那么与它相邻的数据很快也可能被访问;
2. cache和寄存器
存储器的三个性能指标——速度、容量和每位价格——致使了计算机组成中存储器的多级层次结构,其中主要是缓存和主存、主存和磁盘的结构。那么在主存之上,cache和寄存器之间的关系是?
举个例子,当你在思考一个问题的时候,寄存器存放的是你当前正在思考的内容,cache存放的是与该问题相关的记忆,主存则存放不管与该问题是否有关的全部记忆,因此,寄存器存放的是当前CPU执行的数据,而cache则缓存与该数据相关的部分数据,所以只要保证了cache的一致性,那么寄存器拿到的数据也必然具有一致性。
四. CPU cache结构
1. 单核CPU cache结构
在单核CPU结构中,为了缓解CPU指令流水中cycle冲突,L1分红了指令(L1P)和数据(L1D)两部分,而L2则是指令和数据共存。
2. 多核CPU cache结构
多核CPU的结构与单核类似,可是多了全部CPU共享的L3三级缓存。在多核CPU的结构中,L1和L2是CPU私有的,L3则是全部CPU核心共享的。
五. MESI(缓存一致性)
cache的写操做方式能够追溯到大学教程《计算机组成原理》一书。
A. write through(写通):每次CPU修改了cache中的内容,当即更新到内存,也就意味着每次CPU写共享数据,都会致使总线事务,所以这种方式经常会引发总线事务的竞争,高一致性,可是效率很是低;
B. write back(写回):每次CPU修改了cache中的数据,不会当即更新到内存,而是等到cache line在某一个必须或合适的时机才会更新到内存中;
不管是写通仍是写回,在多线程环境下都须要处理缓存cache一致性问题。为了保证缓存一致性,处理器又提供了写失效(write invalidate)和写更新(write update)两个操做来保证cache一致性。
写失效:当一个CPU修改了数据,若是其余CPU有该数据,则通知其为无效;
写更新:当一个CPU修改了数据,若是其余CPU有该数据,则通知其跟新数据;
写更新会致使大量的更新操做,所以在MESI协议中,采起的是写失效(即MESI中的I:ivalid,若是采用的是写更新,那么就不是MESI协议了,而是MESU协议)。
2. cache line
cache line是cache与内存数据交换的最小单位,根据操做系统通常是32byte或64byte。在MESI协议中,状态能够是M、E、S、I,地址则是cache line中映射的内存地址,数据则是从内存中读取的数据。
工做方式:当CPU从cache中读取数据的时候,会比较地址是否相同,若是相同则检查cache line的状态,再决定该数据是否有效,无效则从主存中获取数据,发起一次RR(remote read);
工做效率:当CPU可以从cache中拿到有效数据的时候,消耗几个CPU cycle,若是发生cache miss,则会消耗几十上百个CPU cycle;
cache的工做原理以及在主板上的结构以下两图所示:
3. 状态介绍
MESI协议将cache line的状态分红modify、exclusive、shared、invalid,分别是修改、独占、共享和失效。
modify:当前CPU cache拥有最新数据(最新的cache line),其余CPU拥有失效数据(cache line的状态是invalid),虽然当前CPU中的数据和主存是不一致的,可是以当前CPU的数据为准;
exclusive:只有当前CPU中有数据,其余CPU中没有改数据,当前CPU的数据和主存中的数据是一致的;
shared:当前CPU和其余CPU中都有共同数据,而且和主存中的数据一致;
invalid:当前CPU中的数据失效,数据应该从主存中获取,其余CPU中可能有数据也可能无数据,当前CPU中的数据和主存被认为是不一致的;
对于invalid而言,在MESI协议中采起的是写失效(write invalidate)。
4. cache操做
MESI协议中,每一个cache的控制器不只知道本身的操做(local read和local write),经过监听也知道其余CPU中cache的操做(remote read和remote write)。对于本身本地缓存有的数据,CPU仅须要发起local操做,不然发起remote操做,从主存中读取数据,cache控制器经过总线监听,仅可以知道其余CPU发起的remote操做,可是若是local操做会致使数据不一致性,cache控制器会通知其余CPU的cache控制器修改状态。
local read(LR):读本地cache中的数据;
local write(LW):将数据写到本地cache;
remote read(RR):读取内存中的数据;
remote write(RW):将数据写通到主存;
5. 状态转换和cache操做
如上文内容所述,MESI协议中cache line数据状态有4种,引发数据状态转换的CPU cache操做也有4种,所以要理解MESI协议,就要将这16种状态转换的状况讨论清楚。
MESI协议为了保证多个CPU cache中共享数据的一致性,定义了cache line的四种状态,而CPU对cache的4种操做可能会产生不一致状态,所以cache控制器监听到本地操做和远程操做的时候,须要对地址一致的cache line状态作出必定的修改,从而保证数据在多个cache之间流转的一致性。
2. 客户端-服务器模式架构
客户端-服务器模式
定义:客户端-服务器模式(Client–server model)简称C/S结构,是一种网络架构,它把客户端 (Client) 与服务器 (Server) 区分开来。每个客户端软件的实例均可以向一个服务器或应用程序服务器发出请求。
C/S结构:Client/Server结构(C/S结构)是你们熟知的客户机和服务器结构。它是软件系统体系结构,经过它能够充分利用两端硬件环境的优点,将任务合理分配到Client端和Server端来实现,下降了系统的通信开销。
这是一个过程,这一般使得信息请求。获得回应后,这一过程可能会终止或可能会作一些其余的处理。
例如: 互联网浏览器做为一个客户端应用程序,Web服务器发送一个请求到获得一个HTML网页。
它接受一个来自客户端的请求的过程。得到来自客户端的请求后会处理所需的收集所需的信息,将其发送到请求客户端。一旦这样作完成后,就又变成准备为另外一个客户端。服务器进程始终等待准备用于处理传入请求。
实例: Web服务器一直等待来自互联网浏览器的请求,并尽快获得任何请求从浏览器,它拿起一个请求的HTML页面,并把它发送回该浏览器。
注意,客户端须要知道的存在服务器的地址,可是服务器并不须要在创建的链接以前知道客户端的地址。一旦创建链接后,双方均可以发送和接收信息。
有两种类型的客户端服务器架构:
两层构架: 在这种架构中,客户端直接与服务器进行交互。这种类型的架构可能有一些安全漏洞和性能问题。 IE浏览器和Web服务器的两层架构。这里的安全问题都解决了使用安全套接字层(SSL)。
三层架构:在这个架构中,多了一个软件位于客户端和服务器之间。这中间的软件被称为中间件。中间件被用来执行全部的安全检查和重负载状况下的负载平衡。中间件须要从客户端的全部请求,并作必要的验证后,经过向服务器发出请求。而后,服务器没有所需的处理和发送响应回中间件,中间件终于经过这个响应返回给客户端。若是想实现一个3层架构,那么可使用如Web Logic或WebSphere软件在Web服务器和Web浏览器之间的任何中间件。
优势:
(1)可实现资源共享。C/L结构中的资源是分布的,客户机与服务器具备一对多的关系和运行环境。用户不只可存取在服务器和本地工做站上的资源,还能够享用其余工做站上的资源,实现了资源共享。
(2)可实现管理科学化和专业化。系统中的资源分布在各服务器和工做站上,能够采用分层管理和专业化管理相结合的方式,用户有权去充分利用本部门、本领域的专业知识来参与管理,使得各级管理更加科学化和专业化。
(3)可快速进行信息处理。因为在 C/S 结构中是一种基于点对点的运行环境,当一项任务提出请求处理时,能够在全部可能的服务器间均衡地分布该项任务的负载。这样,在客户端发出的请求可由多个服务器来并行进行处理,为每一项请求提供了极快的响应速度和较高的事务吞吐量。
(4)能更好地保护原有的资源。因为C/S是一种开放式的结构,可有效地保护原有的软、硬件资源。之前,在其余环境下积累的的数据和软件都可在C/S中经过集成而保留使用,而且能够透明地访问多个异构的数据源和自由地选用不一样厂家的数据应用开发工具,具备高度的灵活性;而之前的硬件亦可彻底继续使用,当在系统中增长硬件资源时,不会减弱系统的能力,同时客户机和服务器都可单独地升级,故具备极好的可扩充性。
3. 局域网通讯原理
上图中连线应该是双向箭头,这里就不在进行修改了
局域网中A和B进行通讯,能够直接链接网线。但当局域网中计算机比较多的时候呢?都链接网线吗?显然这种作法不太行。由此交换机就应运而生。
局域网间多个计算机进行相互通讯,依靠的就是交换机。下面说一下计算机之间进行通信的详细流程。在这以前先了解一下网络的层次。这里以五层为例;
================================
应用层
传输层(端口号 TCP.UDP等协议)
网络层
数据链路层(ARP地址解析协议)
物理层 (网线等)
================================
好比A、C间进行通讯:
A第一次找C时,会经过广播的形式来通知局域网内的其余计算机(这里为B,C)。C则会经过地址解析协议(ARP)将本身的IP与MAC进行绑定,而后发送给A。A中此时有C的
IP-MAC,下次A会将MAC地址发送给交换机,从而查找C,进而找到C中对应的进程端口号(计算机之间的交互,其实就是各个进程之间的交互)。