二进制化

2024-10-18

二进制化(精选7篇)

二进制化 篇1

经典巨著《红楼梦》结构庞大,全面展现了贾府由盛而衰的过程,刘姥姥是其中一个独特的叙事视角。她以一个旁观者的角度对这个豪门贵族进行观察与窥视,丰富了读者的阅读视野。尤其第二次进大观园时,作为乡野中人的刘姥姥不仅得以游园,荡舟,宴饮,品茶,而且还以自己的诙谐演出带来了大观园的欢声笑语,是一种典型的狂欢化叙事。

狂欢化理论是原苏联著名的文艺理论家巴赫金在研究拉伯雷和陀斯妥耶夫斯基的创作时提出的。狂欢的概念源于欧洲的狂欢节,可追溯到人类原始制度和原始思维的深刻根源。巴赫金把“包括一切狂欢节的庆贺、仪式、形式”统称为“狂欢”。但是随着巴赫金理论的发展和深化,狂欢的概念已经不拘泥于欧洲的狂欢节中,而延伸到更广泛的狂欢化世界感受。狂欢化具有丰富繁杂的象征意义,接下来本文将以狂欢化的特点分析“刘姥姥二进大观园”,并探究其内在意蕴。

(一)全民性

全民性是狂欢化的核心特征,巴赫金说:“在狂欢节上,人们不是袖手旁观,而是生活在其中,而且是所有人都生活在其中,因为从其观念上说,它是全民的”。在狂欢节中,每个人都融入到其中,按照狂欢节自由的规律生活,参与到颠覆性的更新状态中。

这种全民性特征在“刘姥姥二进大观园”中的宴饮上有独特的表现。刘姥姥用自己的本色在大观园主演了高潮迭起的喜剧,给大观园带来一次前所未有的“开怀畅笑”。尤其刘姥姥一句“老刘,老刘,食量大如牛,吃一个老母猪不抬头”再加上颇具滑稽意味的表情动作“鼓着腮不语”更是将这场喜剧推向高潮。全场“上上下下都哈哈大笑起来”。上至贾母,“笑的搂着宝玉叫‘心肝’”,下至丫鬟,“地下的无一个不弯腰屈背,也有躲出去蹲着笑去的,也有忍着笑上来替他姊妹换衣裳的”,活生生一幅“群笑图”。巴赫金的狂欢节所依托的场所是“广场”,而此时,广场的作用被投射至“大观园”这一空间中。在这场喜剧中,所有人既是观众又是演员,人们不再像平常一般紧张,拘束,充满着心灵的快乐和激情。

(二)仪式性

狂欢节在外在形式上也具备相应的特点,即仪式性,“中世纪的狂欢节是由更古老的诙谐性仪式数千年的发展所酝酿的,在它数世纪的发展过程中,形成了狂欢节的形式和象征的特殊语言”。这种仪式性的主要表现是“打诨式的加冕和脱冕”。

刘姥姥第二次大观园之行也经历了加冕仪式。怡红院是大观园的中心,一般人绝对没有机会进入,而刘姥姥不仅进了怡红院,还醉卧在宝玉的床上,这是一种无意识的篡位和象征性的加冕。在这个特定的场景中,刘姥姥取代了女儿世界中原有的中心人物贾宝玉,她以与宝玉全然不同的视角“观照”大观园,又与宝玉承担着相同的“怡红”功能,给大观园女儿们带来欢声笑语。“一些红学研究者称宝玉为假石头,宝钗为真石头,比较前二者,刘姥姥也许可以称之为一块“自然”之石。……刘姥姥称之为石,没有“玉之顽劣”,没有“钗之冷酷”,却有着石一样硬朗的外在体格,石一样内在的坚贞朴实”。

(三)等级消失

“与官方节日相对,狂欢节仿佛是庆贺暂时摆脱占统治地位的真理和现有的制度,庆贺暂时取消一切等级关系、特权、规范和禁令”。狂欢节提供了颠覆等级关系的乌托邦空间,日常秩序被打乱,人们相互间随便而亲昵地接触,从等级关系中解脱出来。

刘姥姥是一个身份低贱的农妇,但却意外地受到了“欣赏”和“优待”,成为大观园中最受欢迎的人。在宴饮中,“贾母因说‘把那一张小楠木桌子抬过来,让刘亲家近我这边坐着’”,刘姥姥和贾母平起平坐,这在日常等级森严的大观园中是无法想象的。从身份而言,在大观园中元妃是最尊贵的客人,刘姥姥则是最微贱的。第十八回元妃省亲中,伴随的是泣声阵阵,相互之间“垂泪无言”。而刘姥姥游园带来的则是不绝于耳的欢笑声。刘姥姥游大观园时而酒时而茶,时而歌声,时而笑声,她给大观园带来的快乐,是无论如何尊贵的人都难以企及的。

(四)插科打诨

狂欢节背离日常生活秩序,其最重要的手段便是插科打诨。由插科打诨带来的是笑声,无论是尖刻嘲讽的笑,还是无情痛斥的笑,无论是由衷赞美的笑,还是自我解嘲的笑,都可以通过插科打诨的形式来获得。巴赫金说:“这种笑是双重的:既是欢乐的、兴奋的,同时也是讥笑的、冷嘲热讽的,它既否定又肯定,既埋葬又再生”。

刘姥姥二进大观园即是一场由插科打诨带来笑声阵阵的喜剧。这场喜剧以刘姥姥满头插花和其“今儿索性做个老风流”的对词为开幕,引来第一次笑声。走进潇湘馆,刘姥姥“只顾上头和人说话,不防底下果晒滑了,咕咚一跤跌倒”又引得“众人拍手都哈哈的笑起来”。这场喜剧的高潮是刘姥姥喝酒前一句“老刘,老刘,食量大如牛,吃个老母猪,不抬头”的自嘲,写尽各人的笑姿。就连还泪的绛珠仙子林黛玉也“笑岔了气,伏着桌子嗳哟”。之后玩牙牌令时,刘姥姥的“花儿落了结个大倭瓜”又引来一个笑的热浪。此后姥姥用木头杯喝酒,谈茄子的味道,夸城里雀儿的尊贵,一次次引来夫人小姐的大笑。直到姥姥把“省亲别墅的牌坊”认作“玉皇宫殿”跪下磕头,这是笑的一个“大收煞”——“众人笑的拍手打掌”。姥姥去解手,而后醉卧怡红院,这场笑的喜剧才终于落下帷幕。

“刘姥姥二进大观园”融合了狂欢化的四大主要特征,是一种典型的狂欢化叙事。但是当巴赫金的狂欢化理论借鉴并且移植到《红楼梦》的文本研究中是否会产生一定的变异?认真观照刘姥姥二进大观园中的狂欢场景,并且探索其狂欢的源头,我们会发现,这种狂欢化只是源于陌生化效果,带着现实深刻的烙印,其初衷是为了进一步巩固日常生活的等级秩序。因此,这种狂欢是不彻底的,是戴着镣铐的。

“在狂欢节中,人与人之间形成了一种新型的相互关系,……人的行为、姿态、语言,从在非狂欢节生活里完全左右着人们一切的种种等级地位中解放出来”,因此,狂欢节是对等级关系的解构。而刘姥姥二进大观园中等级关系确实暂时消失了,但双方的刻意嘲弄和有意逢迎却表明这种等级的暂时消失只是为了进一步巩固等级关系。

