一种透明、通用的文件缓存系统的制作方法

文档序号:6585353阅读:515来源:国知局
专利名称:一种透明、通用的文件缓存系统的制作方法
技术领域
本发明涉及一种文件缓存系统,特别是涉及一种透明、通用的文件缓存系统。本发
明属于计算机技术领域。
背景技术
目前,随着计算机技术与互联网的飞速发展,用户对应用的需求已不仅仅限于功能方面,对应用的性能需求逐渐成为了影响用户体验的主要因素。 对于企业网站来说,如何为来自全球的用户提供快速稳定和高质量的网站体验,以提升用户满意度和提高收入对企业而言是一个具有战略性意义的重要课题。美国Gomez网络公司曾做过一个2000个用户的调查,结果显示,当一个网站响应速度很慢时,50%的用户会放弃访问而转向竞争对手的网站。而随着电子商务逐渐普及,如何为用户提供高速的购买流程也将直接影响到用户体验。有研究表明,当用户的购买流程失败了三次以上时,94%的用户会选择永远放弃这个网站。而更严重的是,近五成的用户会将这种不好的体验告诉5个以上朋友或同事。根据0MD的最新调查,网页负载时间与bounce rate存在的密切关系。随着负载时间延长,bo皿ce rate会不断增加。因此,提高页面的下载速度将有助于降低bounce rate。 近年来,以提升网站系统性能为目标,大量的技术与相关研究被提出与应用。其中,文件缓存技术,作为一种改善网站系统的性能的技术方案,今年来得到了广泛的应用。它通过对高访问频率的文件进行缓存,提高热点文件的主存Cache命中率,提升访问速度,减小访问延迟。 目前,文件缓存技术被广泛使用于Web服务器应用中。典型的代表有基于Apache的mocLproxy反向代理系统、Web代理与缓存服务器系统Squid、HTTP与反向代理服务器系统Nginx、HTTP服务加速系统Varnish、分布式缓存系统Memcached和分布式的对象存储缓存系统NCache等。通过在Web服务器集群前端部署缓存服务器,将文件缓存到缓存服务器的磁盘中,并进行集中的组织管理,提升热点文件的主存Cache命中率,从而提高文件的访问速度。 综观这些Web服务器系统对文件缓存技术的实现与应用,普遍存在以下几个问题l)依靠专门的硬件构建缓存服务器,成本较高;2)缓存的文件依旧存储在缓存服务器的磁盘中,磁盘访问性能依旧较低;3)缓存服务器的主存Cache命中率仍旧无法保证;4)各系统均采用各自的缓存实现方案且与应用系统本身相关联,不具有通用性,无法被别的应用重用。 另外,对文件缓存的需求并不仅仅停留在Web应用上,大量的桌面应用同样可以利用文件缓存技术提升性能。而前面所提到的诸多系统,虽然均实现并应用了某种文件缓存技术,但各系统的实现存在较大差别,且均与系统本身紧耦合,不具有通用性。

发明内容
1.目的 本发明的目的在于提供一种透明、通用的文件缓存系统。该系统有两个主要的特
征l)高效性,能够高效地进行缓存操作,同时为应用提供高效的服务;2)透明性,缓存系
统对应用具有高透明性,从而,应用不需经过修改就能够应用本缓存系统,提升性能;3)通
用性,模块化设计与良好的用户接口 ,使系统能够应用于各类缓存应用场景中,且易于与其
他系统集成。 2.技术方案 本发明一种透明、通用的文件缓存系统,它包括核心模块、配置管理模块、消息队 列管理模块、通信模块和缓存操作模块,共五个模块组成,参见图1. 核心模块是系统首先启动的模块,它的主要功能包括1)和配置管理模块交互, 载入用户配置;2)为其他模块创建运行所需的子线程;3)初始化消息队列管理模块、缓存 操作模块、通信模块;4)启动、停止消息队列管理模块、缓存操作模块、通信模块;5)接收并 处理来自命令行的命令。 配置管理模块的主要功能包括1)读取并解析系统配置文件;2)将解析出的配置 信息放入存储配置信息的相应数据结构中,方便后续的访问与操作;3)为核心模块提供访 问配置信息数据结构的访问器方法,防止对配置信息的修改。
消息队列管理模块的主要功能包括1)组织管理"待处理"缓存消息队列,为系统
接收到的缓存操作消息提供缓冲机制,对用户提供较高的可用性;2)组织管理"已处理"缓
存消息队列,使缓存消息的处理情况能够由缓存操作模块反馈给通信模块,从而将处理情
况反馈给客户;3)为位于不同线程中的其它模块提供互斥访问消息队列的接口。 缓存操作模块是整个缓存系统最重要的功能模块,其主要功能包括1)接收、解
析缓存操作消息;2)根据缓存操作消息,采用链接修改技术,执行文件的缓存建立、缓存删
除、缓存状态查询功能。
通信模块是整个缓存系统与用户进行交互的界面,其主要功能包括1)与用户建
立通信连接;2)接收用户提交的缓存操作消息;3)将缓存操作消息通过消息队列操作模块
加入消息队列中;4)将缓存操作的结果及消息队列的状态返回给用户。 整个系统采用单进程多线程的模型,参见图2。其中核心模块、配置管理模块位于
线程0中运行,通信模块位于线程1中运行,缓存操作模块位于线程2中运行,消息队列管
理模块为全局共享。 系统首先启动核心模块,由核心模块启动配置管理模块,读取并解析配置文件信 息。接着,核心模块获取配置信息,并用这些配置信息调用消息队列管理模块、通信模块、缓 存操作模块的模块初始化函数,启动这些模块。 系统由消息队列管理模块负责维护"待处理"和"已处理"两个消息队列。通过内部 的互斥访问锁及对外提供的访问接口,为其它模块提供消息队列的互斥访问和存取机制。
通信模块负责与客户间的通信。模块启动后,将等待来自客户的连接请求。 一旦连 接建立,通信模块就创建子线程,并启动消息接收循环,准备接收来自用户的消息。当消息 到来,通信模块通过调用消息队列管理模块的访问函数,将接收到的消息加入到"待处理" 消息队列中。然后,通信模块从"已处理"消息队列中取出缓存消息,将其发送回客户端。
缓存操作模块负责根据缓存操作消息,执行缓存操作。模块启动后,将创建子线 程,并启动缓存消息操作循环。每次循环将依次完成从"待处理"消息队列中取出一个消息, 解析消息,调用相应的缓存操作子程序完成缓存操作任务,最后将处理后的消息加入到"已 处理"消息队列中。
3.优点及功效 本发明一种透明、通用的文件缓存系统,其优点及功效是1)该系统利用内存文 件系统组织存放缓存文件,直接保证服务器的主存Cache命中率,避免了访问磁盘带来的 性能开销,显著地提高应用的缓存访问性能;2)本系统是一个独立的文件缓存系统,所有 希望使用文件缓存技术的应用都作为其用户,缓存系统通过定义良好的协议与接口与应用 交互,缓存系统具有较好的通用性;3)系统使用了基于链接修改的缓存技术,一方面保证 了文件缓存过程的高效性,降低其带来的性能开销;另一方面巧妙地实现了对应用系统的 透明性。


