Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2418467
  • 博文数量: 392
  • 博客积分: 7040
  • 博客等级: 少将
  • 技术积分: 4138
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-17 13:03
个人简介

范德萨发而为

文章分类

全部博文(392)

文章存档

2017年(5)

2016年(19)

2015年(34)

2014年(14)

2013年(47)

2012年(40)

2011年(51)

2010年(137)

2009年(45)

分类:

2010-09-28 22:34:53

上周看了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 零拷贝这个功能很重要了。。也记下来。。。

阅读(1432) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-09-29 11:36:06

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com