自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(122)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 面试经典二叉树算法

#include <iostream>#include <cstdlib>#include <cassert>#include <stack>#include <cmath>#include <queue>#include <list>using namespace std;//面试经典二叉树算法typedef char ElemType;#define END '#'templ

2016-09-10 23:16:28 918

原创 面向对象的特征

面向对象对象:Every thing Is a object 对象(object)是一件事、一个实体、一个名词,一切可以获得的东西。可以想像有自己标识的任何东西。从程序员角度:一个对象是一个具有状态、行为和标识符的实体。什么是对象:亚里士多德的《形而上学》:实体独立存在现实世界由实体构成的东西,是一切属性的承担者实体分为三类: 可感的可毁灭的实体 可感的不可毁灭(永恒)的实体

2016-08-10 16:18:12 422

原创 面向对象&&面向过程

面向对象&&面向过程8/10/2016 3:43:59 PMUML创始人之一Grady Booch在2004年IBM Developer Works Live大会的访谈中讲过一段流传甚广的话: 我对面向对象编程的目标从来就不是复用。相反对我来说,对象提供了一种处理复杂性问题的方式。这个问题可以追溯到亚里士多德:您把这个世界视为过程还是对象?在面向对象兴起运行之前,编程以过程为中心,例如结构

2016-08-10 15:52:23 965 1

原创 面向对象分析

模型模型是什么1. 一旦确定了抽象角度,就确定了一个目标。2. 为了研究目标,从实际上我们就会获取一些与目标相关的场景(事件)3. 一个场景描述了为了一个目标,由静态的事物加在特定的条件下按特定的规则执行了特定的动作。即特定的场景=静态的事物+特定的条件+特定的规则+特定的动作用例驱动开发用例:描绘一个系统外在可见的需求情况,是代表系统中各个项目相关人员之间就系统的行为所达成的契约用例驱动:

2016-08-10 15:24:04 416

原创 文件分割管理技术

文件分割管理技术对于文件管理我们已经非常熟悉,但是云同步应用的文件管理不同于本地文件管理,云同步的数据存储方式区分于本地文件存储方式。文件存储系统在设计 初期会确定存储系统的需求,如果文件存储系统设计为能够直接容纳存储所有文件的文件系统,那么文件系统的文件存取能力会很低。一般情况下,文件存储系 统都会有针对性的确定系统存储的文件小大范围,也就是文件存储系统的需求,然后再根据系统需求做优化设计,提

2016-08-09 00:05:29 854

转载 ZeroMQ进阶

第二章 ZeroMQ进阶原文github链接第一章我们简单试用了ZMQ的若干通信模式:请求-应答模式、发布-订阅模式、管道模式。这一章我们将学习更多在实际开发中会使用到的东西:本章涉及的内容有:创建和使用ZMQ套接字使用套接字发送和接收消息使用ZMQ提供的异步I/O套接字构建你的应用程序在单一线程中使用多个套接字恰当地处理致命和非致命错误处理诸如Ctrl-C的中断信号正确地关闭ZMQ应

2016-08-03 22:24:09 1892

转载 ZMQ指南

ZMQ 指南原文github连接 作者: Pieter Hintjens [email protected], CEO iMatix Corporation. 翻译: 张吉 [email protected], 安居客集团 好租网工程师With thanks to Bill Desmarais, Brian Dorsey, CAF, Daniel Lin, Eric Desgranges, Gonza

2016-08-03 22:22:06 12070

原创 UDP协议进阶

UDP协议什么时候UDP比TCP通信更好?1. UDP协议有更加好的通讯速度2. 在一问一答的情况之下,包的次序无关 =>DNS3. 在网络状况不好情况之下,短连接可能比长连接有更好的体验,一问一答式的小数据量通讯,正是 TCP 的弱项我的思考:在UDP上实现一个带超时的请求回应机制,让业务层负责超时重发,可能比TCP效果更好,前提:单个请求或回应的包不应该过大,最好不要超过一个MTU,大概在

2016-08-02 11:44:50 457

原创 select和epoll的性能差别

