CAS

服务器兼数据同步

孤街浪徒 提交于 2020-07-28 09:58:27
数据库的备份是一个长期的过程,而恢复只在发生事故后进行,恢复可以看作是备份的逆过程,恢复的程度的好坏很大程度上依赖于备份的情况。在全球大数据暴增的趋势下,市场上以Oracle/Mysql为主的数据库的数据量也越来越大。 那么,UCACHE灾备云如何为企业数据库备份提供持续的数据保护、实时增量备份、数据库自动恢复、数据库归档、灾难恢复等场景,来满足企业不同的RPO,RTO要求呢? 一、UCACHE灾备云作为支持各类虚拟化/云平台的数据备份/恢复的工具 二、作为支持各类数据库的数据备份/恢复工具 三、作为支持各类应用文件系统的数据备份/恢复工具 四、采用块级增量备份技术和即时恢复方式,减少99%的恢复时间; 五、重复数据删除技术,减少备份窗口 , 存储节约70%,重删比接近85%; 六、采用全程加密的方式,同时数据有重删压缩功能,极大的缩短了数据的恢复时间 七、云端千M带宽出口:支持千M北京BGP带宽,为用户数据搬迁全面加速; 八、可以实现秒级接管、分钟级数据库复制和迁移、恢复; UCACHE灾备云功能列举:数据保留策略、流量控制、任务告警、任务日志、FusionCloud 云平台备份/恢复、FusionCloud 云平台备份/恢复、VMware架构虚拟化备份/恢复、H3C CAS云平台备份/恢复、OpenStack云平台备份/恢复、XenServer虚拟化备份/恢复、Hyper

Java 可重入锁内存可见性分析

邮差的信 提交于 2020-07-28 06:33:40
作者:周童 来自酒店搜索报价中心,主要负责酒店报价缓存,计算相关系统的开发以及性能优化等工作,热爱摩旅。 一个习以为常的细节 之前在做 ReentrantLock 相关的试验,试验本身很简单,和本文相关的简化版如下:**(提示:以下代码均可左右滑动) 就是通过可重入锁的保护并行对共享变量进行自增。 突然想到一个问题:**共享变量 count 没有加 volatile 修饰,那么在并发自增的过程当中是如何保持内存立即可见的呢?**上面的代码做自增肯定是没问题的,可见 LOCK 不仅仅保证了独占性,必定还有一种机制保证了内存可见性。 可能很多人和我一样,对 LOCK 的认知是如此 “理所应当”,以至于从没有去思考为什么。就好像每天太阳都会从东方升起而不觉得这有什么好质疑的。现在既然问到这儿了,那就准备一探究竟。 几个概念 Java Memory Model (JMM) 即 Java 内存模型,直接引用 wiki 定义: "The Java memory model describes how threads in the Java programming language interact through memory. Together with the description of single-threaded execution of code, the memory

Java 中队列同步器 AQS(AbstractQueuedSynchronizer)实现原理

情到浓时终转凉″ 提交于 2020-07-28 04:40:59
前言 在 Java 中通过锁来控制多个线程对共享资源的访问,使用 Java 编程语言开发的朋友都知道,可以通过 synchronized 关键字来实现锁的功能,它可以隐式的获取锁,也就是说我们使用该关键字并不需要去关心锁的获取和释放过程,但是在提供方便的同时也意味着其灵活性的下降。例如,有这样的一个场景,先获取锁 A,然后再获取锁 B,当锁 B 获取到之后,释放锁 A 同时获取锁 C,当获取锁 C 后,再释放锁 B 同时获取锁 D,依次类推,像这种比较复杂的场景,使用 synchronized 关键字就比较难实现了。 在 Java SE 5 之后,新增加了 Lock 接口和一系列的实现类来提供和 synchronized 关键字一样的功能,它需要我们显示的进行锁的获取和释放,除此之外还提供了可响应中断的锁获取操作以及超时获取锁等同步特性。JDK 中提供的 Lock 接口实现类大部分都是聚合一个同步器 AQS 的子类来实现多线程的访问控制的,下面我们看看这个构建锁和其它同步组件的基础框架——队列同步器 AQS(AbstractQueuedSynchronizer)。 AQS 基础数据结构 同步队列 队列同步器 AQS(下文简称为同步器)主要是依赖于内部的一个 FIFO(first-in-first-out)双向队列来对同步状态进行管理的,当线程获取同步状态失败时

