仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1236|回复: 10
打印 上一主题 下一主题

[其他Linux] Linux编程之单多线程diff成绩清查仓酷云

[复制链接]
乐观 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:26:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
虽然Linux桌面应用发展很快,但是命令在Linux中依然有很强的生命力。Linux是一个命令行组成的操作系统,精髓在命令行。
1.成绩背景

运转于一个历程中的多个线程,相互之间利用不异的地点空间,共享年夜部分数据,因而启动一个线程所消费的空间远远小于启动一个历程所消费的空间,线程间相互切换所需的工夫也远远小于历程间切换所必要的工夫,一个线程的开支约莫是一个历程的开支1/30摆布,可是其大众数据共享大概会带来劫难性的成果,最多见的是共享变量的互斥、变量同步成绩。测试中经由过程对照单线程与多线程实行了局举行的分歧性,来发明多线程情况下的程序成绩。
当单、多线程运转了局呈现纷歧致,即了局存在diff时,申明程序自己存在多线程成绩,而测试的实质是为了发明、办理程序计划中的缺点,不但是要发明成绩,还能办理成绩。但是从纷歧致的了局剖析到终极成绩的办理,另有很长一段路要走。
2.成绩清查坚苦,手腕无限

当呈现多线程成绩时,测试职员常常无从动手,如临年夜敌,这意味着必要损耗伟大的人力物力投进,其坚苦表现在一下几个方面:
1、从了局剖析缘故原由坚苦

了局diff常常是全部模块运转的终极产出,只能申明大概存在成绩,而我们必要从了局动身,慢慢减少可疑代码局限,定位成绩逻辑缘故原由,这就请求在减少局限的过程当中,能够不乱大概高几率复现diff,但是单、多线程了局纷歧致成绩复现具有随机特征,常常必要屡次运转才会呈现一次,无疑增添了所清查成绩复现的难度。
2、diff具有小几率特征

diff呈现一般是小几率事务,以是必要输出年夜数据量触发,招致单次复现所需的工夫本钱太年夜,如8小时,常常没法忍耐。经由过程打印、对照日记或两头了局的体例,年夜数据量输出意味着必要从数百G级的日记或了局数据中,才大概选择出唯一的几条有效信息,保留两头了局的文件过年夜,存储磁盘空间倍受磨练,信息到达T级别或更年夜时,两份数据存储和处置就会非常坚苦,事情开支也很难设想,假如当输入的信息太少,又会招致定位的局限太广泛,起不到减少局限的目标或增添定位的次数。
3、多线程输入必要附加处置

多线程输入的了局乱序,与单线程对照之前,必要对单、多线程了局举行预处置,如排序、过滤,当输入信息不是单行时,将没法复杂利用linux命令,必要做特别处置。
多线程运转输入信息时也必要特别处置,因为程序以多线程体例运转时,为包管输入了局的自力性,必要在输入信息时加上互斥锁,别的为打印格局化的输入信息,也需修正程序自己,如许大概会招致成绩被直接屏障,diff不再触发。
4、可供选择的检测工具无限

vlagrind工具对多线程的扫描存在良多的误报信息,从而必要泯灭大批的工夫从逻辑上剖析、扫除这些误报警。
5、linux情况下静态跟踪调试坚苦

今朝对照盛行的调试工具是gdb,只管gdb功效壮大,但用法烦琐,纯熟天真使用必要很年夜的投进本钱。固然它供应对多线程调试的撑持,但利用起来与实践情况纷歧致会使调试了局与实践运转时有偏向。
6、成绩缘故原由多样

招致diff的缘故原由多种多样,间接缘故原由:如全局变量操纵互斥成绩、变量未初始化、字符串开端未置0,直接缘故原由:如数组溢出、体系工夫依附等在小数据量能够复现,日记、静态调试能够跟踪的幻想情形下,仍旧必要野生借助日记、调试信息,帮助剖析代码逻辑的毛病,对程序自己和测试履历的请求很高。
3.成绩的缘故原由剖析

从多线程diff成绩的实质的视角来剖析,才干从基本上寻觅到办理成绩的体例,进而从本源上探究办理成绩的办法。
1、共享变量互斥成绩

假如线程之间的大众变量未加锁,变量值在线程外部被写乱,这是最多见的情形,但是变量互斥成绩因为存眷度对照高,互斥手艺作为对开辟者的基础手艺请求,开辟职员广泛对照器重,呈现成绩的几率不年夜。
2、数组会见越界

一般要对数组单位做轮回处置,而把持轮回加入的前提为下标,界限处置不妥常常会形成数组1个单位越界,如将for(i=0;i<LEGNTH;i++)轮回的加入前提多加了一个”=”号:i3、变量未显式或隐式地手工初始化
因为分派给变量的物理内存地区不断定,大概存在内存未经过体系举行初始化情形,假如该内存刚好被利用过,而一般利用过的内存又不会被清算洁净,持续利用则会招致变量值与前一次遗留内容相干,单线程一次实行没法发明,屡次运转了局或多线程运转了局会呈现纷歧致。变量初始化值与体系初始化体例严密相干,操纵体系有大概利用随机值举行初始化。变量未初始化也包括数组单位未被初始化的情形,如函数功效是处置某一了局后将了局保留到一个未被初始化吸收数组,当某些非常分支间接前往而未将数组置空,而函数无前往信息断定对数组单位的利用情形:如已利用的长度,此时数组的内容和已利用长度值都是不断定的。
4、字符串数组开头未加’0&prime;

