`
bachmozart
  • 浏览: 110116 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
文章列表
双数组的算法可以参照 、 An Efficient Implementation of Trie Structures 地址:http://www.cs.ubc.ca/local/reading/proceedings/spe91-95/spe/vol22/issue9/spe777ja.pdf 该算法实际描述的是一个reduced trie 上面讲的已经很详细了,只有插入操作的冲突解决第4个case 稍微麻烦些,简单记录一下 在插入了 bachelor,jar,badge 三个单词后形成的trie树如图 这时有待插入单词 baby,那么根据定义,我们进行状态的转移 BASE [l]+‘ ...
看了这个帖子,有感写点废话 http://www.iteye.com/topic/243309 现在随便哪个面试不考点设计模式什么的,似乎就不叫面试,我倒想问问,面试官们你们自己不算那些死记硬背的,能记住多少模式的思想,又有多少是你们每天写的程序会用到的 我承认 1. 设计模式确实是前人总结的一些经验和良好的设计范式,是很有价值的 2. 把握良好的设计模式能够理清程序的骨架,使程序变得更清晰 但是我很想说的是 1.设计模式是最通用的一些程序设计方法和范式,不同的领域有自己的一些模式可以遵循,未必非得是那20几种里的某一个 2.书中列举的那些模式是死的,只是特定问题的一些设计思路,未必就 ...
lighttpd里面采用的是prefork的模型,在fork进程之前就已经创建好了listen socket 那么fork了进程池之后,所有进程都有一份自己独立的listen socket fd, 但实际上这个独立的fd 对应的确是一个文件表项,即实际上任然是一个共享的文件描述符 在阻塞模型中,各进程分别通过accept阻塞,等待连接到达,当一个连接到达时,所有的进程都会被唤醒,但只有其中一个进程可以成功accept该连接,其余的则继续投入睡眠,这就是所谓的惊群现象 lighttpd使用的是非阻塞IO复用模型,测试一下是否会有惊群现象呢? 先把结论给出: 1.比如有20个进程注册了li ...
按照lighttpd的方式封装了一下epoll,打算以后就直接这么用了,虽然简陋了点,不过很容易修改 event.h头文件 #include <sys/epoll.h> #define BV(x) (1 << x) #define FDEVENT_IN BV(0) #define FDEVENT_PRI BV(1) #define FDEVENT_OUT BV(2) #define FDEVENT_ERR BV(3) #define FDEVENT_HUP BV(4) #define FDEVENT_NVAL BV ...
记录一下lighttpd的事件处理机制,这个基本上就是和libevent差不多 lighttpd事件处理的全局数据结构主要有 typedef struct fdevents { fdevent_handler_t type; //事件处理类型,lighttpd通过配置文件获取 fdnode **fdarray; //回调事件,参数等保存在这个结构中 size_t maxfds; #ifdef USE_LINUX_EPOLL int epoll_fd; struct epoll_event *epoll_events; #endif #i ...
从server.c的main函数看起,启动流程大体如下: server_init 函数初始化lighttpd 的server 数据结构,涉及到其中一些buffer,array的结构初始化工作,主要参考的数据结构buffer,array,chunkqueue等等 通过启动参数-f 读取配置文件 config_read if (!i_am_root && (geteuid() == 0 || getegid() == 0)) { /* we are setuid-root */ log_error_write(srv, __FILE__, __LINE__, ...
试了下programming erlang distributed 那章的例子,记录一下 一. erl -name 实验一: 我把kvs那个程序放在了A,B两台服务器上,这两台服务器的hostname()都没设置 在B服务器上执行了 erl -name bachmozart@erlang.xxxx.com -setcookie abc 然后 kvs:start(). 在A服务器上 首先配置etc/hosts   B服务器地址    erlang.xxxx.com 然后启动shell  erl -name me -setcookie abc 执行:rpc:call(bachmozart@ ...
在网上闲逛时发现了一个云风写的垃圾回收库和源码学习文档,我也一起研究一下,一方面弥补一下我对gc知识理解的不足,另一方面督促自己把这个不足1000行代码确足够诡异的迷你gc库看完,搞清楚原理。 参考: 源码地址:http://manualgc.googlecode.com/svn/trunk/ 另外一位同学写的分析文章:http://www.cppblog.com/darkdestiny/archive/2008/09/10/61528.html 写的挺详细,不过我还是记录一下自己理解的部分 我也从分配内存的gc_malloc函数开始 大家都知道由malloc,realloc,calloc ...
目前网上关于memcached的分析主要是内存管理部分,下面对memcached的线程模型做下简单分析 有不对的地方还请大家指正,对memcahced和libevent不熟悉的请先google之 先看下memcahced启动时线程处理的流程 memcached的多线程主要是通过实例化多个libevent实现的,分别是一个主线程和n个workers线程 无论是主线程还是workers线程全部通过libevent管理网络事件,实际上每个线程都是一个单独的libevent实例 主线程负责监听客户端的建立连接请求,以及accept 连接 workers线程负责处理已经建立好的连接的读写等事件 ...
学了忘,忘了还得学,简单记录下 1. time_t time(time_t *tloc); time函数返回从1970年1月1日0点以来的秒数.存储在time_t结构之中 把 这个printf("%ld",time(0)) 保存编译 加到watch -n 1 后面,看看效果 2.int gettimeofday(struct timeval *tv, struct timezone *tz); 头文件:#include <sys/time.h> 其中涉及结构体定义如下 struct timeval { time_t tv_sec; ...
Memcached里的Hashmap实现是一个简单的链式存储方式,简单记录一下 链式hashmap的结构比较简单,基本上可以理解为一个一维线性空间,每个空间称作一个bucket,每个bucket又是一个链表结构,这个链表结构上的所有元素的key的hash值是相同的,所以被分配在一个bucket里。 hashmap存储时首先根据key计算hash得到对应bucket,然后加入该bucket中的链表首部 hashmap查询时也是通过key计算hash得到对应bucket,然后遍历链表查找对应元素 所以hashmap的关键是hash的算法是否可以尽可能的减小不同key值计算出相同hash的概率(减 ...
......
这两天想看看memcached的实现,所以先学习了libevent,使用起来还是比较简单的,其实是对select/poll/kqueue等的封装,学习libevent过程中又遇到了linux下队列的使用,简单分析如下,权当做记录: libevent中的例子中使用的是FreeBSD下的queue.h,在linux的/usr/include/sys/queue.h也有该头文件,但是是一个缩减版本,而且没有看到queue 的access method,不知道是不是跟我们的linux服务器版本有关,没办法google了一下,找到了FreeBSD 下queue.h的定义,我们看一下tail queue的 ...

......

    博客分类:
  • Java
......
平时工作中主要用java,不过还是对Linux非常喜爱,虽然学习时间有限,每天还是能学点小东西,呵呵,写了一个HelloWorld版的Linux守护进程,启动后监听UDP端口做简单的echo back Server代码 #include<sys/socket.h> #include<netinet/in.h> #include<strings.h> #include<stdio.h> #include<syslog.h> #include<stdlib.h> #include<signal.h> ...
Global site tag (gtag.js) - Google Analytics