51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2439|回复: 9
打印 上一主题 下一主题

[原创] Cache简绍资料共享

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2010-10-5 09:51:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
继续学习,这段时间学下了cache一些理论,觉得计算机知识实在是博大,希望大家和我一起学习。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2010-10-5 12:43:21 | 只看该作者
关于 读流程:以下是根据cache一应用为例
在TGT中层接收到主机的读请求命令后,根据TGT后端的SCSI模块对收到的读命令进行解析产生一个读REQ请求,将产生的读REQ送HMP模块进行处理,HMP模块判断该读REQ是本控制器的还是对端控制器的,如果是对端控制器的REQ请求通过IBS传到对端控制器进行处理。该REQ请求是本端控制器的,先判断是否支持增值业务,若不支持增值业务直接送Cache模块处理,若支持增值业务则送增值模块处理,增值处理完后再送Cache模块处理。Cache模块接收REQ请求的总接口函数为CACHE_ReceiveReq()。
Cache模块通过CACHE_ReceiveReq函数接收到REQ请求,并将REQ请求加入g_pstReqWaitQueue读写全局链表中并触发ReadWrite线程去处理对应的REQ请求。在ReadWrite线程的主循环中处理流程如下:
1.        判断g_pstReqWaitQueue读写链表是否为空,如果读写全局链表是空的,则处理写冲突,写冲突分两种:一、写操作产生的冲突,二、读操作产生的冲突;
2.        如果读写全局链表不为空,则取出REQ节点并根据其操作类型进行分类处理;
3.        REQ操作类型为读完成操作,表示读到的数据已经传给Host,可以释放SGL和REQ资源了;
4.        REQ操作类型为读操作,首先先申请一个空的SGL悬挂在REQ上,并查看内存是否存在要读的数据:
1)        如果存在则认为读命中,并将数据串在SGL上,通知SCSI模块读到数据;同时根据智能预取策略进行预取;
2)        如果读不命中,则判断是否在预读队列s_astLargeReadPending中,若在预读队列中也算读命中;
3)        如果读不命中也不在预读队列中,根据Lun的预读策略(固定预读、倍数预读、智能预读)创建一个新的预读请求,挂载到预读队列s_astLargeReadPending中,并为预读请求的SGL申请4K页面资源,在申请到页面资源后,将预读请求挂载到g_pstReadReqWaitQueue链表上并触发Read线程通知块设备读取数据到预读请求的SGL中;
4)        将预读到的数据写入内存中,同时释放预取请求,预读完成后重新执行悬挂在预读请求上主机请求,若命中则通知SCSI模块读到数据,若不命中则释放SGL资源并通知SCSI读失败。
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2010-10-7 16:14:32 | 只看该作者
关于写流程
写操作分为回写、透写和镜像写三种类型。回写是将REQ带的数据写入本地内存后就返回写成功;镜像写是将REQ带的数据先写入对端控制器的镜像内存区,再写入本地内存后才返回写成功;透写是将REQ带的数据先写入内存区,再写入磁盘后才返回写成功。不管是回写、透写还是镜像写其REQ都是在SCSI模块产生的,而SCSI模块在产生REQ时,也要同步申请SGL资源,并将要写的数据放入SGL指向的4K页面上。需要注意的写操作的类型不是在SCSI模块产生REQ时指定的,而是Lun的配置属性决定的,因此在改变Lun的配置属性时也会改变写REQ的类型。
回写流程:
在ReadWrite线程中获得REQ请求,根据REQ请求的类型判断是写操作,则调用WC_Write函数进行处理,从REQ请求中获得LunID值,获得Lun的配置属性为回写方式,则调用WC_WriteBack函数进行回写处理,首先为回写分配Chunk和Chunkunit资源:
1.如果要分配的Chunk在进行其它的写操作,则认为写冲突,则将写REQ加如g_astWriteConflictPending全局数组对应的LunID链表上,后续再通过WC_RetryConflictWrite函数对冲突的REQ进行处理;
2.分配到Chunk和Chunkunit资源,将REQ请求中SGL带的数据写入内存中,并释放SGL对应的资源,并通知SCSI写成功,同时触发Destage线程去写脏数据;
3.分配Chunk和Chunkunit资源失败,释放REQ请求中SGL对应的4K页面,并通知SCSI写失败;
目前没有处理从CM_ORG模块分不到Chunk和Chunkunit的错误,一切依赖与CM_ORG的算法来保证满足需求。

透写流程
在WC_Write函数中根据REQ请求中获得LunID值,然后获得Lun的配置属性为透写方式,则调用WC_WriteThroughDirty函数进行透写处理,首先为透写分配Chunk和Chunkunit资源:
1.如果要分配的Chunk在进行其它的写操作,则认为写冲突,则将写REQ加如g_astWriteConflictPending全局数组对应的LunID链表上,后续再通过WC_RetryConflictWrite函数对冲突的REQ进行处理;
2.分配到Chunk和Chunkunit资源,根据分配资源函数的返回类型不同做相应的处理:
1)从透写转回写,将REQ请求SGL带的数据写入内存中,释放SGL对应的资源,并将REQ加入g_stWBForWTReqList链表,同时触发WBForWT线程刷脏数据;只有在WBForWT线程将脏数据写入磁盘后,才会通知SCSI模块写成功;
2)还是透写,将REQ请求SGL带的数据写入内存,并通知块设备将REQ请求带的数据写入磁盘中;只有块设备将数据写入磁盘才通知SCSI模块写成功;
3.分配Chunk和Chunkunit资源失败,释放REQ请求中SGL对应的4K页面,并通知SCSI写失败;
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2010-10-14 21:55:46 | 只看该作者
谢谢分享
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2010-10-15 10:47:25 | 只看该作者
谢谢楼主
回复 支持 反对

使用道具 举报

该用户从未签到

6#
发表于 2010-10-15 11:12:42 | 只看该作者
分享就是有益  大家努力学习
回复 支持 反对

使用道具 举报

该用户从未签到

7#
发表于 2010-10-15 11:49:25 | 只看该作者
很好的东西  这个网站不错
回复 支持 反对

使用道具 举报

该用户从未签到

8#
发表于 2010-10-15 12:22:23 | 只看该作者
多谢分享!!
回复 支持 反对

使用道具 举报

该用户从未签到

9#
发表于 2010-10-17 16:44:38 | 只看该作者
thank you for share
回复 支持 反对

使用道具 举报

该用户从未签到

10#
发表于 2010-10-18 09:39:48 | 只看该作者
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-28 07:07 , Processed in 0.071428 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表