[zz] Linux IO模式及 select、poll、epoll详解

摘要: https://segmentfault.com/a/1190000003063859 Linux IO模式及 select、poll、epoll详解 https://segmentfault.com/a/1190000003063859 Linux IO模式及 select、poll、epoll详 阅读全文
posted @ 2018-01-14 22:58 ym65536 阅读(215) 评论(0) 推荐(0) 编辑

[zz]muduo源码阅读之Thread和ThreadPool

摘要: [source_address] https://blog.dujiong.net/2016/07/17/muduo-6/ muduo源码阅读之Thread和ThreadPool 在muduo的one loop per thread + thread pool模型中,线程和线程池应该是其中最基础也是 阅读全文
posted @ 2018-01-14 20:24 ym65536 阅读(677) 评论(0) 推荐(2) 编辑

[LevelDB] 0.3 Btree存储引擎

摘要: B 树是为了磁盘或其它存储设备而设计的一种多叉(下面你会看到,相对于二叉,B树每个内结点有多个分支,即多叉)平衡查找树。 B 树又叫平衡多路查找树。一棵m阶的B 树 (m叉树)的特性如下: 树中每个结点最多含有m个孩子(m>=2); 除根结点和叶子结点外,其它每个结点至少有[ceil(m / 2)] 阅读全文
posted @ 2017-10-30 00:24 ym65536 阅读(336) 评论(0) 推荐(0) 编辑

[LevelDB] 0.2 BitCask存储引擎

摘要: 《大规模分布式存储系统:原理解析与架构实战》读书笔记 最近一直在分析OceanBase的源码,恰巧碰到了OceanBase的核心开发者的新作《大规模分布式存储系统:原理解析与架构实战》.看完样章后决定入手,果然物有所值。对于准备学习分布式的同学,这是一本不错的书籍,相对系统,全面的介绍了分布式的相关 阅读全文
posted @ 2017-10-30 00:13 ym65536 阅读(583) 评论(0) 推荐(0) 编辑

[LevelDB] 0.1 LSMTree介绍

摘要: 一、存储引擎介绍 讲LSM树之前,需要提下三种基本的存储引擎,这样才能清楚LSM树的由来: 1.1 哈希存储引擎 是哈希表的持久化实现,支持增、删、改以及随机读取操作,但不支持顺序扫描,对应的存储系统为key-value存储系统。对于key-value的插入以及查询,哈希表的复杂度都是O(1),明显 阅读全文
posted @ 2017-10-30 00:11 ym65536 阅读(1690) 评论(0) 推荐(0) 编辑

[LevelDB] 5.SSTable

摘要: SSTable是Bigtable中至关重要的一块,对于LevelDB来说也是如此,对LevelDB的SSTable实现细节的了解也有助于了解Bigtable中一些实现细节。 本节内容主要讲述SSTable的静态布局结构,SSTable文件形成了不同Level的层级结构,至于这个层级结构是如何形成的我 阅读全文
posted @ 2017-10-29 21:05 ym65536 阅读(541) 评论(0) 推荐(0) 编辑

[leveldb] 2.open操作介绍

摘要: 在看源代码之前, 先了解设计结构是必须的, 这就绕不开著名的LSM Tree了. 我在阅读了原作者论文和BigTable论文之后, 一开始最惊奇的是"伪代码"呢? 没有. 其实LSM Tree与其说是某种数据结构/算法, 倒不如说是一种设计思路, 用日志和批量写入来替代索引更新, 达到通过牺牲随机查 阅读全文
posted @ 2017-10-29 20:34 ym65536 阅读(635) 评论(0) 推荐(0) 编辑

[LevelDB] 4.Get操作

摘要: 恢复内容开始 LevelDB虽然支持多线程, 但本质上并没有使用一些复杂到爆炸的数据结构来达成无锁多写多读, 而是坚持自然朴实的有锁单写多读. 那么是不是只有对时间线产生变动的操作(Put, Compaction etc.)才需要上锁? 不是的. 所有操作几乎都要在某一时间上锁来确保结果是线性的符合 阅读全文
posted @ 2017-10-29 20:28 ym65536 阅读(466) 评论(0) 推荐(0) 编辑

[leveldb] 3.put/delete操作

摘要: 0.导读 LevelPut的流程: Put操作首先将操作记录写入log文件,然后写入memtable,返回写成功。整体来看是这样,但是会引发下面的问题: 1. 写log的时候是实时刷到磁盘的吗? 2. 写入的时候memtable过大了咋办? 3. 同时多个线程并发写咋办? ...... 下面的分析中 阅读全文
posted @ 2017-10-29 16:23 ym65536 阅读(1320) 评论(0) 推荐(0) 编辑