凤姐和鸳鸯等人对刘姥姥刻意嘲弄,是因为刘姥姥的乡下人身份。作为身处豪华世家的凤姐等人,她们打心眼里瞧不起乡野村妇,因此,便以取笑刘姥姥为乐。除此以外,还有一个重要原因便是为了取悦贾母。首先是“凤姐儿见贾母喜欢”所以才留下刘姥姥,而饭前鸳鸯则说“天天咱们说外头老爷们吃酒吃饭都有一个篾片相公,拿他取笑儿。咱们今儿也得了一个女篾片了。”便和凤姐商定了取笑刘姥姥以此逗乐,目的都是为了博得位居金陵宝塔十三层金顶的贾母一笑。

而相对应的,刘姥姥也是有意逢迎。“那刘姥姥虽是个村野人,却生来的有些见识,况且年纪老了,世情上经历过的,见头一个贾母高兴,第二见这些哥儿姐儿们都爱听,便没了说的也编出些话来讲”,她所编述的标致女孩抽柴和九十高龄老奶奶吃斋念佛的故事都是有意投宝玉和贾母之所好。清末徐瀛说:“刘姥姥深观世务,历练人情,一切揣摩求和,思之至深,出其余技作游戏法,如登傀儡场。”其实刘姥姥心里都明白,她在宴饮上是故意出丑,配合着凤姐等逗乐,从她后面所说的“姑娘说那里话,咱们哄着老太太开个心儿,可有什么恼的!你先嘱咐我,我就明白了,不过大家取个笑儿我要心里恼,也就不说了”中就可知刘姥姥并非愚昧。只不过她也乐得充当“女篾片”,粉墨登场,见庙烧香,博得大家的欢笑,结果不但大吃大喝,酒足饭饱,还得到许多礼物的恩赐,满载而归。

刘姥姥二进大观园使贾府中人获得难得的狂欢,而因其根深蒂固的等级烙印,即使狂欢也是戴着沉重的镣铐。这种视觉和感觉上的反差正是曹雪芹写作的艺术魅力所在。作家通过这种“戴着镣铐的狂欢”,将贾府中人们无法摆脱的等级观念及其饱暖空虚诠释得淋漓尽致,冲击着读者的阅读感受。作者让“千里之外,芥豆之微”的刘姥姥到大观园风光一回,以底层人的眼光窥视贾府物质的豪奢与精神的贫乏,此时刘姥姥成为贾府的一面镜子。同时,刘姥姥还是一个重要的纽带,她的农民身份使得这部描写家庭生活的小说有了通向外界和广阔的乡村生活的桥梁。

边玩边学二进制(续) 篇2

用Flappy Bird传输数据

提起FlappyBird很多人都知道, 网络上有不少网友自编的模仿Flappy Bird游戏的源代码,稍加改造就可以作为教学工具。限于篇幅这里不给出完整的代码,大家可自行上网搜索。

改造后的游戏是这样的:小鸟所通过的每列障碍由7个管子和1个空档组成,空档在哪里并不是随机的,如要传递八进制的数据“325”,就需要在第3个、第2个及第5个管子后开出空档,若小鸟顺利通过全部的三个空档而没有撞到管子,就表示顺利传递了“325”这个数据。只要是认真玩过FlappyBird的人,就知道完成这个任务是非常困难的(如图1)。

为了更方便地传递数据,可以把八进制的“325”转换成二进制“11010101”, 虽然“325”里只有3个符号,而“11010101” 里有8个符号,但因为物理状态只有两种,所以小鸟通过管道的腾挪空间可以大幅度增加。小鸟需要通过障碍的数量增加了,但游戏难度反而大大降低(如图2)。

通过这个游戏就可以看出,在有限的信息处理空间中,使用二进制有助于保证数据传输的稳定性。

用游戏棋做二进制运算

假设有3个二进制数,分别是“101” “1111”和“1001”,用棋子(或积木)代表1,空档代表0,将这3个二进制数分三行摆好(如图3)。

游戏规则非常简单:每个棋子都可以向上移动,一次只能移动一颗棋子,但不能往其他方向移;如棋子移动时遇到另一个棋子,则可以将阻挡它移动的棋子吃掉,吃掉阻挡物后,当前棋子再向左移动一格。当所有棋子处于同一行时,游戏结束(如图4)。

然后根据这个规则,对初始的图形进行变化,先移动哪个棋子后移动哪个棋子其实无所谓,最后结果总是一样的(如下页图5)。

信息编码“二进制系统”教学案例 篇3

本节课选自浙教版《信息技术基础》第一章, 主要任务是使学生掌握二进制系统, 学会二进制的信息编码, 熟悉十进制与二进制之间的相互转化。在教学中尽量使用生活中的案例帮助学生理解, 从而使学生对信息的数字化有所认识。

二、教学目标

知识与技能:认识二进制的特点, 掌握二进制数字系统。

过程与方法:通过教师演示、讲授, 创设情境, 培养学生观察能力、探究能力及合作能力。

情感、态度与价值观:培养学生积极探索世界的兴趣, 增强相互合作的能力, 提高学生动手操作的愿望和意识。

三、学情分析

高一新生对信息技术的实践操作学习兴趣浓厚, 对信息技术的理论学习兴趣不高, 针对这样一种现象, 教师必须将理论学习的课时安排得更加丰富多彩。二进制是计算机系统极其重要的一个概念, 但一些高一学生认为这个知识的学习与否根本不会影响自己的计算机操作能力, 因此教师要更加努力地寻求解决问题的办法, 让学生在积极主动的探索环境中学习二进制, 掌握十进制与二进制间的相互转换。同时, 教材中的这部分内容表述的相对简单且抽象, 仅凭高一学生的认知结构还很难理解这个概念。在设计教学时, 教师要特别注重学生对数制转化问题的理解, 设计学生感兴趣的游戏, 改变教学过程中枯燥无味的运算过程, 让学生在学习过程中积极主动地探索问题, 找寻答案。

四、教学重点、难点

重点:二进制数字系统。

难点:十进制与二进制互换。

五、教学过程

1. 智慧魔眼, 游戏导入

师:大街小巷中, 我们经常会遇到算命先生。前几天, 老师就遇到过一位算命先生, 他的面前摆了一大堆牛皮纸, 纸上写着许多姓氏, 路过的很多行人都围着他看热闹, 我也停下来看个究竟。原来这个算命先生有个神通, 那就是他可以百分百地“测算”出你的姓。于是, 我在一旁静静观察, 经过了几个过路人的测试, 算命先生赢得了人们的默默赞赏。天底之下果真还有这等神人?我百思不得其解。回到家, 我苦思冥想, 终于解开了其中的秘密, 千万别小看了算命先生, 要想设计出这样的方法, 没有科学知识是不行的。

教师展示5张卡片 (如图1) , 让学生暗自记住心里想的那个字母究竟在哪几张卡片上, 确认完毕后学生之间不能交流, 让教师来猜猜结果。

师:我们请孙同学来告诉大家, 你心里想的字母在哪几张卡片上呢?

生:2和4。

师:还有其他的吗?

生:没有了。

师 (故作沉思状) :哦, 我看透了你的心, 你心里想的那个字母是“J”!

生 (抑制不住内心的喜悦, 脱口而出) :太神奇了!

此时, 教室里的气氛更加活跃了, 学生开始相互讨论, 还有的学生主动举手让教师来猜他心里想的那个字母。

师:我知道很多同学也很想试试。我们再请一位同学吧!

生:我的字母在1、2、3上。

