JAWS2分析报告 II :: 风之谷
来源: BlogBus 原始链接: http://www.blogbus.com:80/blogbus/blog/diary.php?diaryid=218326 存档链接: https://web.archive.org/web/20041208124306id_/http://www.blogbus.com:80/blogbus/blog/diary.php?diaryid=218326
风之谷 有关ACE/TAO,还有CORBA的学习资料 <<<JAWS2 分析报告 I | 首页 | JAWS2 分析报告 IV>>> JAWS2分析报告 II 时间:2004-06-12 如果我是文件缓存设计者,我的设计方案会是什么样的 有关文件缓存的设计 首先需要实现一个Hash表,通过这个表来快速寻找符合我要求的数据内容,web服务器上的内容 需要建立一个Index与文件内容的映射关系,要知道这些Cache都是放在内存中的 与JAWS_Cache相关的类有以下几个部分 Cache_Hash Cache_Heap Cache_Heap_Item Cache_List Cache_List_Item Cache_Manager Cache_Object Cache_Object_Factory Cache_Proxy 从文字表面上来看,JAWS_Cache中有一些有意思的东西 Hash,这是我们最开始能够想到的 Heap,可能是建立内存映射对象所采取的设计 List,是不是一个和Heap相对应的东东(可以选择不同的设计策略) ..Item 这是我们这样猜测的依据 Manager 应该是扮演一个总管的角色 --下一步的分析应该从这入手 Object 这应该是我在设计中最为迷惑的内容,呵呵,要看一下JAWS2的设计者有什么样的设计策略了 Object_Factory 是地球人都知道的东东 :),不过要看一下需要什么样的参数 Proxy 这个估计要花一点功夫来了解了,现在还表不明白,算是一个伏笔了。 class JAWS_Cache_Manager 打开类定义 发现了有关初始化Cache Object的相关参数 ACE_Allocator, JAWS_Cache_Object_Factory 还有与Cache大小相关的内容, hash大小,内存大小,超时时间, 是否使用计数器 与处理Cache相关的内容 PUT GET MAKE TAKE DROP FLUSH 现在可以研究一下JAWS_Cache_Proxy 从template的参数定义上来看,该类是实现了KEY,DATA以及CACHE_MANAGER之间的映射关系 通过该类来实现真正 PUT和GET的数据绑定 注意: typedef ACE_Singleton<Cache_Manager, ACE_SYNCH_MUTEX> Cache_Manager_Singleton; 如果来实现Singleton模板类 研究 JAWS_Cache_Object 实现了对以下成员变量的封装 void *internal_; --这个东东是什么? const void *data_; -- 定义成为void指针 size_t size_; time_t last_access_; time_t first_access_; time_t new_last_access_; void heap_item_; 在 JAWS_Cache_Object的基础上派生出的 JAWS_Referenced_Cache_Object JAWS_Counted_Cache_Object 注意有关锁的定义 / MUTABLE / ACE_SYNCH_RW_MUTEX count_; / MUTABLE */ ACE_Lock_Adapter<ACE_SYNCH_RW_MUTEX> lock_adapter_; 同样JAWS_Cache_Object_Factory 也派生出了 JAWS_Referenced_Cache_Object_Factory JAWS_Counted_Cache_Object_Factory 需要实现 create和distroy的不同方法 现在着手研究我们的容器 Hash List Heap 通过研究 JAWS_Cache_Hash 发现了 JAWS_Hash_Bucket_Manager 其中包含三个参数 EXT_ID, INT_ID,EQ_FUNC JAWS_Hash_Bucket_Item JAWS_Hash_Bucket_DLCStack JAWS_Hash_Bucket_DLCStack_Iterator 猜测是有关Hash_Bucket的具体实现,是下一步的研究重点 现在还是研究一下JAWS_Cache_Hash 所提供的功能 find -使用EXT_ID为参数 bind trybind rebind unbind 其中还有一下内部的方法 hash isprime new_cachebucket --有待进一步的研究 JAWS_Cache_Heap 注意template的参数 class EXT_ID, class FACT, class H_FN, class E_FN 呵呵,需要照对应 在Cache_Manager中找到定义了 class KEY, class FACTORY, class HASH_FUNC, class EQ_FUNC 看成员变量 Heap 是 HeapItem的容器 Cache_Heap_Item **heap_ 可以学习一下容器类是如何来 进行实现的 heap所拥有的方法 int is_empty (void) const; int is_full (void) const; size_t size (void) const; size_t maxsize (void) const; int maxsize (Cache_Manager *cm, size_t new_maxsize); // attempt to grow (or shrink) the heap. Return 0 on success, -1 on // error. int insert (const EXT_ID &ext_id, JAWS_Cache_Object *const &int_id); // attempt to insert int_id into heap. int remove (EXT_ID &ext_id, JAWS_Cache_Object *&int_id); // attempt to remove the top element of heap. int remove (void *item); // treat item as a Cache_Heap_Item, and remove it from the heap int adjust (void *item); // treat item as a Cache_Heap_Item, and alter its heap position 提供了添加,删除,挑战预先分配内存大小的方法 Heap_Item的实现内容就相对简单得多了,包含一个Cache_Object ,同时将Index与其相绑定 template <class EXT_ID, class FACT, class H_FN, class E_FN> class JAWS_Cache_Heap_Item { friend class JAWS_Cache_Heap<EXT_ID, FACT, H_FN, E_FN>; public: JAWS_Cache_Heap_Item (const EXT_ID &ext_id, JAWS_Cache_Object *const &int_id); unsigned int priority (void); private: EXT_ID ext_id_; JAWS_Cache_Object *int_id_; size_t heap_idx_; -- 这个index是干什么用的啊 }; 有关class JAWS_Cache_List的实现也是很确定的 通过双向链表来实现基本的数据存储 还可以添加一些内容() 如何来使用JAWS中的Cache模块 打开Filecache.h 可以找到以下的定义 typedef JAWS_Cache_Manager<JAWS_Strdup_String, JAWS_Referenced_Filecache_Factory, JAWS_String_Hash_Functor, JAWS_String_Equal_Functor> JAWS_Referenced_Filecache_Manager; typedef JAWS_Cache_Manager<JAWS_Strdup_String, JAWS_Counted_Filecache_Factory, JAWS_String_Hash_Functor, JAWS_String_Equal_Functor> JAWS_Counted_Filecache_Manager; typedef JAWS_Counted_Filecache_Manager JAWS_Filecache_Manager; typedef JAWS_Cache_Proxy<const char *, JAWS_FILE, JAWS_Filecache_Manager> JAWS_Filecache_Proxy; jnn 发表于 2004-06-12 13:37 引用Trackback(0) | 编辑 评论 发表评论 最后更新 ACE Tutorial [翻译] 08-page04 ACE Tutorial [翻译] 08-page03 ACE Tutorial [翻译] 08-page02 ACE Tutorial [翻译] 08-page01 ACE Tutorial [翻译] 06 -page05 ACE Tutorial [翻译] 06 -page04 ACE Tutorial [翻译] 06 -page03 ACE Tutorial [翻译] 06 -page02 ACE Tutorial [翻译] 06 -page01 ACE Tutorial [翻译] 05 -page05