Linux高级环境编程实验报告6.docVIP

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

作业报告

学生姓名:学号:指导教师:

学生E-mail:

一、作业名称:英文统计词频程序的实现

二、作业要求

以英文文章为例,利用执行体程序库实现一个多进程词频统计的程序。对于给定的多个目录,并发地统计每个目录下的所有文件〔假设每个文件中只有英文字符〕中单词出现的次数,并最终汇总出在给定目录下所有文件中单词出现次数,然后记录下来。该过程要求采用多线程协作方式。

三、设计与实现

1、设计思路

首先分析程序设计的需求,要对多个目录下的文件进行词频统计,如果只用一个进程顺序的对各个目录下各个文件进行计算,会消耗很大时间,另外也无法充分发挥执行体程序库的优势。而且要求采用多线程协作方式,这样很自然的会想到创立一些进程去各个目录下进行统计,最后用一个进程统一管理这些进程,那么父进程和子进程的思想就出来了。这个过程中,我们是将一个任务划分成了多个任务并行地去执行,最后把这些子任务的执行结果汇总起来就是整个任务的结果,其实这就是Map-Reduce思想——把整个任务执行过程划分为映射〔Map〕和化简〔Reduce〕两个阶段。

在词频统计程序设计中,这两个阶段具体工作划分如下:

1、映射〔Map〕阶段:

①.主进程根据输入的目录数量创立多个子进程,每个子进程处理一个目录;

②.子进程获得目录名后,遍历整个目录,统计该目录下的每个文件的单词词频,作为中间结果保存。

③.子进程统计结束后把中间结果发送给主进程。

2、化简〔Reduce〕阶段:

①.父进程接收子进程发送过来的中间结果,并进行汇总;

②.子进程发送结束后父进程向其发送退出消息,子进程接收到后退出;

③.父进程检查所有子进程是否全部退出,假设是,那么工作结束,父进程退出,否那么父进程继续等待所有子进程结束。

图3-1协议设计

图3-1显示了主进程与子进程之间的消息协议,其消息通信流程也比拟清楚。

2、词频统计程序的实现

代码清单

classCLFatherInitMsg:publicCLMessage

{

public:

CLFatherInitMsg():CLMessage(FATHER_INIT_MESSAGE_ID)

{}

public:

stringdirname

};

消息由消息头部、消息标志ID和数据组成。代码清单给出了

CLFatherInitMsg的声明,该类继承了CLMessage类。其中包含一个string类型的dirname变量,用来存放消息中携带的目录名。此消息是由父进程发送给子进程的初始化消息,该目录名即为子进程要进行单词统计的目录名。

代码清单

intmain(intargc,char**argv)

{

……

try

{

if(!CLLibExecutiveInitializer::Initialize().IsSuccess())

{

coutInitializeerrorendl;

return0;

}

CLFatherWordCountObserver*pFatherWordCountObserver=newCLFatherWordCountObserver;

for(inti=1;iargc;i++)

pFatherWordCountObserver-PushDirname(argv[i]);

pFatherWordCountObserver-Init();

CLNonThreadForMsgLoopfather_nonthread(pFatherWordCountObserver,father_pipe,EXECUTIVE_BETWEEN_PROCESS_USE_PIPE_QUEUE);

father_nonthread.RegisterDeserializer(CHILD_INIT_MESSAGE_ID,newCLChildInitMsgDeserializer);

father_nonthread.RegisterDeserializer(CHILD_SEND_REQUEST_MESSAGE_ID,newCLChildSendRequestMsgDeserializer);

father_nonthread.RegisterDeserializer(INTERMEDIATE_RESULT_MESSAGE_ID,newCLIntermediateResultMsgDeseriali

文档评论(0)

181****7662 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档