师 (故弄玄虚) :哦, 这个字母我好像看不清了!睁大眼睛看看, 知道了, 知道了, 原来是个“G”!

生:嗯, 又对了!

师:大家一定觉得这是个魔术。莫非老师也像魔术师那样可以看透你的心思, 还是你在怀疑那两个同学是我的“托儿”?

学生都摇了摇头。

师:下面是揭晓秘密的时刻了……

设计意图:游戏的设计使教师能够在心里迅速根据学生说出的字母对应的卡片序号, 按照一定的规律推算出学生心里想的那个字母, 从而牢牢地抓住学生的好奇心, 激发学生学习和探究的热情。

2. 从零开始, 设计游戏

教师下发学习任务单 (如图2) 。游戏的所有秘密都藏在这张小小的任务单里。

师:在设计游戏的时候, 我们最好把每个字母数字化, 即每个字母用若干个数字来代替, 这样就便于管理。表格首列的数据是2 6个字母, 第二列数据是十进制编码。某个字母和一张卡片的关系是怎么样的呢?

生 (讨论并汇总) :字母出现在卡片中, 或者该字母不出现在该卡片中。

师:很好!在设计这个游戏的时候, 我也是这么想的, 把不同的字母和不同的卡片进行有规则的配对。如果某个字母出现在某个卡片中被认为是数字1, 某个字母不出现在该卡片中被认为是数字0, 这时候就出现了由0和1组成的数字系统, 即二进制系统。

学生观察表格并讨论:1.二进制数字系统有什么特点?2.如何更好、更快、更准确地填写第三列表格?

设计意图:问题1旨在促进学生快速找到二进制的两个基本数字:0, 1;问题2的目的是引导学生主动提出要将十进制的数字转化成二进制数字, 从而进入二进制编码转化的环节。

师:经过观察, 大家发现目前的任务是将2 6个字母和若干个卡片对应起来, 换句话说, 就是将2 6个字母对应的2 6个十进制数字转化成二进制数。在数的系统内, 有一个规律——十进制转化成N进制可以采用除N取余数的方法, 那么就让我们来试试他们之间的转换吧!

教师在黑板上板书十进制“6”转化成二进制的短除式子, 一边除一边总结规律, 使学生一目了然地看清楚整个短除过程 (如图3) :除数写在商数的右侧, 一直除到0, 从下向上取余数。

教师在表格中填入十进制数字“1”对应的二进制数字“1”, 十进制数字“6”对应的二进制数字“1 1 0”。学生分组合作完成2 6个数字的转换 (将全体学生分成8组, 每组学生分配3个数字从十进制到二进制的转换) , 转换结束后将答案填入对应的表内。

设计意图: (1) 快速完成表格内剩余数字的转换。 (2) 增强学生的合作意识, 加强组内的监督, 使每个学生都参与活动。

师:同学们, 为了接下来方便设计游戏, 我们需要对现有的二进制数做一些等价的调整。大家有没有注意到从二进制数字1到1 1 0 1 0, 他们的数位是不同的, 有没有什么方法可以把不足5位的二进制数变成等价的二进制呢?

生:建议在数字的左侧加“0”。

师:经过调整, 我们的表格变成了如图4所示的形式。我们把二进制数字最低位出现1的字母全部放进1号卡片;把二进制次高位是1的字母放进2号卡片;3号卡片中存放的是从右侧起第三位数字是1的字母;同理, 4号卡片中放入第四位是数字1的字母;5号卡片中放入第五位是数字1的字母。

3. 深入研究, 水落石出

师:游戏的道具已经准备好了, 接下来的任务是如何从测试者的口中“看”到心里想的那个字母。当测试者告诉魔术师字母在2和4号卡片上时, 魔术师马上就产生了一段代码“0 1 0 1 0”, 通过查表我们迅速找到了正确答案。当然了, 其实最好的方法是魔术师将“0 1 0 1 0”二进制转换成十进制, 最后推算出十进制的数字对应的那个字母。

学生阅读与练习:快速阅读书本, 得到二进制数位的权值, 完成二进制向十进制的转换。

师 (板书) :B代表二进制、D代表十进制

以此类推

师 (演示) :

4. 云开雾散, 尝试成功

学生每两人一组进行分组, 每组分到5张卡片, 组员配合把2 6个字母分配到5张卡片中。两位学生角色分配, 分别扮演魔术师和群众, 看看哪个小组的魔术师反应最快。

学生摩拳擦掌, 跃跃欲试, 整个课堂气氛极其活跃。

师:经过今天的小魔术, 我们发现只要大家肯动脑筋, 不可思议的事情都能实现。在生活中, 我们接触电脑时, 输入的是十进制, 到了电脑内部运算却变成了二进制, 当我们通过Q Q聊天的时候, 输入中文、英文, 到了电脑内部却变成了二进制数字, 那么计算机为什么要采用二进制系统, 我们平时接触最多的英文、符号、汉字又是怎样进行二进制编码呢?敬请大家期待下节课的解答吧!

六、教学反思

一种改进的二进制防碰撞算法 篇4

近年来, 随着物联网概念的提出, 相关的理论研究得到迅速发展[1]。RFID作为物联网的一项核心技术, 成为近年来的研究热点。而标签碰撞是制约射频技术发展的一个关键问题。随着阅读器范围内标签数量的增加, 碰撞问题将导致阅读器范围内标签的吞吐率急速下降、识别速度和识别率降低。多标签防碰撞算法使得阅读器能同时识别其范围内的多个标签, 对RFID系统的运行速度和可靠性至关重要, 因此对防碰撞算法的研究是必须的。

目前, 常用的防碰撞算法都是基于时分多路算法[2]。时分多路法又分为基于时隙的ALOHA算法及其改进算法和基于树的二进制防碰撞算法及其改进算法两大类。ALOHA算法属于不确定算法, 优点是系统实现相对简单。缺点是存在无法识别某个或者某些标签的可能[3], 特别是在标签数量很大时算法效率迅速降低。改进的ALOHA算法主要通过对标签进行分流[4]以及估计阅读器范围内标签个数并以此来动态调整帧长[5]来提高标签的识别效率。改进的ALOHA算法的优点是:标签漏读率有所降低, 吞吐率增加, 但是始终没从根本上解决标签漏读的情况。二进制防碰撞算法是一种确定性的算法, 能100%地识别阅读器范围内的所有标签。缺点是系统设计相对复杂。大部分二进制防碰撞算法的文章主要从以下几方面进行改进:1) 减少阅读器的寻呼次数[4,5];2) 减少标签和阅读器每次通信传输的字节数[5,6,7,8,9], 从而减少算法的识别时间。二进制树算法识别率相比ALOHA算法较高。并且适用于有大量标签需要准确读取的情况。

本文提出的改进算法基于二进制树算法。现存的几种比较常用的改进的二进制树算法有如下两种:1) 返回二进制搜索算法[4], 该算法相对于传统二进制树算法的优势在于阅读器成功识别一个标签后返回到父节点, 而不是返回到根节点。从而减少了阅读器的寻呼次数, 但是需要以标签的UID作为搜寻索引, 搜寻时间相比于二进制树算法有所降低, 但是仍存在可以改进的地方;2) 改进的类二进制数算法[5]—跳跃式类二进制数算法[6]做分析, 该算法采用在标签上设置一个计数器来实现不用发送标签UID的方式实现防碰撞, 该算法虽然减少了每次标签发送的数据量, 但却是以阅读器的寻呼次数增加为代价的。

