COW

并发和Read-copy update(RCU)

空扰寡人 提交于 2020-08-06 02:47:57
简介 在上一篇文章中的并发和ABA问题的介绍中,我们提到了要解决ABA中的memory reclamation问题,有一个办法就是使用RCU。 详见 ABA问题的本质及其解决办法 ,今天本文将会深入的探讨一下RCU是什么,RCU和COW(Copy-On-Write)之间的关系。 RCU(Read-copy update)是一种同步机制,并在2002年被加入了Linux内核中。它的优点就是可以在更新的过程中,运行多个reader进行读操作。 熟悉锁的朋友应该知道,对于排它锁,同一时间只允许一个操作进行,不管这个操作是读还是写。 对于读写锁,可以允许同时读,但是不能允许同时写,并且这个写锁是排他的,也就是说写的同时是不允许进行读操作的。 RCU可以支持一个写操作和多个读操作同时进行。 更多精彩内容且看: 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新 Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新 Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新 java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程 更多内容请访问 www.flydean.com Copy on Write和RCU 什么是Copy on Write? 它和read copy

最短路问题

二次信任 提交于 2020-07-28 10:05:23
* 加载本页面时,公式可能未渲染(显示乱码)请刷新该页面重试 单源最短路 Dijkstra算法(不带负权,单源最短路) (这里干讲不好说,所以直接上模板题来分析一下) 时间复杂度 \(O(N^2)\) (朴素) \(O((M+N)logN)\) (优化后) 空间复杂度 \(O(M)\) 模板题 [1] POJ-2387 Til the Cows Come Home Description Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before Farmer John wakes her for the morning milking. Bessie needs her beauty sleep, so she wants to get back as quickly as possible. Farmer John's field has N (2 <= N <= 1000) landmarks in it, uniquely numbered 1..N. Landmark 1 is the barn; the apple tree grove in which Bessie stands all day is landmark N.

谷歌技术探究之GFS

回眸只為那壹抹淺笑 提交于 2020-05-07 11:44:24
文章目录 引言 GFS的主要设计预期 GFS架构 chunk相关 一致性模型 系统的交互过程 租约(lease) 快照 副本选择 容错机制 master chunk FAQ 总结 引言 GFS可以说是当今云计算的鼻祖,直至今日借鉴其思想的HDFS仍旧活跃在我们的视线当中,我们实在是有必要去好好的学习下相关的知识的,这篇文章是在学习了《The Google File System》这篇论文以后的一点理解和总结,以及对于6.824相关课程资料的结合。因为掺杂了个人的理解有些地方可能并不准确,还望有不同见解的朋友能不吝赐教。 GFS的主要设计预期 系统由廉价的普通机器组成, 所以失效是一种常态 。 系统存储一定数量的大文件 ,预期会有几百万文件,文件的大小通常在100MB或者以上。 工作负载主要由两种读操作构成, 大规模的流式读取和小规模的随机读取 。 工作负载还有写操作,一般是 大规模的、顺序的、数据追加方式的写操作,所以系统支持原子的数据追加操作 。 在高吞吐量和低延时之间GFS选择前者 。 GFS架构 我们可以看到处理 GFS client 以外还有 GFS master 和 GFS chunkserver 。 一般而言整个集群中存在一个master,当然这个一个指的不是一台机器,而是一个集群,其中的机器负责主master的容错,和负载均衡。还存在着许多的 GFS

【模板】deque实现单调队列