计算机基础知识03

别等时光非礼了梦想. 提交于 2020-07-28 03:54:37
内存管理 内存管理的发展历程 DOS时代 - 同一时间只能有一个进程在运行(也有一些特殊算法可以支持多进程) windows9x - 多个进程装入内存 1:内存不够用 2:互相打扰 为了解决这两个问题,诞生了现在的内存管理系统:虚拟地址 分页装入 软硬件结合寻址 程序在磁盘存储的时候,已经按块存储了,每块4k用于加载到内存页中,并产生页表,在页表中记录每块的功能,比如执行程序在第二块,那么在执行程序的时候,会把第二块加载到内存中用于执行,当执行完以后发现要用第三块,在把第三块加载到内存页中; 分页(内存不够用),内存中分成固定大小的页框(4K),把程序(硬盘上)分成4K大小的块,用到哪一块,加载那一块,加载的过程中,如果内存已经满了,会把最不常用的一块放到swap分区, 把最新的一块加载进来,这个就是著名的LRU算法 LRU算法 LeetCode146题,头条要求手撕,阿里去年也要求手撕 Least Recently Used 最不常用 哈希表(保证 查找操作O(1)) + 链表 (保证 排序操作和新增操作 O(1))) 双向链表 (保证 左边指针 指向右边块) 虚拟内存(解决相互打扰问题) DOS Win31 ... 互相干掉 为了保证互不影响 - 让进程工作在虚拟空间,程序中用到的空间地址不再是直接的物理地址,而是虚拟的地址,这样,A进程永远不可能访问到B进程的空间

java并发编程 -CountDownLatch和CyclicBarrier在内部实现和场景上的区别