select和epoll的性能差别select原理概述调用select时,会发生以下事情:1. 从用户空间拷贝fd_set到内核空间;2. 注册回调函数__pollwait;3. 遍历所有fd,对全部指定设备做一次poll(这里的poll是一个文件操作,它有两个参数,一个是文件fd本身,一个是当设备尚未就绪时调用的回调函数__pollwait, 这个函数把设备自己特有的等待队列传给内核,

2016-08-01 21:40:57 2910 1

转载 数据同步算法(rsync和RDC)

1、引言  基于LAN或WAN的网络应用之间进行数据传输或者同步非常普遍,比如远程数据镜像、备份、复制、同步,数据下载、上传、共享等等,最为简单的做法自然就是对数据进行完全复制。然而,数据在网络上来回被复制多次后就会存在大量副本,很多情形下这些文件副本之间仅有很小的差异,很可能是从同一个文件版本演化而来。如果对文件进行完全复制,在文件较大的情况下,会占用大量网络带宽,同步时间也会较长

2016-07-23 19:32:07 6444 1

原创 实现红黑树

红黑树是一个比较常用到数据结构,是一个比AVL树有着更好的搜索能力的树形结构。红黑树是一种自平衡二叉查找树 典型的用途是实现关联数组。它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。 红黑树是一种很有意思的平衡检索树 它的统计性能要好于平衡二叉树(AVL-树),因此,红黑树在很多地方都有应

2016-07-14 17:12:04 1259 1

原创 Memcached内存管理slabclass

memcached使用了一个叫slab的内存分配方法,有关slab的介绍可以参考链接1和链接2。可以简单地把它看作内存池。memcached内存池分配的内存块大小是固定的。虽然是固定大小,但memcached的能分配的内存大小(尺寸)也是有很多种规格的。

2016-07-14 00:30:39 2690

转载 Memcached源码分析之资源分享

这次的Memcached源码分享总共写了20篇文章,主要是记录自己看源码的一个过程,因为我们大脑不靠谱。在看源码过程中,已有的一些文章帮助很大,在学习了很多人的文章之后,自己分析源码,过程才没那么痛苦,下面就把我认为好的文章分享出来,这些文章涵盖了Memcached的各个方面,大家在学习Memcached的过程中可以参考。Facebook对memcached的提升Memcached源码分析之内

2016-07-09 21:50:42 457

转载 网络互联参考模型

1. 什么是协议 为了使数据可以在网络上从源传递到目的地,网络上所有设备需要“讲”相同的“语言”描述网络通信中“语言”规范的一组规则就是协议例如:两个人交谈,必须使用相同的语言,如果你说汉语,他说阿拉伯语……数据通信协议的定义决定数据的格式和传输的一组规则或者一组惯例2. 协议分层网络通信的过程很复杂:数据以电子信号的形式穿越介质到达正确的计算机,然

2016-07-02 19:53:03 525

转载 socket编程原理

1、问题的引入1) 普通的I/O操作过程:UNIX系统的I/O命令集,是从Maltics和早期系统中的命令演变出来的,其模式为打开一读/写一关闭(open-write-read-close)。在一个用户进程进行I/O操作时,它首先调用“打开”获得对指定文件或设备的使用权,并返回称为文件描述符的整型数,以描述用户在打开的文件或设备上进行I/O操作的进程。然后这个用户进程多次调用“读/写”

2016-07-02 19:41:37 1221

原创 从IP地址的扩展

参考文章:http://blog.csdn.net/hguisu/article/details/7449955使用TCP/IP协议进行网络应用开发的朋友首先要面对的就是对IP地址信息的处理。IP地址其实有三种不同的表示格式:       1)Ascii(网络点分字符串)-       2) 网络地址(32位无符号整形,网络字节序,大头)       3)主机地址 (主机字节序

2016-07-02 19:28:58 1785

转载 八大排序算法

概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。         当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。   快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键

2016-07-02 18:57:14 237

转载 TCP的超时与重传

1.前言对每个连接, TCP管理4个不同的定时器。1.重传定时器适用于当希望收到另一端的确认。2.坚持(persist)定时器使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口。3.保活(keepalive)定时器可检测到一个空闲连接的另一端何时崩溃或重启。4.2MSL定时器测量一个连接处于TIME_WAIT状态的时间。超时重传是TCP协议保证数据可靠性的一个重要机制,

2016-07-02 17:10:30 2366

原创 经典库函数实现

经典库函数实现strcpy()原型声明:char strcpy(char dest, const char *src);功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。#include char *strcpy(char* de

2016-07-02 13:08:53 381

转载 Lighttpd源码分析之状态机与插件

Lighttpd启动时完成了一系列初始化操作后,就进入了一个包含11个状态的有限状态机中。每个连接都是一个connection实例(con),状态的切换取决于con->state。lighttpd经过初步处理后将con的基本信息初始化,而插件对事件的处理就是针对con进行的,它拿到con后按照业务需要进行相应处理,然后再交还给lighttpd,lighttpd根据con中的信息完成响应。

2016-07-02 12:23:08 1548

转载 深入理解log机制

