缓存

JSE-1.1.4 内存屏障和CPU缓存

痞子三分冷 提交于 2020-03-03 15:21:35
内存屏障和CPU缓存 【信息】 CPU性能优化手段-缓存 为了提高程序运行的性能 例如:CPU高速缓存。尽可能地避免处理器访问主内存的时间开销,处理器大多会利用缓存以提高性能。 CPU有三级缓存:L1-L3 多级缓存 L1 Cache(一级缓存):CPU第一层高速缓存,分为数据缓存和指令缓存。一般容量在32-4096KB。 L2:由于L1高速缓存容量的限制,为了提高CPU的运算速度,在CPU外部放置一高速存储器,即二级缓存。 L3:现在都是内置的。可以进一步降低内存延迟,同时提升大数据量计算时处理器的性能。具有较大L3缓存的处理器提供更有效的文件系统缓存行为及较短消息和处理器队列长度。 一般多核共享一个L3缓存 ! CPU读数据时,读取顺序:L1-L2-L3-内存-外存储器 缓存同步协议 多CPU读取同样的数据进行缓存,进行不同运算之后,最终写入主内存以哪个CPU为准? MESI协议 ,规定每条缓存有一条状态位,4个状态: 修改态(Modified):此cache行已被修改过(脏行),内容已不同于主存,为此cache专有。 专有态(Exclusive):此cache行内存同于主内存,但不出现与其他cache中。 共享态(Shared):此cache行内容同于主内存,但也出现于其他cache中。 无效态(Invalid):此cache行内容无效(空行) 多处理器时

多线程与并发编程

风格不统一 提交于 2020-03-03 15:14:15
单线程。 cpu核心的缓存只被一个线程访问。缓存独占,不会出现访问冲突等问题。 单核CPU,多线程。 进程中的多个线程会同时访问进程中的共享数据,CPU将某块内存加载到缓存后,不同线程在访问相同的物理地址的时候,都会映射到相同的缓存位置,这样即使发生线程的切换,缓存仍然不会失效。但由于任何时刻只能有一个线程在执行,因此不会出现缓存访问冲突。 多核CPU、多线程情况下存在缓存不一致的情况 每个核都至少有一个L1 缓存。多个线程访问进程中的某个共享内存,且这多个线程分别在不同的核心上执行,则每个核心都会在各自的caehe中保留一份共享内存的缓冲。由于多核是可以并行的,可能会出现多个线程同时写各自的缓存的情况,而各自的cache之间的数据就有可能不同。 在CPU和主存之间增加缓存,在多线程场景下就可能存在 缓存一致性问题 ,也就是说,在多核CPU中,每个核的自己的缓存中,关于同一个数据的缓存内容可能不一致。 理解为: 如果这家公司的命令都是串行下发的话,那么就没有任何问题。 如果这家公司的命令都是并行下发的话,并且这些命令都是由同一个CEO下发的,这种机制是也没有什么问题。因为他的命令执行者只有一套管理体系。 如果这家公司的命令都是并行下发的话,并且这些命令是由多个合伙人下发的,这就有问题了。因为每个合伙人只会把命令下达给自己直属的管理人员,而多个管理人员管理的底层员工可能是公用的。

webpack构建离线应用 Service Workers