參图l:系统结构示意图 參图2 :系统运行结构示意图 參图3 :核心模块初始化流程 參图4 :核心模块清理流程 參图5:配置文件示例 參图6 :消息队列管理模块初始化流程 參图7 :缓存操作模块初始化流程 參图8 :缓存操作模块清理流程 參图9 :缓存消息操作循环 參图10:缓存添加流程 參图11 :缓存删除流程 參图12 :通信模块初始化流程 參图13 :通信模块清理流程 參图14 :通信模块消息循环流程 參图15 :缓存反馈消息发送流程 图中符号说明如下 11核心模块;11配置管理模块;11消息队列管理模块; ii通信模块;^i缓存操作模块; 1111 1119 :核心模块初始化流程的步骤序号; 5181 5184 :核心模块清理流程的步骤序号; 31101 31104 :消息队列管理模块初始化流程的步骤序号; 4141 4145 :缓存操作模块初始化流程的步骤序号; 4151 4154 :缓存操作模块清理流程的步骤序号; 4181 41812 :缓存消息操作循环的步骤序号; 41191 411920 :缓存添加流程的步骤序号;
41201 412033 :缓存删除流程的步骤序号; 5171 5179 :通信模块初始化流程的步骤序号; 5181 5184 :通信模块清理流程的步骤序号; 5191 51912 :通信模块消息循环流程的步骤序号; 51111 51116 :缓存反馈消息发送流程的步骤序号。
具体实施例方式
参见图1、图2.本发明一种透明、通用的文件缓存系统,为一个单进程多线程的系
统,它由核心模块ii、配置管理模块li、消息队列管理模块紅、通信模块ii和缓存操作模块^i,共五个模块组成;其中 核心模块il、配置管理模块^l位于线程0中运行,通信模块ii位于线程1中运
行,缓存操作模块位于线程2中运行,消息队列管理模块紅为全局共享。 本发明所述的缓存系统运行于Li皿x操作系统,并且需要有内存文件系统Tmpfs
提供文件缓存的底层支持。 参见图l 图15本发明的一个具体实施例如下 1.核心模块ii 本模块由四部分组成 1)模块初始化函数ill ; 2)模块清理函数ii^; 3)命令处理函数丄益; 各部分具体实现如下 1)模块初始化函数Hi 模块初始化函数iii用于本模块启动时完成一系列初始化工作,参见图3其具体步骤如下-步骤:调用配置管理模块11的初始化函数启动该模块;-步骤皿调用配置管理模块且的配置信息读取函数li互,获取消息队列最大
长度;-步骤皿调用配置管理模块且的配置信息读取函数ll旦,获取通信模块的监听端口号;-步骤:调用配置管理模块11的配置信息读取函数MI,获取需缓存根路径;-步骤皿调用配置管理模块11的配置信息读取函数1M,获取缓存根路径;-步骤皿调用消息队列管理模块的初始化函数3110启动该模块;-步骤:调用通信模块的初始化函数MI启动该模块;-步骤皿调用缓存操作模块ii的初始化函数iH启动该模块; _歩骤1119 :调用侖令处理函数113,以接收、处理来自命令行的管理命令。
2)模块清理函数m 模块清理函数皿在命令处理函数m接收退出命令后执行,它用于本模块退出
时完成一系列清理工作,参见图4。其具体步骤如下-步骤皿调用通信模块的清理函数停止该模块;
6
-步骤皿调用缓存操作模块11的清理函数11^停止该模块;
-步骤皿调用消息队列管理模块11的清理函数mi停止该模块;
-步骤:调用配置管理模块11的清理函数Hi停止该模块。 3)命令处理函数iH 命令处理函数m接收和处理来自命令行的管理命令。它在一个无限循环中等待
来自命令行的输入,并对每个输入进行解析。如果检测到停止缓存系统命令,则结束循环, 然后调用模块清理函数m。2.配置管理模块li该模块由以下7个部分组成i)配置信息结构m;2)配置信息结构指针212 ;3)模块初始化函数213 ;4)模块清理函数Hi ;5)配置信息读取函数215、216、217、218 :6)配置载入函数liS;7)系统配置文件2110。各部分具体实现如下i)配置信息结构m配置信息结构211包含如下4个字段-消息队列最大长度,无符号短整型-监听端口号,无符号短整型-缓存根路径,字符型指针-需缓存根路,字符型指针其中,消息队列最大长度字段表示消息队列的最大长度监听端口号字段表示通
信樽块监昕的端口号缓存根路径字段表示允许缓存的路径的根需缓存根路径字段表示缓存文件存放的路径的根。
2)配置信息结构指针212配置信息结构指针212为配置信息结构211类型的指针,用于存取系统配置文件
2110获取的配置信息。
3)模块初始化函数213模块初始化函数213在模块启动时被调用,完成配置信息结构指针212的空间分
配,然后调用配置载入函数219载入配置信息。
4)模块清理函数214模块清理函数214回收为配置信息结构指针212分配的空间。5)配置信息读取函数215、216、217、218配置信息读取函数共4个,分别是-获取消息队列最大长度函数215消息队列最大长度函数215返回消息队列最大长度,类型为无符号短整型。-获取监听的端口号2160111 ] 监听端口号返回监听端口号,类型为无符号短整型。 0112]-获取需缓存根路径MI
0113] 需缓存根路径^1I返回需缓存根路径,类型为字符型指针。
0114]-获取缓存根路径IM
0115] 缓存根路径^M返回缓存根路径,类型为字符型指针。
0116]上述配置信息读取函数^、^M、^il、^M是配置管理模块11对外提供的接口 ,通
过这四个函数,核心模块ii能够方便地获取系统的配置信息,同时预防了配置文件皿的 意外修改。
0117] 6)配置载入函数11S
0118] 配置载入函数,在初始化函数^中被调用,它读取并解析系统的配置文件
皿,然后将配置信息存储到由配置信息结构指针M^指向的空间中,并返回给调用者。
0119] 7)系统配置文件2110
0120] 系统配置文件皿是一个位于同一目录下的名为aclm. config的文本文件。其 格式参见图5。
0121] 3.消息队列管理模块旦
0122] 该模块由以下11个部分组成
0123] i)缓存操作消息结构m
0124] 2)消息队列项结构;
0125] 3)消息队列最大长度变量m ;
0126] 4)当前"待处理"消息队列长度变量Mi;
0127] 5)"待处理"消息队列队头指针M^;
0128] 6)"待处理"消息队列互斥访问锁,;
0129] 7)当前"已处理"消息队列长度变量MI;
0130] 8)"已处理"消息队列队头指针,;
0131] 9)"已处理"消息队列互斥访问锁m;
0132] 10)模块初始化函数皿;
0133] 11)模块清理函数皿;
0134] 12)消息队列操作函数3112、3113、3114、3115、3116。
0135] 本发明中,消息队列采用链表进行实现。各部分具体实现如下
0136] i)缓存操作消息结构m
0137] 缓存操作消息结构Hi定义包含如下3个字段,及一个隐含字段 0138]-缓存操作消息类型字段,无符号字符型 0139]-缓存操作消息状态字段,无符号字符型 0140]-缓存消息长度字段,无符号短整型 0141]-带操作的文件名字符串字段,隐含字段
0142] 缓存操作消息类型字段表示缓存操作消息的类型,包括"缓存添加操作"和"缓存 删除操作"。 缓存操作消息状态字段用于表示本缓存操作消息的状态。用户向缓存系统发送缓 存操作消息时,将该域设置为"待处理"状态。当缓存系统处理了该缓存操作消息后,将会设置该域。用户能够通过检查接收到的反馈消息中该域的值,判断缓存的工作情况。根据缓存操作的不同结果,该状态字段一共可以取下面这些状态值-缓存添加终止,文件不可以缓存_缓存添加完成-缓存添加完成,文件已缓存-缓存添加终止,目标文件丢失-缓存添加终止,找不到文件-缓存删除完成-缓存删除完成,备份文件丢失-缓存删除完成,缓存文件丢失-缓存删除完成,链接文件丢失-缓存删除完成,链接文件、备份文件丢失-缓存删除完成,链接文件、缓存文件丢失-缓存删除终止,文件不可以缓存-缓存删除终止,链接文件丢失-缓存删除终止,常规链接文件-缓存删除失败,备份文件、缓存文件丢失-缓存删除失败,所有文件丢失-未知消息类型 缓存消息长度字段用于提取该缓存消息的消息体。由于消息体的长度无法在编译时确定,因此消息体并没有采用显式的域表示,其紧跟在域缓存消息长度字段之后。因此,需要通过指针加偏移量的方式访问消息体。消息体中包含带操作的文件的完整路径名称。
2)消息队列项结构M^ 消息队列项结构M1定义了一个链表节点,其定义包含如下2个字段
-缓存操作消息字段,缓存操作消息结构Hi类型指针
_链表下一结点指针字段,消息队列项结构Ml类型指针 缓存操作消息字段为缓存操作消息结构311指针,将在缓存操作樽块41中详细介绍。 3)消息队列最大长度变量m 消息队列最大长度变量M^为静态无符号短整型,在模块初始化函数皿中完成初始化,存储了从配置文件皿中得到的消息队列最大长度。它用于限制"待处理"队列与"已处理"队列的最大长度。 4)当前"待处理"消息队列长度变量Mi 当前"待处理"消息队列长度变量Mi为静态无符号短整型,表示当前"待处理"消息队列的长度。 5)"待处理"消息队列队头指针M^"待处理"消息队列队头指针巡为静态消息队列项结构巡类型的指针,指向"待处理"消息队列的队头,用于对"待处理"消息队列项的访问。
6)"待处理"消息队列互斥访问锁,
"待处理"消息队列互斥访问锁为静态pthread—muteX_t类型,它为"待处理"
消息队列提供互斥访问机制。消息队列操作函数mi、mi、mi、m^、,首先需要获
取互斥锁M旦,如果成功,则执行队列操作,如果失败,则等待锁。
7)当前"已处理"消息队列长度变量MI 当前"已处理"消息队列长度变量MI为静态无符号短整型,表示当前"已处理"队列的长度。 8)"已处理"消息队列队头指针,"已处理"消息队列队头指针,为静态消息队列项结构类型的指针,指向"已处理"消息队列的队头,用于对"已处理"消息队列项的访问。
9)"已处理"消息队列互斥访问锁MS"已处理"消息队列互斥访问锁MS为静态pthread—muteX_t类型,它"已处理"消息队列提供互斥访问机制。消息队列操作函数皿、皿、皿、皿、皿首先需要获取互斥锁MA如果成功,则执行队列操作,如果失败,则等待锁。 io)模块初始化函数im 模块初始化函数皿用于本模块启动时完成一系列初始化工作,该函数接收一
无符号短整型参数,该参数说明消息队列最大长度,参见图6,其具体歩骤如下-步骤^1 :根据参数,设置消息队列的最大长度变量M^ ;-步骤31102 :初始化"待处理"消息队列队头指针巡; _步骤31103 :初始化"已处理"消息队列队头指针,;-步骤31104 :初始化"待处理"消息队列互斥访问锁,;-步骤m^ :初始化"已处理"消息队列互斥访问锁,。 11)模块清理函数皿 模块清理函数皿在模块退出时执行,负责清空"待处理"和"已处理"两个消息队列。 12)消息队列操作函数3112、3113、3114、3115、3116 消息队列操作函数共5个,分别是-消息入队函数 消息入队函数皿将一个缓存操作消息加入到消息队列中,该函数接收两个参数,分别是待操作队列的标识和待入队的缓存操作消息结构111指针。
-消息出队函数 消息出队函数皿从消息队列中取出一个缓存操作消息,该函数接收待操作队列的标识参数,并返回取出的缓存操作消息结构111指针。-判断队列是否空函数mi 判断队列是否空函数mi判断指定的消息队列是否为空,该函数接收待操作队
列的标识参数,如果队列空,返回l,否则返回0。
-获取当前队列状态函数皿 获取当前队列状态函数,用于获取指定的消息队列的状态,该函数接收待操
作队列的标识参数,并返回当前队列长度,以及允许的最大长度。 -清空队列函数3116
清空队列函数,清空指定的消息队列,该函数接收待操作队列的标识参数。 卜.沭消息队列操作函数3112、3113、3114、3115、3116是消息队列管理模块31向其它模块提供的接口 ,它能够提供对"待处理"和"已处理"两个消息队列的互斥访问。 待操作队列的标识用于指定函数所要作用的消息队列,其可能为"待处理队列"和"已完成队列"。 4.缓存操作模块ii 该模块由以下20个部分组成 1)需缓存根路径变量Hi ; 2)缓存根路径变量ii^ ; 3)消息循环状态变量ill ; 4)模块初始化函数Mi ; 5)模块清理函数ii^; 6)挂载内存文件系统函数,; 7)卸载内存文件系统函数iil; 8)缓存消息操作循环函数iM ; 9)检查文件是否可缓存函数ii^ ; 10)提取相对路径函数im ; 11)生成缓存路径函数; 12)检查文件是否存在函数im ; 13)检杳文件是否为链接文件函数4113 ; 14)获取链接文件的目标文件名函数; 15)重命名文件函数im; 16)创建链接文件函数im ; 17)删除文件函数; 18)拷贝文件函数4118 ; 19)添加缓存im ; 20)删除缓存4120 : 各部分具体实现如下 1)需缓存根路径变量ill 需缓存根路径变量iii为静态字符型指针,它在模块初始化函数1H中被初始化。它保存了可缓存的根路径,所有位于根路径下的所有文件可以被缓存,其余文件不可被缓存。提取相对路径函数皿需要使用该变量提取带缓存文件相对于需缓存根路径的相对路径。 2)缓存根路径变量ii^ 缓存根路径变量ii^为静态字符型指针,它在模块初始化函数Mi中被初始化。它保存了缓存的根路径,是内存文件系统的挂载点。生成缓存路径函数iiii需要使用该变量及相对路径,生成缓存文件完整路径。 3)消息循环状态变量iM 消息循环状态变量iM为静态整型,用于控制缓存消息操作循环函数iM的执行
11状态,其可能取值为"消息循环启用"和"消息循环禁用"。
4)模块初始化函数iH 模块初始化函数iH用于本模块启动时完成一系列初始化工作,其接收两个字符型指针参数,分别表示需缓存根路径与缓存根路径。参见图7,其具体步骤如下
_步骤用参数初始化需缓存根路径变量ill和缓存根路径变量ii^ ;
-步骤1H^ :调用函数挂载内存文件系统到缓存根路径变量ii^表示的路径下;-步骤IMS :设置消息循环状态变量iM为"缓存操作消息循环启用";
-步骤:创建子线程2 ;-步骤,在子线程2中开始执行缓存消息操作循环函数iM。
5)模块清理函数ii^ 模块清理函数ii^在模块退出时完成一系列清理工作,参见图8,其具体步骤如下-步骤ii^i :设置消息循环状态变量iM为"缓存操作消息循环禁用";
-步骤,等待子线程2结束;-步骤,调用函数MI卸载缓存根路径变量Ml表示的路径下的内存文件系统; _步骤MM :释放需缓存根路径变量ill和缓存根路径变量ii^的内存空间。
6)挂载内存文件系统函数iM 内存文件系统是使用本发明必须使用的关键技术,它是缓存文件的存储位置。本发明可以使用多种常见的内存文件系统。本实施示例使用Tmpfs。 挂载内存文件系统函数1M接收一个字符型指针参数,表示缓存根路径。该函数在模块初始化函数Mi中被调用,用于挂载内存文件系统Tmpfs到缓存根路径参数表示的路径下。函数lM中,使用操作系统的system()系统调用执行内存文件系统挂载命令,例如mount tmpfs/cache/_t tmpfs-o size = 128m。 当使用其它内存文件系统时,需要将system()系统调用运行的命令做相应的替换。 7)卸载内存文件系统函数iil 卸载内存文件系统函数MI接收一个字符型指针参数,表示缓存根路径。该函数在模块清理函数ii^中被调用,用于卸载已经挂载到缓存根路径参数表示的路径下的内存文件系统。 8)缓存消息操作循环函数iM 缓存消息操作循环函数1M在子线程2中开始启动,负责执行缓存消息中指定的缓存操作,参见图9,其具体步骤如下
-步骤皿开始无限循环; _步骤,检查消息循环状态变量1M,如果为"缓存操作消息循环禁用",则转向步骤41812,否则继续歩骤4183 ;-步骤,调用消息队列管理模块的消息出队函数皿从"待处理"消息队列中取出一个缓存操作消息;
12
-步骤MM :如果成功获取缓存消息,则转向步骤IMS ;否则继续步骤,;
_歩骤4185 :等待10毫秒,然后转向歩骤4183 :
-步骤,判断取出的缓存操作消息类型 B如果类型为"缓存删除操作",则是缓存文件删除消息,转向步骤1MI ;
B如果类型为"缓存添加操作",则是缓存文件添加消息,转向步骤,;
B其他情况,转向步骤M^;-步骤,调用缓存删除函数皿,转向步骤MM ;
-步骤,调用缓存添加函数im,转向步骤MM ; _步骤,将函数返回值存入该缓存消息的状态域中,转向步骤iMii ;
-步骤41810 :设置该缓存消息的状态域为"未知消息类型";-步骤iMii:调用消息队列管理模块紅的消息入队函数皿将该缓存消息加入 "已处理"消息队列中,转向步骤,;
-步骤41812 :结束循环。
9)检查文件是否可缓存函数ii^ 检查文件是否可缓存函数M£接收一个字符型指针参数,表示待检查的文件名。 函数通过将参数和需缓存根路径变量ill表示的字符串进行比较,从而检查参数表示的文 件是否位于系统的可缓存路径下。
如果是,则返回l,表示可以缓存该文件;否则,返回O,表示不可以缓存该文件。
10)提取相对路径函数im 提取相对路径函数皿接收一个字符型指针参数,表示文件的完整路径名。函数 通过在参数表示的完整路径名中截取除去需缓存根路径变量411表示的字符串的一个子 串,作为待缓存对象的相对路径名,并返回该路径名字符串的指针。 例如,参数为,,/W/www/html/index. html",需缓存根路径变量411为,,/W/www/ html/",则函数iim将返回"index, html"。
11)生成缓存路径函数iiii 生成缓存路径函数iiii接收一个字符型指针参数,表示文件的相对路径名。函数 通过将参数表示的相对路径名与缓存根路径变量ii^表示的字符串进行拼接,生成完整的 缓存文件路径名,并返回该路径名字符串的指针。 例如,参数为"index, html",缓存根路径变量为"/cache/",则函数iiU将返
回,,/cache/index, html ,,。 12)检查文件是否存在函数im 检查文件是否存在函数im接收一个字符型指针参数,表示待检查的文件名。函 数通过系统调用access (const char *pathname, int mode)检查参数表示的文件是否存 在。 如果是,返回1 ;否则返回0。 13)检查文件是否为链接文件函数im 检查文件是否为链接文件函数im接收一个字符型指针参数,表示待检查的文 {牛名。函数通过系纟充i周用lstat (const char承restrict pathname, struct stat承restrict buf)及系统宏S—ISLNK(),检查参数表示的文件是否存在。
如果是,返回1 ;否则返回0。 14)获取链接文件的目标文件名函数11H 获取链接文件的目标文件名函数iiii接收一个字符型指针参数,表示待操作的链接文件名。函数通过系统调用readl ink (const char承restrict path謹e,char*restrict buf, size_t bufsize)获取链接文件参数指向的真实文件的完整路径名。
如果成功,返回指向获取的路径名字符指针;否则,返回NULL。
15)重侖名文件函数4115 重命名文件函数接收两个字符型指针参数,分别表示旧文件名与新文件名。函数通过系统调用rename (const char *oldname, const char *newname)将旧文件名参数表示的文件重命名为新文件名参数表示的文件名。
如果操作成功,返回1 ;否则返回0。
16)创建链接文件函数 创建链接文件函数接收两个字符型指针参数,分别表示待创建的链接文件
名与链接文件将指向的目标文件名。函数通过系统调用symlink (const chai^actualpath,
const char *sympath),创建由链接文件名参数指定的符号链接文件,该链接文件指向由
目标文件名参数指定的文件。 如果操作成功,返回1 ;否则返回0。 17)刪除文件函数4117 删除文件函数liil接收一个字符型指针参数,表示待删除的文件名。函数通过系统调用remove (const char *pathname)删除参数表示的文件。
如果操作成功,返回1 ;否则返回0。
18)拷贝文件函数4118 拷贝文件函数接收两个字符型指针参数,分别表示待拷贝的源文件名与目标文件名。函数通过系统调用system(const char *comstring)调用命令行cp命令,将参数表示的源文件拷贝生成参数表示的目标文件。
如果操作成功,返回1 ;否则返回0。
19)添加缓存函数4119 添加缓存函数im接收一个字符型指针参数,表示待添加的缓存文件。参见图
ll,具体流程如下。为了步骤的叙述简便,用src—name表示待添加缓存的文件名,用cache—name表示存储在缓存中的缓存文件完整路径名,用ret表示用于保存需要返回的状态的变-步骤iim:调用函数il豆,检查待缓存文件是否位于需缓存根路径下,如果是,继续步骤41192 ;否则转到步骤41193 ;-步骤111^:设置状态变量1~"为"缓存添加终止,文件不可以缓存",然后转到步骤411920 :-步骤41193 :调用函数im,提取待缓存文件的相对路径名,存到变量name中;
-步骤41194 :调用函数iiii,生成缓存文件完整路径名,存到变量cache—name中;-步骤41195 :调用函数4112,检查是否存在文件src—name,如果是,继续步骤41196 :否则,转向歩骤411919 :-歩骤41196 :调用函数4113,柃杳文件srC_name是否为链接文件,如果不是,继 续步骤41197 ;否则,转向步骤411911 ;-步骤41197 :调用函数iii^,拷贝文件src_name到文件cache_name ;
-步骤41198 :调用函数4115,将文件src_name重命名为src—name, aclm ;
-步骤41199 :调用函数im,创建链接文件src_name,指向文件cache_name ;
-步骤411910 :设置状态变量ret为"缓存添加完成",然后转到歩骤411920 ;
-步骤411911 :调用函数iiii,检查src—name是否指向cache_name,如果是,继续 步骤411912 ;否则,转向步骤41198 ;-歩骤411912 :调用函数4112,柃杳是否存在文件cache_name,如果是,继续步骤 411913 :否则,转向歩骤411914 :-步骤411913 :设置状态变量ret为"缓存添加完成,文件己缓存",然后转到步骤 411920 ;-歩骤411914 :调用函数4112,检杳是否存在文件src name, aclm,如果是,继续歩 骤411915 ;否则,转向步骤411917 ; -步骤411915 :调用函数4118,拷贝文件src_name. aclm到文件cache_name ;
-步骤411916 :设置状态变量ret为"缓存添加完成",然后转到步骤411920 ;
-歩骤411917 :调用函数4117,刪除失效的链接文件src_name ;
-步骤iUiM:设置状态变量ret为"缓存添加终止,目标文件丢失",然后转到步 骤411920 :-步骤411919 :设置状态变量ret为"缓存添加终止,找不到文件",然后转到步骤 411920-步骤111^:本函数结束,返回状态变量^1。
20)刪除缓存函数4120 删除缓存函数im接收一个字符型指针参数,表示待删除的缓存文件。参见图 11 ,具体流程如下。为了歩骤的叙述简便,用src—name表示待删除缓存的文件名,用cache— name表示存储在缓存中的缓存文件完整路径名,用ret表示用于保存需要返回的状态的变-步骤41201 :调用函数M£,检查文件srC_name是否位于需缓存根路径下,如果 是,继续步骤4匿;否则转到步骤412015 ;-步骤4匿:调用函数皿,提取待缓存文件的相对路径名,存到变量name中;
-步骤4腦:调用函数iiii,生成缓存文件完整路径名cache_name ;
-步骤41204 :调用函数im ,检查是否存在文件src—name ,如果是,继续步骤 41205 ;否则,转向步骤412023 ;-歩骤41205 :调用函数4113,检杳文件srC_name是否为链接文件,如果是,继续 步骤41206 ;否则,转向步骤412016 ;-歩骤41206 :调用函数iUi,检查文件src_name是否指向文件cache_name,如果 是,继续步骤41207 ;否则,转向步骤412017 ;-步骤41207 :调用函数im,检查是否存在文件cache—name,如果是,继续步骤41208 ;否则,转向步骤412018 ;-步骤41208 :调用函数iiiZ,删除文件src_name ;-步骤41209 :调用函数4118,拷贝文件cache_name到文件src_name ;-步骤412010 :调用函数iiil,删除文件cache_name ;-歩骤412011 :调用函数im,检查是否存在文件src—name. aclm,如果是,继续步 骤412012 :否则,转向歩骤412014 ;-步骤412012 :调用函数iUZ,删除文件src_name. aclm ;
-步骤412013 :设置状态变量ret为"缓存删除完成",然后转到步骤412034 ;
-步骤412014 :设置状态变量ret为"缓存删除完成,备份文件丢失",然后转到步 骤412034 :-步骤412015 :设置状态变量ret为"缓存删除终止,文件不可以缓存",然后转到 步骤412034 ;-步骤412016 :设置状态变量ret为"缓存删除终止,链接文件丢失",然后转到步 骤412034 :-步骤412017 :设置状态变量ret为"缓存删除终止,常规链接文件",然后转到步 骤412034 :-歩骤412018 :调用函数im,检查是否存在文件src—name. aclm,如果是,继续步 骤412019 :否则,转向歩骤412023 ;-步骤412019 :调用函数im,删除文件src_name ;-步骤412020 :调用函数4118,拷贝文件src_name. aclm到文件src_name ;
-步骤412021 :调用函数iUI,删除文件src_name. aclm ;-步骤4匿2 :设置状态变量ret为"缓存删除完成,缓存文件丢失",然后转到步 骤412034 :-步骤11^:设置状态变量1~"为"缓存删除失败,备份文件、缓存文件丢失",然 后转到步骤412034 ;-歩骤412024 :调用函数4112,检杳是否存在文件cache_name,如果是,继续步骤 412025 :否则,转向歩骤412030 :-步骤412025 :调用函数4118,拷贝文件cache_name到文件src_name ;-歩骤412026 :调用函数im,检查是否存在文件src_name. aclm,如果是,继续步
骤412027 :否则,转向歩骤412029 ;-步骤412027 :调用函数iUI,删除文件src_name. aclm ;-步骤11^:设置状态变量1~"为"缓存删除完成,链接文件丢失",然后转到步 骤412034 :-步骤11^:设置状态变量1~"为"缓存删除完成,链接文件、备份文件丢失",然 后转到步骤412034 ;-歩骤412030 :调用函数im,检查是否存在文件src_name. aclm,如果是,继续步 骤412031 :否则,转向歩骤412033 ;-步骤412031 :调用函数4118,拷贝文件src_name. aclm到文件src_name ;
-步骤11^:设置状态变量1~"为"缓存删除完成,链接文件、缓存文件丢失",然
16后转到步骤412034 ;-步骤11^:设置状态变量1~"为"缓存删除失败,所有文件丢失",然后转到步 骤412034 :-步骤412034 :结束缓存从删除流程,返回状态变量ret。 5.通信模块a 该模块由以下8个部分组成 1)消息队列状态通告结构旦ii ; 2)监听端口号变量; 3)客户端地址结构变量M2; 4)消息循环状态变量Mi ; 5)监听套接字变量; 6)客户套接字变量; 7)模块初始化函数MZ ; 8)模块清理函数M^; 9)消息循环函数519 : 10)队列状态通告发送函数,; 11)缓存反馈消息发送函数皿。 各部分具体实现如下 1)消息队列状态通告结构^ii 消息队列状态通告结构^ii定义包含如下两个字段
-消息队列待处理消息数量字段,无符号短整形
-消息队列剩余大小字段,无符号短整型 结构m定义了消息队列的状态通告结构。其中,消息队列待处理消息数暈字段 表示当前消息队列中待处理的消息数量,消息队列剩余大小字段表示当前消息队列中还可 以容纳的消息数量。 通信模块处将在"待处理"消息队列长度Mi分别达到消息队列最大长度m的 80 % , 85 % , 90 % , 95 %时,向用户发送消息队列状态通告m。当"待处理"消息队列长度 Mi达到消息队列最大长度m时,通信模块^i将丢弃该消息,并向用户发送队列已满的消
息队列状态通告^ii。 2)监听端口号变量M^ 监听端口号变量Ml为静态无符号短整型变量,在模块初始化函数MI中完成初 始化,用于保存通信模块监听用户连接的端口号。
3)客户端地址结构变量M^ 客户端地址结构变量为静态sockaddr—in类型变量,在模块初始化函数MI 中被赋值,用于保存当前连接到系统的用户的地址信息。该地址信息在缓存反馈消息发送 函数5111中需要使用。
4)消息循环状态变量Mi 消息循环状态变量Mi为静态整型变量,用于控制消息循环函数M^的执行状态, 其可能取值为"消息循环启用"和"消息循环禁用"。
5)监听套接字变量 监听套接字变量为静态socket类型变量,在模块初始化函数MI中初始化,
用于监听来自用户的连接。 6)客户套接字变量M^ 客户套接字变量为静态socket类型变量,在模块初始化函数517中初始化,
在和用户建立连接后进行数据收发。 7)模块初始化函数MZ 模块初始化函数MI用于本模块启动时完成一系列初始化工作。函数接收一个无
符号短整型参数,用于指定监听的端口号。参见图12,其具体步骤如下-步骤Mil :根据参数,设置监听端口号变量;-步骤MZ2 :设置消息循环状态变量Mi为"消息循环启动";-步骤MZS :调用socket创建监听套接字;-步骤MIi:调用bind将套接字515与监听端口号变量M^指定的端口绑定;
-步骤:调用listen启动监听套接字互丘监听;
-步骤MIS :调用acc印t等待客户端连接;-步骤Mil :将acc印t返回的socket实例保存到客户套接字巡中;
-步骤,创建子线程1 ;-步骤:在子线程1中执行消息循环函数MS开始消息循环。 8)模块清理函数 模块清理函数M^在模块退出时完成一系列清理工作。参见图13,其具体步骤如 下-步骤,设置消息循环状态变量Mi为"消息循环启用";
-步骤,等待子线程1结束; _歩骤5183 :关闭客户套接字516 :
-歩骤5184 :关闭监听套接字515。 9)消息循环函数M^ 消息循环函数M^在子线程1中开始启动,负责通信模块的消息接收、发送,参见 图14,其具体步骤如下-步骤,调用消息队列管理模块丑的返回当前队列状态函数111旦,获取当前 队列的长度及最大运行的队列长度,并保存在临时变量current和max中;
-步骤,开始无限循环;-步骤MM :检查消息循环状态变量^M,如果为"消息循环禁用",则转向步骤 51912,否则继续歩骤5194 ;-步骤MM :调用recv从客户套接字中接收数据;-步骤MM :根据current和max计算队列的使用情况,并做如下判断 B如果队列使用达到100%,转向歩骤5196 : 國如果队列使用达到80%,85%,90%,95%,转向步骤^^; B其他情况,继续步骤MM ;-步骤MM:丢弃本次接收到的消息;
18
-步骤MSI :构造队列状态通告消息^i丄,调用队列状态通告发送函数,向用
户发送该通告消息,然后转向步骤MM^ ;-步骤MM :构造队列状态通告消息^i丄,调用队列状态通告发送函数,向用 户发送该通告消息;-步骤MM :调用消息队列管理模块的消息入队函数mi将接收到的消息加 入"待处理"消息队列中; _步骤^^:重新调用消息队列管理模块31的返回当前队列状态函数m互,获 取当前队列的长度及最大运行的队列长度,并更新临时变量current和max ;
-步骤MSii:调用缓存反馈消息发送函数皿发送反馈消息,然后转向步骤 5193 ;-步骤51912 :结束循环。 io)队列状态通告发送函数m^ 队列状态通告发送函数,接收一个消息队列状态通告结构^ii类型的参数,调 用send函数,将参数指向的队列状态通告^ii发送给连接到系统的用户。 11)缓存反馈消息发送函数皿 缓存反馈消息发送函数皿负责向用户发送缓存反馈消息,参见图15,具体步骤 如下-步骤^1111:调用消息队列管理模块31的返回当前队列状态函数皿;-步骤^1111:将返回的队列状态中的当前队列长度的一半,作为需要出队的消息 数量N ; _步骤^1^ :调用消息队列管理模块31的消息出队函数皿,从"已处理"消息 队列中取出一个缓存消息;-步骤^1111:调用缓存反馈消息发送函数皿,将取出缓存消息依次发送给客 户; _歩骤51115 :将N减1 :-步骤51116 :如果N大于0,则转向步骤51113 ;否则结束本函数。
权利要求
一种透明、通用的文件缓存系统,它包括核心模块、配置管理模块、消息队列管理模块、通信模块和缓存操作模块,共五个模块核心模块是系统首先启动的模块,它的功能包括1)和配置管理模块交互,载入用户配置;2)为其他模块创建运行所需的子线程;3)初始化消息队列管理模块、缓存操作模块、通信模块;4)启动、停止消息队列管理模块、缓存操作模块、通信模块;5)接收并处理来自命令行的命令;配置管理模块的功能包括1)读取并解析系统配置文件;2)将解析出的配置信息放入存储配置信息的相应数据结构中,方便后续的访问与操作;3)为核心模块提供访问配置信息数据结构的访问器方法,防止对配置信息的修改;消息队列管理模块的功能包括1)组织管理“待处理”缓存消息队列,为系统接收到的缓存操作消息提供缓冲机制,对用户提供较高的可用性;2)组织管理“已处理”缓存消息队列,使缓存消息的处理情况能够由缓存操作模块反馈给通信模块,从而将处理情况反馈给客户;3)为位于不同线程中的其它模块提供互斥访问消息队列的接口;缓存操作模块是整个缓存系统最重要的功能模块,其功能包括1)接收、解析缓存操作消息;2)根据缓存操作消息,采用链接修改技术,执行文件的缓存建立、缓存删除、缓存状态查询功能;通信模块是整个缓存系统与用户进行交互的界面,其功能包括1)与用户建立通信连接;2)接收用户提交的缓存操作消息;3)将缓存操作消息通过消息队列操作模块加入消息队列中;4)将缓存操作的结果及消息队列的状态返回给用户。
2. 根据权利要求1所述的一种透明、通用的文件缓存系统,特征在于整个系统采用单进程多线程的模型,其中核心模块、配置管理模块位于线程0中运行,通信模块位于线程1中运行,缓存操作模块位于线程2中运行,消息队列管理模块为全局共享。
3. 根据权利要求1所述的一种透明、通用的文件缓存系统,特征在于系统首先启动核心模块,由核心模块启动配置管理模块,读取并解析配置文件信息;接着,核心模块获取配置信息,并用这些配置信息调用消息队列管理模块、通信模块、缓存操作模块的模块初始化函数,启动这些模块;系统由消息队列管理模块负责维护"待处理"和"已处理"两个消息队列,通过内部的互斥访问锁及对外提供的访问接口,为其它模块提供消息队列的互斥访问和存取机制;通信模块负责与客户间的通信,模块启动后,将等待来自客户的连接请求, 一旦连接建立,通信模块就创建子线程,并启动消息接收循环,准备接收来自用户的消息;当消息到来,通信模块通过调用消息队列管理模块的访问函数,将接收到的消息加入到"待处理"消息队列中,然后,通信模块从"已处理"消息队列中取出缓存消息,将其发送回客户端;缓存操作模块负责根据缓存操作消息,执行缓存操作;模块启动后,将创建子线程,并启动缓存消息操作循环;每次循环将依次完成从"待处理"消息队列中取出一个消息,解析消息,调用相应的缓存操作子程序完成缓存操作任务,最后将处理后的消息加入到"已处理"消息队列中。
全文摘要
本发明涉及一种文件缓存系统,特别是涉及一种透明、通用的文件缓存系统。系统由核心模块、配置管理模块、消息队列管理模块、通信模块和缓存操作模块,共五个模块组成。整个系统采用单进程多线程的模型,其中核心模块、配置管理模块位于线程0中运行,通信模块位于线程1中运行,缓存操作模块位于线程2中运行,消息队列管理模块为全局共享。系统由核心模块负责读取配置信息并初始化其它功能模块。通过消息队列管理模块,其它功能模块能够实现对消息队列的互斥访问和存取。系统通过通信模块与客户进行通信,接收缓存消息,并交由缓存操作模块处理,然后将处理结果返回给客户。本发明通过应用链接修改技术,能够高效地实现文件缓存操作。其次,应用链接修改技术,系统对应用提供高透明性。再次,模块化的设计与良好的用户接口,使系统具有良好的通用性。
文档编号G06F17/30GK101710341SQ200910243678
公开日2010年5月19日 申请日期2009年12月22日 优先权日2009年12月22日
发明者余彬彬, 张伟, 徐威, 李秀桥, 肖利民, 肖育前, 阮利 申请人:北京航空航天大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1