生产实习报告.docx
- 文档编号:9022049
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:24
- 大小:367.34KB
生产实习报告.docx
《生产实习报告.docx》由会员分享,可在线阅读,更多相关《生产实习报告.docx(24页珍藏版)》请在冰点文库上搜索。
生产实习报告
1概述......................................................................................................02
1.1实习目的.....................................................................................02
1.2实习内容概述.............................................................................02
1.3实习单位简介.............................................................................03
1.4实习计划.....................................................................................03
2实习介绍..............................................................................................04
2.1复杂软件系统设计准则.............................................................04
2.2开源软件MySQL........................................................................04
2.2.1MySQL简介........................................................................05
2.2.2MySQL简要分析................................................................07
2.3理解模块依赖.............................................................................09
2.3.1简介....................................................................................10
2.3.2模块依赖可视化定义........................................................11
2.4依赖关系可视化方法.................................................................15
2.4.1使用ProcessExplorer分析................................................15
2.4.2结合源代码进行分析........................................................17
2.5实习问题解决.............................................................................18
3实习总结及建议..................................................................................21
4参考文献..............................................................................................21
1概述
1.1实习目的
本次生产实习的目的主要在于加强理论与实践的联系,增强学生对于社会、国情和专业背景的了解;通过考察和实践,拓宽学生视野,巩固和运用课堂教学所掌握的理论知识,了解本学科发展的状况,培养学生分析问题、解决问题的能力和创新能力;增强劳动观念,培养学生的敬业、创业精神;积极探索人才培养新途径,提高人才培养质量。
具体实习目的如下:
(1)通过对特定的系统或软件进行组件重要度的分析和评估,使学生充分了解复杂软件系统的设计准则,包括模块化理论、低内聚高耦合标准、信息隐藏、康威定律等内容;
(2)通过模块关联分析,加强学生对系统或软件组件构成的理解,并尝试通过合理方式将模块间依赖关系进行可视化;
(3)通过研究由依赖关系引起的软件挂起故障,加强学生综合分析,并实际动手解决问题的能力;
(4)通过小组内成员间的相互合作,加强学生的团队合作意识与能力,有效完成实习任务。
1.2实习内容概述
由于在服务计算技术与系统教育部重点实验室实习期间,负责指导我实习工作的前辈复杂方向为评估复杂软件系统组件重要度,依此依据为软件或系统组件做好相应,防范突发软件或系统崩溃,并在最短时间内恢复其正常工作。
因此,实习内容将围绕该方向进行展开。
本组共有四名实习生,各自分配了不同的实习任务,我的实习内容大致如下所示:
(1)预先熟悉复杂软件系统设计准则,其中包括模块化理论、低内聚高耦合标准、信息隐藏、康威定律等内容,为评估复杂软件系统的组件重要度做好充分的准备;
(2)理解系统或软件模块间依赖,加强对系统或软件组件构成的理解,并掌握模块间依赖关系可视化的方法;
(3)研究特定系统或软件(本次实习选择的软件为开源软件MySQL)模块间依赖关系,通过研究当前进程对系统组件的调用,得到并分析其依赖关系,随即给出合理途径实现依赖关系的可视化。
1.3实现单位简介
服务计算技术与系统教育部重点实验室简介如下:
(1)服务计算技术与系统教育部重点实验室依托于计算机系统结构国家重点学科和计算机软件与理论湖北省重点学科,目前主要的研究领域包括:
多核和虚拟化、网络计算与云计算、系统安全、海量数据管理、对等计算与移动互联网等;
(2)实验室承担了50多项重大科研项目,包括国家973计划项目、教育部重大专项、国家科技支撑计划项目、国家科技重大专项等;
(3)实验室出版专著和教材10余本,发表国内外学术期刊论文及国际学术论文500多篇,获得国家发明专利57项,在审的国家发明专利73项,获得国家计算机软件著作权67项;
(4)实验室坚持开放与联合,与很多国内外知名IT企业保持着密切的合作关系,先后建立了很多企业联合实验室。
1.4实习计划
在实验室实习期间,应指导实习工作的前辈的要求,实习时间由原定的四周延长至整个暑假,因此实习计划也根据实习时间的变动做了相应的修改。
大致实习计划表1.1所示:
表1.1实习计划表
时间
实习计划
7月08日
接受实习任务
7月09日-7月12日
了解实习内容,选择并熟悉目标软件
7月13日-7月19日
熟悉复杂软件系统设计准则
7月20日-7月26日
理解软件模块间依赖及可视化方法
7月27日-8月02日
实验室假期
8月03日-8月11日
选择途径对目标软件进行分析
8月12日-8月23日
结合分析结果进行验证,判断途径是否合理
8月24日-8月30日
对得到的判断进行总结整理并汇报,实习结束
2实习介绍
2.1复杂软件系统设计准则
系统软件是控制和协调计算机以及外部设备,支持应用的软件开发和运行的系统,是不需要用户干预的各种程序的集合。
主要的功能是调度、监控和维护计算机系统,负责管理计算机系统中各种独立的硬件,使得它们可以协调工作。
其设计原则如下所示:
(1)可靠性:
软件系统规模越大越复杂,其可靠性越来越难以保证,其本身对系统运行的可靠性要求越来越高。
软件系统的可靠性也直接关系到设计自身的声誉和生存发展竞争能力。
软件可靠性意味着该软件在测试运行过程中避免可能发生故障的能力,且一旦发生故障后,具有解脱和排除故障的能力。
软件可靠性和硬件可靠性的区别在于:
后者为物理机理的衰变和老化所致,而前者是由于设计和实现的错误所致。
(2)健壮性:
软件对于规范以外的输入能够判断出这个输入不符合规范要求,并能有合理的处理方式。
软件健壮性是一个比较模糊的概念,确实非常重要的软件外部度量标准,直接反应了分析设计和编码人员的水平。
(3)模块化理论:
模块化设计较好的系统允许不同部分并发工作,使得系统复杂度得以控制,并隐藏模块内部的不确定性。
(4)低内聚高耦合:
系统模块的通信依赖概念,模块化设计需要以模块之间依赖降低,模块内部依赖增强为准则。
(5)信息隐藏:
隐藏模块内部的设计决策。
(6)康威定律:
组织和产品之间的通用准则,开发人员的组织方式约束了产品设计架构,因为该设计复制了人员组织模式;
(7)标准化原则:
在结构上实现开放,基于业界的开放式标准,符合行业规范。
2.2开源软件MySQL
实习工作需要对特定的软件进行分析,因此选择开源软件MySQL,版本号为5.5。
以下将对MySQL做简要的介绍与分析。
2.2.1MySQL简介
MySQL是一个开源的小型关联数据库管理系统,由瑞典MySQLAB公司开发,目前属于Oracle公司。
它将数据库保存在不同的表中,而不是将所有的数据存放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL的SQL语言是用于访问数据库的最常用的标准化语言,目前被广泛地应用在Internet上的中小型网站中。
由于其体积小、速度快、总体拥有成本低,其社区版的性能卓越,搭配PHP和Apache可组成良好的开发环境,特别是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本,从而选择了MySQL作为网站数据库。
与其他的大型数据库如Oracle、DB2、SQLServer等相比,MySQL自有它的不足之处,但是这丝毫也没有减少它受欢迎的程度。
对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于MySQL是开放源码的软件,因此可以大大降低总体拥有成本。
Linux作为操作系统,Apache和Nginx作为Web服务器,MySQL作为数据库,PHP/Perl/Python作为服务器端的脚本解释器。
由于这四个软件都是免费或开放源码软件,因此使用这种方式就可以不用花费一分钱(除开人工成本)就可以建立起一个稳定、免费的网站系统,被业界称为“LAMP”组合。
MySQL特性如下:
(1)使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性;
(2)支持如AIX、BSDi、FreeBSD、HP-UX、Linux、MacOS、NovellNetware、NetBSD、OpenBSD、OS/2Wrap、Solaris、SunOS、Windows等不同种类的操作系统;
(3)为多种编程语言提供了API。
这些编程语言包括C、C++、C#、Delphi、Eiffel、Java、Perl、PHP、Python、Ruby和Tcl等;
(4)支持多线程,充分利用CPU资源,支持多用户;
(5)优化的SQL查询算法,有效地提高查询速度;
(6)既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中;
(7)提供多语言支持,常见的编码如中文的GB2312、BIG5,日文的Shift_JIS等都可以用作数据表名和数据列名;
(8)提供TCP/IP、ODBC和JDBC等多种数据库连接途径;
(9)提供用于管理、检查、优化数据库操作的管理工具;
(10)可以处理拥有上千万条记录的大型数据库;
(11)支持多种存储引擎。
MySQL支持的存储引擎如下:
(1)MylSAM:
MySQL5.5之前的默认数据库引擎,最为常用。
拥有较高的插入、查询速度,但不支持事务;
(2)InnoDB:
事务性数据库的首选引擎,支持ACID失误,支持行级锁定,自MySQL5.5便起成为默认的数据库引擎;
(3)BDB:
源自BerkeleyDB,事务型数据库的另一种选择,支持COMMIT和ROLLBACK等其他事务特性;
(4)Memory:
所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。
但是会占用和数据量成正比的内存空间。
并且其内容会在Mysql重新启动时丢失;
(5)Merge:
将一定数量的MylSAM表联合而成一个整体,在超大规模数据存储时很有用;
(6)Archive:
非常适合存储大量的、独立的、作为历史记录的数据。
因为它们不经常被读取。
Archive拥有高效的插入速度,但相反其对查询的支持相对较差;
(7)Federated:
将不同的Mysql服务器联合起来,逻辑上组成一个完整的数据库。
非常适合分布式应用;
(8)Cluster/NDB:
高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。
适合数据量大,安全和性能要求高的应用;
(9)CSV:
逻辑上由逗号分割数据的存储引擎。
它会在数据库子目录里为每个数据表创建一个.CSV文件。
这是一种普通文本文件,每个数据行占用一个文本行。
CSV存储引擎不支持索引;
(10)BlackHole:
黑洞引擎,写入的任何数据都会消失,一般用于记录binlog做复制的中继;
(11)EXAMPLE:
一个不做任何事情的存根引擎。
它的目的是作为MySQL源代码中的一个例子,用来演示如何开始编写一个新存储引擎。
同样,它的主要兴趣是对开发者。
EXAMPLE存储引擎不支持编索引;
除此之外,MySQL的存储引擎接口定义良好,有兴趣的开发者也可以通过阅读文档自行编写自己的存储引擎。
针对MYSQL应用的架构,则分为一下三类:
(1)单点(Single):
适合小规模应用;
(2)复制(Replication):
适合中小规模应用;
(3)集群(Cluster):
适合大规模应用。
其应用架构总体如图2.1所示:
图2.1MySQL架构及应用
2.2.2MySQL简要分析
依照实习计划的安排,对MySQL有了初步的理解,并依据其机制大致将MySQL划分为如下七个模块:
(1)启动、退出模块:
开始或结束MySQL的运行状态;
(2)基本功能模块:
包括创建数据库、表,以及查询、插入、修改、删除等操作;
(3)功能优化模块:
基于基本功能模块并对其操作进行优化,节省开销;
(4)访问控制模块:
对用户帐户信息以及访问权限进行管理;
(5)错误恢复模块:
检测MySQL的运行错误,向用户反馈,并执行恢复策略;
(6)备份维护模块:
定期备份,定期维护;
(7)日志管理模块:
对整个操作过程进行记录。
上述七个模块整体关联图如图2.2所示:
图2.2块整体关联图
启动模块加载后,主要模块开始正常工作,直至激活退出模块为止。
日志管理模块负责记录MySQL运行过程中发生的事件,与其它模块均有交互,图中不作详解。
当任一模块执行操作时,先行通知日志管理模块,日志记录完毕后,相应模块再执行操作。
备份维护模块正常情况下独立运行,依照既定的备份和维护策略对当前数据库进行备份和维护。
仅当错误恢复模块检测到错误,并且恢复时需要调用备份时,才与错误恢复模块进行交互。
以下将对局部模块间关联关系做简要分析:
(1)功能优化模块的主要目的在于对用户执行的查询语句进行优化,使该语句的开销尽可能的降低。
具体的优化策略在此不作详细介绍。
此外,该模块还能优化数据库结构,以及MySQL服务器。
该部分内容中还包含有MySQL基准套件和crash-me的技术描述,可以通过MySQL源码中的“sql-bench”目录下的代码和结果了解基准套件如何工作。
具体如图2.3所示:
图2.3局部模块关联图1
(2)模块间的交互主要体现于添加、删除新用户,与用户权限授予、回收,以及用户是否有相应操作权限等内容之中。
此外,用户的账号密码及其安全,应当是访问控制模块独立执行的。
具体如图2.4所示:
图2.4局部模块关联图2
(3)当错误恢复模块检测到用户操作出现错误时,将中断用户当前操作并执行恢复策略。
若用户操作与权限有关,则需要先查询访问控制模块,并返回结果。
具体如图2.5所示:
图2.5局部模块关联图3
此外,目前认为MySQL存储机制在局部模块关联图1中已经完成,故在此不另外对其进行分析。
2.3理解模块依赖
软件通常处于在不同模块与组件间有着复杂的相互作用与依赖关系的复杂软件生态系统中。
在Windows操作系统中,由于整个系统的复杂性与其不开源的特性,这个问题更加突出。
甚至当源可用时,仅以二进制形式存在的模块间仍然存在相互作用。
在这里我们将为探索程序与其他二进制文件,如Windows的动态链接库间的依赖关系提供两种可视化的途径。
这是基于包含来自Windows内核或者通过二进制仪表的运行痕迹。
因此,这并不需要依赖源代码。
我们将通过直观表现整个系统软件间的依赖,直观表现别选定软件的模块间相互作用,被使用的模块来源来理解模块依赖。
2.3.1简介
软件通常由不同的模块组成,或者来自系统组件,或者来自第三方软件,或者来自个人软件,然后成为形成丰富复杂的关系网的软件生态系统的一部分。
系统组件(通常以动态链接库DLL形式出现)也很重要,并且对于程序的运行时必须的。
Windows有一个非常复杂的软件模块生态系统。
此外,API和实际作为二进制交付的软件组件间的使用依赖关系通常没有被正确的记录。
微软的软件通常广泛地使用微软软件组件,但是却没有太多的文档。
虽然源代码可能是可用的,但是却不一定适用于多有的关联软件模块。
一些模块被如此广泛的嵌入于系统中,以至于他们很难学习或理解。
软件间的依赖关系网络,意味着在所有系统安装的软件(过去、现在或是未来)间可能存在脆弱和隐含的依赖关系。
在Windows中,这往往会导致安装或卸载应用程序时的软件故障。
通俗的说,即是“DLL地狱”。
我们的目的即是理解Windows中软件模块间(可执行文件和动态链接库文件)的使用和依赖关系。
由于源不适用于所有的组件,所以我们的工作纯粹只是与二进制文件相关。
此外,有些软件是用多种语言写成,即使存在源,也可能会与其它以二进制文件形式存在的模块间存在复杂方式的相互作用。
我们提供两种可视化:
EXE依赖关系图与DLL依赖关系图。
第一种对于数个方案间的相互比较很有用,可能这包含其他进程的参与而非已有的可执行文件。
第二种对于调查可执行文件与DLL,以及DLL本身之间的相互作用很有用。
我们采用多种方式来处理潜在的复杂可视化。
通过压缩依赖关系图,或者简单的按功能或供应商(但其它映射也是可能的)的分组概念,来简化可视化。
投影通过简单的图给出仅影响选中模块的相互作用,而差异操作则给出两个依赖图之间的区别。
事实证明,这两种可视化虽然简单,却有效地实现了Windows上实际软件间模块的依赖关系与相互作用的理解。
例如,我们给出很多种情况,包含整个系统的使用如开关机,理解软件安装时发生的异常相互作用(TortoiseSVN模块影响任意软件),不同浏览器模块间的共享,从供应商角度理解模块的用处无论模块的源是否可用,观察不同版本的模块如网络模块等的用处。
我们相信这对于软件开发者甚至用户理解系统模块间的交互是个不错的办法。
对于功能强大的软件的开发和维护,这是非常有用的。
此外,Windows环境如此复杂,以致很多意想不到的交互和依赖在软件开发员、管理员和用户不知情的情况下发生。
大多数分析软件依赖的相关工作都使用分析源代码的途径。
其中一些也使用静态和动态分析二进制文件的方式。
着重于软件组建的测试和分析,在WindowsServer2003上使用工具来分析依赖关系。
相似的,他们使用图形网络来分析并预测WindowsServer2003上的缺陷率,其他工具则构建依赖图。
但是他们依靠源代码。
在不同层次上使用动态分析提取软件视图,他们的工具可能更适合开发者,因为他们的用例是为帮助他们定位改变的区域而量身定制的。
他们的方法依赖访问源代码,因为他们依靠仪器来添加代码,从而拦截函数入口和退出点。
本文则着重于通过各种依赖关系图,来理解软件模块交互中在Windows作为一个整体的的二进制文件。
我们处理二进制文件而非源代码,我们也处理更复杂环境下的Windows,如内核可以调用用户空间功能,这是某种形式的回调。
2.3.2模块依赖可视化定义
在Windows中,有很多种二进制文件。
我们使用术语程序表示可执行文件,它在Windows中通常是EXE文件。
不同于Unix,Windows中含有很多种含有其他软件模块的二进制文件。
一个不完全的非EXE二进制文件列表显示:
DLL(动态链接库),ocx(ActiveX控件,常用于IE浏览器),sys(设备驱动程序,可能用于用户或内核模式),cpl(控制面板小程序),acm/ax(多媒体编解码器)等。
本文中,我们使用术语EXE表示单个主可执行文件,和术语DLL表示中包含EXE以外的软件的二进制文件。
我们认为EXE和DLL都用于软件模块中。
模块依赖可视化通常使用一个有向图的有向边从一个节点(代表二进制A)到另一个节点(代表二进制B)来表示存在的依赖关系,亦即A中代码使用的是B中代码(后来我们会看到为什么有措辞“节点表示二进制”)。
鉴于此二进制文件分类,有三种可能的类型依赖关系:
(1)EXE-DLL
这种类型的依赖表示的事实是程序使用DLL。
如,iexplore.exe依赖mshtml.dll。
(2)DLL-DLL
DLL可以有自己之间的依赖关系。
如,Mozilla的UI库xui.dll依赖SQLite数据库的sqlite3.dll。
(3)EXE-EXE
程序也可能依赖于其他程序。
这种情况发生于,当一个进程是程序Pa的一个实例,并创建另一个进程,而这个进程是程序Pb的一个实例时。
我们也在Pa到Pb间做一条边,边上的标签表示Pa创建Pb的次数。
本文中,我们关心的是确定、并将软件(可能含有多个EXE文件)运行时的依赖可视化。
不同于单一的可视化一同显示三种依赖,我们提供的两种可视化途径,这意味着可以服务于不同的目的。
第一类可视化,称为EXE依赖关系图,显示EXE-EXE和EXE-DLL依赖关系。
第二种可视化,成为DLL依赖关系图,显示DLL-DLL和EXE-DLL依赖关系。
EXE-DLL依赖关系不同于EXE依赖关系图和DLL依赖关系图,即他们有着不同的定义和可视化。
我们首先定义我们所说的EXE关系依赖图中的EXE-DLL和EXE-EXE依赖关系。
定义1EXE依赖关系图中的EXE-DLL依赖关系,是指当进程a运行的可执行文件X加载二进制文件Y时,我们说X对Y有EXE-DLL依赖关系。
在Windows中,一个二进制文件可以通过LoadLibrary()API显式加载,也可通过IMPORTS文件头隐式加载。
这两种方式都导致EXE-DLL依赖。
定义2EXE依赖关系图中的EXE-EXE依赖关系,是指当进程a运行的可执行文件X创建一个新进程b并运行可执行文件Y时,我们说X对Y有EXE-EXE依赖关系。
EXE-EXE依赖关系给出一种亲子关系的形式。
然而,过程层次图是不一样的,因为过程层次是关于流程和文件上的EXE-EXE依赖。
此外,我们将在图表中看到,对于每一个程序中,只有一个节点,也可能有循环。
我们主要关注不同的可执行文件间的依赖关系,因此,如果有一个X和自身之间存在EXE-EXE依赖关系,我们将忽略自我循环。
需要注意的是,在Windows中,进程的创建
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 生产 实习 报告