风格不统一 提交于 2020-03-03 12:00:38
1 简介 Service Workers是一个在浏览器后台运行的脚本,它的生命周期完 全独立于网页。它无法直接访问DOM,但可以通过postMessage接口发 送消息来和UI进程通信。拦截网络请求是Service Workers的重要功能, 通过Service Workers能完成离线缓存、编辑响应、过滤响应等功能。 2 兼容性 判断浏览器是否支持Service Workers的最简单方法是通过以下代 码: if (navigator.serviceWorker) { // 可以使用navigator.serviceWorker } 3 注册 要为网页接入Service Workers,就需要在网页加载后注册一个描述 Service Workers逻辑的脚本。代码如下: <script> if (navigator.serviceWorker) { window.addEventListener('load', () => { navigator.serviceWorker.register('../sw.js').then((registration) => { // Registration was successful console.log('ServiceWorker registration successful with scope: ', registration

Shiro框架缓存相关

给你一囗甜甜゛ 提交于 2020-03-03 10:13:37
shiro框架使用缓存 解决问题:登陆之后每次访问页面都要进行认证(消耗性能),使用缓存技术,只需要认证一次,即可多次访问 1.pom文件中导入依赖包 <!--导入缓存所需要的包--> < dependency > < groupId > org.springframework.boot </ groupId > < artifactId > spring-boot-starter-cache </ artifactId > </ dependency > < dependency > < groupId > net.sf.ehcache </ groupId > < artifactId > ehcache </ artifactId > < version > 2.10.4 </ version > </ dependency > < dependency > < groupId > org.apache.shiro </ groupId > < artifactId > shiro-ehcache </ artifactId > < version > 1.4.0 </ version > </ dependency > 2.resource目录中导入ehcahe.xml文件 <?xml version="1.0" encoding="UTF-8"?> < ehcache

解决ecshop清除缓存css样式没反应问题

折月煮酒 提交于 2020-03-03 09:36:31
部分浏览器例如谷歌或360等双核浏览器会对商城的css样式进行缓存,导致修改了css样式文件也没有更新。 ecshop模板 提供解决方法,修改后效果如下: 解决方法: 修改includes/init.php 找到 if (!empty($_CFG['stylename'])) { $smarty->assign('ecs_css_path', 'themes/' . $_CFG['template'] . '/style_' . $_CFG['stylename'] . '.css'); } else { $smarty->assign('ecs_css_path', 'themes/' . $_CFG['template'] . '/style.css'); } 修改为: if (!empty($_CFG['stylename'])) { $smarty->assign('ecs_css_path', 'themes/' . $_CFG['template'] . '/style_' . $_CFG['stylename'] . '.css?'.time()); } else { $smarty->assign('ecs_css_path', 'themes/' . $_CFG['template'] . '/style.css?'.time()); } 修改后,style

HTTP探索之初学乍练

戏子无情 提交于 2020-03-03 08:02:36
一、什么是HTTP? Hypertext Transfer Protocol(HTTP)协议(RFC7230) 一种无状态的、应用层、以请求/应答方式运行的协议,它使用可扩展的语义和自描述消息格式,与基于网络的超文本信息系统灵活的互动。 二、HTTP请求行与响应行 请求行格式(ABNF方式描述) Request-line = method SP request-target SP HTTP-version CRLF HTTP常见方法(RFC7231) GET:主要的获取信息方法,大量的性能优化都针对该方法,幂等方法 HEAD:类似GET方法,但服务器不发送BODY,用以获取HEAD元数据,幂等方法 POST:常用于提交HTML FORM表单、新增资源等 PUT:更新资源,带条件时是幂等方法 DELETE:删除资源,幂等方法 CONNECT:建立tunnel隧道 OPTIONS:显示服务器对访问资源支持的方法,幂等方法 TRACE:回显服务器收到的请求,用于定位问题。有安全风险 Request-target origin-form:后端请求资源的路径,为空时传递/ absolute-form:用于正向代理 authority-form:用于CONNECT方法 asterisk-form:用于OPTIONS方法 HTTP-version 版本号发展历史 HTTP/0.9:只支持GET

dns原理介绍及实践问题总结

我的未来我决定 提交于 2020-03-03 07:11:35
1 问题引入: a) 域名劫持: dns过程中某个环节被攻击/篡改,导致dns结果为劫持者的服务器。例如竞争对手将你方的app下载地址篡改为他方的app下载地址。 b) 对现网用户进行监控时,发现个别用户请求时间为几十秒,而客户端设置的connectTimeout时间为二十秒。 原因:初步判断为dns解析时间耗时过长导致整个接口请求时间远远超过了10s。 解决办法: 自定义dns,设置超时时间。 (使用的的是OkHttp,支持自定义dns) c) 测试环境dns几十秒,现网正常 原因: 旧的代码里面对url解析为host有bug,当传入一个测试环境地址,例如 10.10.10.10:6026/path,最终解析出来的host为10.10.10.10:6026, 当调用系统的InetAddress.getAllByName("10.10.10.10:6026"),耗时非常长(几十秒) 分析: 首先10.10.10.10:6026不是一个host地址也不是一个ip地址,所以dns是无法解析的。 方法内部会把它当成一个host在到不同的dns服务器上去查找它的ip,最后返回失败。 解决办法: 使用InetAddress中提供的方法来获取host,拒绝自己实现一套 d) no route to host 2 dns过程介绍 2.1 什么是dns DNS (Domain Name

Java并发机制的底层实现--volatile

Deadly 提交于 2020-03-03 05:59:40
Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,JAVA中所使用的并发机制依赖于JVM的实现和CPU的指令。 volatile的应用 在线程并发编程中sychronized和volatile都扮演者重要的角色,volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性“。可见性的意思是当一个线程修改一个共享变量时,另一个线程能读到这个修改的值。如果volatile变量修饰符使用恰当的话,它比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。 1.volatile的定义与实现原理 Java语言规范第三版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被唯一和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁更加方便。如果一个字段被声明为volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。 在了解volatile的实现原理之前,我们先来看下与其实现原理相关的CPU术语与说明。 volatile是如何来保证可见性的呢?让我们在X86处理器下通过工具获取JIT编译器生成的汇编指令来查看对volatile进行写操作时

MySql基础

浪子不回头ぞ 提交于 2020-03-03 01:40:59
这是我第一次写博客,写的不好希望大家指正(说实话,有点紧张)。 今天我们要把MySql的内部"拆解"开来,通过了解MySql内部当我们发生问题时能够更快速的定位到问题。 下面是MySql的基本架构示意图,从图中可以观察到SQL语句在MySql中的执行过程 连接器:提供与客户端连接的服务。对用户输入的用户名和密码进行校验。 如果用户名或密码不正确,就会提示"Access denied for user"的错误,随后客户端程序结束。 如果通过用户名密码通过验证,则连接器就会到权限表中查出你的权限,以后这个连接的权限都和此时读到的权限相同。 这就意味着,一个用户建立了连接后,即使你使用管理员账号对这个用户的权限进行修改,也不会影响已经存在连接的权限。修改后,只能新建连接才能使用新的权限。 当客户端长时间没动静,连接器就会自动将其断开(默认为8小时,通过show global variables like ‘wait_timeout’;查看全局时间)。这个时间是由wait_timeout控制。 连接完成后,如果没有进行操作,则这个连接就处于空闲状态,使用show processlist;可以查看连接状态。如下图,其中command列显示为sleep则为空闲连接。 查询缓存:MySql内置的一种缓存机制,比如我们进行select * from student查询

http缓存详解

心已入冬 提交于 2020-03-03 00:34:52
单独拎出来的缓存问题,http的缓存 前后端的http交互中,使用缓存能很大程度上的提升效率,而且基本上对性能有要求的前端项目都是必用缓存的。 强缓存与弱缓存 缓存可以简单的划分成两种类型: 强缓存 ( 200 from cache )与 协商缓存 ( 304 )。 区别简述如下: 强缓存( 200 from cache )时,浏览器如果判断本地缓存未过期,就直接使用,无需发起http请求 协商缓存( 304 )时,浏览器会向服务端发起http请求,然后服务端告诉浏览器文件未改变,让浏览器使用本地缓存 对于协商缓存,使用 Ctrl + F5 强制刷新可以使得缓存无效。但是对于强缓存,在未过期时,必须更新资源路径才能发起新的请求(更改了路径相当于是另一个资源了,这也是前端工程化中常用到的技巧)。 缓存头部简述 上述提到了强缓存和协商缓存,那它们是怎么区分的呢?答案是通过不同的http头部控制。 先看下这几个头部: If - None - Match / E - tag 、 If - Modified - Since / Last - Modified 、 Cache - Control / Max - Age 、 Pragma / Expires 这些就是缓存中常用到的头部,这里不展开。仅列举下大致使用。 属于强缓存控制的: ( http1 . 1 ) Cache - Control