- 博客(51)
- 资源 (4)
- 收藏
- 关注
转载 Redis:集群
前言在前面的文章中,已经介绍了Redis的几种高可用技术:持久化、主从复制和哨兵,但这些方案仍有不足,其中最主要的问题是存储能力受单机限制,以及无法实现写操作的负载均衡。Redis集群解决了上述问题,实现了较为完善的高可用方案。本文将详细介绍集群,主要内容包括:集群的作用;集群的搭建方法及设计方案;集群的基本原理;客户端访问集群的方法;以及其他实践中需要的集群知识(集群扩容、故障转移、参数...
2019-06-29 17:54:18 136
转载 Redis:哨兵
前言在Redis:主从复制中曾提到,Redis主从复制的作用有数据热备、负载均衡、故障恢复等;但主从复制存在的一个问题是故障恢复无法自动化。本文将要介绍的哨兵,它基于Redis主从复制,主要作用便是解决主节点故障恢复的自动化问题,进一步提高系统的高可用性。文章主要内容如下:首先介绍哨兵的作用和架构;然后讲述哨兵系统的部署方法,以及通过客户端访问哨兵系统的方法;然后简要说明哨兵实现的基本...
2019-06-29 17:52:54 245
转载 Redis:主从复制
前言在Redis的持久化中曾提到,Redis高可用的方案包括持久化、主从复制(及读写分离)、哨兵和集群。其中持久化侧重解决的是Redis数据的单机备份问题(从内存到硬盘的备份);而主从复制则侧重解决数据的多机热备。此外,主从复制还可以实现负载均衡和故障恢复。这篇文章中,将详细介绍Redis主从复制的方方面面,包括:如何使用主从复制、主从复制的原理(重点是全量复制和部分复制、以及心跳机制)、...
2019-06-29 09:37:15 214
转载 Apple LZF算法解析
有关LZF算法的相关解析文档比较少,但是Apple对LZF的开源,可以让我们对该算法进行一个简单的解析。LZFSE 基于 Lempel-Ziv ,并使用了有限状态熵编码。LZF采用类似lz77和lzss的混合编码。使用3种“起始标记”来代表每段输出的数据串。 接下来看一下开源的LZF算法的实现源码。 1.定义的全局字段:private readonly long...
2019-06-29 09:14:04 557
转载 Redis:持久化
本文将先说明上述几种技术分别解决了Redis高可用的什么问题;然后详细介绍Redis的持久化技术,主要是RDB和AOF两种持久化方案;在介绍RDB和AOF方案时,不仅介绍其作用及操作方法,同时介绍持久化实现的一些原理细节及需要注意的问题。最后,介绍在实际使用中,持久化方案的选择,以及经常遇到的问题等。目录一、Redis高可用概述二、Redis持久化概述三、RDB持久化1....
2019-06-29 01:22:14 143
转载 Redis内存模型
前言Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分。我们使用Redis时,会接触Redis的5种对象类型(字符串、哈希、列表、集合、有序集合),丰富的类型是Redis相对于Memcached等的一大优势。在了解Redis的5种对象类型的用法和特点的基础上,进一步了解Redis的内存模型,对Redis的使用有...
2019-06-29 01:19:33 115
转载 Android中的sp和wp指针
经常会在android的framework代码中发现sp<xxx>和wp<xxx>这样的指针,平时看的时候都把他当成一个普通的指针封装过掉了相关的代码:frameworks/base/include/utils/RefBase.hframeworks/base/libs/utils/RefBase.cppsp和wp都是一个模板类,看一下sp类的定义:...
2019-06-27 22:22:08 184
转载 Linux进程管理 (2)CFS调度器
根据进程的特性可以将进程划分为:交互式进程、批处理进程、实时进程。O(N)调度器从就绪队列中比较所有进程的优先级,然后选择一个最高优先级的进程作为下一个调度进程。每个进程都一个固定时间片,当进程时间片用完之后,调度器会选择下一个调度进程,当所有进程都运行一遍后再重新分配时间片。调度器选择下一个调度进程前需要遍历整个就绪队列,花费O(N)时间。O(1)调度器优化了选择下一个进程的时间,...
2019-06-26 12:27:54 789
转载 Linux进程管理 (1)进程的诞生
关键词:swapper、init_task、fork。Linux内核通常把进程叫作任务,进程控制块(PCB Processing Control Block)用struct task_struct表示。线程是轻量级进程,是操作系统做小调度单元,一个进程可以拥有多个线程。线程之所以被称为轻量级,是因为共享进程的资源空间。线程和进程使用相同的进程PCB数据结构。内核使用clone方法创...
2019-06-26 12:26:14 502
转载 Linux并发与同步专题 (4) Mutex互斥量
关键词:mutex、MCS、OSQ。信号量是在并行处理环境中对多个处理器访问某个公共资源进行保护的机制,mutex用于互斥操作。信号量的count初始化为1,down()/up()也可以实现类似mutex的作用,那为什么还要单独实现mutex机制呢?mutex的语义相对于信号量要简单轻便一些,在锁争用激烈的测试场景下,mutex比信号量执行速度更快,可扩展性更好,另外mutex数...
2019-06-25 21:52:42 661
转载 Linux并发与同步专题 (3) 信号量
关键词:Semaphore、down()/up()。1. 信号量数据结构数据机构struct semaphore用于描述信号量。/* Please don't access any members of this structure directly */struct semaphore { raw_spinlock_t lock;---------...
2019-06-25 21:51:02 219
转载 Linux并发与同步专题 (2)spinlock
关键词:wfe、FIFO ticket-based、spin_lock/spin_trylock/spin_unlock、spin_lock_irq/spin_lock_bh/spin_lock_irqsave。spinlock同一时刻只能被一个内核代码路径持有,如果有另外一个内核代码路径试图获取一个已经被持有的spinlock,那么该内核代码路径需要一直自旋忙等待,直到锁持有者释放了该锁。...
2019-06-25 21:46:21 429
原创 Linux并发与同步专题 (5) 读写锁
在多线程程序中,有一种读写者的问题,即对某些资源的访问,存在两种可能的情况,一种是访问必须排他的,称为写操作;另外一种访问是可共享的,称为读操作。 处理读写着问题的两种常见策略是:强读者同步和强写者同步在强读者同步过程中,总是给读者优先权,只要写着当前没有进行写操作,读者就可以获得访问权。在强写者同步过程中,通常将优先权先交给写者,而将读者延迟到所有等待的或者活动的写者都完成为止...
2019-06-25 15:04:00 239
转载 Linux并发与同步专题 (1)原子操作和内存屏障
1. 原子操作1.1 一个原子操作例子思考1.2 原子操作APIatomic_t数据结构表示原子变量,它的实现依赖于不同的体系结构。typedef struct { int counter;} atomic_t;Linux提供了很多操作原子变量的API。以arch/arm/include/asm/atomic.h为例。#define ATOMI...
2019-06-25 12:50:41 402
转载 Linux并发与同步专题
并发访问:多个内核路径同时访问和操作数据,就有可能发生相互覆盖共享数据的情况,造成被访问数据的不一致。临界区:访问和操作共享数据的代码段。并发源:访问临界区的执行线程或代码路径。在内核中产生并发访问的主要有如下4种:中断和异常:中断发生后,中断处理程序和被中断的进程之间有可能产生并发访问。中断<==>被中断的线程 软中断和tasklet:软中断或者tasklet...
2019-06-25 12:48:55 151
转载 Linux中断管理 (3)workqueue工作队列
关键词:工作队列的原理是把work(需要推迟执行的函数)交由一个内核线程来执行,它总是在进程上下文中执行。工作队列的优点是利用进程上下文来执行中断下半部操作,因此工作队列允许重新调度和睡眠,是异步执行的进程上下文,它还能解决软中断和tasklet执行时间过长导致系统实时性下降等问题。当驱动程序或者内核子系统在进程上下文中有异步执行的工作任务时,可以使用work item来描述工作...
2019-06-25 12:33:39 1682
转载 Linux中断管理 (2)软中断和tasklet
关键词:TASKLET_SOFTIRQ、HI_SOFTIRQ、softirq_action、ksoftirqd、tasklet、BH。软中断以及基于软中断的tasklet、工作队列,包括中断线程化都属于下半部机制,为什么需要下半部机制呢?1.硬件中断处理程序以异步方式执行,会打断其它重要代码执行,因此为了避免打断事件太久,硬件中断程序需要尽快执行完成。2.硬件中断处理程序通常在关...
2019-06-25 12:25:18 361
转载 Linux中断管理 (1)Linux中断管理机制
关键词:GIC、IAR、EOI、SGI/PPI/SPI、中断映射、中断异常向量、中断上下文、内核中断线程、中断注册。由于篇幅较大,简单梳理一下内容。本章主要可以分为三大部分:讲解硬件背景的1.ARM中断控制器。系统初始化的静态过程:GIC初始化和各中断的中断号映射2. 硬件中断号和Linux中断号的映射;每个中断的注册5. 注册中断。一个中断从产生到执行完毕的动态过程:...
2019-06-25 12:20:59 729
原创 Linux中断管理
CPU和外设之间的交互,或CPU通过轮询机制查询,或外设通过中断机制主动上报。对大部分外设中断比轮询效率高,但比如网卡驱动采取轮询比中断效率高。这里重点关注ARM+Linux组合下中断管理,从底层硬件GIC+CPU,到Linux内核通用部分处理,再到GIC驱动以及中断注册,最后是中断下半部软终端、tasklet、workqueue,包括线程化部分。所以按照从硬件到软件,软件从底层到上层...
2019-06-25 12:16:05 156
原创 MIPI接口资料汇总
一、介绍1、MIPI联盟,即移动产业处理器接口(Mobile Industry Processor Interface 简称MIPI)联盟。MIPI(移动产业处理器接口)是MIPI联盟发起的为移动应用处理器制定的开放标准和一个规范。2、MIPI联盟定义了一套接口标准,把移动设备内部的接口如摄像头、显示屏、基带、射频接口等标准化,从而增加设计灵活性,同时降低成本、设计复杂度、功耗和EMI。...
2019-06-24 22:21:38 1422
转载 Linux kprobe调试技术使用
kprobe调试技术是为了便于跟踪内核函数执行状态所设计的一种轻量级内核调试技术。利用kprobe技术,可以在内核绝大多数函数中动态插入探测点,收集调试状态所需信息而基本不影响原有执行流程。kprobe提供三种探测手段:kprobe、jprobe和kretprobe,其中jprobe和kretprobe基于kprobe实现,分别应用于不同探测场景中。可以通过两种方式使用kp...
2019-06-24 12:33:19 515
转载 Android关于cpu/cpuset/schedtune的应用
Android中关于cpu/cpuset/schedtune的应用都是基于进程优先级的,根据不同优先级划分进程类型。AMS(ActivityManagerService)和PMS(PackageManagerService)等通过class Process设置进程优先级、调度策略等;android/osProcess JNI通过调用libcutils.so/libutils.so执行getprio...
2019-06-24 12:25:41 2089
转载 Android基于CGroup的memory子系统HAL层分析-lmkd
Android在内存管理上于Linux有些小的区别,其中一个就是引入了lowmemorykiller。从lowmemorykiller.c位于drivers/staging/android也可知道,属于Android专有,没有进入Linux kernel的mainline。lmkd,即Low Memory Killer Daemon,基于memory子系统和Kernel lowmemoryki...
2019-06-24 11:50:58 1093
原创 redis--初始化客户端
初始化客户端客户端使用了linenoise库, linenoise比较简单, 不需要任何配置,支持单行、多行模式,history命令查询,自动补全等。 help.h是当前所有的命令文件汇总, 用于tab自动补全功能的源数据。客户端初始化主要通过一下几步:1.初始化客户端默认状态2.查看是否终端输出3.初始化help4.根据参数初始化变量5.判断以那种方式工作初始化客...
2019-06-23 20:25:10 367
原创 redis--初始化服务器
服务器初始化从启动Redis服务器,到服务器可以接受外来客户端的网络连接这段时间,Redis需要执行一系列初始化操作。整个初始化过程可以分为以下六个步骤:初始化服务器全局状态。 载入配置文件。 创建守护进程。 初始化服务器功能模块。 载入数据。 开始事件循环。以下各个小节将介绍Redis服务器初始化的各个步骤。服务器初始化状态全局redis.h/redisServe...
2019-06-23 20:22:58 386
转载 /proc/xxx/maps简要记录
定位内存泄漏基本上是从宏观到微观,进而定位到代码位置。从/proc/meminfo可以看到整个系统内存消耗情况,使用top可以看到每个进程的VIRT(虚拟内存)和RES(实际占用内存),基本上就可以将泄漏内存定位到进程范围。之前也大概了解过/proc/self/maps,基于里面信息能大概判断泄露的内存的属性,是哪个区域在泄漏、对应哪个文件。辅助工具procmem输出更可读的maps信息。...
2019-06-23 15:07:01 2803
原创 strcmp, strncmp和memcmp比较
函数:int memcmp (const void *a1, const void *a2, size_t size)函数memcmp用于比较字符串s1与s2的前size个字符。如果两上字符块相同,memcmp将返回0。函数:int strcmp (const char *s1, const char *s2)这个函数用来比较s1和s2字符串...
2019-06-22 21:44:59 1381
原创 redis 基础数据结构实现
参考文献redis数据结构分析 Skip List(跳跃表)原理详解 redis 源码分析之内存布局 Redis 基础数据结构与对象 Redis设计与实现-第7章-压缩列表在redis中构建了自己的底层数据结构:动态字符,双端链表,字典,压缩列表,整数集合和跳跃表等。通过这些数据结构,redis构造出字符串对象,列表对象,哈希对象,集合对象和有序集合对象这5种我们常用的数据结构。接下...
2019-06-22 21:17:38 509
原创 redis源码笔记--内存管理
redis的内存分配主要就是作者将不同平台下的内存分配malloc()进行了一个统一,和统计内存占有量,是对malloc和free进行了一层简单的封装。具体的实现在zmalloc.h和zmalloc.c中。本文将对redis的内存管理相关几个比较重要的函数做逐一的介绍。/***************************** Part1:zmalloc.h ************...
2019-06-22 20:58:53 234
原创 Linux下cat命令详解
简略版cat主要有三大功能:1.一次显示整个文件。$ catfilename2.从键盘创建一个文件。$ cat>filename 只能创建新文件,不能编辑已有文件.3.将几个文件合并为一个文件: $catfile1file2 > file参数:-n 或 --number 由 1 开始对所有输出的行数编号-b 或 --number-nonblank ...
2019-06-22 20:27:57 2376
原创 深入理解HBase的系统架构
目录HBase的构成RegionsHBase的HMasterZooKeeperHBase各组成部分之间的合作HBase的第一次读写HBase的META tableRegion Server的组成HBase的写操作步骤步骤一步骤二HBase的MemStoreHBase Region FlushHFileHFile的结构HFile的索引...
2019-06-22 17:12:22 165
原创 关于源码阅读
源码阅读方法:自底向上:从耦合关系最小的模块开始读,然后逐渐过度到关系紧密的模块。就好像写程序的测试一样,先从单元测试开始,然后才到功能测试。我在刚开始读 Redis 源码的时候,使用的就是这种方法:先从单独的数据结构模块开始,然后再过渡到高层的功能模块。 从功能入手:通过文件名(模块名)和函数名,快速定位到一个功能的具体实现,然后追踪整个实现的运作流程,从而了解该功能的实现方式。我在读阻塞...
2019-06-22 16:09:29 169
转载 系统级性能分析工具perf的介绍与使用
测试环境:Ubuntu16.04 +Kernel:4.4.0-31系统级性能优化通常包括两个阶段:性能剖析(performance profiling)和代码优化。性能剖析的目标是寻找性能瓶颈,查找引发性能问题的原因及热点代码。代码优化的目标是针对具体性能问题而优化代码或编译选项,以改善软件性能。在性能剖析阶段,需要借助于现有的profiling工具,如perf等。在...
2019-06-22 15:56:09 3680
转载 Linux内存使用情况以及内存泄露分析之工具与方法
《Linux C/C++ Memory Leak Detection Tool》1. 内存使用情况分析1.1 系统总内存分析通过cat /proc/meminfo,可用的物理内存=MemFree+Buffers+Cached。 MemTotal: 5933132 kB MemFree: 4485932 kB MemAvailable:...
2019-06-20 21:48:44 391
转载 CK:User mode Bus Error(用户空间操作内核地址导致的异常)
关键词:VEC_ACCESS、coredump、LR、PC等。CK中存在一种VEC_ACCESS异常,可能原因是用户空间访问了内核空间,还有一种是内核访问不存在的总线地址。下面简单构造VEC_ACCESS异常,包括变量指针异常和函数指针异常并分析。1. 变量指针异常#include <stdio.h>void main(void){ char *p...
2019-06-20 21:44:55 1008
转载 ramdisk配置、解压、创建rootfs、启动简单分析
本着了解ramdisk,带着如下几个问题进行分析:如何打开ramdisk功能? ramdisk存放在哪里? ramdisk在什么时候解压?如何解压? 解压后ramdisk在什么位置? ramdisk如何启动?1.如何打开ramdisk功能?如果要使用ramdisk功能,需要做两步工作:一是修改Kernel的bootargs,增加rdinit选项;二是在编译uImage的时候将ro...
2019-06-20 17:44:17 1988
原创 Linux内存管理机制——内核空间
Linux内存中线性地址为4G,0~3G为用户空间,3~4G为内核空间一、内核空间内核空间是3~4G的内存地址,主要用来存储高优先级的代码在X86结构中的内核地址存在三种类型的区域: ZONE_DMA内存开始的16m ZONE_NORMAL 16m~896m ZONE_HIGHMEM...
2019-06-20 15:29:34 1295
原创 Linux的任督二脉:进程调度和内存管理
Linux进程调度以及配套的进程管理回答如下问题:1.Linux进程和线程如何创建、退出?进程退出的时候,自己没有释放的资源(如内存没有free)会怎样?2.什么是写时拷贝?3.Linux的线程如何实现,与进程的本质区别是什么?4.Linux能否满足硬实时的需求?5.进程如何睡眠等资源,此后又如何被唤醒?6.进程的调度延时是多...
2019-06-20 15:29:14 260
转载 Linux内存管理(最透彻的一篇)
摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存的使用方法。力求从外到内、水到渠成地引导网友分析Linux的内存管理与使用。在本章最后,我们给出一个内存映射的实例,帮助网友们理解内核内存管理与用户内存管理之间的关系,希望大家最终能驾驭Linux内存管理。前言内存管理一向是所有操作系统书籍不惜笔墨重点讨论的内容,无论市...
2019-06-20 15:29:03 689
转载 异步IO
在IO编程一节中,我们已经知道,CPU的速度远远快于磁盘、网络等IO。在一个线程中,CPU执行代码的速度极快,然而,一旦遇到IO操作,如读写文件、发送网络数据时,就需要等待IO操作完成,才能继续进行下一步操作。这种情况称为同步IO。在IO操作的过程中,当前线程被挂起,而其他需要CPU执行的代码就无法被当前线程执行了。因为一个IO操作就阻塞了当前线程,导致其他代码无法执行,所以我们必须使用多...
2019-06-18 15:40:41 129
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人