博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
thttpd源码小分析之Reactor pattern
阅读量:2224 次
发布时间:2019-05-08

本文共 1798 字,大约阅读时间需要 5 分钟。

这篇文章非常粗略地讨论thttpd的工作pattern: Reactor.关于pattern和model的区别,这里不多解释,参考这个说法: M(odel)-VC pattern.关于pattern的更多资料,参考  .

什么是Reactor

Reactor又称Dispatcher,用于同步IO,它逆置了常见的函数调用机制,也就是说, Application将一个service对应的handler注册到Reactor,当这个service需要被处理时(一般通过定时器来触发),Reactor主动调用handler.浅白一点说, ‘Don’t call us, we’ll call you.’ — Hollywood principle.

在前面对Reactor的简单解释中,可以看到Reactor至少有下面几个组件:

  1. handle: service(read, write)对应的句柄,Linux下通常是file description.
  2. handler: service对应的回调函数,如 handle_read(), handle_write().
  3. demultiplexer: 多路复用机制,Linux下可以用select/(e)poll
  4. reactor: 注册/移除handler的统一界面,如: Reactor::register_handler(), Reactor::remove_handler().

废话少说,看一下Reactor pattern大概的样子:

01.
int fd[MAX_FD]; //要素1
02.
 
03.
typedef int EventType;
04.
typedef int HANDLER;
05.
 
06.
enum
07.
{
08.
READ_EVENT = 1;
09.
WRITE_EVENT = 2;
10.
...
11.
};
12.
 
13.
class CEventHandler //要素2
14.
{
15.
public:
16.
virtual void handle_read(HANDLER handle) = 0;
17.
virtual void handle_write(HANDLER handle) = 0;
18.
virtual HANDLER get_handle() const = 0;
19.
...
20.
};
21.
 
22.
class CReactor //要素4
23.
{
24.
public:
25.
virtual void register_handler(HANDLER handle, CEventHandler *ceh, EventType et) = 0;
26.
virtual void remove_handler(HANDLER handle, CEventHandler *ceh, EventType et) = 0;
27.
void handle_events(struct timeval *tv);
28.
...
29.
};

thttpd的Reactor pattern

thttpd是事件驱动(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

转载地址:http://fzafb.baihongyu.com/

你可能感兴趣的文章
【LeetCode】无重复字符的最长子串
查看>>
时间复杂度
查看>>
【C++】动态内存管理 new和delete的理解
查看>>
【Linux】了解根目录下每个文件的作用
查看>>
【Linux】进程的理解(一)
查看>>
【Linux】进程的理解(二)
查看>>
【C语言】深度理解函数的调用(栈帧)
查看>>
【Linux】进程的理解(三)
查看>>
【C++】带头节点的双向线链表的实现
查看>>
【C++】STL -- Vector容器的用法
查看>>
【Linux】Linux中的0644 和 0755的权限
查看>>
【数据结构】有关二叉树的面试题
查看>>
【Linux】内核态和用户态
查看>>
【Linux】HTTP的理解
查看>>
【Linux】HTTPS的理解
查看>>
【操作系统】大小端问题
查看>>
Git上传代码时碰到的问题及解决方法
查看>>
【Linux】vim的简单配置
查看>>
【C++】智能指针
查看>>
【C++】const修饰的成员函数
查看>>