计算机体系结构报告.docx

上传人:b****5 文档编号:7710058 上传时间:2023-01-25 格式:DOCX 页数:10 大小:140.88KB
下载 相关 举报
计算机体系结构报告.docx_第1页
第1页 / 共10页
计算机体系结构报告.docx_第2页
第2页 / 共10页
计算机体系结构报告.docx_第3页
第3页 / 共10页
计算机体系结构报告.docx_第4页
第4页 / 共10页
计算机体系结构报告.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

计算机体系结构报告.docx

《计算机体系结构报告.docx》由会员分享,可在线阅读,更多相关《计算机体系结构报告.docx(10页珍藏版)》请在冰豆网上搜索。

计算机体系结构报告.docx

计算机体系结构报告

中南大学

计算机体系结构

实验报告

学生姓名郁博文

指导教师雷向东

学院信息科学与工程学院

专业班级信安1302班

学号**********

完成时间2015年11月4日

实验1对指令操作码进行霍夫曼编码

一、实验目的

了解和掌握指令编码的基本要求和基本原理

二、实验要求

使用编程工具编写一个程序,对一组指令进行霍夫曼编码,并输出最后的编码结果以及对指令码的长度进行评价。

与扩展操作码和等长编码进行比较。

问题描述以及问题分析:

我们举例说明此问题,例如:

有一组指令的操作码共分七类,它们出现概率如

下表所示:

P1P2P3P4P5P6P7

0.450.300.150.050.030.010.01

对此组指令进行HUFFMAN编码正如下图所示:

三、实验内容

因为各字符在信息中出现的频率是不同的,若根据字符出现的不同频率分配给不同长度的编码:

频繁出现的字符分配给较短的编码,不常出现的字符分配给较长的编码,且这种编码还具有“前缀特性”,那么这样的编码电文总长会最短,发送效率会最高,占用的空间会最少。

而哈弗曼编码就是这样一种编码,字符出现的频率与该程序中对应的权重。

首先将建立哈弗曼树,将权重最小的放在二叉树的最低端,将权重最大的放置在离根结点最近的位置,这样就可以使权重大的结点的编码较短,权重小的结点的编码较长。

实际上是建立一个表格,中间有结点的权重,父亲和孩子的信息。

建立好哈弗曼树之后,要使得哈弗曼的左子树的编码为0,右子树的编码为1。

可以通过这个来确定字符的哈弗曼编码。

四、实验原理

构造HUFFMAN树所要做的工作:

1、先对各指令操作码的出现概率进行排序,构造一个有序链表。

2、再取出两个最小的概率节点相加,生成一个生的节点加入到链表中,同时从两表中删除此两个节点。

3、在对链表进行排序,链表是否只有一个节点,是则HUFFAN树构造完毕,否则继续做2的操作。

为此设计一个工作链表(链表的元素时类,此类的功能相当结构。

)、HUFFMAN树节点、HUFFMAN编码表节点

 

五、实验结果

六、源程序代码

#coding:

utf-8

importmath

classNode:

def__init__(self,probability):

self.left=None

self.right=None

self.father=None

self.probability=probability

defisLeft(self):

returnself.father.left==self

defcreateNodes(probabilitys):

return[Node(probability)forprobabilityinprobabilitys]

defcreateHuffmanTree(nodes):

queue=nodes[:

]

whilelen(queue)>1:

queue.sort(key=lambdaitem:

item.probability)

node_right=queue.pop(0)

node_left=queue.pop(0)

node_father=Node(node_right.probability+node_left.probability)

node_left.father=node_father

node_right.father=node_father

node_father.left=node_left

node_father.right=node_right

queue.append(node_father)

queue[0].father=None

returnqueue[0]

defhuffmanEncoding(nodes,root):

codes=[""]*len(nodes)

foriinrange(len(nodes)):

node_tmp=nodes[i]

whilenode_tmp!

=root:

ifnode_tmp.isLeft():

codes[i]=codes[i]+'1'

else:

codes[i]=codes[i]+'0'

node_tmp=node_tmp.father

returncodes

deffixedLengthEncoding(nodes):

returnmath.ceil(math.log(len(nodes),2))

defextendEncoding(nodes):

sum_extend=0

if(len(nodes)>3):

sum_extend=nodes[0]+2*nodes[1]+3*nodes[2]+5*(1-nodes[0]-nodes[1]-nodes[2])

eliflen(nodes)==2:

sum_extend=nodes[0]+2*nodes[1]

else:

sum_extend=nodes[0]

returnsum_extend

 

if__name__=="__main__":

chars_freqs=[('P1',0.45),('P2',0.30),('P3',0.15),('P4',0.05),('P5',0.03),

('P6',0.01),('P7',0.01)]

