[CDN 技术] Squid事件机制的原理与实现

Mar 6th, 2009

转载本站文章请注明,转载自:扶凯[http://www.php-oa.com]

本文链接: http://www.php-oa.com/2009/03/06/squidevent.html

1.1.Squid事件机制的功能
Squid的事件机制的作用是,提供一种触发机制,可以定时地执行某些操作.
Squid任何一个功能模块中的代码可以灵活地指定“在x秒钟之后,我要做某操作”,而到了x秒钟之后,该操作就可以自动地执行.
1.2.Squid事件机制的原理
Squid的事件全部存储在一个事件链表中.每一个事件的主要属性包括id, func(即该事件要执行的函数)和when(事件的执行时间)等.
Squid所有的功能模块都可以向事件链表中添加事件,添加的位置取决于when的值.新添加的事件总是保证链表的每个事件是以when来排序的.
而事件的执行则是靠Squid的主循环来触发的.Squid的主循环会不停地检查事件链表,并取出when值小于或等于当前时间的那些事件来执行.
1.3. 事件机制的实现
1.3.1. 事件的结构体的定义

.

在event.c中
 
/* The list of event processes */
struct ev_entry {
EVH *func;
void *arg;
const char *name;
double when;
struct ev_entry *next;
int weight;
int id;
};
其中EVH的定义为:
typedef void EVH(void *);
1.3.2. 事件链表的定义
在event.c中
Static struct ev_entry *tasks = NULL;
 
 
1.3.3. 事件的添加
在event.c中
void
eventAdd(const char *name, EVH * func, void *arg, double when, int weight)
 
eventAdd的主要流程是:
1) 初始化ev_entry结构体
2) cbdatalock对arg加锁,其中arg是func的执行参数
3) 找到这个事件该插入的地点
4) 插入这个事件
 
void
eventAddIsh(const char *name, EVH * func, void *arg, double delta_ish, int weight)
eventAddIsh的作用与eventAdd类似,只是插入事件会随即地增加或减少0~1/3倍delte_ish秒
 
1.3.4. 事件的执行
 
在event.c中
void
eventRun(void)
 
 
eventRun函数是在每次主循环中都会被调用的.
eventRun的主要流程是:
1) 从tasks(即链表头)开始,遍历每一个event:
a) 取出event->func的arg,并进行cbdatavalid验证,然后cbdataunlock
b) 执行event->func,以arg为参数
c) 删掉该event
2) 遍历结束的条件是(以下条件满足一个就退出):
a) event的执行时间when大于当前时间
b) event是在此次eventRun运行期间刚刚添加的
c) 前面执行的event中任何一个的weight值>0.weight值是Squid其他功能模块在添加事件的时候指定的一个对于事件占用时间的估计值,目的是为了防止一次执行过多的event,影响Squid主循环执行epoll等其他代码.
 
1.3.5. 事件操作的其他代码
event.c中还包括了事件删除、清除事件等操作.但这些操作大部分都在Squid启动、停止或reconfig的时候才起作用,并不重要.故本文不再详述.

 
2. 事件机制在Squid中的使用情况
事件机制(eventAdd)在以下功能模块中被调用
authenticate.c
client_db.c
comm.c
dns_internal.c
event.c
forward.c
fqdncache.c
http.c
ipcache.c
logfile_mod_daemon.c
main.c
neighbors.c
peer_digest.c
peer_monitor.c
peer_select.c
send-announce.c
stat.c
store.c
store_client.c
store_digest.c
store_rebuild.c
wccp2.c
wccp.c
 
 
事件机制在Squid中被用于触发以下函数:
authenticateProxyUserCacheCleanup
clientdbGC
clientdbScheduledGC
commReconnect
fqdncache_purgelru
fwdRestart
httpRequestBodyHandler2
idnsCheckQueue
ipcache_purgelru
logfileFlushEvent
peerClearRRLoop
peerDigestCheck
peerMonitorRequest
peerMonitorTimeout
SquidShutdown
start_announce
statAvgTick
statObjects
storeCleanup
storeClientCopyEvent
storeDigestRebuildStart
storeDigestRebuildStep
storeDigestRewriteStart
storeDigestSwapOutStep
storeLateRelease
storeMaintainSwapSpace
wccp2AssignBuckets
wccp2HereIam
wccpHereIam
 
等.
Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪 ViVi 365Key 网摘 天极网摘 和讯网摘 博拉网 POCO 网摘 饭否 QQ 书签 Digbuzz 我挖网 Mister Wong
Tags:
  1. freeke
    Mar 6th, 2009 at 18:05
    Reply | Quote | #1

    建议扶凯兄针对SQUID出一本分析书算了!

  2. freeke
    Mar 6th, 2009 at 18:05
    Reply | Quote | #2

    天天都有好多成果啊!

  3. admin
    Mar 6th, 2009 at 21:33
    Reply | Quote | #3

    哈哈,这个不是我写的,我的老兄写的…我其实很菜的..

  4. mason
    Mar 9th, 2009 at 10:57
    Reply | Quote | #4

    转帖应注明,最起码的,

  5. admin
    Mar 9th, 2009 at 11:17
    Reply | Quote | #5

    没有转贴啊。。。这个是原创。。。你没有见到作者吗?他先挂在我这边写文章

  6. 小斯
    Mar 9th, 2009 at 14:45
    Reply | Quote | #6

    大家好,我就是作者小斯。
    被当作转贴很荣幸啊,说明我的文章看起来有点像专业的了。
    其实我也是squid初学者,希望跟大家多多交流,今后还请大家指教~

  7. haha
    Aug 2nd, 2009 at 00:06
    Reply | Quote | #7

    @小厮,刚刚还准备佩服你呢,现在bs你了,哈哈哈

  8. Gengoo
    Jan 18th, 2010 at 07:12
    Reply | Quote | #8

    楼主你好,我也在研究squid源代码这块,能不能加我QQ:147052998,
    大家相互指导和学习