本文提出了一种改进的二进制树算法。改进的算法规定发生碰撞时, 阅读器发送一个Call (m, n) 命令, 使得标签UID从最高碰撞位开始的3bit UID被通过一种计算规则生成1字节的数据返回给阅读器。该数据包含了标签这3bit UID的具体值, 该值具有唯一性 (即标签当前3bit UID不同返回值不同) , 即便碰撞后阅读器依然能正确识别出该值, 并以此为索引寻呼, 这样就减少了阅读器的寻呼次数。随后, 通过仿真与其他改进二进制树算法对比, 证明了改进的算法在搜寻次数以及搜寻时间上相较另外两种改进二进制树算法的优势。

1 几种常用改进的二进制树算法

在二进制算法中, 为了能使阅读器准确识别标签碰撞位的位置, 通常采用Manchester编码。普通的类二进制搜索算法, 例如返回类二进制树算法, 通过标签的计数器来获取标签位的准确信息, 虽然让编码方式更加自由, 但是增加了软硬件的负担, 因此改进算法采用Manchester编码识别碰撞位的准确位置[7]。

根据标签的标准通信协议规定的传输速度为12.5μs/bit, 则算法的识别时间T与搜寻过程中需要传送的比特位呈正比。在信号传输过程中, 为了便于互相区分, 必须在信息的头部和尾部各加上一个“NULL” (占用5个比特位) 。当标签返回信息时, 阅读器需要占用1个bit周期来校验接收到的数据是否存在错误。如果收到的数据没有出现碰撞, 则阅读器还需要2个bit周期的时间记录标签的UID信息。下面对常见的两种改进的二进制防碰撞算法进行分析。

1.1 返回二进制树算法

返回二进制树算法特点是:在进行搜索的过程中阅读器依次记录下标签发生冲突节点即父节点, 直到完成一个标签的识别。然后返回上一级父节点继续识别其他的标签, 而不是像二进制树算法返回到根节点重新进行识别。因此返回二进制树算法主要是通过减少阅读器对标签的搜寻次数来减少阅读器的搜寻时间。

对返回二进制树算法[4], 根据文献[4]可知, 假设阅读器范围内有m个UID长为n bit的标签。

则阅读器的寻呼次数为CDBS=2×m-1。

由于返回二进制树算法的命令只有Rq () 则寻呼时间为:

1.2 跳跃类二进制树算法

使用跳跃类二进制树算法阅读器每次只接收l bit的数据, 阅读器就不需要对所有标签进行同步, 因此编码方式更加自由, 实现起来更加容易。跳跃式二进制防碰撞算法的搜寻时间与阅读器范围的标签个数和标签的位数成正比, 假设阅读器范围内存在n个UID为m bit的标签时此算法的搜寻次数C=0.65×m×n次。寻呼次数太高, 导致算法的识别效率较低。

对跳跃式类二进制树算法[6], 由文献[6]可知, 搜寻时间为:

1.3 返回式类二进制算法

该算法是基于类二进制算法的基础上提出需要标签内部的一个碰撞计数器collion_count[]用于记录碰撞位父节点的位置。将冲突位1的标签的collion_count[]值加1, 并以collion_count[]和标签位数作为寻呼标准, 相对于类二进制算法成功地减少寻呼次数。

由文献[1]可知, 该算法的阅读器寻呼次数为:

寻呼时间为

2 改进的二进制树算法

改进的二进制树算法, 如返回二进制树算法每次都需要传送标签的UID, 因此冗余信息比较多。从而使得算法的搜寻时间比较长。改进的类二进制树算法, 如跳跃式类二进制算法虽然减少了标签与阅读器每次交互需传输的数据量, 但却是以增加阅读器的寻呼次数为代价的。

2.1 改进算法思想简介

改进的防碰撞算法, 都是基于两方面的事实来提高算法的性能, 即一是减少标签和阅读器每次交互所需传输的数据, 二是减少第一次寻呼以后搜寻标签所需寻呼的次数。本算法主要是从不增加每个时隙传输数据的前提下, 减少阅读器对标签的寻呼次数。

本算法根据碰撞后Call (m, n) 命令要求计算的uid位数k (2位、3位或者4位) , 让标签预留2k字节的寄存器buffer[], 用来暂存标签通过计算生成的将要发送给阅读器的数据。本文以n=4为例 (具体原因见2.3节) , 首先对改进算法需要用到的一些命令做简介。命令的具体用法参见2.2节。

Rq (u) —UID前几位与u相同的标签将其剩余部分的UID发送该阅读器。

Call (m, n) —UID前几位与m相同的标签将其n~n+3位UID做运算, 运算方法见标签的程序执行要点, 将运算所得值存入Buffer[]中, 并发送给阅读器。

C语言应用在单片机编程时具有易于移植、维护等优点, 因此在实际应用中, 需要实现二进制防碰撞算法时, 一般都采用C语言编程。所以, 本文采用C语言的伪代码对算法执行过程中的核心程序做简要说明。

为了方便表述本算法, 首先对本文用到的一些C语言运算符以及运算目的做简介。

<< (>>) 表示:按位左移 (右移) , 移位后空余的最低 (高) 位由0补足。

规定:当发生碰撞时标签接收到Call (m, n) 命令时, 需要计算的uid位数为k位 (k=2, 3, 4) , 并且标签需要预留2k字节给寄存器buffer。且根据k取值不同, buffer长度及初值如表1所示。

规定:标签UID高位到低位依次为1—s位, 如图1所示。

运算目的如下:将标签的n~n+2位UID变成“不会碰撞”的值, “不会碰撞”就是在标签发生碰撞时, 阅读器也能正确识别出接收到的数据。标签通过如下计算得到的buffer值, buffer值的二进制表示形式有且仅有一位为1 (其余位都为0) 。

在算法的识别过程中标签需要执行操作的程序要点如下:

如果k=4则buffer初值为0x0001, 当n~n+3位值不同时标签计算得出的buffer值不同, 如表2所示。

在算法的识别过程中当发生碰撞时, 阅读器需要执行的操作的程序要点如下:

所以当发生碰撞时, 标签向阅读器发buffer值, 而不直接发送uid。如果有大于一个标签向阅读器发送其buffer的值, 则阅读器记录下收到的buffer值, 每个碰撞位对应一个Buffer值。将每个碰撞位依次分别置1, 其余位补0, 还原buffer值。下面举例说明这样计算的优势:假设阅读器范围内存在三张标签, 前3位uid分别为:1000, 1100, 1111。那么做运算后, 三个标签分别将buffer值为0x0100, 0x1000, 0x8000发送给阅读器, 曼彻斯特编码解码后阅读器将收到的数据为x00x 000x 0000 0000, 有三个碰撞位第1、4和第8位, 首先将第八位置1其余位补0则可得0000 0001 0000 0000, 同理得到第四位碰撞位对应的buffer值为0001 0000 0000 0000。第一位碰撞位对应的buffer值为1000 0000 0000 0000这样就还原了碰撞前的buffer值。阅读器知道了其范围内标签前4位uid值存在如下3中情况:1000, 1100, 1111, 并以此为索引依次寻呼。

2.2 改进算法流程

本文提出的改进算法的处理流程如图2所示。

为了清楚地介绍本算法, 假设阅读器范围内有10张uid长度为8 bit的标签, 标签uid值如表3所示。

根据图2所示算法流程, 表3所列10张标签的识别过程概述如下:

1) 所有进入阅读器范围内的标签都处于Unselect状态。阅读器发送Active () 命令激活阅读器范围内的所有标签, 使标签处于Ready状态。

2) 阅读器发送Request (all) 命令, 处于Ready状态的标签向阅读器发送其完整的UID, 此时阅读器接收到的数据为xxxx xxxx。

3) 由于接收到数据的最高碰撞在首位, 因此阅读器下发命令Call (, 1) , 所有收到命令的标签1~4 (1+3) 位做计算, 并向阅读器发送标签计算所得值。

4) 阅读器分析收到的数据x00x x0xx 0xx0 0x00, 分析知此时标签前三位UID值有8种情况, 0010 (0000 0000 0000 0100) , 0101 (00000000 0010 0000) , 0110 (0000 0000 0100 0000) , 1000 (0000 0001 00000000) , 1001 (0000 0010 0000 0000) , 1011 (0000 1000 0000 0000) , 1100 (0001 0000 0000 0000) , 1111 (1000 0000 0000 0000) 。阅读器发送Rq (0010) , 此时只有Tag6回复, 无碰撞, 正确识别Tag6。

5) 阅读器发送Rq (0101) , 此时只有Tag9回复, 无碰撞, 正确识别Tag9。

6) 阅读器发送Rq (0110) , 此时只有Tag8回复, 无碰撞, 正确识别Tag8。

7) 阅读器发送Rq (1000) , 此时只有Tag1回复, 无碰撞, 正确识别Tag1。

8) 阅读器发送Rq (1001) , 此时Tag4, Tag7, Tag10响应, 阅读器收到xxxx, 发生碰撞, 表示uid前4位为1001的标签不止一张, 需要继续寻呼标签的接下来的4位uid, 即5~8位uid才能识别本组标签。

9) 阅读器向标签发送Call (1001, 5) 表示:UID前4位为1001的标签将5~8 (5+3) 位做计算, 然后向阅读器发送标签计算所得值。

10) 阅读器分析收到的数据00x0 000x 0000 x000, 分析知此时前四位为1001的标签5~8位值有如下3种情况:0011 (0000 0000 0000 1000) , 1000 (0000 0001 0000 0000) , 1101 (00100000 0000 0000) 。阅读器发送Rq (1001 0011) , 此时只有Tag4回复, 无碰撞, 正确识别Tag4。

11) 阅读器发送Rq (1001 1000) , 此时只有Tag10回复, 无碰撞, 正确识别Tag10。

12) 阅读器发送Rq (1001 1101) , 此时只有Tag7回复, 无碰撞, 正确识别Tag7。

13) 阅读器发送Rq (1011) , 此时只有Tag5回复, 无碰撞, 正确识别Tag5。

14) 返回上一级阅读器发送Rq (1100) , 此时只有Tag2回复, 无碰撞, 正确识别Tag2。

15) 阅读器发送Rq (1111) , 此时只有Tag3回复, 无碰撞, 正确识别Tag3, 阅读器范围内所有标签识别完毕, 本次识别结束。

16) 使用Active () 命令激活标签进入下次识别。

改进算法具体实现标签的识别过程与结果如表4所示。

2.3 仿真结果以及分析

假设阅读器范围内有m个uid长度为n bit的标签。当标签收到Call命令时, 标签每次用k bit做计算, 存到长度为2kbi的buffer中。

由文献[4]可知, 对于返回二进制树算法, 要识别m (m>2) 个标签, 则阅读器需要寻呼次数为2×m-1次, 其中m-1次寻呼后收到的数据发生碰撞, m次寻呼后正确识别标签。

本文提出的算法, 根据每次碰撞时标签最高碰撞位接下来的k bit作为一组运算后, 发送阅读器, 阅读器按k位来寻呼, 而不是像返回二进制树算法以最高碰撞位 (即一位) 做寻呼。因此, 发生碰撞次数概率为返回二进制树算法的1/k, 但是改进的算法当发生碰撞时会产生一次额外的Call命令, 因此改进算法的寻呼次数为:

{根据上式可以得出rk与k成反比, 因此可以得出k越大, 算法在阅读器寻呼次数上优势越大。

下面针对改进算法的寻呼时间与返回二进制树算法的识别时间做推导, 算法的识别时间T与搜寻过程中需要传送的比特位呈正比, 因此此处仅对算法识别过程中传输的总bit位做推导, 而不考虑校验记录uid所需要的时间。假设改进的算法以及返回二进制树算法在一次搜寻过程中需要传输的总比特位分别为bitNBBS和bitBBS。

{根据上式可知bitNBBS与k (k≥2) 成正比因此, 虽然随着k的增加阅读器总寻呼次数减少, 但是需要传输的字节数却在增加。这是由于随着k的增加阅读器每次发送Call命令需要传输的字节数呈指数增加。不仅如此, 随着k的增加标签需要预留的buffer字节数也增加, 同时就增加了标签的硬件负担。给实际应用造成了困难, 因此, k值并不是越大越好。

结合实际考虑:由于标签uid长度普遍为2nbyte=8×2nbi (n≥0) , 如基于14443-A协议的标签uid长度为4 byte。在标签预留可供用户使用的寄存器大于两个字节时, 标签建议k值取4。因为, 当k=4时, 只需要使用标签的2字节的寄存器, 并且运算都是以移位运算为主, 不会给标签造成太大的负担, 同时效率也得到提高。但是, 当k>4时, 标签则要预留2k/8字节的寄存器, 例如k=5时, 则需要预留4字节;k=6时, 则需要预留8字节, 对标签负担就加重了。因此, 本文建议k取值为4。

以阅读器范围内标签个数为m个 (x轴) , 阅读器寻呼次数为y次 (y轴) , 标签长度n=8 bit, k=2, 3, 4反复运行10次求平均值。阅读器搜寻时间标签个数关系如图3所示。

注: (1) 返回二进制树算法; (2) k=2, 时改进算法; (3) k=3时, 改进算法; (4) k=4时, 改进算法

阅读器的搜寻时间直接决定算法的优劣, 从图3可以直观地看出随着标签个数的增加改进算法在识别时间上, 相对于其他两种改进的二进制树算法优势更加明显。由表5改进算法与其它两种二进制树算法搜寻时间比较表可以定量地看出改进算法在搜寻时间上的优势, 例如:在标签个数为250个时改进算法在k=4时相对于返回二进制树算法时间节省率将达到29.86%。

3 结语

本文首先对常用的改进二进制树简介, 然后提出了一种改进的二进制树算法, 该算法在动态二进制树算法的基础上通过阅读器发送命令让标签做计算, 并将计算所得值发送给阅读器, 通过标签返回的值, 阅读器清楚地知道标签的当前k (k=2, 3, 4, 在实际应用中建议取值为4) 位uid值, 从而减少阅读器的寻呼次数, 并最终减少了阅读器的搜寻时间。并通过仿真证明了, 改进算法相比于动态二进制树算法在阅读器寻呼次数上有所减少。相比于动态二进制树算法和跳跃类二进制树算法在阅读器寻呼时间上的优势。特别在标签数越多时算法的优势越明显, 但是本算法需要标签支持一个可供用户使用的一个字节的寄存器Buffer[], 相对来说就增加了标签的硬件负担。因此, 本算法适用于对算法识别速度要求高, 并且标签支持一个可供用户使用的一个字节的寄存器适的情况下的RFID系统下大规模标签的识别。

参考文献

[1]张航, 唐明浩, 程晖.改进的返回二进制防碰撞算法[J].计算机工程与应用, 2011, 47 (25) :208-211.

[2]夏志国, 何怡刚, 侯周国.一种二进制树位检测的标签防碰撞算法[J].计算机工程与应用, 2010, 46 (20) :245-248.

[3]Lee Suryun, Joo Sungdon, Lee Chaewoo.An Enhanced Dynamic Framed Slotted ALOHA Algorithm for RFID Tag Identification[C]//Proceeding of the 2nd Annual International Conference on Mobile and Ubiquitous Systems, 2005.

[4]徐圆圆, 曾隽芳, 刘禹.基于A loha算法的帧长及分组数改进研究[J].计算机应用, 2008, 28 (3) :588-590.

[5]Joe I, Lee J.A novel anti-collision algorithm with optimal frame size for RFID system[C]//Proc.of 5th IEEE International Conference on Software Engineering Research, Management and Applications, 2007:424-428.

[6]陶云聪.RFID系统多标签防碰撞算法研究[D].重庆:重庆大学, 2010.

[7]何晓桃, 郑文丰.RFID中基于二分叠加的二进制防碰撞算法[J].华南师范大学学报:自然科学版, 2011 (3) .

[8]张琦.基于TDMA的阅读器控制防碰撞算法研究[D].合肥:合肥工业大学, 2007.

二进制化 篇5

1.1 问题描述

用C语言解决如下问题:有一个用火柴棒拼成的等式,如图1所示移动2根以内的火柴棒使等式成立。输入一个现有的等式,输出所有成立的等式,并在每个等式后面注明是移动几根火柴棒使等式成立的。

1.2 题目要求

(1)等号不许移动,运算符只能是“+”或者“-”。

(2)这里暂时只讨论两位数的情况(所有数字在0-99之间)。变换后不能出现最高位是0的二位数(例:08),但是数字0是可以出现的。

(3)数字之间的变换必须是最少移动次数。

(4)不能在原来的数后面添加火柴棒(例:8→81),也不能把原来数后面的一位去掉使变成一个一位数(例:81→8)。

(5)可以在原来的数前面添加火柴棒(例:8→18),或者把原来数的最高位去掉(例:18→8)。

2 算法原理及可行性

2.1 程序的总体算法分析和对时间复杂度的分析

最简单的思路就是分别循环等式中的所有可以变换的状态,一个个的分析排除,即用枚举策略。因为数字范围是0-99,一共只有3个数字和一个可以变换的符号,又因为最后一个数字有可能是前两个数的和或者是差并且与符号的变换是相对应的,用枚举策略的话需最多100*2*100=2*10^4次运算,显然是可行的。

2.2 程序数据结构分析和对空间复杂度的分析

为了便于对等式中火柴棒根数的控制设定一个100的一位数组记录组成数字i所需要的火柴棒根数。再设定一个10*10的二维数组记录数字i变换到数字j所需要的最少步骤数(为了避开小数运算,我们把移动一根火柴棒的步骤数记为10,即移入和移出一个火柴棒分别记为5。在下面的文段中会详细介绍二维表的生成过程)。[1]

3 程序的算法思路

3.1 程序流程图,如图 2 所示。

3.2 用火柴棒表示的各个数字在计算机中的表示

对于每一位数字都是在8个位置中放几个适当的火柴棒来表示一位数字的。也就是一共8个位置,每个位置上要么有火柴要么没有,对于这2种状态,我们分别记为0和1,把这一串0和1组成的二进制数字就可以表示出用火柴棒表示的数字的具体情况。例:数字5用火柴棒排列如图3所示。在计算机中我们对每一根火柴棒的位置从1开始进行的编号,如图4所示。

我们把用火柴棒的地方记1,没有的记作0,按照顺序可以写出1101011的二进制数字,然后转换成十进制的数字就是107。同理0-9对应的十进制数字分别为119,36,94,110,45,107,123,38,127,111。[2]

3.3 二维表代码详解

以下是二维表代码详解:

int build ()// 建立数字i变到数字j所需要的步骤数的二维表

4 思考和体会

二进制化 篇6

关键词:二进制,八进制,进制转换,超越离合器

0 引言

在计算机技术教学中进制转换知识点的抽象、学生不易理解的问题, 传统的传感器式进制转换器不能表示其中的转换关系, 并且在实际操作过程中具有一定的环境要求。纯机械式二进制到十进制进制转换器国内外都没有成品, 然而传感器式进制转换器对环境具有一定的限制性、转换关系准确性不能达到“零误差”。

故需要设计一部二进制到八进制转换装置, 是一部使用于教学的原理模拟装置, 该装置通过单向轴承、齿轮和不完全齿轮等机械零件, 根据一定的比例与相互组合, 例如通过齿轮与齿轮比例关系实现二进制对其他进制的一位或几位的作用, 利用不完全齿轮的间歇关系实现各进制内的进位, 利用单向轴承对数据进行处理, 实现二进制数字组合对其他进制的转换关系。本装置通过简单地输入二进制数等, 可以得到相应八进制的数据, 就像中国传统的算盘一样, 操作简单, 方便使用。

该装置由圆柱齿轮、超越离合器 (即单向轴承) 、推力轴承等机械零件组成, 完全通过机械结构实现二进制与八进制的转换。其与传感器式进制转换器相比较, 具有数据传动准确、零误差、对环境的要求低等优点。该装置整体图如图1所示。

1 二进制理论设计

数学关系中的规律在进制转换中, 二进制中的第n为代表的数为2n-1, 为了找到其中函数关系, 把二进制和八进制中的每一位展开, 进制函数关系图如图1。

由图2可以得到两个规律:1) 二进制中每位数字只对八进制数字的一位起作用;2) 二进制从右开始的相邻每三位数字对八进制从右开始的相应一位数字起作用, 二进制中分为三个数字为一个单元。

2 二进制装置的构件设计

该装置由数字显示机构、多对相应传动比的完全齿轮对组成的进制间转换机构、完全齿轮与不完全齿轮组成的进制内进位机构、支撑等辅助机构组成。

2.1 数字显示机构

通过转动齿轮带动显示盘的数据一起转动, 实现两者同步的目的。其中, 二进制的数字盘数字由“0”和“1”两个数字组成, 八进制数字盘数字由“0”“1”……“7”等10个数字组成。机构俯视图如图3[1]所示。

通过计算二进制数字盘的第一位数字转“一个单位”需要转过的角度为90° (360/4=90) , 八进制数字盘的第一位 (个位) 数字需要转动一个数字转过的角度为45° (360/8=45) , 传动比为90/45=2;二进制数字盘的第二位数字转“一个单位”需要转过的角度为90°, 八进制数字盘的第一位 (个位) 数字需要转动两个数字转过的角度为90° ( (360/8) ×2=90) , 传动比为90/90=1;依次类推, 数字盘间相互连接的传动比如表1。

2.2 进制间各位“转换机构”

利用不同传动比的齿轮副, 实现二进制到八进制的进制各个相应位的对应关系。进制间传动比示意图如图4所示, 图5为进制间传动比三维图。

由第一条规律:二进制中每位数字只对八进制数字的一位起作用, 是一对一的关系;通过二进制到十进制的转换关系, 即表2中的传动比, 设计计算所需齿轮的参数。当轴心距为60 mm时, 计算前四位各个齿轮的直径及齿数。得出进制间各齿轮参数表2。