程序处置最多的就是字符串,它们一般由数组来存储。顺次对数组单位举行处置时,假如开端未加停止符’0&prime;,数组中字符串的长度实践上与厥后内存中第一次呈现’0&prime;的地位相干(内存里有大批的’0’),这段字符串内存中的内容存在不断定性。最典范的就是strncpy利用成绩,借助strncpy举行字符串拷贝时,当拷贝的限定长度小于源字符串的长度大概源字符串年夜于方针buffer长度,拷贝时不会主动增加’0’字符,拷贝完成后必要在开端手工增加’0’’停止符,不然会形成字符串自己的不断定,而当长度限定年夜于方针数组时会产生拷贝越界损坏栈数据,也大概将脏数据写到别的变量中而形成单、多线程diff。
5、程序了局依附体系以后工夫

单线程运转工夫与多线程运转工夫分歧,招致分歧的了局,如判别网页的时效性时,程序盘算网页中提取的工夫与以后体系工夫的差值,小于30天赋判断其具偶然效性,假如单多线程运转工夫刚好在该工夫界限两侧,就会呈现单、多线程了局diff。
4.通用的清查体例与手腕

只管清查体例与手腕无限,经由过程平常的清查成绩的履历总结,分离模块自己特定和使用情况需求,纯熟组合、使用以下七种手腕寻觅冲破口:
1、野生review代码

程序中约莫1/3的bug由codereview发明,以是野生反省名不虚传的复杂可依附,在review代码过程当中,重点存眷全局变量利用情形、确保写操纵前加锁或写操纵初始化只要一次;反省数组下标是不是有越界大概,特别是界限利用是不是公道,数组轮回操纵的加入前提是不是与实在利用长度符合;重点存眷未被初始化的变量或数组。
2、log日记体例

日记的体例必要预估日记量,在实践利用过程当中必要良多技能、同时在磁盘、体系处置等方面会有良多限定,但在年夜数据量时的广泛定位和较小数据可复现时的具体定位相称无效。
1)关于日记对照标准的模块,下降日记级别,打印模块日记,对主要的分支和数据举行打印,假如模块自己日记不标准,日记希少的情形对照多见,必要依据diff倒推,先随机的对主要分支、变量值举行日记纪录,再依据成绩慢慢细化。
2)关于数据对照庞大的,或日记了局太年夜,方便于日记的模块,可使用署名体例,对参数和变量值举行署名,将后面了局写进日记,定位出成绩的地位。
3)日记纪录时必需要到场输出数据标识,如网页url、term值等,便于该条日记与输出数据对应,分歧的了局数据也必要分明的支解符加以辨别;多线程时必要思索输入了局与线程id绝对应,便于辨别多线程了局。
4)排查与输出数据按次序列相干的diff,因为利用标准的日记体系,会纪录以后的线程id,起首反省diff的网页地点的线程id,然后将该线程按次处置一切数据按该按次构造,作为单线程输出数据,若有id号位1、2、3的3个线程,输出数据abcdefghijk:
abcdefghijk…
12232132132…
数据e发生diff,则取线程2的输出序列:bcehk…,假如是按次相干便可触发diff,数据已被减少到2号线程处置的这个弁言列了。日记文件对照年夜时,必要修正ullib日记设置,拆分日记文件,但日记文件总量不宜过年夜:
#defineUL_LOGSIZESPLIT0
蒙在股里 该用户已被删除
沙发
发表于 2015-1-21 06:36:35 | 只看该作者
随着实验课程的结束,理论课也该结束了,说实话教OS的这两位老师是我们遇到过的不错的老师(这话放这可能不太恰当).
简单生活 该用户已被删除
板凳
发表于 2015-1-30 09:52:29 | 只看该作者
把这个问题放在其他Linux社区请求帮助也是一种选择。如果Linux得不到答案,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。这时换一个社区是不错的选择。
愤怒的大鸟 该用户已被删除
地板
发表于 2015-2-2 15:33:49 | 只看该作者
现在的linux操作系统如redhat,难点,红旗等,都是用这么一个内核,加上其它的用程序(包括X)构成的。
乐观 该用户已被删除
5#
 楼主| 发表于 2015-2-3 12:35:34 来自手机 | 只看该作者
发问的时候一定要注意到某些礼节。因为Linux社区是一个松散的组织、也不承担回复每个帖子的义务。它不是技术支持。
变相怪杰 该用户已被删除
6#
发表于 2015-2-9 00:31:04 | 只看该作者
任何人都可以根据自己的喜好来定制适合自己的操作系统,Linux?是抢占式多任务多用户操作系统.
小妖女 该用户已被删除
7#
发表于 2015-2-25 14:58:34 | 只看该作者
Linux是参照Unix思想设计的,理解掌握Linux必须按照Unix思维来进行。思想性的转变比暂时性的技术提高更有用,因为他能帮助你加快学习速度。
若天明 该用户已被删除
8#
发表于 2015-3-7 22:10:35 | 只看该作者
熟悉并掌握安装Linux,安装是学习的前提。目前较常见的安装方法有二种:
冷月葬花魂 该用户已被删除
9#
发表于 2015-3-13 02:07:13 | 只看该作者
Linux最大的特点就是其开源性,这一点是十分难得的,这也是它能够存在到现在的原因之一。
分手快乐 该用户已被删除
10#
发表于 2015-3-20 09:12:33 | 只看该作者
为了更好的学习这门课程,我不仅课上认真听讲,课下也努力学习,为此还在自己的电脑上安装了Ubuntu系统。
再见西城 该用户已被删除
11#
发表于 2015-4-11 03:11:34 | 只看该作者
通过一条缓慢的调制解调器线路,它也能操纵几千公里以外的远程系统。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-2 15:26

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表