nodes=createNodes([item[1]foriteminchars_freqs])

root=createHuffmanTree(nodes)

codes=huffmanEncoding(nodes,root)

sum_huffman=0

foriteminzip(chars_freqs,codes):

print'Character:

%sencoding:

%s'%(item[0][0],item[1])

sum_huffman+=float(item[0][1])*len(item[1])

print'哈弗曼编码平均长度',sum_huffman

print'等长编码平均长度',fixedLengthEncoding(nodes)

print'扩展编码平均长度',extendEncoding([item[1]foriteminchars_freqs])

实验2使用LRU方法更新Cache

一、实验目的

了解和掌握寄存器分配和内存分配的有关技术。

二、实验要求

1、用C语言实现最近最久未使用(LRU)置换算法。

2、了解内存分页管理策略

3、掌握调页策略

4、LRU调度算法D的模拟实现

三、实验内容

LRU置换算法是选择最近最久未使用的页面予以置换。

该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来经历的时间T,当须淘汰一个页面时,选择现有页面中T值最大的,即最近最久没有访问的页面。

这是一个比较合理的置换算法。

Cache更新

结合数据结构的相关知识,使用LRU的策略,对一组访问序列进行内部的LRU置换算法是选择最近最久未使用的页面予以置换。

该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来经历的时间T,当须淘汰一个页面时,选择现有页面中T值最大的,即最近最久没有访问的页面。

这是一个比较合理的置换算法。

四、实验原理

LRU置换算法虽然是一种比较好的算法,但要求系统有较多的支持硬件。

为了了解一个进程在内存中的各个页面各有多少时间未被进程访问,以及如何快速地知道哪一页是最近最久未使用的页面,须有以下两类硬件之一的支持:

寄存器

为了记录某个进程在内存中各页的使用情况,须为每个在内存中的页面配置一个移位寄存器,可表示为R=Rn-1Rn-2Rn-3……R2R1R0当进程访问某物理块时,要将相应寄存器的Rn-1位置成1。

此时,定时信号将每隔一定时间(例如100ms)将寄存器右移一位。

如果我们把n位寄存器的数看作是一个整数,那么具有最小数值的寄存器所对应的页面,就是最近最久未使用的页面。

如图1示出了某进程在内存中具有8个页面,为每个内存页面配置一个8位寄存器时的LRU访问情况。

这里,把8个内存页面的序号分别定为1˜˜8。

由图可以看出,第7个内存页面的R值最小,当发生缺页时首先将它置换出去。

 

可利用一个特殊的栈来保存当前使用的各个页面的页面号。

每当进程访问某页面时,便将页面的页面号从栈中移出,将它压入栈顶。

因此,栈顶始终是最新被访问页面的编号民,而栈底则是最近最久未使用的页面的页面号。

五、实验结果

 

六、源程序代码

#coding:

utf-8

from__future__importdivision

classLRUCache:

def__init__(self,capacity):

LRUCache.capacity=capacity

LRUCache.length=0

LRUCache.list=[]

LRUCache.lost=0

LRUCache.getIn=[]

defsearch(self,value):

foriinrange(len(self.list)):

ifself.list[i][0]==value:

returni

returnNone

defremoveItem(self):

temp=0

tempItem=0

foriinrange(len(self.list)):

iftemp

temp=self.list[i][1]

tempItem=i

returntempItem

defaddAll(self):

foriinrange(len(self.list)):

self.list[i][1]+=1

defset(self,value):

temp=self.search(value)

iftemp==None:

ifself.length

self.list.append([value,0])

self.length+=1

else:

self.list[self.removeItem()][0]=value

self.list[self.removeItem()][1]=0

self.lost+=1

self.getIn.append(value)

else:

self.list[temp][1]=0

self.addAll()

cache=LRUCache(4)

inputList=raw_input("请输入序列:

\n")

itemList=list(inputList)

cache0=[]

cache1=[]

cache2=[]

cache3=[]

foriinitemList:

cache.set(int(i))

#print'%s'%i,[j[0]forjincache.list]

cache0.append(cache.list[0][0])

if(len(cache.list)>1):

cache1.append(cache.list[1][0])

else:

cache1.append('')

if(len(cache.list)>2):

cache2.append(cache.list[2][0])

else:

cache2.append('')

if(len(cache.list)>3):

cache3.append(cache.list[3][0])

else:

cache3.append('')

foriinitemList:

print'|-%s-|'%i,

print

foriincache0:

print'|%s|'%i,

print

foriincache1:

print'|%s|'%i,

print

foriincache2:

print'|%s|'%i,

print

foriincache3:

print'|%s|'%i,

print

print'缺页次数',cache.lost

print'缺页率',cache.lost/len(itemList)

print'调入队列',cache.getIn

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 文化宗教

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1