以前整理过的关于larbin的队列结构给需要的网友:
为什么disk和priority的队列都是成对出现的,是因为可以认为每个site在namedSiteList当中都有一个小的队列来保存它的url,这个url的个数是有个限制的,当超过这个限制的时候就不能再把该site下的url放入,但也不能丢弃,而是放入wait队列。larbin会控制一段时间在disk队列中取url,一段时间在diskWait当中取url。disk和priority的区别只是优先级的区别。
![](http://blog.chinaunix.net/photo/21158_080805114937.jpg)
![](http://blog.chinaunix.net/photo/21158_080805115026.jpg)
为什么disk和priority的队列都是成对出现的,是因为可以认为每个site在namedSiteList当中都有一个小的队列来保存它的url,这个url的个数是有个限制的,当超过这个限制的时候就不能再把该site下的url放入,但也不能丢弃,而是放入wait队列。larbin会控制一段时间在disk队列中取url,一段时间在diskWait当中取url。disk和priority的区别只是优先级的区别。
namedSiteLIst的作用可以任务是实现了DNS缓存;IPSiteList是控制了polite访问。
larbin中用到的都是循环队列,根据存储方式不同,有存储在磁盘中的队列PersistentFifo,存储在内存中的队列SyncFifo,Fifo,ConstantSizedFifo 。
PersistentFifo:用于将优先级较低的urls存储在磁盘,文件名后六位是数字,随着urls的增加而递增,每个文件最多url数由type.h中的urlByFile指定,在从fifo中读出后如果输出文件已经读完,则会删除该文件,在reload时,如果只有一个文件,则会忽略,对于文件名后数字最大的文件作为输入文件(压入队列),最小的作为输出文件(弹出队列),在初始化时,文件名后数字最大的文件会被清空,这样保证url数是urlByFile的位数,可以容易的取得urls数
SyncFifo:只是在Fifo的基础上加了同步机制,用到pthread_mutex_lock(阻止两个线程同时对fifo访问)和pthread_cond_wait(fifo为空时等待)以及pthread_cond_broadcast(广播fifo中有数据),其实larbin只是单线程,无需同步,可以考虑扩展为多线程。