由第二条规律:二进制从右开始的相邻每三位数字对八进制从右开始的相应一位数字起作用, 二进制中分为三个数字为一个单元。通过没有力矩传动的联轴器, 将二进制数字每三位一个单元分隔开。由此, 二进制中每三位一个单元, 制作成的二进制到八进制转换器, 将没有位数限制, 实现转换目的。

3 结论

该装置能够通过转动数字显示机构, 能够达到给定一个相应的二进制数字, 就会在相应的八进制数字转换机构上, 自行旋转出八进制数字的目的[1]。所以, 该装置既可以作为计算机相应课程的辅助教具, 同时又可以对现代转换计算工具的有效补充[1]。

参考文献

[1]王鹏博, 郑双阳, 孟宪瑞, 等.一种新型二进制到十进制转换装置的设计[J].机械工程师, 2014 (12) :43-44.

[2]唐佐侠, 杨军, 董寅.基于FPGA的十进制浮点乘法器的设计与研究[J].云南大学学报 (自然科学版) , 2010 (5) :526-531.

[3]刘继栋, 王锡淮, 肖健梅.基于十进制编码的差分进化算法在配电网重构中的应用[J].电力自动化设备, 2012 (5) :94-97, 107.

[4]GUAN Jun, KOCHERT P, WEICHERT C, et al.A high performance one-dimensional homodyne encoder and the proof of principle of a novel two-dimensional homodyne encoder[J].Precision Engineering, 2013, 37 (4) :865-870.

[5]冯建, 石雷兵, 刘文芳, 等.二进制感应分压器及其在高速采样器线性度校准中的应用[J].电测与仪表, 2013 (增刊1) :112-114.

[6]郝承伟, 高慧敏.求解TSP问题的一种改进的十进制MIMIC算法[J].计算机科学, 2012 (8) :233-236.

[7]同济大学数学系.高等数学:上册[M].北京:高等教育出版社, 2007.

[8]大连理工大学工程图学教研室.机械制图[M].北京:高等教育出版社, 2007.

二进制化 篇7

计算机系统中一个最重要的接口是软件与硬件之间的接口,称为指令集体系结构,它定义了任何软件程序正确运行在处理器上所要知道的所有细节,包括机器指令,访存模型,I/O方式等。传统的计算机软件和硬件都依赖于特定的体系结构,针对不同指令集体系结构的软件和硬件不能相互结合,降低了计算机系统的互操作性。

二进制翻译技术就是一种解除二进制软件程序与机器平台之间依赖关系的关键技术。它把一种机器平台上的二进制代码翻译为另一种机器平台上的目标代码,从而在新体系结构上运行旧体系结构的程序。二进制翻译通常可以分为静态二进制翻译和动态二进制翻译。

动态二进制翻译器动态翻译源机器上的二进制代码,收集profile信息,并且根据这些信息对执行频率较高的代码进行优化,这些翻译优化后的代码保存在一个通常称之为TCache的软件cache里。这样当程序再次执行到这些代码块时就转入TCache,直接执行优化后的代码块,从而提高程序的执行速度。

因此,TCache的性能直接影响动态二进制翻译器的性能,对它采用什么样的管理策略是很重要的。

1 TCache的特性

最简单的TCache管理是不使用任何管理策略,仅仅在内存中申请一块大小不受限制的动态区域作为TCache。但这样做的话TCache的长度可能达到所执行的应用程序的5倍大小,而现在交互式Windows程序往往在几分钟内执行超过40MB的代码。这样庞大的代码量,TCache根本无法容纳,因此这种设想在实际操作中是行不通的。TCache必须长度有限,并配合一种合适的替换策略供动态翻译器使用。

传统的硬件cache中,最基本的三种替换策略是:随机替换,最近最少使用(LRU)替换和先进先出(FIFO)替换。TCache跟传统的硬件cache虽然相似,但又有很多不同的特性[1]:

第一,传统cache中存放的代码单元都是固定长度的,但是TCache中代码单元的长度不一。传统的算法,如随机、LRU、都会产生很多碎片,而采用碎片整理算法又会造成巨大的负担;

第二,TCache没有后备存储,翻译好的代码块一旦被替换出TCache就不存在了。如果要再次用到该代码块,则必须重新翻译生成。因此,TCache的miss代价非常高,应该尽量采取miss率低的管理策略;

第三,TCache中代码块之间由于链接而相互依赖,当某一个代码块被替换掉时,与其相链接的代码块的指针都要更新。因此,如果使用一次替换一个代码块的算法,就要不断地更新指针,管理开销太大。

鉴于这些特性,传统cache的替换算法不太适合于TCache。

2 常用的TCache算法

一般来说,TCache管理要选择比较简单而且不产生碎片的策略。除此之外还要考虑的几个因素包括:替换粒度,miss率,管理开销。

在TCache大小一定的情况下,替换单元的粒度越小,例如一次只替换一个基本块或者超级块,可以降低miss率;但是考虑到每次替换的固有开销(包括来回调用和更新链接指针),这样替换次数太多也是不划算的。反之,如果替换单元的粒度很大,例如全清空,每次替换整个TCache,虽然管理开销小,miss率却相对较高。

在这几个因素中找到一个比较好的平衡点,才能使TCache的综合性能最好。

2.1 全清空

全清空算法在动态优化器和翻译器中的使用是比较多的。它一次清空整个TCache,机制简单,管理开销很小,也不会产生碎片。但是它的替换粒度太大,造成miss率比较高,在miss代价很高的动态翻译系统中,对性能造成比较大的影响。此外,热路径会被反复地替换掉,不符合翻译优化热路径来提高程序执行速度的初衷。

动态二进制翻译器Strata、Walkabout等都是采用的这种算法。

2.2 先进先出

先进先出,又可以称为细粒度的先进先出(Fine-Grained FIFO),也是在动态翻译器中应用得比较广泛的一种算法。这种算法的思想是把TCache当作circular buffer[2],每个代码块按照它们被插入的顺序进行替换。如果新进来的代码块比被替换的代码块大,即被替换的代码块腾出的空间不够,那么被替换的代码块的下一个代码块会作为牺牲块也被替换掉。

这种方法可以避免碎片的产生,而且由于替换粒度比较小,miss率也比较低。其缺点是:第一,每次只替换一个代码块,反复调用控制程序造成的开销比较大;第二,每删除一个代码块,与之相链接的代码块的链接指针就会悬空,这种做法会使悬空指针数量最多,指针更新代价也很高。

2.3 基于工作集的全清空

1999年HP开发了著名的全软件动态透明优化器Dynamo[3,3]。Dynamo运行在HPUX操作系统之上,它以PA-RISC代码作为输入、输出更加高效的PA-RISC代码。Dynamo首创了基于工作集的全清空算法,这种算法可以看作是对全清空的改进。

在Dynamo中,使用FCache来存放执行频率高的代码段的翻译优化版本。其具体做法是这样的:先申请一块固定大小的内存空间作为Fcache,依次存放新近生成的Fragment(即翻译优化后的代码段)。若干个Fragment的集合被称为工作集,一个工作集对应着程序运行的一个阶段。在一个阶段里,程序控制权将主要在对应的工作集的Fragment之间跳转。当程序从一个阶段执行到另一个阶段时,上一阶段反复执行的代码在这一阶段不会再被执行,此时Dynamo将触发一次Fcache的简单全清空。检测工作集的改变是基于Fragment的生成率的:在新阶段的形成过程中,Fragment的生成率先急剧上升,再急剧下降,之后维持在相对较低的水平上,直至下一个阶段的形成。