[网络编程] select/epoll分析

摘要: 一、简要分析 一个socket对应一个数据流,通过I/O操作中的read从流中读入数据,write向流中写入数据。当read时,socket流中没有数据的话,read阻塞,线程睡眠,CPU开始做其他的任务,流中有数据可读时,read返回。 在阻塞IO模式下,一个线程只能处理一个IO事件。如果处理多个 阅读全文
posted @ 2017-10-29 16:18 ym65536 阅读(618) 评论(0) 推荐(0) 编辑

[leveldb]1.原理介绍

摘要: (转载:http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html) LevelDb日知录之一:LevelDb 101 说起LevelDb也许您不清楚,但是如果作为IT工程师,不知道下面两位大神级别的工程师,那您的领导估计会Hold不住 阅读全文
posted @ 2017-09-21 00:19 ym65536 阅读(393) 评论(0) 推荐(0) 编辑

[leveldb]0.源码编译及使用

摘要: 一、LevelDB简介 LevelDB是Google开源的持久化KV单机数据库,具有很高的随机写,顺序读/写性能,但是随机读的性能很一般,也就是说,LevelDB很适合应用在查询较少,而写很多的场景。LevelDB应用了LSM (Log Structured Merge) 策略,lsm_tree对索 阅读全文
posted @ 2017-09-10 15:59 ym65536 阅读(945) 评论(0) 推荐(0) 编辑

redis源码分析(5)-- redis数据库

摘要: 一、服务器中的数据库 Redis服务器将所有数据库信息保存在redis.h/redisServer, redisServer包含db数组,如下: 每个Redis客户端都有自己的目标数据库,默认情况是db[0],客户端可以通过SELECT命令切换数据库。 例如,某个客户端使用SELECT 1命令切换到 阅读全文
posted @ 2017-08-06 11:32 ym65536 阅读(582) 评论(0) 推荐(0) 编辑

redis源码分析(4)-- 基本数据结构字典dict

摘要: 一、字典结构 Redis中字典采用hash表结构,如下: table是一个数组,每个元素指向一个dictEntry结构。size表示hash表大小,used表示使用的大小。一个size=4的空hash表如下: dictEntry是一个key-value pair, 定义为: next指针用于解决ha 阅读全文
posted @ 2017-07-24 23:20 ym65536 阅读(719) 评论(0) 推荐(0) 编辑

redis源码分析(3)-- 基本数据结构双链表list

摘要: 一、双链表结构 redis中实现的双链表结构体如下: 包含三个节点的list组成如图: 每个listNode的结构: Redis链表list特点: 1、双端:每个节点包括前向指针prev和后级指针next,获取节点前后节点都是O(1) 2、无环:首节点prev=NULL,尾节点next=NULL 3 阅读全文
posted @ 2017-07-22 23:55 ym65536 阅读(440) 评论(0) 推荐(0) 编辑

redis源码分析(2)-- 基本数据结构sds

摘要: 一、sds格式 sds header定义: sizeof(struct sdshdr)= 2*sizeof(unsigned int), char buf[]等价于char buf[0], 仅对编译器有效,并不实际占用存储。 其中len是使用的长度,free是剩余的长度,再加上一个C语言中的'\0' 阅读全文
posted @ 2017-07-08 23:05 ym65536 阅读(839) 评论(0) 推荐(0) 编辑

redis源码分析(1)--makefile和目录结构分析

摘要: 一、redis源码编译 redis可以直接在官网下载(本文使用版本 3.0.7):https://redis.io/download 安装: Run Redis with: You can interact with Redis using the built-in client: 主要调用src/ 阅读全文
posted @ 2017-06-25 17:56 ym65536 阅读(5079) 评论(0) 推荐(0) 编辑

网络编程/tcp协议分析

摘要: 一、链接的建立 TCP Server和Client模型: 1、bind函数相关 作用是绑定addr中的<IP:PORT>, 对于tcp server一般port是固定的。当系统有多个IP(多网卡)时,把ip设置为INADDR_ANY, 内核会自动分配ip。如果只有单一的IP,选择 机器IP和INAD 阅读全文
posted @ 2017-04-21 12:38 ym65536 阅读(519) 评论(0) 推荐(0) 编辑

无锁编程

摘要: 无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)。 实现非阻塞同步的方案称为“无锁编程算法”( Non-blocking algorithm)。 多线程编程条件下,多个线 阅读全文
posted @ 2017-02-19 22:57 ym65536 阅读(759) 评论(0) 推荐(0) 编辑

