上一页 1 2 3 4 5 6 7 ··· 9 下一页
摘要: memlink按照天涯的人说是一个灰常牛的key-List系统,比Redis要快很多倍,下面就来一点点看它的代码。在内存中的Block也是通过一个池来管理的,用到的数据结构大致有三个DataBlock、MemItem、MemPool。MemPool的结构如下:typedef struct _mempool{ MemItem *freemem; // 数组 int size; // 数组的大小 int used; // 正在用的MemItem的大小 int blocks; // 内存池中的... 阅读全文
posted @ 2011-11-11 15:55 GG大婶 阅读(300) 评论(0) 推荐(0) 编辑
摘要: 信号是软件中断所提供的用于处理异步时间的一种机制,它有一个非常精确的生命周期。首先是一个时间引发一个信号,然后内核将该信号存储起来,直到被传递出去,最后内核在适当的时候处理该信号。内核处理信号有三种方式:忽略,但是SIGKILL和SIGSTOP是不能被忽略的。捕获并处理,内核暂停当前程序的执行,跳跃到一个先前注册的一个函数,进程执行该函数,然后返回到暂停的地方。执行默认操作,具体的操作取决有信号类型,默认操作通常是终止进程。static void sigwinch_handler(int signo){ printf("window size has been changed\n&q 阅读全文
posted @ 2011-11-03 14:33 GG大婶 阅读(1695) 评论(2) 推荐(0) 编辑
摘要: 应该用设计模式的眼观来看设计模式,不然一定会让你失望的。在开发中会遇到一方去调用另一方,甲具有决定权,知道什么时候该行动。而乙虽然不知道什么时候行动,但是他很清楚怎么做。 好了,现在看起来这个代码写起来非常清楚,甲去调用乙中的方法就可以了。但是不能用静态的眼观来看程序,尤其是这种调用关系中。如果哪一天甲抛弃了乙该投丙了(当然丙也是知道该怎么做但是不知道该什么时候做),这下麻烦来了。需要把甲中与乙有关的部分用丙的替换掉,当然这是简单调用的情况,那如果甲和乙之间的关系千丝万缕的时候怎么办呢?重写甲吧。 但是,如果你的程序使用了命令模式就大不一样了。甲只需要傻傻地调用execte就可以了(当... 阅读全文
posted @ 2011-11-02 14:57 GG大婶 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 以前对压缩算法一无所知,只是知道哈弗曼编码能做这种事情,但是感觉这样的方法奇慢无比。昨天下午看了下号称世界上最快的压缩算法Quicklz,对压缩的基本思路有了一定的了解。一般的压缩程序的要求读入文件之后以便压缩一边输出,而不是去先分析整个文件中的情况之后才做决定采取哪种算法。 Quicklz也不例外也是争取利用文件中重复出现的字节来进行压缩,管理结构如下:在压缩的过程中不断地读入3个字节,然后根据这3个字节得到一个hash值,根据这个hash值就可以找到offset,这个offset就是上次这个hash值出现的位置,而通过cache可以判断出这次出现的和最近一次出现相同hash值的时候的... 阅读全文
posted @ 2011-11-02 10:09 GG大婶 阅读(4927) 评论(2) 推荐(1) 编辑
摘要: int main(){ char *ptr; // alloc a memory area. ptr = (char*)malloc(10); free(ptr); // alloc an array. ptr = (char*)calloc(10, 1); printf("%u\n", (unsigned)ptr); // realloc. ptr = (char*)realloc(ptr, 20); printf("%u\n", (unsigned)ptr); free(ptr); return 0;} re... 阅读全文
posted @ 2011-11-01 11:06 GG大婶 阅读(349) 评论(0) 推荐(0) 编辑
摘要: 昨天看了下线程池,虽然原理什么都比较好理解,但是实现起来感觉自己的方法还是非常笨。这里没直接把任务也做了一个池,就不用动态的分配操作了。下面是代码以及测试:#include <pthread.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <errno.h>#define MAX_THREAD_NUM 100#define MAX_WORK_NUM 1000struct gwork{ void (*f 阅读全文
posted @ 2011-10-29 19:14 GG大婶 阅读(1544) 评论(4) 推荐(0) 编辑
摘要: 单例模式用来创建独一无二的对象。有些类型比如驱动程序等只能有一个对象,如果创建出多个对象的时候可能会导致许多问题的产生。单例模式还是很简单的,实现方法也很多,不过需要注意并发的情况。下面是一个简单的例子(非并发):class singleton{ private static singleton single; private singleton(){ } public singleton getSigle(){ if(single == null){ single = new singleton(); ... 阅读全文
posted @ 2011-10-29 17:11 GG大婶 阅读(195) 评论(0) 推荐(0) 编辑
摘要: 1、数据的存储 虽然从Ext2到Ext4,找数据的方式发生了变化,但是,磁盘的布局还是非常相似的。其实这个东西也不需要变化,因为现在也没什么特别巧妙的方式,而且磁盘的吞吐量、效率的瓶颈也不在这里。当然,这里排除那些根据自身文件特点设计的数据库,毕竟还是为了支持通用文件。磁盘布局如下: Boot在第一个块,放的应该是引导程序,超级块就放在了第二个块上,如果不是可以在mount的时候通过参数sb来设置。对于经常要访问(比较重要)的内容可以在每个块组中都存储(当然这是比较浪费空间的,所有有的只选择在部分),在不同的块组中访问这些内容的时候磁头移动的距离就小了。如果开启了sparse block功.. 阅读全文
posted @ 2011-10-28 10:41 GG大婶 阅读(3134) 评论(0) 推荐(1) 编辑
摘要: 工厂模式就是专门负责实例化大量相同接口的类。简单的工厂模式用《head first》中的例子就要生产不同的比萨,只需要告诉工厂你要什么样的比萨,它就会给你生产出来。这样的代码如下: 想一下简单的工厂模式为我们做了什么?相当于把生成对象的这个功能分离出去,也就是解耦让代码变得简单。这样做还有一个好处就是,在别人调用这个工厂的时候,不仅能简单地返回一个对象,还可以完成一些想要的操作。把这些操作放在这里就可以强制、统一地进行了。 这样做的初衷是想让代码尽量地简单,但是现在情况可能并不怎么好,因为在一个比萨工厂中要考虑所有的情况,而且在有所改变的时候又需要修改代码。这样本金功能简单的工厂类中的... 阅读全文
posted @ 2011-10-27 16:25 GG大婶 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 在这个模式中把面向对象的好处得到了很好的体现。在类设计的时候可能会遇到组合爆炸的情况,比如《head first》中咖啡的例子。在不同的咖啡中添加不同调料的时候价格是不一样的,如果有10种调料,那么一杯咖啡的种类就由2^10=1024。但是我们不可能设计1024个类来做,就算做了维护起来也是很恐怖的。 装饰者模式很好的利用继承来解决了这个问题,反正都是一杯咖啡,不过是在向里面加东西而已。如果只是要求咖啡的价格用面向过程的写成for+switch就可以了。在创造类型的过程中继承给人的感觉有点像这个循环的作用。下面是一个装饰者模式的例子:interface coffee{ int co... 阅读全文
posted @ 2011-10-26 11:38 GG大婶 阅读(146) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 ··· 9 下一页