基于工作集的刷新方法优点是:第一,只需要足够存放最大Fragment工作集的空间,因而Fcache内存需求较少;第二,Fcache中的内容更集中于当前工作集的信息,命中率也相对提高;第三,执行更少的转移分支指令。不过,这种cache管理技术的基础是程序执行的阶段性,因而有一定的针对性,比如适合于循环密集的科学计算。

2.4 粗粒度的先进先出

由于全清空和先进先出各有优缺点,又出现了一种综合的替换算法,可以称作粗粒度的先进先出。这种算法的做法是:将TCache分成大小相等的几个单元,在这几个单元之间采用先进先出的替换策略。每个单元内存放的是长度不一的代码块,每次替换一个单元,相当于每个单元内部使用的是全清空。

本文使用粒度系数来代表一个TCache被划分的单元数。按照这种划分,全清空是粒度系数为1的粗粒度先进先出;先进先出则是粒度系数最大时的粗粒度先进先出。

下面是几个应用粗粒度的先进先出算法的典型例子。

(1) Mojo的TCache管理

2000年微软研究院开发了动态优化系统Mojo[4,4]。它使用了两个代码cache,分别称为BasicBlockCache和PathCache。BBCache用来存放最近执行过的基本块。如果某些基本块足够热,Mojo就会创建一条包含这些基本块的路径,优化后存放到PCache中。

Mojo对这两块cache都采用粗粒度的先进先出算法。以粒度系数为2的PCache为例:将PCache分成两个等长的区域,两个区域之间是先进先出替换;而每个区域内部存放长度不等的代码块,一旦满就全清空。具体的说,当一条新的路径要被存放时,当前区域空间不够,就会转到下一个区域,如果下一个也满了,控制程序就会对下一个进行全清空。这种做法保证替换发生时只选择比较老的那块区域进行刷新。跟普通的全清空相比,可以避免把所有热路径都一次替换掉。

(2) DigtalBridge的CPB算法

2004年中科院计算所开发的动态二进制翻译器DigtalBridge[5,5]是国内比较有代表性的成果,它实现了从X86/Linux平台到MIPS/Linux平台的动态翻译和优化。

DigtalBridge提出了是一种叫作CPB的TCache管理策略:将TCache划分成大小相等的若干个piece,piece是替换的最小单位;每个piece又缓存若干个大小不等的block,block是分配的最小单位。整个cache按照piece组织成一个循环队列。初始化时将待分配的空闲片指向第一片,分配时首先在待分配的空闲片中放置每个代码块。如果待分配的空闲片空间不够了,就选择它的下一片作为待分配的空闲片;如果这个下一片刚好空间也不够,就进行替换。

这种CPB算法实质上也是粒度系数不小于2的粗粒度先进先出。

(3) 粒度的选择

实际应用中,粒度的选择应该综合考虑miss率和替换开销。一般说来,当TCache大小一定时,粒度系数越小,miss率越低,替换开销越高。

图1~图3显示了这个变化趋势。图中的实验数据是通过运行一系列SPECint2000 benchmarks获得的[6,6]。

图1表示各种粗粒度先进先出算法产生的miss率;图2是这些算法跟FIFO相比,相对的替换开销(包括调用和指针更新的开销);图3是对前面两个图的总结,综合考虑了miss开销和替换开销。

可以看出,粗粒度的先进先出算法,既避免了全清空算法的高miss率,又降低了先进先出算法的替换开销,因此综合性能比全清空和先进先出都要好。

图3中还显示,当粒度系数为8的时候,TCache的综合开销最小。当然,这个结论是在对应的TCache大小下得出,动态二进制翻译器可以根据自身的特点选择合适的TCache大小,再利用这种分析方法去寻找最适合的粒度系数。

2.5 其它替换算法

除了前面提到的几种TCache替换算法外,还有一些不常用的算法。

LRA(Least-Recently Accessed)选择最近最少被访问的那条路径进行替换,如果空间不够,这条被替换的路径的下一条路径就会作为牺牲路径也被替换。其缺点是牺牲路径比较多,而且会产生很多碎片。

LFA(Least-Frequently Accessed)使用一个计数器来记录每条优化路径的访问次数,然后选择访问次数最少的路径进行替换。它的牺牲路径比LRA少,对热路径的确定也比较有效,但仍然会产生许多碎片,而且总是把新路径替换出去。

LE(Largest Element)每次都选择TCache中最长的路径替换。其缺点是碎片很多,而且为每条路径的长度维持一个排序的表单需要一定的开销。优点是每次替换发生是牺牲路径的数量比较少。

BFE(Best-Fit Element)每次选择TCache中长度不小于新来路径的所有路径中最短的一条替换出去。这种做法碎片会减少,管理开销却是最大的。

总的来说,这里提到的四种替换算法从miss率、碎片以及管理开销的这些角度综合考虑,性能比先进先出更差[2],实际应用非常少。

3 结 论

动态二进制翻译器中的TCache的设计是一个重要环节。本文总结了近年来在动态二进制翻译系统中常用的一些TCache替换算法,并分析了它们各自的优缺点。从文中的分析可以看出,针对TCache独有的特性,往往会选择机制简单,容易管理,miss率比较低,并且不产生碎片的算法。其中全清空、先进先出尤其受到动态翻译器的青睐,在它们的基础上又提出了很多改进的算法,例如基于工作集的全清空、粗粒度的先进先出等。尤其是粗粒度的先进先出,如果能够选择一个合适的粒度系数,它的性能会比简单的全清空、先进先出等算法更好。当然,粗粒度的先进先出也有值得改进之处,如何找到更合适的TCache算法,还有待于我们进一步的研究。

参考文献

[1]Smith J E,Nair R.Virtual machines—versatile platforms for systems and processes.Beijing:Publishing House of Electronics Industry,2006:133-139.

[2]Hazelwood K,Smith MD.Code cache management schemes for dynam-ic optimizers.Proceedings of the Sixth Annual Workshop on Interaction between Compilers and Computer Architectures,IEEE,2002.

[3]Bala V,Duesterwald E,Banerjia S.Dynamo:a transparent dynamic op-timization system.In Proceedings of the ACM SIGPLAN’2000Confer-ence on Programming Language Design and Implementation,2000.

[4]Chen W,Lerner S,Chaiken R,et al.Mojo:a dynamic optimization sys-tem.Proceedings of the3rdWorkshop on Feedback-Directed and Dy-namic Optimization,2000.

[5]中科院计算所.动态二进制翻译中的代码cache管理策略.计算机工程,2005,31(10).

[6]Hazelwood K,Smith J E.Exploring code cache eviction granularities in dynamic optimization systems.Proceedings of the International Sympo-sium on Code Generation and Optimization,IEEE,2004.(上接第270页)

[3]Osher S,Sethian J A.Fronts Propagating with curvature dependent speed:Algorithms based on the Hamilton-Jacobiformulation[J].Jour-nal of Computational Physics,1988,79(1):12-49.

[4]李庆华,杨世达,阮幼林.基于水平集遗传算法优化的改进[J].计算机研究与发展,2006,43(9):1624-1629.

[5]蔡自兴,等.人工智能及其应用[M].北京:清华大学出版社.

[6]Esmin A A A,LambertTorres G,Zambroni deSouza A C.A hybrid par-ticle swarm optimization applied to loss power minimization.IEEE Transactions on Power Systems,2005,20(2):859-866.

上一篇:奥运会带给我们什么下一篇:思维范式

本站热搜

    相关推荐