Mit os Lab 3. User Environmen

摘要: Part A: User Environments and Exception Handling As you can see in kern/env.c, the kernel maintains three main global variables pertaining to environm 阅读全文
posted @ 2016-07-10 15:08 ym65536 阅读(912) 评论(0) 推荐(0) 编辑

最长递增子序列

摘要: 参考<Intruction to algorithm - a creative approach> 6.11 阅读全文
posted @ 2016-06-29 09:02 ym65536 阅读(193) 评论(0) 推荐(0) 编辑

Mit os Lab 2. Memory Management

摘要: Part 1: Physical Page Management 在lab1中,内存布局如下: kernel是0xF0100000 - end 部分, 剩下4K大小是页目录表: 需要由函数boot_alloc填补。 这部分的地址都是线性地址,即line_addr: 0xF0100000 ==> ph 阅读全文
posted @ 2016-06-26 16:29 ym65536 阅读(1031) 评论(0) 推荐(0) 编辑

[ZZ]实现c协程

摘要: http://www.cnblogs.com/sniperHW/archive/2012/06/19/2554574.html 协程的概念就不介绍了,不清楚的同学可以自己google,windows和unix like系统本身就提供了协程的支持,windows下叫fiber,unix like系统下 阅读全文
posted @ 2016-03-22 21:53 ym65536 阅读(278) 评论(0) 推荐(0) 编辑

Linux socket IO模型

摘要: 网络应用需要处理的无非就是两大类问题,网络I/O,数据计算。相对于后者,网络I/O的延迟,给应用带来的性能瓶颈大于后者。网络I/O的模型大致有如下几种: 网络I/O的本质是socket的读取,socket在linux系统被抽象为流,I/O可以理解为对流的操作。这个操作又分为两个阶段: 对于socke 阅读全文
posted @ 2016-03-22 20:22 ym65536 阅读(607) 评论(0) 推荐(0) 编辑

emacs简单入门

摘要: 一些默认快捷键C-代表按住Ctrl键M-代表按住Alt键,也可以用按一下ESC放开代替 最先要记住的M-x <cmd> 输入指令执行,在输入时用Tab可以自动补全或列出项目C-g 取消当前操作指令C-h k <key> 查看当前按键绑定的指令及介绍 移动插入点(光标)C-n/p/b/f 到 下一行、 阅读全文
posted @ 2016-03-18 00:08 ym65536 阅读(165) 评论(0) 推荐(0) 编辑

令牌桶-流量控制

摘要: 作为后台服务,通常有一个处理极限PPS(packets per second),如果请求超过了这个处理能力,可能会出现“雪崩效应”,因此后台服务需要有过载保护机制。 1、有个简单的算法可以实现流量控制功能:设置一个单位时间(如1s, 1min)内的最大访问量,并维护一个单位时间里的计数器。 当访问请 阅读全文
posted @ 2016-01-06 11:40 ym65536 阅读(4485) 评论(0) 推荐(1) 编辑

GNU Makefile tips

摘要: 1、make 参数下面列举了所有GNU make 3.80版的参数定义。其它Linux版本和产商的make大同小异,不过其它产商的make的具体参数还是请参考各自的产品文档。“-b”“-m”这两个参数的作用是忽略和其它版本make的兼容性。“-B”“–always-make”认为所有的目标都需要更新... 阅读全文
posted @ 2016-01-03 17:03 ym65536 阅读(307) 评论(0) 推荐(0) 编辑

Linux atomic memory access

摘要: http://gcc.gnu.org/onlinedocs/gcc-4.4.5/gcc/Atomic-Builtins.html5.47 Built-in functions for atomic memory accessThe following builtins are intended to... 阅读全文
posted @ 2015-12-03 16:01 ym65536 阅读(213) 评论(0) 推荐(0) 编辑

[zz]Linux系统相关shell命令

摘要: 1. Linux的实时监测命令(watch): watch 是一个非常实用的命令,可以帮你实时监测一个命令的运行结果,省得一遍又一遍的手动运行。该命令最为常用的两个选项是-d和-n,其中-n表示间隔多少秒执行一次"command",-d表示高亮发生变化的位置。下面列举几个在watch中常用的实时监视... 阅读全文
posted @ 2015-11-24 21:34 ym65536 阅读(257) 评论(0) 推荐(0) 编辑

state thread

摘要: State Thread 的官网地址:http://state-threads.sourceforge.netThe State Threads Library is a small application library which provides a foundation for writin... 阅读全文
posted @ 2015-11-22 17:50 ym65536 阅读(781) 评论(0) 推荐(0) 编辑