浪尽此生 提交于 2020-05-06 10:54:21
双端队列 deque 容器: 关于 deque 最常用的有这几个函数 : 都是成员函数 双端队列模板题: 【洛谷】P2952 [USACO09OPEN]牛线Cow Line 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<deque> 6 using namespace std; 7 8 int n, cnt; 9 deque< int > q; 10 11 int main() { 12 scanf( " %d\n " , & n); 13 char s[ 21 ]; 14 for ( int i= 1 ; i<=n; ++ i) { 15 gets(s); 16 if (s[ 0 ] == ' A ' ) 17 if (s[ 2 ] == ' L ' ) q.push_front(++ cnt); 18 else q.push_back(++ cnt); 19 if (s[ 0 ] == ' D ' ) { 20 int m = 0 , j = 1 ; 21 while (s[j]< ' 0 ' || s[j]> ' 9 ' ) ++ j; 22 while (s[j]>= ' 0 ' && s[j]<= ' 9 ' ) 23 m = (m

PHP7的Yaconf使用教程

和自甴很熟 提交于 2020-05-06 09:21:42
简介 首先说说, 这个是干啥的. 我见过很多的项目中, 用PHP文件做配置的, 一个config目录下可能有十几个甚至数十个.php配置文件, 里面都是各种各样的array, 还有甚者会把一些词典文件(比如中文/英文对照)也放到配置中去. 这就导致配置文件的解析耗费了很大的性能(诚然, 用了opcache能好点, 但是实际上还是有执行的过程). 除了PHP的, 还有用json的, yaml的, 一个共同的特点就是这些配置的可读性比较差. 另外, 他们也都要runtime解析. config目录往往和代码在一起, 首先会有安全隐患(配置中往往有敏感信息), 其次如果配置和代码属于一个项目, 这就会导致配置的修改也要走代码上线的流程. 一些资源配置文件, 比如mysql/memcache的配置信息, 这些内容本来是应该对开发透明的, 运维直接负责即可. 但是放到了代码中就会导致, 运维如果要发起一些变更, 也要开发配合修改配置文件上线. 所以, Yaconf就是为了解决这些问题而生的一个工具. 它使用单独的一个配置目录(在yaconf.directory指定), 不和代码在一起. 它在PHP启动的时候, 处理所有的要处理的配置, 然后这些配置就会常驻内存, 随着PHP的生命周期存亡. 避免了每次请求的时候解析配置文件. 所有的配置内容都是immutable的,

Ceph RBD 的实现原理与常规操作

戏子无情 提交于 2020-05-06 02:40:18
目录 文章目录 目录 前文列表 RBD RBD Pool 的创建与删除 块设备的创建与删除 块设备的挂载与卸载 新建客户端 块设备的扩缩容 RBD 块设备的 Format 1 VS Format 2 块设备的快照、克隆、恢复 块设备的 I/O 模型 RBD QoS Token bucket algorithm(令牌桶算法) dmClock algorithm 块设备性能测试 使用 RADOS bench 进行基准测试 使用 fio 进行 IO 测试 前文列表 《 Ceph 分布式存储架构解析与工作原理 》 《 手动部署 Ceph Mimic 三节点 》 RBD RBD: Ceph’s RADOS Block Devices , Ceph block devices are thin-provisioned, resizable and store data striped over multiple OSDs in a Ceph cluster. Ceph RBD 是企业级的块设备存储解决方案,支持扩缩容、支持精简置备,具有 COW 特性,一个块设备(Volume)在 RADOS 中会被分割为若干个 Objects 储存。 CEPH BLOCK DEVICE Thin-provisioned Images up to 16 exabytes Configurable

RMQ算法详解

和自甴很熟 提交于 2020-05-05 16:52:47
RMQ算法,是一个快速求区间最值的离线算法,预处理时间复杂度O(n*log(n)),查询O(1),所以是一个很快速的算法。 当然这个问题用线段树同样能够解决,算法复杂度为:O(N)~O(logN) 。 RMQ: RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A, 回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值。 分析: 对于该问题,最容易想到的解决方案是遍历,复杂度是O(n)。但当数据量非常大且查询很频繁时,该算法无法在有效的时间内查询出正解。 本节介绍了一种比较高效的在线算法(ST算法)解决这个问题。所谓在线算法,是指用户每输入一个查询便马上处理一个查询。该算法一般用较长的时间做预处理,待信息充足以后便可以用较少的时间回答每个查询。ST(Sparse Table)算法是一个非常有名的在线处理RMQ问题的算法 预处理: 设A[i]是要求区间最值的数列,F[i, j]表示从第i个数起连续2^j个数中的最大值。(DP的状态) 例如: A数列为:3 2 4 5 6 8 1 2 9 7 F[1,0]表示第1个数起,长度为2^0=1的最大值,其实就是3这个数。同理 F[1,1] = max(3,2) = 3, F[1,2]=max(3,2,4,5) = 5,F[1,3] =

[算法竞赛进阶指南]图论专题训练

帅比萌擦擦* 提交于 2020-05-04 04:32:17
[TOC] A:最优贸易 题意: 一个国家里有很多个城市,某件物品在所有城市的价格都不同,你可以在一个城市买,另一个城市卖出来获得利益,但是只能进行一次买卖。然后要从1走到n,1到n有单向,也有双向的。 题解:将图分层。邻接表,spfa求出最长路(最大权值)。有三层,一层是不购买也不卖,第二层是买,一到第二层的边权为负。第三层是卖,二到第三层的边权为正。由于有向边的建立,你不能从第二/三层走回第一层图,这保证了你只做一次买卖,而不是无限做买卖。然后再设置一个最终大终点。 其实这题还有很多方法 参考 https://www.luogu.org/problemnew/solution/P1073 #include <bits/stdc++.h> #define ll long long using namespace std; const ll mod=1e9+7; const ll maxn=1e5+7; const ll inf=1<<18; struct u { int v,len; }; int n,m,v[maxn],d[maxn*3+1]; vector<u> vt[maxn*3+1];//邻接表 template<class T> void read(T &res) { res = 0; char c = getchar(); T f = 1; while(c < '0'

Linux stress 命令

♀尐吖头ヾ 提交于 2020-05-01 04:41:49
stress 命令主要用来模拟系统负载较高时的场景,本文介绍其基本用法。文中 demo 的演示环境为 ubuntu 18.04。 基本语法 语法格式: stress <options> 常用选项: -c, --cpu N 产生 N 个进程,每个进程都反复不停的计算随机数的平方根 -i, --io N 产生 N 个进程,每个进程反复调用 sync() 将内存上的内容写到硬盘上 -m, --vm N 产生 N 个进程,每个进程不断分配和释放内存 --vm-bytes B 指定分配内存的大小 --vm-stride B 不断的给部分内存赋值,让 COW(Copy On Write)发生 --vm-hang N 指示每个消耗内存的进程在分配到内存后转入睡眠状态 N 秒,然后释放内存,一直重复执行这个过程 --vm-keep 一直占用内存,区别于不断的释放和重新分配(默认是不断释放并重新分配内存) -d, --hadd N 产生 N 个不断执行 write 和 unlink 函数的进程(创建文件,写入内容,删除文件) --hadd-bytes B 指定文件大小 -t, --timeout N 在 N 秒后结束程序 --backoff N 等待N微妙后开始运行 -q, --quiet 程序在运行的过程中不输出信息 -n, --dry-run 输出程序会做什么而并不实际执行相关的操作 -

为什么Redis的RDB备份不用多线程实现CopyOnWrite?

白昼怎懂夜的黑 提交于 2020-04-29 11:02:25
前言 这篇文章源于我昨天看到的一个有意思的问题。 快照持久化是个很耗时间的操作,而Redis采用fork一个子进程出来进行持久化。理论而言,fork出来的子进程会拷贝父进程所有的数据,这样当Redis要持久化2G的内存数据的时候,子进程也会占据几乎2G的内存。那么此时Redis相关的进程内存占用就会达到4G左右。这在数据体量比较小的时候还不严重,但是比如你的电脑内存是8G,目前备份快照数据本身体积是5G,那么按照上面的计算备份一定是无法进行的。所幸在Unix类操作系统上面做了如下的优化: 在刚开始的时候父子进程共享相同的内存,直到父进程或者子进程进行内存的写入后,对被写入的内存共享才结束。 这样就会减少快照持久化时对内存的消耗。这就是COW技术,减少了快照生成时候的内存使用的同时节省了不少时间。而备份期间多用的内存正比于在此期间接收到的数据更改请求数目。 更具体地讲,我们知道每个进程的虚拟空间是被划分成正文段,数据段,堆,栈这四个部分,同时对应于每一个部分,操作系统会为之分配真实物理块。当我们从父进程P1中fork出一个子进程P2时: 在没有CopyOnWrite之前,我们要给子进程生成虚拟空间,并为虚拟空间地每一个部分分配对应地物理空间,接着要把父进程对应部分地物理空间地内容复制到子进程的空间中。这实际上是个既耗时又耗费空间地操作。 有了COW之后, fork子进程时