
编程思想
文章平均质量分 64
xiongping_
这个作者很懒,什么都没留下…
展开
-
多线程并发-SEDA架构
http://surlymo.iteye.com/blog/2001529?utm_source=tuicool&utm_medium=referral一、传统并发模型的缺点基于线程的并发特点:每任务一线程直线式的编程使用资源昂高,context切换代价高,竞争锁昂贵太多线程可能导致吞吐量下降,响应时间暴涨。基于事转载 2016-11-24 17:15:27 · 851 阅读 · 0 评论 -
面向对象设计原则:不要STUPID,坚持GRASP和SOLID
不要STUPID,坚持GRASP和SOLID听过SOLID编码吗?有人可能会说:这是描述设计原则的一个专业术语,由我们可爱的代码整洁之道传教者鲍勃(罗伯特C. 马丁)大叔提出,是一组用于指导我们如何写出“好代码”的原则。在编程界充满了这样由单词首字母组成的缩略词。其它类似的例子还有DRY(Don’t Repeat Yourself! 不要重复你自己!)和KISS(Keep It S转载 2015-06-11 11:47:17 · 458 阅读 · 0 评论 -
Arrays of Length Zero在redis中的应用
Hacking StringsThe implementation of Redis strings is contained in sds.c (sds stands for Simple Dynamic Strings).The C structure sdshdr declared in sds.h represents a Redis string:struct sds转载 2015-06-01 15:44:46 · 550 阅读 · 0 评论 -
C语言结构体里的成员数组和指针
单看这文章的标题,你可能会觉得好像没什么意思。你先别下这个结论,相信这篇文章会对你理解C语言有帮助。这篇文章产生的背景是在微博上,看到@Laruence同学出了一个关于C语言的题,微博链接。微博截图如下。我觉得好多人对这段代码的理解还不够深入,所以写下了这篇文章。为了方便你把代码copy过去编译和调试,我把代码列在下面:123456转载 2015-06-01 15:09:56 · 752 阅读 · 0 评论 -
goto对资源的释放问题的解决
Q:一块代码中有大于1的资源的分配时,很容易造成跳过资源的释放;从而导致资源的泄露。A:利用goto语句的跳转特点可以一定程度上解决这个问题example:FILE *f1=open();if(NULL==f1){ goto error1;}FILE *f2=open();if(NULL==f2){ goto error2;原创 2015-03-13 11:49:30 · 529 阅读 · 0 评论 -
高性能I/O设计模式Reactor和Proactor
昨天购买了《程序员》杂志 2007.4期,第一时间去翻阅了一遍,其中有一篇《两种高性能I/O设计模式的比较》令人眼睛一亮,这是一篇译文,偶最近在一直想认真看看这方面的文章很久了。文章主要是讲到了系统I/O方式可分为阻塞,非阻塞同步和非阻塞异步三类,三种方式中,非阻塞异步模式的扩展性和性能最好。主要是讲了两种IO多路复用模式:Reactor和Proactor,并对它们进行了比较。文章还介绍了转载 2015-04-20 16:47:19 · 1003 阅读 · 0 评论 -
FSM设计和实现2
分层状态机的设计:对于状态较多的状态机,通常的设计会维护一个庞大的二维矩阵,所有状态耦合在一起,这往往导致维护困难,由于可能存在许多公共的特性,也会导致许多状态具有相同的处理函数。针对这些问题我们可以通过设计分层状态机来解决,主要的思想就是根据不同的功能模块设计出多个状态机,各个状态机分布在不同的层次上。上层状态机调用下层状态机时,上层状态机入栈,下层状态机变为当前处理状态机。通常我们使用堆栈转载 2015-03-23 10:08:51 · 483 阅读 · 0 评论 -
FSM设计和实现1
有限状态机(FSM)是表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用。通常FSM包含几个要素:状态的管理、状态的监控、状态的触发、状态触发后引发的动作。本文主要阐述一下状态机的几种设计方法。1:switch case/if else设计方法curEvent = getEvent();curState = getCurState();swi转载 2015-03-23 10:08:00 · 545 阅读 · 0 评论 -
多平台适配的代码设计
多平台适配的代码设计一个成功的软件系统,往往需要根据需求在不同的系统平台上运行,为了解决系统在多个平台的移植带来的风险,业务架构往往会设计相应的平台适配层来隔离不同平台的差异,如何设计一个易于扩展的平台适配层,是软件设计人员需要考虑的问题。设计1:1: 提供平台接口文件os.h2:定义如下:#ifdef OS1#define OS_Fun OS1_Fun#end转载 2015-03-23 10:05:13 · 983 阅读 · 0 评论 -
进程退出后,malloc分配的资源会被系统回收
当进程退出时,会释放进程的所用资源(进程分配的内存,打开的套接字,用户malloc资源)这一步是有操作系统完成的,malloc内存泄露是指在一个进程中malloc了内存没有free,在进程结束前,这段内存都是被占用的。原创 2015-07-06 12:07:34 · 3585 阅读 · 0 评论 -
linux无锁化编程--__sync_fetch_and_add系列原子操作函数
最近编码需要实现多线程环境下的计数器操作,统计相关事件的次数。下面是一些学习心得和体会。不敢妄称原创,基本是学习笔记。遇到相关的引用,我会致谢。 当然我们知道,count++这种操作不是原子的。一个自加操作,本质是分成三步的: 1 从缓存取到寄存器 2 在寄存器加1 3 存入缓存。 由于时序的因素,多个线程操作同一个全局变量,会出现问题。这也转载 2015-07-14 16:15:59 · 569 阅读 · 0 评论 -
怎么面试架构师
转至http://developer.51cto.com/art/200912/172420.htm其实本文想说的是:当面试一个架构师的时候,我们应该问什么问题?我觉得,问什么样的问题,体现了 team leader 更加看重架构师的哪些特点。我一直认为,做技术就跟练武一样,在练武的不同阶段,分招式和心法。技术也一样,在不同的阶段,也分招式和心法。另外,就我个人而言,经常忘转载 2015-07-17 15:00:57 · 661 阅读 · 0 评论 -
AIO
转载:http://blog.chinaunix.net/uid-11572501-id-2868654.htmlLinux 异步 I/O 是 Linux 内核中提供的一个相当新的增强。它是 2.6 版本内核的一个标准特性,但是我们在 2.4 版本内核的补丁中也可以找到它。AIO 背后的基本思想是允许进程发起很多 I/O 操作,而不用阻塞或等待任何操作完成。稍后或在接收到 I/O 操作完成转载 2016-03-24 10:56:56 · 480 阅读 · 0 评论 -
reactor模式和Proactor模式
最近在研究boost异步io,但是具体原理还是很混乱,现在理清一下思路,对普通函数和reactor模式和proactor模式进行比较普通函数处理机制:程序调用接口函数 -> 函数执行,程序等待 -> 函数执行完将结果和控制权返回给程序 ->程序继续执行下面具体来分析下reactor模式和proactor模式reactor模式(反应堆模式):reactor模式是事件驱动模式,应用转载 2016-04-05 11:19:33 · 589 阅读 · 0 评论 -
海量数据处理算法bloom filter
转载:http://blog.youkuaiyun.com/hguisu/article/details/78661731. Bloom-Filter算法简介 Bloom-Filter,即布隆过滤器,1970年由Bloom中提出。它可以用于检索一个元素是否在一个集合中。 Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个转载 2015-11-18 11:19:01 · 452 阅读 · 0 评论 -
内存管理内幕
http://www.ibm.com/developerworks/cn/opensource/os-cn-kafka-distributed/为什么必须管理内存内存管理是计算机编程最为基本的领域之一。在很多脚本语言中,您不必担心内存是如何管理的,这并不能使得内存管理的重要性有一点点降低。对实际编程来说,理解您的内存管理器的能力与 局限性至关重要。在大部分系统语言中,比转载 2015-11-16 11:44:39 · 423 阅读 · 0 评论 -
代码重构
“小步快跑”的编程方法,是一种高效的编程方法,它摒弃了那种“完备的设计→完备的编码→完备的测试”这种近乎于瀑布式的开发模式。“小步快跑”的编程步骤通常是这样:忽略掉所有的细节与分支,用最简单快捷的方式完成主流程的编写,让程序快速跑起来;以重构的方式不断往程序中添加新的功能,每次添加新的功能都应当足够短小而可以快速实现,从而通过测试快速检验新增的功能;不断往复步骤2,直到完成开发。转载 2015-10-12 11:25:34 · 396 阅读 · 0 评论 -
模块设计思想
转载:http://www.youkuaiyun.com/article/2015-11-06/2826139我一般讲模块设计的时候,都会先讲架构相关的一些东西,首先架构师必须重视的第一件事情是需求,因为架构的目的是为了满足需求,这一点千万不能搞错。谈到架构,很多人都会喜欢说,我设计了一个牛逼的框架。但是我长期以来在强调的一个观点是说,框架这种事情其实在架构哲学里面一点都不重要,框架其实是实践层面的事情,转载 2015-11-09 09:27:00 · 2347 阅读 · 0 评论 -
队列汇总
消息队列可以把消息产生和消息处理解耦合,分离开来,并且可以避免了使用线程或进程同步的锁是一个典型的生产者消费者模式生产者生产数据入队列=>队列缓存=>消费者取数据队列采用先进先出的阻塞队列,队列前后分别有至少一个线程,前一线程负责往队列中放数据,后一线程负责从队列中取数据进行分析处理等操作经典的队列应用:1.内存队列2.无锁内存队列Rin原创 2015-11-06 16:58:58 · 290 阅读 · 0 评论 -
阅读源代码的方式的心得
不知不觉从毕业到现在已经有一年的时间了,看了很多的代码,但是看过后,或者就在看的过程中,对很多代码流程步骤,只是过一遍而已,没有全面深刻的理解。所以看过之后很容易的会忘记,处理问题的时候又要重新研究代码的流程。这样的阅读代码的方式理所当然需要改变,这样的方式,效率低,关键还没什么软用。 以下就总结下阅读代码的一些正确的方法:1.对于一个大工程的代码,肯定有很多的提供基础功能的代原创 2015-08-18 16:25:35 · 461 阅读 · 0 评论 -
C/C++程序员必须熟练应用的开源项目
作为一个经验丰富的C/C++程序员, 肯定亲手写过各种功能的代码, 比如封装过数据库访问的类, 封装过网络通信的类,封装过日志操作的类, 封装过文件访问的类, 封装过UI界面库等, 也在实际的项目中应用过, 但是回过头仔细想想,其实以前自己写过的这些代码,只能是在特定的项目或者特定的环境中使用, 对于自己来说, 在不同的项目中应用, 只需要复制代码, 改改也就可以了, 因为自己写的代码自己很熟悉。转载 2015-03-12 14:28:41 · 376 阅读 · 0 评论 -
Hook钩子技术
钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。 钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即转载 2015-03-30 09:13:49 · 464 阅读 · 0 评论 -
结构体中的函数指针(类中的成员函数效果)
结构体指针变量的定义,定义结构体变量的一般形式如下:形式1:先定义结构体类型,再定义变量struct结构体标识符{成员变量列表;…};struct 结构体标识符 *指针变量名;变量初始化一:struct结构体标识符 变量名={初始化值1,初始化值2,…, 初始化值n };形式2:在定义类型的同时定义变量struct结构体标识符{成员变量列转载 2015-02-28 10:17:56 · 1294 阅读 · 0 评论 -
cache性能优化
性能优化的方法和技巧:代码本文是弯曲大牛KernelChina所写,非常不错,在这里和大家分享一下。 代码层次的优化是最直接,也是最简单的,但前提是要对代码很熟悉,对系统很熟悉。很多事情做到后来,都是一句话:无他,但手熟尔^-^。在展开这个话题之前,有必要先简单介绍一下Cache相关的内容,如果对这部分内容不熟悉,建议先补补课,做性能优化对Cache不了转载 2015-02-26 15:02:30 · 2772 阅读 · 0 评论 -
运算符优先级
恩,问这个问题的人太多了,懒得继续回答,直接贴上来自己看。。。优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右 ()圆括号(表达式)/函数名(形参表)转载 2015-02-11 19:22:02 · 332 阅读 · 0 评论 -
结构体与业务
C语言通过结构体来“封装”一个业务的中要处理的数据。如果这个数据比较多,建议拆成多个子结构体,分解业务各个模块数据,总的业务模块再包含各个子模块结构体。这样更容易处理和分离不同的业务,保证了数据互不影响。并且这样条理会更加清晰。如:struct gvod_session_s{ char read_again; tim原创 2015-02-12 10:55:31 · 390 阅读 · 0 评论 -
指针变量与内存分配
指针变量与内存分配1. char * str1;//str1 只是一个指针,指针指向的空间还没有分配,所以此时用strcpy向str1所指向的内存中拷贝内容将出错。利用malloc动态分配指向的内存(在堆中):str1=(char *)malloc(10) or str1=(char *)malloc(sizeof(char) *num)//分配num个char所占有的字节(一转载 2015-02-11 19:30:05 · 1827 阅读 · 0 评论 -
对指针应用的总结
1.指针赋值: char str[30]; char *p=str; 对p进行任何操作都不会影响str,如p++,p--等,str始终是str[30],数组的首地址不会变; 得出:指针之间的赋值跟变量的赋值一样int a=b;a的变化不会影响b。指针变量本质也是变量;2.但是如果改变*p的值,str[30]数组的值也会变; 比如int a=20;原创 2015-02-10 18:17:26 · 511 阅读 · 0 评论 -
变量区别
一、程序的内存分配一个由C/C++编译的程序占用的内存分为以下几个部分:1、栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。3、全局区(静态区)(static)原创 2015-02-04 10:02:01 · 396 阅读 · 0 评论 -
函数指针
函数指针最近看android camera的source,发现大量的call back,多线程,有必要对其中的基础:函数指针复习一下,觉得函数指针主要还是用在call back函数,以及多线程多进程编程中。函数在被编译器编译后就是一段二进制码,而这段二进制码有一个入口地址,而这个入口地址就是函数指针的值了。首先看函数指针的语法,举一个最简单的例子,要创建一个函数指针,则它与它指向的函数转载 2015-01-12 09:09:19 · 372 阅读 · 0 评论 -
递归的本质
递归 简单的来说递归就是一个函数直接或间接地调用自身,是为直接或间接递归。一般来说,递归需要有边界条件、递归前进段和递归返回段(其实就是进栈出栈的操作)。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。用递归需要注意以下两点:(1) 递归就是在过程或函数里调用自身。(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。递归一般用于解决三类问题: (1)数原创 2015-02-07 09:52:57 · 5810 阅读 · 0 评论 -
C函数接口
C语言应许我们编写提供函数接口供其他的.c文件调用,但是有很多是本模块具体实现的小函数(只是给本模块自己调用的函数),也同时可以被其他文件调用。为了避免这个情况发生,把只被自己模块调用的函数用static修饰,就可以实现了''封装",外部的文件就不能访问了,只允许本模块函数调用。相当于只提供接口,把具体的内部实现隐藏掉了。原创 2015-02-14 09:14:51 · 793 阅读 · 0 评论 -
回调函数
回调函数定义:就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方法直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。机制⑴定义一个回调函数;⑵提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;转载 2015-02-28 09:55:28 · 338 阅读 · 0 评论 -
编程思想
但是对于一个软件来说, 最最重要的是系统架构,数据结构,架构设计的好, 对后期的代码维护,功能修改都很关键, 这也就是新手写的代码, 到最后连他自己本人都很难维护的原因, 更别说让别人来维护了。API相当于基本功, 系统架构, 数据结构是内功,基本功练的越快,我们就越有更多的时间来练习内功。练习内功,我们要多向高手学习。转载 2015-03-12 14:43:49 · 351 阅读 · 0 评论 -
线程池
线程池作用合理利用线程池能够带来三个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌。Ja转载 2015-03-05 10:49:12 · 306 阅读 · 0 评论 -
内存池
为什么要使用内存池技术呢? 主要有两个原因:1、减少new/malloc、delete/free次数,减少运行时间;2、避免内存碎片,避免开发人员忘记释放内存造成内存泄露连接:http://www.cnblogs.com/bangerlee/archive/2011/08/31/2161421.htmlnginx内存池分析:http://blog.chinaunix.net/转载 2015-03-05 10:55:43 · 318 阅读 · 0 评论 -
数据库连接池
数据库连接池:对于一个简单的数据库应用,由于对于数据库的访问不是很频繁。这时可以简单地在需要访问数据库时,就新创建一个连接,用完后就关闭它,这样做也不会带来什么明显的性能上的开销。但是对于一个复杂的数据库应用,情况就完全不同了。频繁的建立、关闭连接,会极大的减低系统的性能,因为对于连接的使用成了系统性能的瓶颈。连接复用。通过建立一个数据库连接池以及一套连接使用管理策略,使得一个数据库连转载 2015-03-05 10:43:28 · 444 阅读 · 0 评论 -
指针内存分配总结
按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求. 栈式存储分配也可称为动态存原创 2015-02-11 20:07:01 · 668 阅读 · 0 评论 -
linux进程双向通信
Linux环境下使用socketpair函数创造一对未命名的、相互连接的UNIX域套接字。定义int socketpair(int d, int type, int protocol, int sv[2]);描述建立一对匿名的已经连接的套接字创建一对Socket:转载 2015-02-14 16:43:09 · 638 阅读 · 0 评论 -
函数指针的应用
struct ngx_module_s { ngx_uint_t ctx_index; ngx_uint_t index; ngx_uint_t spare0; ngx_uint_t spare1; ngx_uint_t spare2;原创 2015-02-28 09:28:37 · 364 阅读 · 0 评论