setjmp/longjmp原理分析

摘要: 1、使用setjmp的man手册上可以看到使用方法:1 #include 2 3 int setjmp(jmp_buf env);setjmp() saves the stack context/environment in env forlater use by longjmp(3)RETURN ... 阅读全文
posted @ 2015-11-21 18:29 ym65536 阅读(952) 评论(0) 推荐(0) 编辑

epoll使用介绍

摘要: 一、epoll原理一个socket对应一个数据流,通过I/O操作中的read从流中读入数据,write向流中写入数据。当read时,socket流中没有数据的话,read阻塞,线程睡眠,CPU开始做其他的任务,流中有数据可读时,read返回。在阻塞IO模式下,一个线程只能处理一个IO事件。如果处理多... 阅读全文
posted @ 2015-10-04 20:02 ym65536 阅读(481) 评论(0) 推荐(0) 编辑

zeromq安装使用

摘要: 一、zeromq简介zeromq的官方网站:http://zeromq.org/, 简介如下:ZeroMQ (also known as ØMQ, 0MQ, or zmq) looks like an embeddable networking library but acts like a con... 阅读全文
posted @ 2015-10-04 12:02 ym65536 阅读(608) 评论(0) 推荐(0) 编辑

Libevent使用

摘要: 一、简介Libevent 是一个用C语言编写的、轻量级的开源高性能网络库,主要特点:1、事件驱动,即异步调用2、支持多种 I/O多路复用技术, epoll、poll、dev/poll、select 和kqueue 等。地址在 http://libevent.org/ 可在该网站下载最新的代码库。Th... 阅读全文
posted @ 2015-09-09 08:24 ym65536 阅读(340) 评论(0) 推荐(0) 编辑

SystemV共享内存简介

摘要: System V 共享内存区例子:1、获取共享内存并写入数值1#include"network.h"23intmain(intargc,char*argv[])4{5intlen=BLOCK_SIZE;6intshmid=0;7int*addr=NULL;8structshmid_dsshmbuf;... 阅读全文
posted @ 2015-09-09 08:24 ym65536 阅读(205) 评论(0) 推荐(0) 编辑

[zz]一致性哈希算法及其在分布式系统中的应用

摘要: 原文链接:http://blog.codinglabs.org/articles/consistent-hashing.html摘要本文将会从实际应用场景出发,介绍一致性哈希算法(Consistent Hashing)及其在分布式系统中的应用。首先本文会描述一个在日常开发中经常会遇到的问题场景,借此... 阅读全文
posted @ 2015-08-28 08:10 ym65536 阅读(152) 评论(0) 推荐(0) 编辑

virtualbox_ubuntu和Windows共享文件夹

摘要: 1、virtualbox上安装增强功能2、在pc磁盘上创建文件夹share3、设备->共享文件夹->添加4、挂载共享文件夹进入虚拟Ubuntu,在命令行终端下输入:sudo mkdir /mnt/sharesudo mount -t vboxsf share /mnt/share其中"share"是... 阅读全文
posted @ 2015-07-22 08:59 ym65536 阅读(186) 评论(0) 推荐(0) 编辑

x86_64汇编基础

摘要: 1、AT&T格式汇编在 Unix 和 Linux 系统中,更多采用的还是 AT&T 格式,两者在语法格式上有着很大的不同:在 AT&T 汇编格式中,寄存器名要加上 '%' 作为前缀;而在 Intel 汇编格式中,寄存器名不需要加前缀。例如:AT&T 格式Intel 格式pushl %eaxpush ... 阅读全文
posted @ 2015-05-31 20:54 ym65536 阅读(6959) 评论(1) 推荐(2) 编辑

算法导论Part3: 二叉搜索树

摘要: 1、概念二叉搜索树性质:设x是二叉搜索树的一个节点,那么:a) 对x左子树中任意节点y, y.key = x.key2、数据结构 1 struct TreeNode 2 { 3 TreeNode(int key): left(NULL), right(NULL), parent(NULL),... 阅读全文
posted @ 2015-05-31 11:44 ym65536 阅读(188) 评论(0) 推荐(0) 编辑

[linux] ubuntu系统tips

摘要: 1、vim配置~/.vimrc 1 "== 2 "Author :mamo 3 "Website:mamolinux.cn 4 "Version:1.0 5 "== 6 7 "按编程语言的语法,对代码进行彩色标示,术语叫做语法高亮 8 syntax on 9 10 "显示行数标示11 set nu... 阅读全文
posted @ 2015-05-24 11:00 ym65536 阅读(238) 评论(0) 推荐(0) 编辑