深入的探讨了log机制中各种概念的来源、常用log库的用法、内部处理流程,以及如何在一个涉及多台主机的复杂系统中部署log等问题。本文是对这次分享的总结,将对这些问题一一展开介绍。转自:http://feihu.me/blog/2014/insight-into-log/开场log如今已经成为了我们日常开发时所必不可少的工具,它同debug一起构成了开发者手中分析问题最有力的两

2016-05-29 00:48:08 7221 1

转载 跟我一起学习VIM - The Life Changing Editor

前两天同事让我在小组内部分享一下VIM,于是我花了一点时间写了个简短的教程。虽然准备有限,但分享过程中大家大多带着一种惊叹的表情,原来编辑器可以这样强大,这算是对我多年来使用VIM的最大鼓舞吧。所以分享结束之后,将这篇简短教程整理一下作为我2014年的第一篇Blog。转自:http://feihu.me/blog/2014/intr-to-vim/搭完网站之后的第一篇文章有些兴奋,先变

2016-05-28 22:50:43 434

转载 C++ typename的起源与用法

侯捷在Effective C++的中文版译序中提到:C++的难学,还在于它提供了四种不同(但相辅相成)的程序设计思维模式:procedural-based, object-based, object-oriented, generics对于较少使用最后一种泛型编程的我来说,程序设计基本上停留在前三种思维模式当中。虽说不得窥见高深又现代的泛型技术,但前三种思维模式已几乎满足我所遇到的

2016-05-28 22:45:08 320

转载 知无涯之std::sort源码剖析

从事程序设计行业的朋友一定对排序不陌生,它从我们刚刚接触数据结构课程开始便伴随我们左右,是需要掌握的重要技能。任何一本数据结构的教科书一定会介绍各种各样的排序算法,比如最简单的冒泡排序、插入排序、希尔排序、堆排序等。在现已知的所有排序算法之中,快速排序名如其名,以快速著称,它的平均时间复杂度可以达到O(N logN),是最快排序算法之一。转自:http://feihu.me/blog/2014

2016-05-28 22:36:59 9900 2

转载 const、volatile、mutable的用法

const修饰普通变量和指针const修饰变量,一般有两种写法:const TYPE value;TYPE const value;这两种写法在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。对于一个非指针的类型TYPE,无论怎么写,都是一个含义,即value值不可变。例如:const int nValue;    //nValue

2016-05-27 16:13:47 254

转载 哈希函数

