分类: LINUX
2010-06-10 21:46:06
上周看了lighttpd,有些收获,自己有个原因,看一个未知的代码时特别新奇,当了解一点或者过了很多天后,发现自己就没有激情了。。很郁闷。。。想着后天要回学校了,现在心情浮躁,就写点东西,看不进书了。
博客上面好多人都写了关于它的文章,等会我会列出来,给大家参考。。现在说说我的学习感受。
1.watcher-worker模型
第一次接触这种编程模型,有点意外。。一般的网络都是一个主进程监听,在accept到一个连接后frok一个子进程处理这个连接,描述符在进程间进行了传递。而这种模型中watcher fork了很多子进程worker,每个worker子进程都监听同样的端口,在有一个连接到来时,一个阻塞的子进程被唤醒来处理业务逻辑。watcher进程就是监视这些worker的工作状态,如果有worker因错误而退出,则fork一个新的子进程进行补充。有点新奇了。。
2.为什么要有状态机
在一般实现中,都是开启一个线程来处理一个业务,开启另一个线程处理另一个业务,这样做使得每个业务之间相互隔离,不会干扰,一个业务的阻塞不会影响到另一个业务,方便了编程,因为将业务的流程性包装在一个线程里,不需要记录业务的当前处理状态。而这样做在大并发网站是行不通的。在linux下采用poll这种机制来支持大并发网站。
在一个进程里处理很多业务,可能某个业务当前正处于阻塞状态,所以我们必须暂停该业务的执行,运行另一个业务。当阻塞业务可运行时,这就产生了一个问题,我们怎么知道这个业务当前都进行到哪一步了,所以状态机就应运而生了。在每个业务中保存当前的处理状态,再恢复运行时,根据这个状态来调用不同的处理函数。感觉这种编程模型更好,因为只有一个进程,避免了进程或线程之间的切换,很高效了。。
状态机的实现中很好使用了switch(state)。。。。
3.动态加载到底怎么回事
以前不明白一个应用怎么在需求到来时加载处理插件的,现在有了直观的代码,有所明白。。
这是一个简单的代码
//假设add.so包中实现了int add(int x, int y)函数,现在要动态加载运行这个函数
//这是伪代码了,没考虑参数和返回值细节
int (*fun)(int, int);
lib *p = dlopen("add.so");
fun = dlsym(p, "add");
int result = fun(3, 7);
dlclose(p);
这就是一个机制,使用这种机制可以做很多事了。。。。学习了新的编程接口。。
4.信号的处理
在lighttpd server.c中有对信号的处理部分,在这里也学习到了新知识,就是设置标记变量,在信号处理函数中设置标记位,在程序中对标记位进行检测和处理并置位,目的就是尽可能简化信号处理函数。
5.对文件状态的监视
使用了FAM(File Alteration Moniter)监视文件系统的变化,好像现在有了更新的手段inotify -- Linux 2.6 内核中的文件系统变化通知机制。有时间再看看这种机制的实现。。
6.在web编程中新增了etags的使用,自己不是很了解,写在这做为备忘录
7.刚想起了一点。。sendfile 零拷贝这个功能很重要了。。也记下来。。。
几个很好的链接。。。谢谢这些作者了。能写这么多好的文章,发现写文章真是难,好文章更难。
文件:
nginx_and_lighttp.pdf 两web服务器比较
大小:
190KB
下载:
下载