摘要: 由来:最近一直在想怎么高效率的在IO线程接收到数据时通知逻辑线程(基于线程池)工作的问题,像网络编程的服务器模型的一些模型都需要用到这个实现,下面我这里简单的罗列一个多线程的网络服务器模型半同步/半异步(half-sync/half-async):许多餐厅使用半同步/半异步模式的变体。例如,餐厅常常雇佣一个领班负责迎接顾客,并在餐厅繁忙时留意给顾客安排桌位,为等待就餐的顾客按序排队是必要的。领班由所有顾客“共享”,不能被任何特定顾客占用太多时间。当顾客在一张桌子入坐后,有一个侍应生专门为这张桌子服务。对于上面罗列的这种模型,本文讨论的问题是当领班接到客人时,如何高效率的通知侍应生去服务顾客.在阅读全文
posted @ 2012-04-18 19:14 大熊 | Zealot Yin 阅读(1441) 评论(0) 编辑
摘要: 内容: 本文将介绍几种常用的内存池技术的实现,这是我最近学习各大开源的内存池技术遗留下来的笔记,其主要内容包括:STL内存池以及类STL内存池实现Memcached内存池实现固定规格内存池实现Nginx内存池实现一.类STL的内存池实现方式SGI STL的内存池分为一级配置器和二级配置器,一级配置器主要处理分配空间大小大于128Byte的需求,其内部实现就是直接使用malloc realloc 和free.二级配置器则使用使用free_list的数组链表的方式来管理内存,SGI的Allocate最小的分辨单位为8Byte,其free_list数组存着8*n(n=1...16)大小内存的首地址,阅读全文
posted @ 2012-04-11 01:04 大熊 | Zealot Yin 阅读(2169) 评论(14) 编辑
摘要: 问题: 我们在写程序的时候经常发现程序使用的内存往往比我们申请的多,为了优化程序的内存占用,搅尽脑汁想要优化内存占用,可是发现自己的代码也无从优化了,怎么办?现在我们把我们的焦点放到malloc上,毕竟我们向系统申请的内存都是通过它完成了,不了解他,也就不能彻底的优化内存占用。来个小例子//g++ -o malloc_addr_vec mallc_addr_vec.cpp 编译2#include<iostream>3usingnamespacestd;4intmain(intargc,char*argv[])5{6intmalloc_size=atoi(argv[1]);7char阅读全文
posted @ 2012-04-05 17:51 大熊 | Zealot Yin 阅读(1242) 评论(2) 编辑
摘要: 问题: 如何增量同步文件,例如一个文本文件有10M,分别存放在A,B两个地方,现在两个文件是完全一样的,但是我马上要在A上对这个文件进行修改,B如何实现自动和A上的文件保持一致,并且网络的传输量最少。应用场景: 这样的使用场景太多,这里随便列举几个 1.A机器为线上运营的机器,现在需要一台备份的机器B,当A发生宕机的时候,或者硬盘损坏等各种认为非人为原因导致数据不可用时,可以很快从B恢复 2.SVN这样的应用场景,不需要每次修改都向服务器发送并替换掉一个文件,而是只发送被修改的部分 3.手机客户端对一个文本修改,如果那个文本有2M,难道我每次更新都需要上传整个文件吗?每次2M,傻子才用! 等等阅读全文
posted @ 2012-03-30 22:22 大熊 | Zealot Yin 阅读(1657) 评论(10) 编辑
摘要: 最近开发一些东西,线程数非常之多,当用户输入Ctrl+C的情形下,默认的信号处理会把程序退出,这时有可能会有很多线程的资源没有得到很好的释放,造成了内存泄露等等诸如此类的问题,本文就是围绕着这么一个使用场景讨论如何正确的终止正在运行的子线程。其实本文更确切的说是解决如何从待终止线程外部安全的终止正在运行的线程首先我们来看一下,让当前正在运行的子线程停止的所有方法1.任何一个线程调用exit2.pthread_exit3.pthread_kill4.pthread_cancel下面我们一一分析各种终止正在运行的程序的方法任何一个线程调用exit任何一个线程只要调用了exit都会导致进程结束,..阅读全文
posted @ 2012-03-21 23:08 大熊 | Zealot Yin 阅读(1659) 评论(12) 编辑
摘要: 在启动MongoDB后,程序会对相应的参数,上次遗留的锁文件,日志文件等等进行相应的处理,同时也会开启一些支撑其他部分运行的服务线程,为了精读MongoDB的代码,领会其全局设计理念,所以我对这些不是特别核心的部分,也通过博文给自己来做一个总结,方便自己以后查阅。 程序在mian函数里进行了对输入参数的所有处理,程序使用Boost库实现了跨平台的命令行参数的兼容性,这部分的代码非常庞大,也非常的乱,所以也没有必要太过记载,在main函数的底部进行了initAndListen(cmdLine.port, appsrvPath);调用,这个函数就是我们的重点部分。 在void _...阅读全文
posted @ 2012-03-07 21:21 大熊 | Zealot Yin 阅读(808) 评论(0) 编辑
摘要: 本篇文章主要介绍MongoDB的日志模块以及数据持久化存储模块的代码实现方式。大家也许会惊讶,为什么日志模块和持久化存储模块会放到一篇文章来总结。嘿嘿,在别的系统,可能这两个模块联系不是特别大,可是这MongoDB ,这两个模块还真不能分开来讲。这是怎么回事呢?请听我娓娓道来…通常说来,MongoDB具有三个日志模块,LogJournalOplog Log: 位于 log.h,它主要负责用户日志文件,这和我们普通系统的日志系统没有什么区别,作用也就是记录系统的一些重要流程,然后持久化到log文件。这个log文件可以通过系统启动参数"--logpath". Journal: 阅读全文
posted @ 2012-03-02 22:13 大熊 | Zealot Yin 阅读(1368) 评论(2) 编辑
摘要: 在一个数组中。若你需要频繁的计算一段区间内的和,你会怎么做?,最最简单的方法就是每次进行计算,但是这需要O(N)的时间复杂度,如这个需求非常的频繁,那么这个操作就会占用大量的CPU时间,进一步想一想,你有可能会想到使用空间换取时间的方法,把每一段区间的值一次记录下来,然后存储在内存中,将时间复杂度降低到O(1),的确,对于目前的这个需求来说,已经能够满足时间复杂度上的要求,尽管带来了线性空间复杂度的提升. 但若是我们的源数据需要频繁的更改怎么办?使用上面的方案,我们需要大量的更新我们保存到内存中的区间和,而且这中间的很多更新的影响是重叠的,我们需要重复计算。例如对于数组array[10]...阅读全文
posted @ 2011-09-10 16:11 大熊 | Zealot Yin 阅读(1086) 评论(2) 编辑
摘要: 目标: 大家可以设想这样一个情景,公司已经部署信息化,且很多办公流程已经挪到线上正在运营的系统来解决,这带给企业的员工非常大的便利,节省办公时间,提高办公效率,可是我们把所有的流程和数据都放到了公司服务器,一旦离开了公司,我们就相当于和我们所有的办公环境脱离了,不再可以查看公司系统上的运营数据,不再可以进行添加删除等等一系列操作。如果你最近的工作非常的多,你在有限的正常办公时间内不能完成,那怎么办,只有在办公室奋战,叫苦不迭的夜晚办公室生活就开始了. 离线应用生来就是为了解决这样的问题,针对上面所列举的情况,你不需要在办公室进行奋战,你要做的只有 1.将线上系统某个列表(或存储结构)的数据按需阅读全文
posted @ 2011-07-13 16:48 大熊 | Zealot Yin 阅读(2001) 评论(14) 编辑
摘要: 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。分治法解题的一般步骤: (1)分解,将要解决的问题划分成若干规模较小的同类问题; (2)求解,当子问题划分得足够小时,用较简单的方法解决; (3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。一言以蔽之:分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。在认识分治之前很有必要先了解一下递归,当然,递归也是最基本的编程问题,一般接触过编程的人都会对递归有一些认识.为什么要先了解递归呢?你看,.阅读全文
posted @ 2011-06-18 16:11 大熊 | Zealot Yin 阅读(2422) 评论(18) 编辑
摘要: 疑问:基于.net平台能开发操作系统吗?那.net framework怎么办?别急,慢慢讲解… 不知道园子里面有多少人对开发操作系统比较感兴趣,我本人对开发操作系统是非常感兴趣的,记得以前在学校里面用汇编写代码来引导计算机启动等等,现在编写一个属于自己的操作系统,你不需要在写繁杂的汇编,甚至于都不用写C,C++,不要碰复杂的指针操作和内存分配等等问题,所有的这些事情,现在已经都被Cosmos做好了...阅读全文
posted @ 2011-06-09 13:46 大熊 | Zealot Yin 阅读(7104) 评论(95) 编辑
摘要: 最近帮朋友准备.net方向初级研发工程师面试的题目,在这里记录下面.答案我先卖个关子.呵呵,在下次的博文中公布,不过我更喜欢一种方式,如果各位看官知道答案就留言在文章下面,这样我们可以汇集到大家的思想,也可以了解一下我们这些面试题目的难度.当然还有一点就是我们也可以参考一下大家的意见.呵呵~ 下面有些题目都有“简单描述”这个词,因为我们这些题目主要用来面试的时候用,所以更比较注重口头的表达,当然答案也就并不是唯一的了.简单描述也不只是只能用口头表达,我们同样也可以用文字来简单描述。 好了,废话不多说了,大家知道答案的就把答案留言吧.基础方面:1.简单的描述一下C# 中重写,重载,隐藏的概念2.阅读全文
posted @ 2011-06-07 20:41 大熊 | Zealot Yin 阅读(5513) 评论(131) 编辑
摘要: 前几天参加了一下ACM比赛,呵呵,权当陪太子读书了,成绩有一点点不好,不过都已经过去了。比赛可以没有,博文不能不继续,呵呵,今天我总结我最近练习的贪心算法。我写文章的顺序是先写的 动态规划 , 回溯算法 ,分支限界算法 然后再准备写写贪心算法以及基本的递归和分治算法,计算机最常用的算法就这么几种了,如果真正对算法感兴趣的话可以多研究研究算法导论,其实写算法给人的成就感比做项目要大,我们现在的项目其实都不太需要别特好的算法,大都都是阅读SDK等等文档等,运用设计模式,面向对象等基本都可以解决。当然,我也曾经遇到了对数学要求非常非常高的项目,设计到解高斯方程,微分积分这些,不过我当时没有参与这个.阅读全文
posted @ 2011-06-07 12:54 大熊 | Zealot Yin 阅读(2386) 评论(15) 编辑
摘要: 今天,我一反常态,其他的算法系列文章都是先介绍算法的理论,然后再讲到具体的问题,后来有人给我反应,对于那些随便看看的人,看到那些我贴了别的地方的理论文字就特别的反感,然后就不想继续往下面看了,对于分支限界算法,我采用问题先行的总结方法。首先我们来关注一个问题:问题描述:布线问题:印刷电路板将布线区域划分成n×m个方格阵列,要求确定连接方格阵列中的方格a的中点到方格b的中点的最短布线方案。在布线时,电路只能沿直线或直角布线,为了避免线路相交,已布了线的方格做了封锁标记,其他线路不允许穿过被封锁的方格。如下图所示: 问题 求解结果算法思路:布线问题的解空间是一个图,则从起始位置a开始将它阅读全文
posted @ 2011-05-21 19:46 大熊 | Zealot Yin 阅读(870) 评论(0) 编辑
摘要: 这个系列的第一部分将会重点关注WCF行为(behaviors),WCF提供了四种类型的行为:服务行为、终结点行为、契约行为和操作行为。这些行为的接口几乎是所有WCF的扩展入口。本篇文章只是对行为拓展讲述一些基础的铺设,具体到上面四个行为的扩展以及使用案例,将会在后续的文章中讲到.Behaviors上述这四个行为的所定义的接口分别是IServiceBehavior,IEndpointBehavior,IContractBehavior以及 IOperationBehavior。虽然是四个不同的接口,但它们的接口方法却基本相同,分别为 AddBindingParameters(),ApplyCl.阅读全文
posted @ 2011-05-21 12:30 大熊 | Zealot Yin 阅读(1444) 评论(6) 编辑