在大多数实际项目中,对于哈希函数的选择,往往并不怎么在意,讲究的是能用就行,但在性能追求极致的环境里,哈希函数却还是一个考察重点。在Web服务器lighttpd里,使用的是一个非常流行的DJB hash function,即俗称“Times33”的哈希算法,这个算法很简单,就是不断的乘33。看实际代码:   /* the famous DJB h

2016-05-26 19:47:34 797

原创 Linux无锁编程

__sync_fetch_and_add系列一共有十二个函数,有加/减/与/或/异或/等函数的原子性操作函数,__sync_fetch_and_add,顾名思义,现fetch,然后自加,返回的是自加以前的值。以count=4为例,调用__sync_fetch_and_add(&count,1),之后,返回值是4,然后,count变成了5.   有__sync_fetch_and_add,自然也

2016-05-22 22:03:03 339

转载 Linux系统调用--getrlimit()与setrlimit()函数详解

功能描述:获取或设定资源使用限制。每种资源都有相关的软硬限制,软限制是内核强加给相应资源的限制值,硬限制是软限制的最大值。非授权调用进程只可以将其软限制指定为0~硬限制范围中的某个值,同时能不可逆转地降低其硬限制。授权进程可以任意改变其软硬限制。RLIM_INFINITY的值表示不对资源限制。用法:#include int getrlimit(int resource, str

2016-05-19 18:34:20 232

转载 C/C++的一些杂项

fwrite 和 fread的参数问题        有时,我们在阅读别人的代码时会看到这样的写法:[cpp] view plain copy fwrite(buff, 1, 8912, fout);  fread(buff, 1, 8912, fin);  我就觉得奇怪,为什么不写成:[cpp] view plain copy

2016-05-19 17:16:35 313

转载 source insight中文注释乱码问题的解决方案

最近使用source insight查看一些开源代码,显示中文就乱码,据说是因为source insight不支持utf-8编码,默认编码方式为ANSI码。所以需要将utf-8等非ANSI码的文件转换成source insight默认支持的ANSI码格式才能显示中文不乱码。   解决方案如下:一、单个文件转换对于单个文件,好说,只要将非ANSI码格式的文件转换成ANSI码格式即可,方法

2016-05-17 22:21:51 371

转载 谈谈C++中的swap函数

1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符。[cpp] view plain copy print?template class T> void swap ( T& a, T& b )  {    T c(a); a=b; b=c;  }   需要构建临时对象,一个拷贝构造,两次赋值操作。2,针对int型优化:[

2016-05-16 20:21:01 10422

转载 私有继承和组合

私有继承 vs 公有继承公有继承继承的是接口与实现,它表示了类与类之间is-a的关系。而私有继承继承的仅仅是实现,它表示了has-a (或者 is-implemented-in-terms-of)的关系。在公有继承中,基类的公有成员在派生类中仍然公有,基类拥有的接口完整无缺地传给了派生类,也就是说基类对象出现的每一个地方都可以用派生类对象替换(is-a)。因此,编译器可以安

2016-05-12 22:28:24 591

转载 shared_ptr线程安全性全面分析

正如boost文档所宣称的,boost为shared_ptr提供了与内置类型同级别的线程安全性。这包括:1. 同一个shared_ptr对象可以被多线程同时读取。2. 不同的shared_ptr对象可以被多线程同时修改成正如《STL源码剖析》所讲,“源码之前,了无秘密”。本文基于shared_ptr的源代码,提取了shared_ptr的类图和对象图,然后分析了shared_ptr如

2016-05-12 01:14:33 524

转载 Linux IO模式及 select、poll、epoll详解

转自:https://segmentfault.com/a/1190000003063859同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的。所以先限定一下本文的上下文。本文讨论的背景是Linux环境下的network IO。一 概念说明在进行解释之前,首先要说明几个概念:- 用户空间和内核空间- 进程切换

2016-05-11 18:27:30 324

转载 使用 getopt() 进行命令行处理

轻松处理复杂命令行所有 UNIX® 程序甚至那些具有图形用户界面(graphical user interface,GUI)的程序,都能接受和处理命令行选项。对于某些程序,这是与其他程序或用户进行交互的主要手段。具有可靠的复杂命令行参数处理机制,会使得您的应用程序更好、更有用。不过很多开发人员都将其宝贵的时间花在了编写自己的命令行解析器,却不使用getopt(),而后者是一个专门设

2016-05-11 16:59:03 209

原创 从运算符优先级看指针数组和数组指针

简单介绍C/C++中的这两种书写方法实在是很像,但是它们的含义有很大的不同,所以一定要能清晰地辨别它们。简单地说,int *p[4]是指针数组,int(*p)[4]是指向数组的指针指针数组:是一个元素全为指针的数组;数组指针:可以理解为指针,只是这个指针类型不是int而是int[4]类型的数组int *p[4],p是一个指针数组,每一个指向一个int型的,等价于(int *) (p

2016-05-11 16:19:40 1148

转载 一致性hash算法(consistenthashing)

consistent hashing算法早在1997年就在论文Consistenthashing and random trees中被提出,目前在cache系统中应用越来越广泛;1基本场景比如你有N个cache服务器(后面简称cache),那么如何将一个对象object映射到N个cache上呢,你很可能会采用类似下面的通用方法计算object的hash值,然后均匀的映射到到N个cach

2016-05-11 10:57:45 217

转载 多线程服务器的适用场合

与前文相同,本文的“进程”指的是 fork() 系统调用的产物。“线程”指的是 pthread_create() 的产物,而且我指的 pthreads 是 NPTL 的,每个线程由 clone() 产生,对应一个内核的 task_struct。本文所用的开发语言是 C++,运行环境为 Linux。首先,一个由多台机器组成的分布式系统必然是多进程的(字面意义上),因为进程不能跨 OS 边界。在这

2016-05-11 01:11:05 225

转载 shell脚本--if判断(数字条件、字符串条件)

二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别.1.整数比较 [cpp] view plaincopy-eq 等于,如:if [ "$a" -eq "$b" ]   -ne 不等于,如:if [ "$a" -ne "$b" ]   -gt 大于,如:if [ "$a" -gt "$b" ]   -ge 大于等于,如:if [ "$a" -ge 

2016-05-11 00:56:12 914

转载 冒泡排序的三种实现

冒泡排序是非常容易理解和实现,,以从小到大排序举例:设数组长度为N。1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。3.N=N-1,如果N不为0就重复前面二步,否则排序完成。 按照定义很容易写出代码://冒泡排序1  void Bubbl

2016-05-11 00:29:50 167

Shell脚本学习指南

在linux下的纯文本编译,纯命令的集合,脱离了windows的图形界面,在linux下的编程,linux下的文件的操作全是shell的集合,这是成为“骨灰级”linux高手的必备神器。

2015-08-03

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除