• 四川郎酒股份有限公司获第十二届人民企业社会责任奖年度环保奖 2019-05-13
  • 银保监会新规剑指大企业多头融资和过度融资 2019-05-12
  • 韩国再提4国联合申办世界杯 中国网友无视:我们自己来 2019-05-11
  • 中国人为什么一定要买房? 2019-05-11
  • 十九大精神进校园:风正扬帆当有为 勇做时代弄潮儿 2019-05-10
  • 粽叶飘香幸福邻里——廊坊市举办“我们的节日·端午”主题活动 2019-05-09
  • 太原设禁鸣路段 设备在测试中 2019-05-09
  • 拜耳医药保健有限公司获第十二届人民企业社会责任奖年度企业奖 2019-05-08
  • “港独”没出路!“梁天琦们”该醒醒了 2019-05-07
  • 陈卫平:中国文化内涵包含三方面 文化复兴表现在其中 2019-05-06
  • 人民日报客户端辟谣:“合成军装照”产品请放心使用 2019-05-05
  • 【十九大·理论新视野】为什么要“建设现代化经济体系”?   2019-05-04
  • 聚焦2017年乌鲁木齐市老城区改造提升工程 2019-05-04
  • 【专家谈】上合组织——构建区域命运共同体的有力实践者 2019-05-03
  • 【华商侃车NO.192】 亲!楼市火爆,别忘了买车位啊! 2019-05-03
    • / 29
    • 下载费用:30 金币  

    重庆时时彩开彩记录: 一种透明、通用的文件缓存系统.pdf

    摘要
    申请专利号:

    重庆时时彩单双窍门 www.4mum.com.cn CN200910243678.1

    申请日:

    2009.12.22

    公开号:

    CN101710341A

    公开日:

    2010.05.19

    当前法律状态:

    授权

    有效性:

    有权

    法律详情: 授权|||专利申请权的转移IPC(主分类):G06F 17/30变更事项:申请人变更前权利人:北京航空航天大学变更后权利人:华为技术有限公司变更事项:地址变更前权利人:100191 北京市海淀区学院路37号北京航空航天大学计算机科学与工程学院变更后权利人:518129 中国广东省深圳市龙岗区坂田华为基地总部办公楼登记生效日:20110926|||实质审查的生效IPC(主分类):G06F 17/30申请日:20091222|||公开
    IPC分类号: G06F17/30 主分类号: G06F17/30
    申请人: 北京航空航天大学
    发明人: 肖利民; 徐威; 张伟; 余彬彬; 李秀桥; 肖育前; 阮利
    地址: 100191 北京市海淀区学院路37号北京航空航天大学计算机科学与工程学院
    优先权:
    专利代理机构: 北京慧泉知识产权代理有限公司 11232 代理人: 王顺荣;唐爱华
    PDF完整版下载: PDF下载
    法律状态
    申请(专利)号:

    CN200910243678.1

    授权公告号:

    101710341B|||||||||

    法律状态公告日:

    2012.08.08|||2011.11.16|||2011.04.20|||2010.05.19

    法律状态类型:

    授权|||专利申请权、专利权的转移|||实质审查的生效|||公开

    摘要

    本发明涉及一种文件缓存系统,特别是涉及一种透明、通用的文件缓存系统。系统由核心???、配置管理???、消息队列管理???、通信??楹突捍娌僮髂??,共五个??樽槌?。整个系统采用单进程多线程的模型,其中核心???、配置管理??槲挥谙叱?中运行,通信??槲挥谙叱?中运行,缓存操作??槲挥谙叱?中运行,消息队列管理??槲止蚕?。系统由核心??楦涸鸲寥∨渲眯畔⒉⒊跏蓟渌δ苣??。通过消息队列管理???,其它功能??槟芄皇迪侄韵⒍恿械幕コ夥梦屎痛嫒?。系统通过通信??橛肟突Ы型ㄐ?,接收缓存消息,并交由缓存操作??榇?,然后将处理结果返回给客户。本发明通过应用链接修改技术,能够高效地实现文件缓存操作。其次,应用链接修改技术,系统对应用提供高透明性。再次,??榛纳杓朴肓己玫挠没Ы涌?,使系统具有良好的通用性。

    权利要求书

    1: 一种透明、通用的文件缓存系统,它包括核心???、配置管理???、消息队列管理???、通信??楹突捍娌僮髂??,共五个??椋?核心??槭窍低呈紫绕舳哪??,它的功能包括:1)和配置管理??榻换?,载入用户配置;2)为其他??榇唇ㄔ诵兴璧淖酉叱?;3)初始化消息队列管理???、缓存操作???、通信???;4)启动、停止消息队列管理???、缓存操作???、通信???;5)接收并处理来自命令行的命令; 配置管理??榈墓δ馨ǎ?)读取并解析系统配置文件;2)将解析出的配置信息放入存储配置信息的相应数据结构中,方便后续的访问与操作;3)为核心??樘峁┓梦逝渲眯畔⑹萁峁沟姆梦势鞣椒?,防止对配置信息的修改; 消息队列管理??榈墓δ馨ǎ?)组织管理“待处理”缓存消息队列,为系统接收到的缓存操作消息提供缓冲机制,对用户提供较高的可用性;2)组织管理“已处理”缓存消息队列,使缓存消息的处理情况能够由缓存操作??榉蠢「ㄐ拍??,从而将处理情况反馈给客户;3)为位于不同线程中的其它??樘峁┗コ夥梦氏⒍恿械慕涌?; 缓存操作??槭钦龌捍嫦低匙钪匾墓δ苣??,其功能包括:1)接收、解析缓存操作消息;2)根据缓存操作消息,采用链接修改技术,执行文件的缓存建立、缓存删除、缓存状态查询功能; 通信??槭钦龌捍嫦低秤胗没Ы薪换サ慕缑?,其功能包括:1)与用户建立通信连接;2)接收用户提交的缓存操作消息;3)将缓存操作消息通过消息队列操作??榧尤胂⒍恿兄?;4)将缓存操作的结果及消息队列的状态返回给用户。
    2: 根据权利要求1所述的一种透明、通用的文件缓存系统,特征在于:整个系统采用单进程多线程的模型,其中核心???、配置管理??槲挥谙叱?中运行,通信??槲挥谙叱?中运行,缓存操作??槲挥谙叱?中运行,消息队列管理??槲止蚕?。
    3: 根据权利要求1所述的一种透明、通用的文件缓存系统,特征在于:系统首先启动核心???,由核心??槠舳渲霉芾砟??,读取并解析配置文件信息;接着,核心??榛袢∨渲眯畔?,并用这些配置信息调用消息队列管理???、通信???、缓存操作??榈哪?槌跏蓟?,启动这些???; 系统由消息队列管理??楦涸鹞ぁ按怼焙汀耙汛怼绷礁鱿⒍恿?,通过内部的互斥访问锁及对外提供的访问接口,为其它??樘峁┫⒍恿械幕コ夥梦屎痛嫒』?; 通信??楦涸鹩肟突Ъ涞耐ㄐ?,??槠舳?,将等待来自客户的连接请求,一旦连接建立,通信??榫痛唇ㄗ酉叱?,并启动消息接收循环,准备接收来自用户的消息;当消息到来,通信??橥ü饔孟⒍恿泄芾砟?榈姆梦屎?,将接收到的消息加入到“待处理”消息队列中,然后,通信??榇印耙汛怼毕⒍恿兄腥〕龌捍嫦?,将其发送回客户端; 缓存操作??楦涸鸶莼捍娌僮飨?,执行缓存操作;??槠舳?,将创建子线程,并启动缓存消息操作循环;每次循环将依次完成从“待处理”消息队列中取出一个消息,解析消息,调用相应的缓存操作子程序完成缓存操作任务,最后将处理后的消息加入到“已处理”消息队列中。

    说明书


    一种透明、通用的文件缓存系统

        【技术领域】

        本发明涉及一种文件缓存系统,特别是涉及一种透明、通用的文件缓存系统。本发明属于计算机技术领域。

        背景技术

        目前,随着计算机技术与互联网的飞速发展,用户对应用的需求已不仅仅限于功能方面,对应用的性能需求逐渐成为了影响用户体验的主要因素。

        对于企业网站来说,如何为来自全球的用户提供快速稳定和高质量的网站体验,以提升用户满意度和提高收入对企业而言是一个具有战略性意义的重要课题。美国Gomez网络公司曾做过一个2000个用户的调查,结果显示,当一个网站响应速度很慢时,50%的用户会放弃访问而转向竞争对手的网站。而随着电子商务逐渐普及,如何为用户提供高速的购买流程也将直接影响到用户体验。有研究表明,当用户的购买流程失败了三次以上时,94%的用户会选择永远放弃这个网站。而更严重的是,近五成的用户会将这种不好的体验告诉5个以上朋友或同事。根据OMD的最新调查,网页负载时间与bounce?rate存在的密切关系。随着负载时间延长,bounce?rate会不断增加。因此,提高页面的下载速度将有助于降低bounce?rate。

        近年来,以提升网站系统性能为目标,大量的技术与相关研究被提出与应用。其中,文件缓存技术,作为一种改善网站系统的性能的技术方案,今年来得到了广泛的应用。它通过对高访问频率的文件进行缓存,提高热点文件的主存Cache命中率,提升访问速度,减小访问延迟。

        目前,文件缓存技术被广泛使用于Web服务器应用中。典型的代表有:基于Apache的mod_proxy反向代理系统、Web代理与缓存服务器系统Squid、HTTP与反向代理服务器系统Nginx、HTTP服务加速系统Varnish、分布式缓存系统Memcached和分布式的对象存储缓存系统NCache等。通过在Web服务器集群前端部署缓存服务器,将文件缓存到缓存服务器的磁盘中,并进行集中的组织管理,提升热点文件的主存Cache命中率,从而提高文件的访问速度。

        综观这些Web服务器系统对文件缓存技术的实现与应用,普遍存在以下几个问题:1)依靠专门的硬件构建缓存服务器,成本较高;2)缓存的文件依旧存储在缓存服务器的磁盘中,磁盘访问性能依旧较低;3)缓存服务器的主存Cache命中率仍旧无法保证;4)各系统均采用各自的缓存实现方案且与应用系统本身相关联,不具有通用性,无法被别的应用重用。

        另外,对文件缓存的需求并不仅仅停留在Web应用上,大量的桌面应用同样可以利用文件缓存技术提升性能。而前面所提到的诸多系统,虽然均实现并应用了某种文件缓存技术,但各系统的实现存在较大差别,且均与系统本身紧耦合,不具有通用性。

        【发明内容】

        1.目的

        本发明的目的在于提供一种透明、通用的文件缓存系统。该系统有两个主要的特征:1)高效性,能够高效地进行缓存操作,同时为应用提供高效的服务;2)透明性,缓存系统对应用具有高透明性,从而,应用不需经过修改就能够应用本缓存系统,提升性能;3)通用性,??榛杓朴肓己玫挠没Ы涌?,使系统能够应用于各类缓存应用场景中,且易于与其他系统集成。

        2.技术方案

        本发明一种透明、通用的文件缓存系统,它包括核心???、配置管理???、消息队列管理???、通信??楹突捍娌僮髂??,共五个??樽槌?,参见图1.

        核心??槭窍低呈紫绕舳哪??,它的主要功能包括:1)和配置管理??榻换?,载入用户配置;2)为其他??榇唇ㄔ诵兴璧淖酉叱?;3)初始化消息队列管理???、缓存操作???、通信???;4)启动、停止消息队列管理???、缓存操作???、通信???;5)接收并处理来自命令行的命令。

        配置管理??榈闹饕δ馨ǎ?)读取并解析系统配置文件;2)将解析出的配置信息放入存储配置信息地相应数据结构中,方便后续的访问与操作;3)为核心??樘峁┓梦逝渲眯畔⑹萁峁沟姆梦势鞣椒?,防止对配置信息的修改。

        消息队列管理??榈闹饕δ馨ǎ?)组织管理“待处理”缓存消息队列,为系统接收到的缓存操作消息提供缓冲机制,对用户提供较高的可用性;2)组织管理“已处理”缓存消息队列,使缓存消息的处理情况能够由缓存操作??榉蠢「ㄐ拍??,从而将处理情况反馈给客户;3)为位于不同线程中的其它??樘峁┗コ夥梦氏⒍恿械慕涌?。

        缓存操作??槭钦龌捍嫦低匙钪匾墓δ苣??,其主要功能包括:1)接收、解析缓存操作消息;2)根据缓存操作消息,采用链接修改技术,执行文件的缓存建立、缓存删除、缓存状态查询功能。

        通信??槭钦龌捍嫦低秤胗没Ы薪换サ慕缑?,其主要功能包括:1)与用户建立通信连接;2)接收用户提交的缓存操作消息;3)将缓存操作消息通过消息队列操作??榧尤胂⒍恿兄?;4)将缓存操作的结果及消息队列的状态返回给用户。

        整个系统采用单进程多线程的模型,参见图2。其中核心???、配置管理??槲挥谙叱?中运行,通信??槲挥谙叱?中运行,缓存操作??槲挥谙叱?中运行,消息队列管理??槲止蚕?。

        系统首先启动核心???,由核心??槠舳渲霉芾砟??,读取并解析配置文件信息。接着,核心??榛袢∨渲眯畔?,并用这些配置信息调用消息队列管理???、通信???、缓存操作??榈哪?槌跏蓟?,启动这些???。

        系统由消息队列管理??楦涸鹞ぁ按怼焙汀耙汛怼绷礁鱿⒍恿?。通过内部的互斥访问锁及对外提供的访问接口,为其它??樘峁┫⒍恿械幕コ夥梦屎痛嫒』?。

        通信??楦涸鹩肟突Ъ涞耐ㄐ?。??槠舳?,将等待来自客户的连接请求。一旦连接建立,通信??榫痛唇ㄗ酉叱?,并启动消息接收循环,准备接收来自用户的消息。当消息到来,通信??橥ü饔孟⒍恿泄芾砟?榈姆梦屎?,将接收到的消息加入到“待处理”消息队列中。然后,通信??榇印耙汛怼毕⒍恿兄腥〕龌捍嫦?,将其发送回客户端。

        缓存操作??楦涸鸶莼捍娌僮飨?,执行缓存操作。??槠舳?,将创建子线程,并启动缓存消息操作循环。每次循环将依次完成从“待处理”消息队列中取出一个消息,解析消息,调用相应的缓存操作子程序完成缓存操作任务,最后将处理后的消息加入到“已处理”消息队列中。

        3.优点及功效

        本发明一种透明、通用的文件缓存系统,其优点及功效是:1)该系统利用内存文件系统组织存放缓存文件,直接保证服务器的主存Cache命中率,避免了访问磁盘带来的性能开销,显著地提高应用的缓存访问性能;2)本系统是一个独立的文件缓存系统,所有希望使用文件缓存技术的应用都作为其用户,缓存系统通过定义良好的协议与接口与应用交互,缓存系统具有较好的通用性;3)系统使用了基于链接修改的缓存技术,一方面保证了文件缓存过程的高效性,降低其带来的性能开销;另一方面巧妙地实现了对应用系统的透明性。

        【附图说明】

        ●图1:系统结构示意图

        ●图2:系统运行结构示意图

        ●图3:核心??槌跏蓟鞒?br>
        ●图4:核心??榍謇砹鞒?br>
        ●图5:配置文件示例

        ●图6:消息队列管理??槌跏蓟鞒?br>
        ●图7:缓存操作??槌跏蓟鞒?br>
        ●图8:缓存操作??榍謇砹鞒?br>
        ●图9:缓存消息操作循环

        ●图10:缓存添加流程

        ●图11:缓存删除流程

        ●图12:通信??槌跏蓟鞒?br>
        ●图13:通信??榍謇砹鞒?br>
        ●图14:通信??橄⒀妨鞒?br>
        ●图15:缓存反馈消息发送流程

        图中符号说明如下:

        11核心???;21配置管理???;31消息队列管理???;

        41通信???;51缓存操作???;

        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.本发明一种透明、通用的文件缓存系统,为一个单进程多线程的系统,它由核心???1、配置管理???1、消息队列管理???1、通信???1和缓存操作???1,共五个??樽槌?;其中:

        核心???1、配置管理???1位于线程0中运行,通信???1位于线程1中运行,缓存操作???1位于线程2中运行,消息队列管理???1为全局共享。

        本发明所述的缓存系统运行于Linux操作系统,并且需要有内存文件系统Tmpfs提供文件缓存的底层支持。

        参见图1~图15本发明的一个具体实施例如下:

        1.核心???1

        本??橛伤牟糠肿槌?br>
        1)??槌跏蓟?11;

        2)??榍謇砗?12;

        3)命令处理函数113;

        各部分具体实现如下:

        1)??槌跏蓟?11

        ??槌跏蓟?11用于本??槠舳蓖瓿梢幌盗谐跏蓟ぷ?,参见图3其具体步骤如下:

        -步骤1111:调用配置管理???1的初始化函数213启动该???;

        -步骤1112:调用配置管理???1的配置信息读取函数215,获取消息队列最大长度;

        -步骤1113:调用配置管理???1的配置信息读取函数216,获取通信??榈募嗵丝诤?;

        -步骤1114:调用配置管理???1的配置信息读取函数217,获取需缓存根路径;

        -步骤1115:调用配置管理???1的配置信息读取函数218,获取缓存根路径;

        -步骤1116:调用消息队列管理???1的初始化函数3110启动该???;

        -步骤1117:调用通信???1的初始化函数517启动该???;

        -步骤1118:调用缓存操作???1的初始化函数414启动该???;

        -步骤1119:调用命令处理函数113,以接收、处理来自命令行的管理命令。

        2)??榍謇砗?12

        ??榍謇砗?12在命令处理函数113接收退出命令后执行,它用于本??橥顺鍪蓖瓿梢幌盗星謇砉ぷ?,参见图4。其具体步骤如下:

        -步骤1121:调用通信???1的清理函数518停止该???;

        -步骤1122:调用缓存操作???1的清理函数415停止该???;

        -步骤1123:调用消息队列管理???1的清理函数3111停止该???;

        -步骤1124:调用配置管理???1的清理函数214停止该???。

        3)命令处理函数113

        命令处理函数113接收和处理来自命令行的管理命令。它在一个无限循环中等待来自命令行的输入,并对每个输入进行解析。如果检测到停止缓存系统命令,则结束循环,然后调用??榍謇砗?12。

        2.配置管理???1

        该??橛梢韵?个部分组成:

        1)配置信息结构211;

        2)配置信息结构指针212;

        3)??槌跏蓟?13;

        4)??榍謇砗?14;

        5)配置信息读取函数215、216、217、218;

        6)配置载入函数219;

        7)系统配置文件2110。

        各部分具体实现如下:

        1)配置信息结构211

        配置信息结构211包含如下4个字段:

        -消息队列最大长度,无符号短整型

        -监听端口号,无符号短整型

        -缓存根路径,字符型指针

        -需缓存根路,字符型指针

        其中,消息队列最大长度字段表示消息队列的最大长度;监听端口号字段表示通信??榧嗵亩丝诤?;缓存根路径字段表示允许缓存的路径的根;需缓存根路径字段表示缓存文件存放的路径的根。

        2)配置信息结构指针212

        配置信息结构指针212为配置信息结构211类型的指针,用于存取系统配置文件2110获取的配置信息。

        3)??槌跏蓟?13

        ??槌跏蓟?13在??槠舳北坏饔?,完成配置信息结构指针212的空间分配,然后调用配置载入函数219载入配置信息。

        4)??榍謇砗?14

        ??榍謇砗?14回收为配置信息结构指针212分配的空间。

        5)配置信息读取函数215、216、217、218

        配置信息读取函数共4个,分别是:

        -获取消息队列最大长度函数215

        消息队列最大长度函数215返回消息队列最大长度,类型为无符号短整型。

        -获取监听的端口号216

        监听端口号216返回监听端口号,类型为无符号短整型。

        -获取需缓存根路径217

        需缓存根路径217返回需缓存根路径,类型为字符型指针。

        -获取缓存根路径218

        缓存根路径218返回缓存根路径,类型为字符型指针。

        上述配置信息读取函数215、216、217、218是配置管理???1对外提供的接口,通过这四个函数,核心???1能够方便地获取系统的配置信息,同时预防了配置文件2110的意外修改。

        6)配置载入函数219

        配置载入函数219在初始化函数213中被调用,它读取并解析系统的配置文件2110,然后将配置信息存储到由配置信息结构指针212指向的空间中,并返回给调用者。

        7)系统配置文件2110

        系统配置文件2110是一个位于同一目录下的名为aclm.config的文本文件。其格式参见图5。

        3.消息队列管理???1

        该??橛梢韵?1个部分组成:

        1)缓存操作消息结构311

        2)消息队列项结构312;

        3)消息队列最大长度变量313;

        4)当前“待处理”消息队列长度变量314;

        5)“待处理”消息队列队头指针315;

        6)“待处理”消息队列互斥访问锁316;

        7)当前“已处理”消息队列长度变量317;

        8)“已处理”消息队列队头指针318;

        9)“已处理”消息队列互斥访问锁319;

        10)??槌跏蓟?110;

        11)??榍謇砗?111;

        12)消息队列操作函数3112、3113、3114、3115、3116。

        本发明中,消息队列采用链表进行实现。各部分具体实现如下:

        1)缓存操作消息结构311

        缓存操作消息结构311定义包含如下3个字段,及一个隐含字段:

        -缓存操作消息类型字段,无符号字符型

        -缓存操作消息状态字段,无符号字符型

        -缓存消息长度字段,无符号短整型

        -带操作的文件名字符串字段,隐含字段

        缓存操作消息类型字段表示缓存操作消息的类型,包括”缓存添加操作”和”缓存删除操作”。

        缓存操作消息状态字段用于表示本缓存操作消息的状态。用户向缓存系统发送缓存操作消息时,将该域设置为“待处理”状态。当缓存系统处理了该缓存操作消息后,将会设置该域。用户能够通过检查接收到的反馈消息中该域的值,判断缓存的工作情况。根据缓存操作的不同结果,该状态字段一共可以取下面这些状态值:

        -缓存添加终止,文件不可以缓存

        -缓存添加完成

        -缓存添加完成,文件已缓存

        -缓存添加终止,目标文件丢失

        -缓存添加终止,找不到文件

        -缓存删除完成

        -缓存删除完成,备份文件丢失

        -缓存删除完成,缓存文件丢失

        -缓存删除完成,链接文件丢失

        -缓存删除完成,链接文件、备份文件丢失

        -缓存删除完成,链接文件、缓存文件丢失

        -缓存删除终止,文件不可以缓存

        -缓存删除终止,链接文件丢失

        -缓存删除终止,常规链接文件

        -缓存删除失败,备份文件、缓存文件丢失

        -缓存删除失败,所有文件丢失

        -未知消息类型

        缓存消息长度字段用于提取该缓存消息的消息体。由于消息体的长度无法在编译时确定,因此消息体并没有采用显式的域表示,其紧跟在域缓存消息长度字段之后。因此,需要通过指针加偏移量的方式访问消息体。消息体中包含带操作的文件的完整路径名称。

        2)消息队列项结构312

        消息队列项结构312定义了一个链表节点,其定义包含如下2个字段:

        -缓存操作消息字段,缓存操作消息结构311类型指针

        -链表下一结点指针字段,消息队列项结构312类型指针

        缓存操作消息字段为缓存操作消息结构311指针,将在缓存操作???1中详细介绍。

        3)消息队列最大长度变量313

        消息队列最大长度变量313为静态无符号短整型,在??槌跏蓟?110中完成初始化,存储了从配置文件2110中得到的消息队列最大长度。它用于限制“待处理”队列与“已处理”队列的最大长度。

        4)当前“待处理”消息队列长度变量314

        当前“待处理”消息队列长度变量314为静态无符号短整型,表示当前“待处理”消息队列的长度。

        5)“待处理”消息队列队头指针315

        “待处理”消息队列队头指针315为静态消息队列项结构312类型的指针,指向“待处理”消息队列的队头,用于对“待处理”消息队列项的访问。

        6)“待处理”消息队列互斥访问锁316

        “待处理”消息队列互斥访问锁316为静态pthread_mutex_t类型,它为“待处理”消息队列提供互斥访问机制。消息队列操作函数3112、3113、3114、3115、3116首先需要获取互斥锁316,如果成功,则执行队列操作,如果失败,则等待锁。

        7)当前“已处理”消息队列长度变量317

        当前“已处理”消息队列长度变量317为静态无符号短整型,表示当前“已处理”队列的长度。

        8)“已处理”消息队列队头指针318

        “已处理”消息队列队头指针318为静态消息队列项结构312类型的指针,指向“已处理”消息队列的队头,用于对“已处理”消息队列项的访问。

        9)“已处理”消息队列互斥访问锁319

        “已处理”消息队列互斥访问锁319为静态pthread_mutex_t类型,它“已处理”消息队列提供互斥访问机制。消息队列操作函数3112、3113、3114、3115、3116首先需要获取互斥锁319,如果成功,则执行队列操作,如果失败,则等待锁。

        10)??槌跏蓟?110

        ??槌跏蓟?110用于本??槠舳蓖瓿梢幌盗谐跏蓟ぷ?,该函数接收一无符号短整型参数,该参数说明消息队列最大长度,参见图6,其具体步骤如下:

        -步骤31101:根据参数,设置消息队列的最大长度变量313;

        -步骤31102:初始化“待处理”消息队列队头指针315;

        -步骤31103:初始化“已处理”消息队列队头指针318;

        -步骤31104:初始化“待处理”消息队列互斥访问锁316;

        -步骤31105:初始化“已处理”消息队列互斥访问锁319。

        11)??榍謇砗?111

        ??榍謇砗?111在??橥顺鍪敝葱?,负责清空“待处理”和“已处理”两个消息队列。

        12)消息队列操作函数3112、3113、3114、3115、3116

        消息队列操作函数共5个,分别是:

        -消息入队函数3112

        消息入队函数3112将一个缓存操作消息加入到消息队列中,该函数接收两个参数,分别是待操作队列的标识和待入队的缓存操作消息结构311指针。

        -消息出队函数3113

        消息出队函数3113从消息队列中取出一个缓存操作消息,该函数接收待操作队列的标识参数,并返回取出的缓存操作消息结构311指针。

        -判断队列是否空函数3114

        判断队列是否空函数3114判断指定的消息队列是否为空,该函数接收待操作队列的标识参数,如果队列空,返回1,否则返回0。

        -获取当前队列状态函数3115

        获取当前队列状态函数3115用于获取指定的消息队列的状态,该函数接收待操作队列的标识参数,并返回当前队列长度,以及允许的最大长度。

        -清空队列函数3116

        清空队列函数3116清空指定的消息队列,该函数接收待操作队列的标识参数。

        上述消息队列操作函数3112、3113、3114、3115、3116是消息队列管理???1向其它??樘峁┑慕涌?,它能够提供对“待处理”和“已处理”两个消息队列的互斥访问。

        待操作队列的标识用于指定函数所要作用的消息队列,其可能为“待处理队列”和“已完成队列”。

        4.缓存操作???1

        该??橛梢韵?0个部分组成:

        1)需缓存根路径变量411;

        2)缓存根路径变量412;

        3)消息循环状态变量413;

        4)??槌跏蓟?14;

        5)??榍謇砗?15;

        6)挂载内存文件系统函数416;

        7)卸载内存文件系统函数417;

        8)缓存消息操作循环函数418;

        9)检查文件是否可缓存函数419;

        10)提取相对路径函数4110;

        11)生成缓存路径函数4111;

        12)检查文件是否存在函数4112;

        13)检查文件是否为链接文件函数4113;

        14)获取链接文件的目标文件名函数4114;

        15)重命名文件函数4115;

        16)创建链接文件函数4116;

        17)删除文件函数4117;

        18)拷贝文件函数4118;

        19)添加缓存4119;

        20)删除缓存4120;

        各部分具体实现如下:

        1)需缓存根路径变量411

        需缓存根路径变量411为静态字符型指针,它在??槌跏蓟?14中被初始化。它保存了可缓存的根路径,所有位于根路径下的所有文件可以被缓存,其余文件不可被缓存。提取相对路径函数4110需要使用该变量提取带缓存文件相对于需缓存根路径的相对路径。

        2)缓存根路径变量412

        缓存根路径变量412为静态字符型指针,它在??槌跏蓟?14中被初始化。它保存了缓存的根路径,是内存文件系统的挂载点。生成缓存路径函数4111需要使用该变量及相对路径,生成缓存文件完整路径。

        3)消息循环状态变量413

        消息循环状态变量413为静态整型,用于控制缓存消息操作循环函数418的执行状态,其可能取值为“消息循环启用”和“消息循环禁用”。

        4)??槌跏蓟?14

        ??槌跏蓟?14用于本??槠舳蓖瓿梢幌盗谐跏蓟ぷ?,其接收两个字符型指针参数,分别表示需缓存根路径与缓存根路径。参见图7,其具体步骤如下:

        -步骤4141:用参数初始化需缓存根路径变量411和缓存根路径变量412;

        -步骤4142:调用函数416挂载内存文件系统到缓存根路径变量412表示的路径下;

        -步骤4143:设置消息循环状态变量413为“缓存操作消息循环启用”;

        -步骤4144:创建子线程2;

        -步骤4145:在子线程2中开始执行缓存消息操作循环函数418。

        5)??榍謇砗?15

        ??榍謇砗?15在??橥顺鍪蓖瓿梢幌盗星謇砉ぷ?,参见图8,其具体步骤如下:

        -步骤4151:设置消息循环状态变量413为“缓存操作消息循环禁用”;

        -步骤4152:等待子线程2结束;

        -步骤4153:调用函数417卸载缓存根路径变量412表示的路径下的内存文件系统;

        -步骤4154:释放需缓存根路径变量411和缓存根路径变量412的内存空间。

        6)挂载内存文件系统函数416

        内存文件系统是使用本发明必须使用的关键技术,它是缓存文件的存储位置。本发明可以使用多种常见的内存文件系统。本实施示例使用Tmpfs。

        挂载内存文件系统函数416接收一个字符型指针参数,表示缓存根路径。该函数在??槌跏蓟?14中被调用,用于挂载内存文件系统Tmpfs到缓存根路径参数表示的路径下。函数416中,使用操作系统的system()系统调用执行内存文件系统挂载命令,例如:mount?tmpfs/cache/-t?tmpfs-o?size=128m。

        当使用其它内存文件系统时,需要将system()系统调用运行的命令做相应的替换。

        7)卸载内存文件系统函数417

        卸载内存文件系统函数417接收一个字符型指针参数,表示缓存根路径。该函数在??榍謇砗?15中被调用,用于卸载已经挂载到缓存根路径参数表示的路径下的内存文件系统。

        8)缓存消息操作循环函数418

        缓存消息操作循环函数418在子线程2中开始启动,负责执行缓存消息中指定的缓存操作,参见图9,其具体步骤如下:

        -步骤4181:开始无限循环;

        -步骤4182:检查消息循环状态变量413,如果为“缓存操作消息循环禁用”,则转向步骤41812,否则继续步骤4183;

        -步骤4183:调用消息队列管理???1的消息出队函数3113从“待处理”消息队列中取出一个缓存操作消息;

        -步骤4184:如果成功获取缓存消息,则转向步骤4186;否则继续步骤4185;

        -步骤4185:等待10毫秒,然后转向步骤4183;

        -步骤4186:判断取出的缓存操作消息类型:

        ■如果类型为”缓存删除操作”,则是缓存文件删除消息,转向步骤4187;

        ■如果类型为”缓存添加操作”,则是缓存文件添加消息,转向步骤4188;

        ■其他情况,转向步骤41810;

        -步骤4187:调用缓存删除函数4120,转向步骤4189;

        -步骤4188:调用缓存添加函数4119,转向步骤4189;

        -步骤4189:将函数返回值存入该缓存消息的状态域中,转向步骤41811;

        -步骤41810:设置该缓存消息的状态域为“未知消息类型”;

        -步骤41811:调用消息队列管理???1的消息入队函数3112将该缓存消息加入“已处理”消息队列中,转向步骤4182;

        -步骤41812:结束循环。

        9)检查文件是否可缓存函数419

        检查文件是否可缓存函数419接收一个字符型指针参数,表示待检查的文件名。函数通过将参数和需缓存根路径变量411表示的字符串进行比较,从而检查参数表示的文件是否位于系统的可缓存路径下。

        如果是,则返回1,表示可以缓存该文件;否则,返回0,表示不可以缓存该文件。

        10)提取相对路径函数4110

        提取相对路径函数4110接收一个字符型指针参数,表示文件的完整路径名。函数通过在参数表示的完整路径名中截取除去需缓存根路径变量411表示的字符串的一个子串,作为待缓存对象的相对路径名,并返回该路径名字符串的指针。

        例如,参数为”/var/www/html/index.html”,需缓存根路径变量411为”/var/www/html/”,则函数4110将返回”index.html”。

        11)生成缓存路径函数4111

        生成缓存路径函数4111接收一个字符型指针参数,表示文件的相对路径名。函数通过将参数表示的相对路径名与缓存根路径变量412表示的字符串进行拼接,生成完整的缓存文件路径名,并返回该路径名字符串的指针。

        例如,参数为”index.html”,缓存根路径变量412为”/cache/”,则函数4111将返回”/cache/index.html”。

        12)检查文件是否存在函数4112

        检查文件是否存在函数4112接收一个字符型指针参数,表示待检查的文件名。函数通过系统调用access(const?char?*pathname,int?mode)检查参数表示的文件是否存在。

        如果是,返回1;否则返回0。

        13)检查文件是否为链接文件函数4113

        检查文件是否为链接文件函数4113接收一个字符型指针参数,表示待检查的文件名。函数通过系统调用lstat(const?char?*restrict?pathname,struct?stat*restrict?buf)及系统宏S_ISLNK(),检查参数表示的文件是否存在。

        如果是,返回1;否则返回0。

        14)获取链接文件的目标文件名函数4114

        获取链接文件的目标文件名函数4114接收一个字符型指针参数,表示待操作的链接文件名。函数通过系统调用readlink(const?char?*restrict?pathname,char*restrict?buf,size_t?bufsize)获取链接文件参数指向的真实文件的完整路径名。

        如果成功,返回指向获取的路径名字符指针;否则,返回NULL。

        15)重命名文件函数4115

        重命名文件函数4115接收两个字符型指针参数,分别表示旧文件名与新文件名。函数通过系统调用rename(const?char?*oldname,const?char?*newname)将旧文件名参数表示的文件重命名为新文件名参数表示的文件名。

        如果操作成功,返回1;否则返回0。

        16)创建链接文件函数4116

        创建链接文件函数4116接收两个字符型指针参数,分别表示待创建的链接文件名与链接文件将指向的目标文件名。函数通过系统调用symlink(const?char*actualpath,const?char?*sympath),创建由链接文件名参数指定的符号链接文件,该链接文件指向由目标文件名参数指定的文件。

        如果操作成功,返回1;否则返回0。

        17)删除文件函数4117

        删除文件函数4117接收一个字符型指针参数,表示待删除的文件名。函数通过系统调用remove(const?char?*pathname)删除参数表示的文件。

        如果操作成功,返回1;否则返回0。

        18)拷贝文件函数4118

        拷贝文件函数4118接收两个字符型指针参数,分别表示待拷贝的源文件名与目标文件名。函数通过系统调用system(const?char?*comstring)调用命令行cp命令,将参数表示的源文件拷贝生成参数表示的目标文件。

        如果操作成功,返回1;否则返回0。

        19)添加缓存函数4119

        添加缓存函数4119接收一个字符型指针参数,表示待添加的缓存文件。参见图11,具体流程如下。为了步骤的叙述简便,用src_name表示待添加缓存的文件名,用cache_name表示存储在缓存中的缓存文件完整路径名,用ret表示用于保存需要返回的状态的变量。

        -步骤41191:调用函数419,检查待缓存文件是否位于需缓存根路径下,如果是,继续步骤41192;否则转到步骤41193;

        -步骤41192:设置状态变量ret为“缓存添加终止,文件不可以缓存”,然后转到步骤411920;

        -步骤41193:调用函数4110,提取待缓存文件的相对路径名,存到变量name中;

        -步骤41194:调用函数4111,生成缓存文件完整路径名,存到变量cache_name中;

        -步骤41195:调用函数4112,检查是否存在文件src_name,如果是,继续步骤41196;否则,转向步骤411919;

        -步骤41196:调用函数4113,检查文件src_name是否为链接文件,如果不是,继续步骤41197;否则,转向步骤411911;

        -步骤41197:调用函数4118,拷贝文件src_name到文件cache_name;

        -步骤41198:调用函数4115,将文件src_name重命名为src_name.aclm;

        -步骤41199:调用函数4116,创建链接文件src_name,指向文件cache_name;

        -步骤411910:设置状态变量ret为“缓存添加完成”,然后转到步骤411920;

        -步骤411911:调用函数4114,检查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;

        -步骤411918:设置状态变量ret为“缓存添加终止,目标文件丢失”,然后转到步骤411920;

        -步骤411919:设置状态变量ret为“缓存添加终止,找不到文件”,然后转到步骤411920

        -步骤411920:本函数结束,返回状态变量ret。

        20)删除缓存函数4120

        删除缓存函数4120接收一个字符型指针参数,表示待删除的缓存文件。参见图11,具体流程如下。为了步骤的叙述简便,用src_name表示待删除缓存的文件名,用cache_name表示存储在缓存中的缓存文件完整路径名,用ret表示用于保存需要返回的状态的变量。

        -步骤41201:调用函数419,检查文件src_name是否位于需缓存根路径下,如果是,继续步骤41202;否则转到步骤412015;

        -步骤41202:调用函数4110,提取待缓存文件的相对路径名,存到变量name中;

        -步骤41203:调用函数4111,生成缓存文件完整路径名cache_name;

        -步骤41204:调用函数4112,检查是否存在文件src_name,如果是,继续步骤41205;否则,转向步骤412023;

        -步骤41205:调用函数4113,检查文件src_name是否为链接文件,如果是,继续步骤41206;否则,转向步骤412016;

        -步骤41206:调用函数4114,检查文件src_name是否指向文件cache_name,如果是,继续步骤41207;否则,转向步骤412017;

        -步骤41207:调用函数4112,检查是否存在文件cache_name,如果是,继续步骤41208;否则,转向步骤412018;

        -步骤41208:调用函数4117,删除文件src_name;

        -步骤41209:调用函数4118,拷贝文件cache_name到文件src_name;

        -步骤412010:调用函数4117,删除文件cache_name;

        -步骤412011:调用函数4112,检查是否存在文件src_name.aclm,如果是,继续步骤412012;否则,转向步骤412014;

        -步骤412012:调用函数4117,删除文件src_name.aclm;

        -步骤412013:设置状态变量ret为“缓存删除完成”,然后转到步骤412034;

        -步骤412014:设置状态变量ret为“缓存删除完成,备份文件丢失”,然后转到步骤412034;

        -步骤412015:设置状态变量ret为“缓存删除终止,文件不可以缓存”,然后转到步骤412034;

        -步骤412016:设置状态变量ret为“缓存删除终止,链接文件丢失”,然后转到步骤412034;

        -步骤412017:设置状态变量ret为“缓存删除终止,常规链接文件”,然后转到步骤412034;

        -步骤412018:调用函数4112,检查是否存在文件src_name.aclm,如果是,继续步骤412019;否则,转向步骤412023;

        -步骤412019:调用函数4117,删除文件src_name;

        -步骤412020:调用函数4118,拷贝文件src_name.aclm到文件src_name;

        -步骤412021:调用函数4117,删除文件src_name.aclm;

        -步骤412022:设置状态变量ret为“缓存删除完成,缓存文件丢失”,然后转到步骤412034;

        -步骤412023:设置状态变量ret为“缓存删除失败,备份文件、缓存文件丢失”,然后转到步骤412034;

        -步骤412024:调用函数4112,检查是否存在文件cache_name,如果是,继续步骤412025;否则,转向步骤412030;

        -步骤412025:调用函数4118,拷贝文件cache_name到文件src_name;

        -步骤412026:调用函数4112,检查是否存在文件src_name.aclm,如果是,继续步骤412027;否则,转向步骤412029;

        -步骤412027:调用函数4117,删除文件src_name.aclm;

        -步骤412028:设置状态变量ret为“缓存删除完成,链接文件丢失”,然后转到步骤412034;

        -步骤412029:设置状态变量ret为“缓存删除完成,链接文件、备份文件丢失”,然后转到步骤412034;

        -步骤412030:调用函数4112,检查是否存在文件src_name.aclm,如果是,继续步骤412031;否则,转向步骤412033;

        -步骤412031:调用函数4118,拷贝文件src_name.aclm到文件src_name;

        -步骤412032:设置状态变量ret为“缓存删除完成,链接文件、缓存文件丢失”,然后转到步骤412034;

        -步骤412033:设置状态变量ret为“缓存删除失败,所有文件丢失”,然后转到步骤412034;

        -步骤412034:结束缓存从删除流程,返回状态变量ret。

        5.通信???1

        该??橛梢韵?个部分组成:

        1)消息队列状态通告结构511;

        2)监听端口号变量512;

        3)客户端地址结构变量513;

        4)消息循环状态变量514;

        5)监听套接字变量515;

        6)客户套接字变量516;

        7)??槌跏蓟?17;

        8)??榍謇砗?18;

        9)消息循环函数519;

        10)队列状态通告发送函数5110;

        11)缓存反馈消息发送函数5111。

        各部分具体实现如下:

        1)消息队列状态通告结构511

        消息队列状态通告结构511定义包含如下两个字段:

        -消息队列待处理消息数量字段,无符号短整形

        -消息队列剩余大小字段,无符号短整型

        结构511定义了消息队列的状态通告结构。其中,消息队列待处理消息数量字段表示当前消息队列中待处理的消息数量,消息队列剩余大小字段表示当前消息队列中还可以容纳的消息数量。

        通信???1将在“待处理”消息队列长度314分别达到消息队列最大长度313的80%,85%,90%,95%时,向用户发送消息队列状态通告511。当“待处理”消息队列长度314达到消息队列最大长度313时,通信???1将丢弃该消息,并向用户发送队列已满的消息队列状态通告511。

        2)监听端口号变量512

        监听端口号变量512为静态无符号短整型变量,在??槌跏蓟?17中完成初始化,用于保存通信???1监听用户连接的端口号。

        3)客户端地址结构变量513

        客户端地址结构变量513为静态sockaddr_in类型变量,在??槌跏蓟?17中被赋值,用于保存当前连接到系统的用户的地址信息。该地址信息在缓存反馈消息发送函数5111中需要使用。

        4)消息循环状态变量514

        消息循环状态变量514为静态整型变量,用于控制消息循环函数519的执行状态,其可能取值为“消息循环启用”和“消息循环禁用”。

        5)监听套接字变量515

        监听套接字变量515为静态socket类型变量,在??槌跏蓟?17中初始化,用于监听来自用户的连接。

        6)客户套接字变量516

        客户套接字变量516为静态socket类型变量,在??槌跏蓟?17中初始化,在和用户建立连接后进行数据收发。

        7)??槌跏蓟?17

        ??槌跏蓟?17用于本??槠舳蓖瓿梢幌盗谐跏蓟ぷ?。函数接收一个无符号短整型参数,用于指定监听的端口号。参见图12,其具体步骤如下:

        -步骤5171:根据参数,设置监听端口号变量512;

        -步骤5172:设置消息循环状态变量514为“消息循环启动”;

        -步骤5173:调用socket创建监听套接字515;

        -步骤5174:调用bind将套接字515与监听端口号变量512指定的端口绑定;

        -步骤5175:调用listen启动监听套接字515监听;

        -步骤5176:调用accept等待客户端连接;

        -步骤5177:将accept返回的socket实例保存到客户套接字516中;

        -步骤5178:创建子线程1;

        -步骤5179:在子线程1中执行消息循环函数519开始消息循环。

        8)??榍謇砗?18

        ??榍謇砗?18在??橥顺鍪蓖瓿梢幌盗星謇砉ぷ?。参见图13,其具体步骤如下:

        -步骤5181:设置消息循环状态变量514为“消息循环启用”;

        -步骤5182:等待子线程1结束;

        -步骤5183:关闭客户套接字516;

        -步骤5184:关闭监听套接字515。

        9)消息循环函数519

        消息循环函数519在子线程1中开始启动,负责通信??榈南⒔邮?、发送,参见图14,其具体步骤如下:

        -步骤5191:调用消息队列管理???1的返回当前队列状态函数3115,获取当前队列的长度及最大运行的队列长度,并保存在临时变量current和max中;

        -步骤5192:开始无限循环;

        -步骤5193:检查消息循环状态变量514,如果为“消息循环禁用”,则转向步骤51912,否则继续步骤5194;

        -步骤5194:调用recv从客户套接字516中接收数据;

        -步骤5195:根据current和max计算队列的使用情况,并做如下判断:

        ■如果队列使用达到100%,转向步骤5196;

        ■如果队列使用达到80%,85%,90%,95%,转向步骤5198;

        ■其他情况,继续步骤5199;

        -步骤5196:丢弃本次接收到的消息;

        -步骤5197:构造队列状态通告消息511,调用队列状态通告发送函数5110向用户发送该通告消息,然后转向步骤51910;

        -步骤5198:构造队列状态通告消息511,调用队列状态通告发送函数5110向用户发送该通告消息;

        -步骤5199:调用消息队列管理???1的消息入队函数3112将接收到的消息加入“待处理”消息队列中;

        -步骤51910:重新调用消息队列管理???1的返回当前队列状态函数3115,获取当前队列的长度及最大运行的队列长度,并更新临时变量current和max;

        -步骤51911:调用缓存反馈消息发送函数5111发送反馈消息,然后转向步骤5193;

        -步骤51912:结束循环。

        10)队列状态通告发送函数5110

        队列状态通告发送函数5110接收一个消息队列状态通告结构511类型的参数,调用send函数,将参数指向的队列状态通告511发送给连接到系统的用户。

        11)缓存反馈消息发送函数5111

        缓存反馈消息发送函数5111负责向用户发送缓存反馈消息,参见图15,具体步骤如下:

        -步骤51111:调用消息队列管理???1的返回当前队列状态函数3115;

        -步骤51112:将返回的队列状态中的当前队列长度的一半,作为需要出队的消息数量N;

        -步骤51113:调用消息队列管理???1的消息出队函数3113,从“已处理”消息队列中取出一个缓存消息;

        -步骤51114:调用缓存反馈消息发送函数5111,将取出缓存消息依次发送给客户;

        -步骤51115:将N减1;

        -步骤51116:如果N大于0,则转向步骤51113;否则结束本函数。

    关 键 词:
    一种 透明 通用 文件 缓存 系统
      专利查询网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:一种透明、通用的文件缓存系统.pdf
    链接地址://www.4mum.com.cn/p-5782049.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服客服 - 联系我们

    [email protected] 2017-2018 www.4mum.com.cn网站版权所有
    经营许可证编号:粤ICP备17046363号-1 
     


    收起
    展开
  • 四川郎酒股份有限公司获第十二届人民企业社会责任奖年度环保奖 2019-05-13
  • 银保监会新规剑指大企业多头融资和过度融资 2019-05-12
  • 韩国再提4国联合申办世界杯 中国网友无视:我们自己来 2019-05-11
  • 中国人为什么一定要买房? 2019-05-11
  • 十九大精神进校园:风正扬帆当有为 勇做时代弄潮儿 2019-05-10
  • 粽叶飘香幸福邻里——廊坊市举办“我们的节日·端午”主题活动 2019-05-09
  • 太原设禁鸣路段 设备在测试中 2019-05-09
  • 拜耳医药保健有限公司获第十二届人民企业社会责任奖年度企业奖 2019-05-08
  • “港独”没出路!“梁天琦们”该醒醒了 2019-05-07
  • 陈卫平:中国文化内涵包含三方面 文化复兴表现在其中 2019-05-06
  • 人民日报客户端辟谣:“合成军装照”产品请放心使用 2019-05-05
  • 【十九大·理论新视野】为什么要“建设现代化经济体系”?   2019-05-04
  • 聚焦2017年乌鲁木齐市老城区改造提升工程 2019-05-04
  • 【专家谈】上合组织——构建区域命运共同体的有力实践者 2019-05-03
  • 【华商侃车NO.192】 亲!楼市火爆,别忘了买车位啊! 2019-05-03