变长并发日志文件的设计及实现报告.docxVIP

变长并发日志文件的设计及实现报告.docx

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
变长并发日志文件的设计及实现报告

程序员简介姓名:李尔楠学号级:计科1101设计要求系统组成系统由两个文件组成,日志文件及索引文件;日志文件存放日志记录,日志记录由日志记录结构描述,及日志记录体组成;每个日志记录可包含任意条数据项,每个数据项可是任意数据类型及长度;日志记录结构描述对本记录的每个数据项进行描述。包括数据类型及长度;日志记录体根据日志记录结构描述来存放日志记录数据。索引文件存放自动增长的日志记录号,日志记录发生的日期及时间,指向日志文件中相应日志记录的文件指针。主要功能增加日志记录:生成日志记录并写入。根据本次日志记录各数据项生成日志记录结构描述,再生成日志记录体,并追加到日志文件尾。追加日志记录时要考虑并发写入问题(加锁)根据当前日期时间,及日志记录的位置生成索引记录,并发写入索引文件。日志记录与索引记录要同时锁定,否则会发生错误浏览日志:浏览给定时间段日志。根据给定时间段,遍历索引文件找到给定时间段的索引记录,然后根据索引记录读出日志记录并显示,直到时间段结束。结构设计与分析文件结构设计本程序总体设计为两个txt文件,即一个日志文件Log,一个索引文件Index。其中日志文件中主要保存当前记录的总长度,当前记录的每个内容的类型及长度,还有具体内容这三部分;索引文件中则保存的是写入日志的当前时间和当前日志开始的位置指针。其结构体分别定义如下:struct logStructure {int dataType;int dataSize;};typedefstruct indexStructure { time_t writeTime;int logF;}indexStructure_t;数据类型设计由于要求随机写入随机的数据类型,所以在此定义了6种数据类型,分别为char int short long float double类型,另外用字符数组来存放string类型的数据。数据类型及数据类型的长度保存方法如下:constint typeSize[6] = {sizeof(char), sizeof(short), sizeof(int), sizeof(long), sizeof(float), sizeof(double)};constchar typeName[7][10]= {char, short, int, long, float, double, char[]};constchar output[7][6] = {%c\n, %d\n, %d\n, %ld\n, %lld\n, %f\n, %s\n};写入数据设计文件锁的设计在本次的实验中,要求实现多线程同时访问文件并进行并发式的写入,为此需要对访问文件进行上锁。为了尽可能的提高并发度,文件的打开方式设置为共享打开方式,这样就可以多个线程同时打开文件了。下面讨论如何实现并发。在本次实验中,我才用的方式是当线程访问文件时先对文件的大小进行改变,然后在写入数据,因为相对于改变文件大小,写入数据的时间是相对慢一些的,这样就可以让各个线程先进行对文件大小的修改,然后再各自慢慢的写入数据。所以在写入数据时并不需要进行加锁,因为大家都往自己改过的空间里写入数据,需要加锁的地方只是在修改文件大小的时候。然而,要更改文件的大小实际上是修改文件的属性中的Size值,如图1-1所示,文件的Size属性在文件的头部,而_locking函数所的是从文件体的当前指针位置指定的长度,此操作并没有将文件头部锁住,所以在实现并发的过程中就可能出现多个线程同时修改Size的情况导致写入混乱。图1-1所以在此处我采用的方法为设置一个互斥变量int test = 0;然后每条线程在打开文件后均进行while循环当test = 1时进循环并输出等待信息,当test = 0时,跳出循环然后将test置一表示当前有线程在进行文件属性的修改其他线程则继续进行while循环。写入数据设计在产生数据方面根据要求所有的内容都是随机的,这样我的设计方案是,首先进行播种,然后随机生成一条记录要写的总字节数即WriteSize。首先将总字节数写入到一条记录的最前面4个字节方便以后向外读。然后将type随机产生个数模7确定随机产生的类型,将该类型和该类型的长度作为描述写入日志中,然后写入对应的随机产生的该类型的数据。就这样一个数据一个数据写入,每写一次WriteSize减去一个log结构体的字节大小即数据类型描述的大小,再减去一个数据类型长度的大小即写入内容的字节数,这样直到WriseSize小于或等于0的时候结束循环不再写入。文件内容存储方式如图1-2所示:图1-2读出数据设计时间获取转换方法根据题目要求,在读取数据的时候需要可以让用户按照指定的时间范围来获取对应的日志记录,这样就需要将用户输入的字符串类型的日期(年月

文档评论(0)

wnqwwy20 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:7014141164000003

1亿VIP精品文档

相关文档