thttpd源码小分析之Reactor pattern
这篇文章非常粗略地讨论thttpd的工作pattern: Reactor.关于pattern和model的区别,这里不多解释,参考这个说法:M(odel)-VCpattern.关于pattern的更多资料,参考http://www.enterpriseintegrationpatterns.com/. 什么是ReactorReactor又称Dispatcher,用于同步IO,它逆置了常见的函数调用机制,也就是说,Application将一个service对应的handler注册到Reactor,当这个service需要被处理时(一般通过定时器来触发),Reactor主动调用handler.浅白一点说,‘Don’t call us,we’ll call you.’ —Hollywood principle. 在前面对Reactor的简单解释中,可以看到Reactor至少有下面几个组件:
废话少说,看一下Reactor pattern大概的样子: 01.
int fd[MAX_FD]; //要素1
02.
03.
typedef int EventType;
04.
intHANDLER;
05.
06.
enum
07.
{
08.
READ_EVENT = 1;
09.
WRITE_EVENT = 2;
10.
...
11.
};
12.
13.
classCEventHandler //要素2
14.
{
15.
public:
16.
virtual void handle_read(HANDLER handle) = 0;
17.
voidhandle_write(HANDLER handle) = 0;
18.
virtualHANDLER get_handle() const = 0;
19.
...
20.
};
21.
22.
classCReactor //要素4
23.
24.
public:
25.
voidregister_handler(HANDLER handle,CEventHandler *ceh,EventType et) = 0;
26.
voidremove_handler(HANDLER handle,EventType et) = 0;
27.
voidhandle_events( struct timeval *tv);
28.
29.
};
thttpd的Reactor patternthttpd是事件驱动(event-driven)的,它有效的避开了多线程附带的复杂不易维护(尤其是临界区)和上下文切换,将CPU从事件源中解放出来,无须block.关于Event driven,这里不多说. 现在看看thttpd很寒酸的Reactor pattern: thttpd自身既是master,又是worker,matser代码是main(),worker代码是handle_read(),handle_write()等函数.thttpd使用Reactor pattern,但弃用了Reactor 要素4的reactor,代码中根本就没有CReactor界面,这直接导致了要素2被散乱的硬编码到thttpd.c文件中,无需注册,也没有办法移除.对于thttpd这种HTTP服务器来说,要素1很自然的就是fd,而要素3 demultiplexer,在我的电脑上,configure thttpd代码时被选定为select. 以上,确实很粗略,哈哈哈. 其实thttpd里面有很多不错的小技巧,比如说watchdog,总结出来应该是很实用的 :p (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |