Chinaunix首页 | 论坛 | 博客
  • 博客访问: 153793
  • 博文数量: 32
  • 博客积分: 2053
  • 博客等级: 大尉
  • 技术积分: 382
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-09 12:45
文章分类

全部博文(32)

文章存档

2011年(12)

2010年(20)

分类: 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 *= 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
下载: 下载

几个很好的链接。。。谢谢这些作者了。能写这么多好的文章,发现写文章真是难,好文章更难。

kernel@hcy 不抛弃,不放弃,不哭泣

阅读(2063) | 评论(0) | 转发(0) |
0

上一篇:dazuko1.0.0代码分析(2)

下一篇:ad

给主人留下些什么吧!~~