霸气de小男生 提交于 2020-07-28 02:58:32
前言 CountDownLatch和CyclicBarrier两个同为java并发编程的重要工具类,它们在诸多多线程并发或并行场景中得到了广泛的应用。但两者就其内部实现和使用场景而言是各有所侧重的。 内部实现差异 前者更多依赖经典的AQS机制和CAS机制来控制器内部状态的更迭和计数器本身的变化,而后者更多依靠可重入Lock等机制来控制其内部并发安全性和一致性。 public class { //Synchronization control For CountDownLatch. //Uses AQS state to represent count. private static final class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 4982264981922014374L; Sync(int count) { setState(count); } int getCount() { return getState(); } protected int tryAcquireShared(int acquires) { return (getState() == 0) ? 1 : -1; } protected boolean

Synchronized关键字及锁的升级状态

可紊 提交于 2020-07-27 22:36:34
Synchronized关键字及锁的升级状态 ① 对于synchronized锁的理解 Synchronized锁的理解 :执行System.out.println(*****)这段代码时, synchronized锁定了o这个对象 ,而不是锁定代码块, 锁的信息记录在对象里 ; 简单理解:你要进屋子里,就要打开门,对象就是门,锁要加在门上,也就是对象上; 锁的信息是记录在对象头中的 markword 里面 ; ② JVM内置锁(Synchronized)的升级状态讲解 2.1 对象的状态有哪些? 无锁态 刚刚new出来的对象 001 偏向锁 101 轻量锁(自旋锁、无锁、自适应自旋) 00 重量锁 10 GC标记 2.2 锁的升级状态讲解 Markword中记录的锁的信息 无锁态 --> 偏向锁 当第一个线程来使用时,先不用那么重量级的锁,就贴个标签(轻量锁); 主要针对没有出现竞争的情况; 偏向锁 --> 轻量锁 当有其他线程也来使用, 造成竞争 时,自动升级为轻量锁; 过程:撤销偏向锁,然后每个线程中的Lock Record用CAS的方式去抢锁;没抢到锁的线程就采用CAS机制自旋等待; 轻量锁执行在用户态,不需要经过内核态,效率高; 轻量锁 --> 重量锁 主要解决竞争较大时,某个线程占用CPU过久(占用锁过久)的问题,其他线程在一直自旋等待,等待过程会一直消耗 CPU;

Redis的面试问题总结,面试跳槽必备

[亡魂溺海] 提交于 2020-07-27 22:34:58
1.什么是redis? Redis 是一个基于内存的高性能key-value数据库。 2.Reids的特点  Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。 Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的memcached来用。 Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。 3.使用redis有哪些好处?   (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) (2) 支持丰富数据类型

Java 可重入锁内存可见性分析

我只是一个虾纸丫 提交于 2020-07-27 18:31:23
作者:周童 来自酒店搜索报价中心,主要负责酒店报价缓存,计算相关系统的开发以及性能优化等工作,热爱摩旅。 一个习以为常的细节 之前在做 ReentrantLock 相关的试验,试验本身很简单,和本文相关的简化版如下:**(提示:以下代码均可左右滑动) 就是通过可重入锁的保护并行对共享变量进行自增。 突然想到一个问题: 共享变量 count 没有加 volatile 修饰,那么在并发自增的过程当中是如何保持内存立即可见的呢? 上面的代码做自增肯定是没问题的,可见 LOCK 不仅仅保证了独占性,必定还有一种机制保证了内存可见性。 可能很多人和我一样,对 LOCK 的认知是如此 “理所应当”,以至于从没有去思考为什么。就好像每天太阳都会从东方升起而不觉得这有什么好质疑的。现在既然问到这儿了,那就准备一探究竟。 几个概念 Java Memory Model (JMM) 即 Java 内存模型,直接引用 wiki 定义: "The Java memory model describes how threads in the Java programming language interact through memory. Together with the description of single-threaded execution of code, the memory model

Java 可重入锁内存可见性分析

送分小仙女□ 提交于 2020-07-27 16:23:41
作者:周童 来自酒店搜索报价中心,主要负责酒店报价缓存,计算相关系统的开发以及性能优化等工作,热爱摩旅。 一个习以为常的细节 之前在做 ReentrantLock 相关的试验,试验本身很简单,和本文相关的简化版如下:**(提示:以下代码均可左右滑动) 就是通过可重入锁的保护并行对共享变量进行自增。 突然想到一个问题: 共享变量 count 没有加 volatile 修饰,那么在并发自增的过程当中是如何保持内存立即可见的呢? 上面的代码做自增肯定是没问题的,可见 LOCK 不仅仅保证了独占性,必定还有一种机制保证了内存可见性。 可能很多人和我一样,对 LOCK 的认知是如此 “理所应当”,以至于从没有去思考为什么。就好像每天太阳都会从东方升起而不觉得这有什么好质疑的。现在既然问到这儿了,那就准备一探究竟。 几个概念 Java Memory Model (JMM) 即 Java 内存模型,直接引用 wiki 定义: "The Java memory model describes how threads in the Java programming language interact through memory. Together with the description of single-threaded execution of code, the memory model

Synchronized加锁、锁升级和java对象内存结构

﹥>﹥吖頭↗ 提交于 2020-07-27 14:34:20
首先了解一下 JMM 中定义的内存操作: 一个线程操作数据时候都是从主内存(堆内存)读取到自己工作内存(线程私有的数据区域)中再进行操作。对于硬件内存来说,并没有工作内存和主内存的区分,这都是 java 内存模型划分出来的,它只是一种抽象的概念,是一组规则,并不是实际存在的。 Java 内存模型中定义了 八种同步操作 : 1.lock( 锁定 ) :作用于主内存的变量,把一个变量标记为一条线程独占状态 2.unlock( 解锁 ) :作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定 3.read( 读取 ) :作用于主内存的变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的 load 动作使用 4.load( 载入 ) :作用于工作内存的变量,它把 read 操作从主内存中得到的变量值放入工作内存的变量副本中 5.use( 使用 ) :作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎 6.assign( 赋值 ) :作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量 7.store( 存储 ) :作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的 write 的操作 8.write( 写入 ) :作用于工作内存的变量,它把 store