第一篇:北邮大三计算机体系结构实验三DLX处理器程序设计
实验三DLX处理器程序设计
1.实验目的
学习简单编译优化方法,观察采用编译优化方法所带来的性能的提高。
2.实验原理
采用静态调度方法重排指令序列,减少相关,优化程序。
3、实验内容和要求
自编一段汇编代码,完成一维向量加法运算,并输出结果。观察程序中出现的数据/控制/结构相关。(注:使用一维数组表示一维向量。)
4.1向量加法代码清单及注释说明
1、向量加法设计源代码.data
VectorLength:.word 16
Vector1:.word 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
Vector2:.word 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 ;声明向量长度以及声明向量1、2 Printf1:.asciiz
“Vector =” Printf2:.asciiz “ %f”.align 2
PrintPrompt:.word Printf1 PrintPar:
.word Printf2
Result:
.space ;存放打印数据的空间申请.text
main:
addi r14,r0,PrintPrompt trap 5
lw r20,VectorLength
addi r2,r0,0
Loop:
ld f10,Vector1(r2)
ld f12,Vector2(r2)
;循环体中读入向量 cvti2d f0,f10
cvti2d f2,f12
addd f4,f2,f0;加法运算
Finish:;**** Finish,write result into stdout sd Result,f4
addi r14,r0,PrintPar
trap 5
;系统中断,输出结果 addi r2,r2,4
subi r20,r20,1
bnez r20,Loop
;**** End trap
0
2、运行结果
5.1程序相关性分析结果
(1)观察程序中出现的数据/控制/结构相关。指出程序中出现上述现象的指令组合。
产生34.12%的数据相关。当对当前指令的操作数寄存器进行操作的时候,前几条指令的运算结果还未写回结果寄存器,由此产生数据相关。
没有产生结构相关。
产生3.94%的控制相关。系统按照预测成功来执行指令,执行一条指令后马上将其下一条指令trap读进来。
(2)考察增加浮点运算部件对性能的影响。
1个浮点运算部件
3个浮点运算部件
同一段代码执行相同步,但是经过对比发现浮点运算部件的多少对于程序执行效率并没有什么影响,浮点运算部件的多少对统计结果都不造成影响,可能是由于该程序不存在争用浮点运算部件资源的情况(3)考察增加forward 部件对性能的影响。
不使用forward部件使用forward部件
使用forward部件之后执行相同的代码用的时钟周期比不使用forward部件少了 大约100个时钟周期,由于没有结构相关,所以使用forward部件主要使得RAW相关明显减少了,占总的时钟周期比例也减少了,对控制相关没有什么影响。总之,使用forward部件后,总的时钟周期减少,数据相关减少,流水线的性能得到很大的改善。
(4)观察转移指令在转移成功和转移不成功时候的流水线开销。
在本次实验中转移成功的几率比较大,进行16次转移只有一次转移不成功的,因为系统按照预测成功来执行指令,当判断转移不成功时,系统对trap指令进行的操作被全部作废,转而去执行跳转到的指令。
4.2双精度浮点加法求和代码清单及注释说明
1、双精度浮点加法求和源代码.data
;初始化两个用于相加的一维向量(双精度浮点数),向量长度为20 a:.double 1.9, 2.1, 3.7, 4.6, 5.5, 6.4, 7.3, 8.2, 9.1, 10.1, 11.2,12.3,13.4,14.5,15.6,16.7,17.8,18.9,19.0,20.2 b:.double 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.8, 10.9, 11.8,12.7,13.6,14.5,15.4,16.3,17.2,18.1,19.9,20.8
PrintfFormat:.asciiz“The result is nn%ft%ft%ft%ft%ft%ft%ft%ft%ft%ft%ft%ft%ft%ft%ft%ft%ft%ft%ft%ftnn”
.align
PrintfPar:
.word
PrintfFormat r:
.space
200
;r为保存相加结果的向量空间
.text
.global main main:
addi r1,r0,0;r1计数相加的次数 addui r4,r0,8;r4为常数8
loop:
;循环计算向量相加结果
subi r2,r1,20;r1=20时,跳转到finish beqz r2,finish
multu r3,r1,r4;r3为当前分量相对于向量基址的偏移(每个分量占8B)ld f0,a(r3);取a中第r1个分量 ld f2,b(r3);取b中第r1个分量 addd f4,f0,f2;相加结果放在f4中
sd r(r3),f4;将相加结果放入结果向量r中 addi r1,r1,1;下一分量 j loop
finish:;输出向量相加的结果 addi r14,r0,PrintfPar trap 5
2、运行结果:
5.2程序相关性分析结果
(1)观察程序中出现的数据/控制/结构相关。指出程序中出现上述现象的指令 组合。
产生了53.78%的数据相关。当对当前指令的操作数寄存器进行操作的时候,前几条指令的运算结果还未写回结果寄存器,由此产生数据相关。产生数据相关的指令主要有:
1)addi r1,r0,0 subi r2,r1,20
2)subi r2,r1,20
beqz r2,finish
3)multu r3,r1,r4 ld f0,a(r3)4)ld f2,b(r3)addd f4,f0,f2
无结构相关
产生了4.29%的控制相关。系统按照预测成功来执行指令,执行一条指令后马上将其下一条指令trap读进来。和4.1代码类似。(2)考察增加浮点运算部件对性能的影响。
1个浮点运算部件
3个浮点运算部件
同一段代码执行相同步,但是经过对比发现浮点运算部件的多少对于程序执行效率并没有什么影响,浮点运算部件的多少对统计结果都不造成影响,可能是由于该程序函数中没有连续的浮点运算指令。
(3)考察增加forward 部件对性能的影响。
没有forward部件有forward部件
使用forward部件之后执行相同的代码用的时钟周期比不使用forward部件少了 大约122个时钟周期,使用forward部件使得RAW相关明显减少了,流水线的性能得到很大的改善。
(4)观察转移指令在转移成功和转移不成功时候的流水线开销。
该转移指令不成功的情况较多,21次预测中只有1次转移成功,所以预测顺序取对流水线的性能是有利的。
6、实验总结
本次实验主要是向量求和运算,在本次实验我设计了两个部分,首先是整数向量的加法,整数向量加法的实验进行成功后才在之前实验的基础上略作修改,进行了的双精度浮点加法求和的实验。本次实验没有输入,是直接对固定在代码中的数据进行运算,运算完毕后直接输出结果。编程中遇到的一些问题:在由整形改为双精度浮点运算的时候对双精度运算指令不知道怎么来标识,后来查到所有涉及到double型数据的运算指令,指令代码都要加上d来说明,否则编译是不通过的。
通过本次自己编写汇编程序对浮点数的操作有了更深入的了解,也学会了WINDLX中浮点寄存器和浮点状态寄存器的设置和使用。熟悉了双精度浮点运算的流水线操作过程,以及数据相关,结构相关,控制相关,forward部件对于双精度浮点运算流水线的影响。
第二篇:北邮操作系统第二次实验[模版]
北京邮电大学操作系统实验实验报告
班号:2011211314姓名:oneseven学号:
实验日期: 2013.12.16 实验名称: 操作系统实验
一、实验目的
通过模拟实现内存分配的伙伴算法和请求页式存储管理的几种基本页面置换算法,了解存储技术的特点。掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。
二、实验内容
1.实现一个内存管理的伙伴算法,实现内存块申请时的分配和释放后的回收。
实验准备
用随机函数仿真进程进行内存申请,并且以较为随机的次序进行释放。对其碎片进行统计,当申请分配内存失败时区分实际空间不足和由于碎片而不能满足。
2.设计一个虚拟存储区和内存工作区,并使用下述算法计算访问命中率。
1)最佳置换算法(Optimal)
2)先进先出法(Fisrt In First Out)
3)最近最久未使用(Least Recently Used)4)最不经常使用法(Least Frequently Used)
其中,命中率=1-页面失效次数/页地址流长度。试对上述算法的性能加以较各:页面个数和命中率间的关系;同样情况下的命中率比较。
实验准备
本实验中主要的流程:首先用srand()和rand()函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的命中率。
实验可先从一个具体的例子出发。
(1)通过随机数产生一个指令序列,共2048条指令。指令的地址按下述原则生成: A:50%的指令是顺序执行的
B:25%的指令是均匀分布在前地址部分 C:25%的指令是均匀分布在后地址部分 具体的实施方法是:
A:在[0,1023]的指令地址之间随机选取一起点m B:顺序执行一条指令,即执行地址为m+1的指令
C:在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m’ D:顺序执行一条指令,其地址为m’+1 E:在后地址[m’+2,2047]中随机选取一条指令并执行 F:重复步骤A-E,直到2048次指令(2)将指令序列变换为页地址流 设:页面大小为4K;
用户内存容量4页到32页; 用户虚存容量为32K。
在用户虚存中,按每K存放64条指令排列虚存地址,即2048条指令在虚存中的存放方式为:
第 0 条-第 63 条指令为第0页(对应虚存地址为[0,63])第64条-第127条指令为第1页(对应虚存地址为[64,127])
………………………………
-1- 第1984条-第2047条指令为第31页(对应虚存地址为[1984,2047])按以上方式,用户指令可组成32页。
以此为基础,给出较为一般的情形:仿真内存容量和虚存容量参数变化时的情形。
3.实现内存的slab分配器:
其基本思想是:一次向内核获取整数页,slab根据数据结构的大小进行划分为一个个小的数据结构,当需要时直接从该链表上摘取一个返回应用程序,当应用程序释放时,而非真正释放,只需要该空间放回到链表中,当分散的一页多块又聚集一页时,又会拼成一页,同时判断slab空闲的页数,如果空闲页超过一定的页数,就会向系统释放一定的页数。一个slab分配器只能管理一个指定大小的数据结构分配。
三、项目要求及分析
3.1实现一个内存管理的伙伴算法,实现内存块申请时的分配和释放后的回收。假设系统的可利用内存空间容量为2m个字(地址从0到2m-1),则在开始运行时,整个内存区是一个大小为2m的空闲块,在运行了一段时间之后,被分隔成若干占用块和空闲块。为了在分配时查找方便起见,我们将所有大小相同的空闲块建于一张子表中。每个子表是一个双重链表,这样的链表可能有m+1个,将这m+1个表头指针用向量结构组织成一个表,这就是伙伴系统中的可利用空间表,如图所示:
分配算法:
当用户提出大小为n的内存请求时,首先在可利用表上寻找结点大小与n相匹配的子表,若此子表非空,则将子表中任意一个结点分配之即可;若此子表为空,则需从结点更大的非空子表中去查找,直至找到一个空闲块,则将其中一部分分配给用户,而将剩余部分插入相应的子表中。
若2k-1 < n ≤ 2k-1,又第k+1个子表不空,则只要删除此链表中第一个结点并分配给用户即可;若 2k-2 < n ≤ 2k-1-1,此时由于结点大小为2k-1 的子表为空,则需从结点大小为2k 的子表中取出一块,将其中一半分配给用户,剩余的一半作为一个新结点插入在结点大小为2k-1的子表中,若2k-i-1 < n ≤ 2k-i-1(i为小于是的整数),并且所有结点小于2k的子表均为空,则同样需从结点大小为2k的子表中取出一块,将其中2k-i的一小部分分配给用户,剩余部分分割成若干个结点分别插入在结点大小为2k-1、2k-
2、…、2k-i的子表中。回收算法:
在用户释放不再使用的占用块时,系统需将这新的空闲块插入到可利用空间表中去。这里,同样有一个地址相邻的空闲块归并成大块的问题。但是在伙伴系统中仅考虑互为“伙伴”的两个空闲块的归并。
何谓“伙伴”?如前所述,在分配时经常需要将一个大的空闲块分裂成两个大小相等的存
-2- 储区,这两个由同一大块分裂出来的小块就称之“互为伙伴”。例如:假设p为大小为pow(2,k)的空闲块的初始地址,且p MOD pow(2,k+1)=0,则初始地址为p和p+pow(2,k)的两个空闲块互为伙伴。在伙伴系统中回收空闲块时,只当其伙伴为空闲块时才归并成大块。也就是说,若有两个空闲块,即使大小相同且地址相邻,但不是由同一大块分裂出来的,也不归并在一起。
由此,在回收空闲块时,应首先判别其伙伴是否为空闲块,若否,则只要将释放的空闲块简单插入在相应子表中即可;若是,则需在相应子表中找到其伙伴并删除之,然后再判别合并后的空闲块的伙伴是否是空闲块。依此重复,直到归并所得空闲块的伙伴不是空闲块时,再插入到相应的子表中去。
3.2.设计一个虚拟存储区和内存工作区,并使用下述算法计算访问命中率。
页式虚拟存储器实现的一个难点是设计页面调度(置换)算法,即将新页面调入内存时,如果内存中所有的物理页都已经分配出去,就要按某种策略来废弃某个页面,将其所占据的物理页释放出来,供新页面使用。页面替换算法主要用于如下几个地方:
(1)虚拟存储器中,主存页面(或程序段)的替换。
(2)Cache中的块替换。
(3)虚拟存储器的快慢表中,快表的替换。
(4)虚拟存储器中,用户基地址寄存器的替换。
在虚拟存储器中常用的页面替换算法有如下几种:
(1)最优替换算法,即OPT算法(OPTimal replacement algorithm)。上面介绍的几种页面替换算法主要是以主存储器中页面调度情况的历史信息为依据的,它假设将来主存储器中的页面调度情况与过去一段时间内主存储器中的页面调度情况是相同的。显然,这种假设不总是正确的。最好的算法应该是选择将来最久不被访问的页面作为被替换的页面,这种替换算法的命中率一定是最高的,它就是最优替换算法。
要实现OPT算法,唯一的办法是让程序先执行一遍,记录下实际的页地址流情况。根据这个页地址流才能找出当前要被替换的页面。显然,这样做是不现实的。因此,OPT算法只是一种理想化的算法,然而,它也是一种很有用的算法。实际上,经常把这种算法用来作为评价其它页面替换算法好坏的标准。在其它条件相同的情况下,哪一种页面替换算法的命中率与OPT算法最接近,那么,它就是一种比较好的页面替换算法。(2)先进先出算法,即FIFO算法(First-In First-Out algorithm)。这种算法选择最先调入主存储器的页面作为被替换的页面。它的优点是比较容易实现,能够利用主存储器中页面调度情况的历史信息,但是,没有反映程序的局部性。因为最先调入主存的页面,很可能也是经常要使用的页面。
(3)最久没有使用算法,即LRU算法(Least Recently Used algorithm)。这种算法把近期最久没有被访问过的页面作为被替换的页面。它把LFU算法中要记录数量上的“多”与“少”简化成判断“有”与“无”,因此,实现起来比较容易。
(4)近期最少使用算法,即LFU算法(Least Frequently Used algorithm)。这种算法选择近期最少访问的页面作为被替换的页面。显然,这是一种非常合理的算法,因为到目前为止最少使用的页面,很可能也是将来最少访问的页面。该算法既充分利用了主存中页面调度情况的历史信息,又正确反映了程序的局部性。但是,这种算法实现起来非常困难,它要为每个页面设置一个很长的计数器,并且要选择一个固定的时钟为每个计数器定时计数。在选择被替换页面时,要从所有计数器中找出一个计数值最大的计数器。因此,通常采用如下一种相 -3- 对比较简单的方法。
3.3实现内存的slab分配器
slab描述符和空闲对象管理部分成为 slab的管理部分,也可以称为slab头
slab的头可以放在slab自身,也可以放在 slab 之外。如果slab头放在了slab 之外,那么用户申请obj时,需要首先访问 slab头,slab头提供未使用free obj的指针
然后再访问这个free obj的地址。完成这项工作需要访问2个页块。会带来效率上的损失。slab头始终位于slab 也存在问题,比如一个页面只有4K,objsize = 2K,那么slab 头在slab 上,就意味着,这个4K的页面只能够分配一个obj。造成了内存的浪费。
如果 页数太少,存放的 obj个数少,那么 增加管理开销,同时 内存使用率低,如果页数太多对伙伴内存系统不好,所以需要一定的策略妥协。
这个妥协过程是有calculate_slab_order 这个函数来实现的。从 0阶(即一页)到kmalloc的最高阶 KMALLOC_MAX_ORDER,挨个尝试,由cache_estimate这个函数计算 如果选用order 阶,那么能分配 多少个 obj(num),剩余空间是多少(remainder)。所谓剩余空间,就是除去slab头(如果有的话),除去 obj*num,剩下的边角料空间是多少。需要分成两种情况去计算,分成两种情况的原因,很快就能看到 A)slab头不在slab上,即 flag & CFLGS_OFF_SLAB == 1的时候 这种情况比较简单,由于管理数据完全不在slab 上,size_tslab_size = PAGE_SIZE < 换句话,slab头的大小取决于obj的个数,obj的个数取决于 slab头的大小,四、具体实现 4.1实现一个内存管理的伙伴算法,实现内存块申请时的分配和释放后的回收。 程序: #include #define MIN_MOMORY_SIZE 536870912 //随机产生的最小内存空间 #define WORKTIME 1500 //系统工作时间 #define MAX_REQ_SIZE 268435456 //申请空闲内存分配的最大容量:256M #define MIN_DUE 30 //使用内存块的最短时间 #define MAX_DUE 90 //使用内存块的最长时间 #define OCCUPY_INTERVAL 60 //每次分配的最大间隔 #define USED 1 //内存块被使用 #define UNUSED 0 //内存块未被使用 //内存块链表结点结构 typedefstructbuddy_node { int flag; //标记空间是否被使用 -4- int base; //本块儿内存的基地址 int occupy; //实际使用空间大小 int fragment; //碎片大小 intduetime; //使用时间 structbuddy_node *nextPtr; //指向下一个结点 } Buddy, *BuddyPtr; IndexTable table[INDEX_SIZE];//使用哈希表管理伙伴系统 int ready = 0; //需要分配内存的时刻 intavailSpace; //可分配空间大小 inttotalFragment = 0; //总碎片大小 //函数:添加结点(形参为内存块结点的信息) void insert_node(inti, intinbase, int f, intocc, int frag, int d){ BuddyPtrnewnodePtr = NULL, prePtr = NULL, curPtr = NULL; newnodePtr =(BuddyPtr)malloc(sizeof(Buddy));//分配结点 newnodePtr->base = inbase;newnodePtr->flag = f;newnodePtr->occupy = occ;newnodePtr->fragment = frag;newnodePtr->duetime = d;newnodePtr->nextPtr = NULL; if(table[i].headPtr == NULL) table[i].headPtr = newnodePtr; else { curPtr = table[i].headPtr;prePtr = NULL; //按地址顺序插入内存块 while(curPtr&&curPtr->base } if(prePtr == NULL){ //插在最前 newnodePtr->nextPtr = curPtr; table[i].headPtr = newnodePtr; } else if(curPtr == NULL){ //插在最后 prePtr->nextPtr = newnodePtr; } else { //插在中间 prePtr->nextPtr = newnodePtr;newnodePtr->nextPtr = curPtr; -5- } } } //函数:删除结点 intdelete_node(inti, BuddyPtrdelPtr){ BuddyPtrprePtr = NULL, curPtr = NULL;intbasehold = delPtr->base; curPtr = table[i].headPtr; while(curPtr!= delPtr){ //寻找要删除的结点的位置 prePtr = curPtr;curPtr = curPtr->nextPtr; } if(prePtr == NULL) //要删除的结点在最前 table[i].headPtr = curPtr->nextPtr; else //要删除的结点不在链表的最前 prePtr->nextPtr = curPtr->nextPtr; free(curPtr); //释放结点 return basehold; //返回删除的内存块结点的基地址 } //函数:伙伴系统的分配算法 void buddy_allocate(inttime_slice){ inti, j, size, due;int state = 0; //分配状态:0为未分配,1为已分配 intinbase, basehold;BuddyPtrcurPtr = NULL; if(ready == time_slice){ //到达分配内存的时刻 printf(“Time %d:”, time_slice); size = 1 + rand()% MAX_REQ_SIZE; //申请使用内存的大小 due = MIN_DUE + rand()%(MAX_DUEsize;curPtr->duetime = due + ready; //修改可系统分配空间和碎片大小 availSpace-= table[i].nodesize;totalFragment += curPtr->fragment; state = 1;//标记已分配 break; } //空闲块的大小刚大于申请大小的2倍 else { basehold = delete_node(i, curPtr);//删除较大的空闲块并保留其基地址 inbase = basehold + table[i].nodesize; j = i; //分割空闲块 do { j--;inbase-= table[j].nodesize; //设置要添加内存块结点的基地址 insert_node(j, inbase, UNUSED, 0, 0, 0);//添加较小的空闲块 printf(“A block cut takes placen”); } while(table[j].nodesize / size > 1); //分配 insert_node(j, basehold, USED, size, table[j].nodesizesize; state = 1;//标记已分配 } } //块被占用,查看下一结点 else curPtr = curPtr->nextPtr; } } } printf(“Allocated %d,Fragment %d,Due %dn”, size, totalFragment, ready+due); -7- } else if((availSpace< size)&&((availSpace + totalFragment)>= size))printf(“Allocation failed because of fragment!n”); else printf(“Allocation failed because of no enough unused space!n”); ready +=(1 + rand()% OCCUPY_INTERVAL);//下次需要分配内存的时刻 } } //函数:伙伴系统的回收算法 void buddy_retrieve(inttime_slice){ inti, basehold, dif;int f = 0;intModnext=0;BuddyPtrcurPtr = NULL, todelPtr = NULL; //依次查找,并回收需要回收的块 for(i = 0;i< INDEX_SIZE;i ++){ if(table[i].headPtr){ curPtr = table[i].headPtr; while(curPtr){ if((curPtr->flag == USED)&&(curPtr->duetime == time_slice)){//需要回收 //修改可系统分配空间和碎片大小 availSpace += table[i].nodesize;totalFragment-= curPtr->fragment; //回收为空闲块 curPtr->flag = UNUSED;curPtr->occupy = 0;curPtr->fragment = 0;curPtr->duetime = 0;printf(“Time %d:Retrieve %d,Fragment %dn”, time_slice, table[i].nodesize, totalFragment); } curPtr = curPtr->nextPtr; } } } //合并空闲块 for(i = 0;i< INDEX_SIZE;i ++){ if(table[i].headPtr){ -8- curPtr = table[i].headPtr; while(curPtr&&curPtr->nextPtr){ //将地址连续且都为空闲的块合并后加入下一级的链表中 if(curPtr->flag == UNUSED &&(curPtr->nextPtr)->flag == UNUSED){ dif =(curPtr->nextPtr)->base-curPtr->base; Modnext =((int)(curPtr->nextPtr->base))%(2*table[i].nodesize); if((dif == table[i].nodesize)&&(Modnext==0)){ //删除两个结点 todelPtr = curPtr;curPtr = curPtr->nextPtr;basehold = delete_node(i, todelPtr);todelPtr = curPtr;curPtr = curPtr->nextPtr;delete_node(i, todelPtr);insert_node(i+1, basehold, UNUSED, 0, 0, 0);//添加合并后的结点 printf(“Two blocks mergen”); } else curPtr = curPtr->nextPtr; } else curPtr = curPtr->nextPtr; } } } } //函数:伙伴系统的处理过程 void buddy_system(void){ inttime_slice = 0; //在每个时间片内使用分配算法和回收算法 for(;time_slice< WORKTIME;time_slice ++){ buddy_allocate(time_slice); //分配算法 buddy_retrieve(time_slice); //回收算法 } } int main(intargc, char *argv[]){ intmemory_size; -9- ini_index(); //初始化哈希索引表 srand(time(NULL)); //设置随机数种子 //随机产生需要管理的内存大小:512M ~ 1G memory_size = MIN_MOMORY_SIZE + rand()% MIN_MOMORY_SIZE;printf(“The size of memory is:%dn”, memory_size); int_system(memory_size); //初始化伙伴系统 buddy_system(); //伙伴系统的处理过程 printf(“Time %d:System execution stops and the spaces are all freed.n”, WORKTIME); free_system(); //释放所有结点 system(“pause”); return 0;} 4.2.设计一个虚拟存储区和内存工作区,并使用下述算法计算访问命中率。程序: #include //虚页长 #define clear_period 50 //清零周期 typedefstruct { intpn; //页号 intpfn; // 面号 int counter; // 一个周期内访问该页面的次数 int time; // time为访问时间 }pl_type;pl_typepl[total_vp];//页面结构数组 structpfc_struct{ //页面控制结构 intpn,pfn;structpfc_struct *next;};typedefstructpfc_structpfc_type; -10- pfc_typepfc[total_vp],*freepf_head,*busypf_head,*busypf_tail;intdiseffect,a[total_instruction];int page[total_instruction], offset[total_instruction];/* Name: void Lprintf(void) Achieve: 格式控制 */ void Lprintf(void){ inti,j;printf(“|”); for(i = 1;i<=6;i++) { for(j = 1;j<=9;j++)printf(“-”); if(i!=6)printf(“+”); } printf(“|n”); } /* Name: void initialize(inttotal_pf) Achieve:初始化相关数据结构 */ void initialize(inttotal_pf){ inti;diseffect=0; for(i=0;i { pl[i].pn=i;pl[i].pfn=INVALID; //置页面控制结构中的页号,页面为空 pl[i].counter=0;pl[i].time=-1;//页面控制结构中的访问次数为0,时间为-1 } for(i=1;i { pfc[i-1 ].next=&pfc[i];pfc[i-1].pfn=i-1;//建立pfc[i-1]和pfc[i]之间的连接 } pfc[total_pf-1].next=NUL;pfc[total_pf-1].pfn=total_pf-1; freepf_head=&pfc[0]; //页面队列的头指针为pfc[0] } /* -11- Name:void FIFO(inttotal_pf) Achieve:先进先出法(Fisrt In First Out)*/ void FIFO(inttotal_pf){ inti,j;pfc_type *p;//中间变量 initialize(total_pf);//初始化相关页面控制用数据结构 busypf_head=busypf_tail=NULL;//忙页面队列头,队列尾链接 for(i=0;i if(pl[page[i]].pfn==INVALID) //页面失效 { diseffect+=1;//失效次数 if(freepf_head==NULL)//无空闲页面 { p=busypf_head->next; pl[busypf_head->pn].pfn=INVALID; freepf_head=busypf_head;//释放忙页面队列的第一个页面 freepf_head->next=NULL;//表明还是缺页*/ busypf_head=p; } p=freepf_head->next; freepf_head->pn=page[i]; pl[page[i]].pfn=freepf_head->pfn; freepf_head->next=NULL;//使busy的尾为null if(busypf_tail==NULL) { busypf_tail=busypf_head=freepf_head; } else { busypf_tail->next=freepf_head; busypf_tail=freepf_head; } freepf_head=p; } } printf(“%6.3f”,1-(float)diseffect/320);} /* Name: void LRU(inttotal_pf) Achieve: 最近最久未使用(Least Recently Used)*/ -12- void LRU(inttotal_pf){ intmin,minj,i,j,present_time;//minj为最小值下标 initialize(total_pf);present_time=0;for(i=0;i if(pl[page[i]].pfn==INVALID)//页面失效 { diseffect++; if(freepf_head==NULL)//无空闲页面 { min=32767;//设置最大值 for(j=0;j { if(min>pl[j].time&&pl[j].pfn!=INVALID) { min=pl[j].time; minj=j; } } freepf_head=&pfc[pl[minj].pfn]; //空出一个单元 pl[minj].pfn=INVALID; pl[minj].time=0; freepf_head->next=NULL; } pl[page[i]].pfn=freepf_head->pfn;//有空闲页面,改为有效 pl[page[i]].time=present_time; freepf_head=freepf_head->next;//减少一个free 页面 } else { pl[page[i]].time=present_time;//命中则增加该单元的访问次数 present_time++; } } printf(“%6.3f”,1-(float)diseffect/320);} /* Name:void OPT(inttotal_pf) Achieve:最佳置换算法(Optimal)*/ void OPT(inttotal_pf){ -13- inti,j, max,maxpage,d,dist[total_vp];pfc_type *t;initialize(total_pf);for(i=0;i if(pl[page[i]].pfn==INVALID) /*页面失效*/ { diseffect++; if(freepf_head==NULL) /*无空闲页面*/ { for(j=0;j { if(pl[j].pfn!=INVALID) dist[j]=32767; else dist[j]=0; } for(j=0;j { if((pl[j].pfn!=INVALID)&&(dist[j]==32767)) { dist[j]=j; } } max=0; for(j=0;j if(max { max=dist[j]; maxpage=j; } freepf_head=&pfc[pl[maxpage].pfn]; freepf_head->next=NULL; pl[maxpage].pfn=INVALID; } pl[page[i]].pfn=freepf_head->pfn; freepf_head=freepf_head->next; } } printf(“%6.3f”,1-(float)diseffect/320);} /* Name: vodi LFU(inttotal_pf) Achieve:最不经常使用法(Least Frequently Used) -14- */ void LFU(inttotal_pf) { inti,j,min,minpage;pfc_type *t;initialize(total_pf);for(i=0;i if(pl[page[i]].pfn==INVALID)//页面失效 { diseffect++; if(freepf_head==NULL)//无空闲页面 { min=32767; //获取counter的使用用频率最小的内存 for(j=0;j { if(min>pl[j].counter&&pl[j].pfn!=INVALID) { min=pl[j].counter; minpage=j; } } freepf_head=&pfc[pl[minpage].pfn]; pl[minpage].pfn=INVALID; pl[minpage].counter=0; freepf_head->next=NULL; } pl[page[i]].pfn=freepf_head->pfn;//有空闲页面,改为有效 pl[page[i]].counter++; freepf_head=freepf_head->next;//减少一个free 页面 } else { pl[page[i]].counter; pl[page[i]].counter=pl[page[i]].counter+1; } } printf(“%6.3f”,1-(float)diseffect/320);} int main(int){ intS,i; -15- srand((int)getpid()); for(i=0;i { S=(int)rand()%320; a[i]=S; //任选一指令访问点 a[i+1]=a[i]+1;//顺序执行一条指令 a[i+2]=(int)rand()%a[i+1];//执行前地址指令m' a[i+3]=a[i+2]+1;//顺序执行一条指令 a[i+4]=(int)rand()%(319-a[i+2]-1)+a[i+2]+2;//执行后地址指令 } for(i=0;i { page[i]=a[i]/10; offset[i]=a[i]%10;} printf(“FrametOPTtFIFOtLRUtLFU n”);for(i=4;i<=32;i++)//用户内存工作区从4个页面到32个页面 { printf(“%dt”,i);OPT(i);printf(“t”); FIFO(i);printf(“t”); LRU(i); printf(“t”); LFU(i); printf(“n”);} system(“pause”);return 0;} 4.3 实现内存的slab分配器 程序: #include -17- } 五、调试运行结果 -18- 5.1 实现一个内存管理的伙伴算法 5.2设计一个虚拟存储区和内存工作区,并使用下述算法计算访问命中率。 -19- 5.3 实现内存的slab分配器 六、所遇问题及解决方法 1.在写第一个程序的时候,对树的合并在之前的学习中,有比较多的学习,数据结构中此程序有详细的介绍,因此在编写这个程序的时候,比较顺利的完成了要求。但要求中需要产生一些随机的数据,重新对随机仿真函数进行回顾,最后较为顺利的完成了程序。2.第二个程序,要求随机产生一些数据,对srand()和rand()函数定义和产生指令序列,在进一步的学习中,完成了这些函数,仿真内存容量和虚存容量参数变化时的情形,对此不太熟悉,四个算法对要求较高,在完成算法的学习后,完成了程序。 3.第三个程序因不太理解其要求,上网搜寻了一些代码,但对其最后的结果依然没有得出,为此询问了同学,但不知是否正确。 -20- 微波仿真实验报告 学 院:电子工程学院 班 级 学 号: 姓 名: 班内序号: 微波仿真课作业1 1.了解ADS Schematic的使用和设置 2.在Schematic里,分别仿真理想电容20pF和理想电感5nH,仿真频率为(1Hz-100GHz),观察仿真结果,并分析原因。20pF理想电容 仿真图 原因分析:史密斯原图下半部分是容性,随频率增加,电容由开路点变到短路点,通高频,阻低频。5nH理想电感 仿真图 原因分析:史密斯原图上半部分是感性,随频率增加,电容由短路点变到开路点,阻高频,通低频。 3. Linecalc的使用 a)计算中心频率1GHz时,FR4基片的50Ω微带线的宽度 宽度为:2.9112mm b)计算中心频率1GHz时,FR4基片的50Ω共面波导(CPW)的横截面尺寸(中心信号线宽度与接地板之间的距离) 横截面尺寸为:W=171.355mm,G=5mm,L=63.5mm 4.基于FR4基板,仿真一段特性阻抗为50Ω四分之一波长开路CPW线的性能参数,中心工作频率为1GHz。仿真频段(500MHz-3GHz),观察Smith圆图变化,分析原因。 仿真图 仿真图分析: 1、1GHz时,为四分之一波长,开路阻抗变换后变为短路,2GHz时为二分之一波长,所以仍为开路; 2、由于损耗,因此反射系数变小,所以等反射系数圆的半径也在变小。 5.基于FR4基板,仿真一段特性阻抗为50Ω四分之一波长短路CPW线的性能参数,中心工作频率为1GHz。仿真频段(500MHz-3GHz),观察Smith圆图变化,分别求出500MHz和2GHz的输入阻抗,分析变化原因。 仿真图 仿真图分析: 1、1GHz时,为四分之一波长,短路阻抗变换后变为开路,2GHz时为二分之一波长,所以仍为短路; 2、由于损耗,因此反射系数变小,所以等反射系数圆的半径也在变小。分别求出500MHz和2GHz的输入阻抗: 500MHz:Z0*(0.003+j0.001)2GHz:Z0*(0.012-j0.005) 6.分别用理想传输线和在FR4基片上的微带传输线,仿真一段特性阻抗为50Ω四分之一波长开路线的性能参数,工作频率为1GHz。仿真频段(500MHz-3GHz),观察Smith圆图变化,分别求出500MHz和2GHz的输入阻抗,分析变化原因。 仿真图 分别求出500MHz和2GHz的输入阻抗: 微带线 500MHz:Z0*(0.003-j0.992)2GHz:Z0*(32.830-j1.603)理想传输线 500MHz:Z0*(1.000E-10-j1.000)2GHz:Z0*(2.000E10-j2.000E5) 分析:因为相对于理想传输线,微带线有损耗产生误差,反射系数一直变小。 扩展仿真频率(500MHz-50GHz),分析曲线变化原因。 分析:对于理想传输线,反射系数不变,而对于微带线,由于存在损耗,反射系数会一直变小,因此其反射系数圆的半径在一直变小。 7.分别用理想传输线和在FR4基片上的微带传输线,仿真一段特性阻抗为50Ω四分之一波长短路线的性能参数,工作频率为1GHz。仿真频段(500MHz-3GHz),观察Smith圆图变化,分别求出500MHz和2GHz的输入阻抗,分析变化原因。 仿真图 分别求出500MHz和2GHz的输入阻抗: 微带线 500MHz:Z0*(0.009+j1.003)2GHz:Z0*(0.031+j0.002)理想传输线 500MHz:Z0*(5.551E-17+j1.000)2GHz:Z0*(8.284E-18-j1.000E-5) 分析:因为相对于理想传输线,微带线有损耗产生误差,反射系数一直变小。 扩展仿真频率(500MHz-50GHz),分析曲线变化原因。 分析:对于理想传输线,反射系数不变,而对于微带线,由于存在损耗,反射系数会一直变小,因此其反射系数圆的半径在一直变小。 8.分别用理想传输线和在FR4基片上的微带传输线,仿真一段特性阻抗为50Ω二分之一波长开路线的性能参数,工作频率为1GHz。仿真频段(500MHz-3GHz),观察Smith圆图变化,分别求出500MHz和2GHz的输入阻抗,分析变化原因。 仿真图 分别求出500MHz和2GHz的输入阻抗: 微带线 500MHz:Z0*(0.016+j0.006)2GHz:Z0*(16.430-j0.798)理想传输线 500MHz:Z0*(5.000E-11-j6.123E-17)2GHz:Z0*(2.000E10-j2.000E5) 分析:因为相对于理想传输线,微带线有损耗产生误差,反射系数一直变小。扩展仿真频率(500MHz-50GHz),分析曲线变化原因。 分析:对于理想传输线,反射系数不变,而对于微带线,由于存在损耗,反射系数会一直变小,因此其反射系数圆的半径在一直变小。 9.分别用理想传输线和在FR4基片上的微带传输线,仿真一段特性阻抗为50Ω二分之一波长短路线的性能参数,工作频率为1GHz。仿真频段(500MHz-3GHz),观察Smith圆图变化,分别求出500MHz和2GHz的输入阻抗,分析变化原因。 仿真图 分别求出500MHz和2GHz的输入阻抗: 微带线 500MHz:Z0*(55.044-j19.301)2GHz:Z0*(0.061+j0.004)理想传输线 500MHz:Z0*(-1.000+j1.633E16)2GHz:Z0*(8.284E-18-j1.000E-5) 分析:因为相对于理想传输线,微带线有损耗产生误差,反射系数一直变小。 扩展仿真频率(500MHz-50GHz),分析曲线变化原因。 分析:对于理想传输线,反射系数不变,而对于微带线,由于存在损耗,反射系数会一直变小,因此其反射系数圆的半径在一直变小。微波测量实验中测得的几个史密斯圆图 四分之一开路微带线 四分之一短路微带线 二分之一开路微带线 二分之一短路微带线 微波仿真课作业2 1. 用一段理想四分之一波长阻抗变换器匹配10欧姆到50欧姆,仿真S参数,给出-20dB带宽特性,工作频率为1GHz。计算得,22.36欧姆 仿真S参数 计算分析:由图计算-20dB带宽为 1071-929=142MHz;且如仿真图所示,在1GHz处回波损耗最低,实现阻抗匹配。2. 用一段FR4基片上四分之一波长阻抗变换器匹配10欧姆到50欧姆,仿真S参数,给出-20dB带宽特性,工作频率为1GHz,比较分析题1和题2的结果。 仿真S参数 由图计算-20dB带宽为1065-921=144MHz。 比较分析题1和题2的结果 分析,微带线与理想传输线之间有一定的误差: 1、如图所示可以看出微带线情况下,回波损耗最低点稍微偏离1GHz; 2、-20dB带宽为144MHz大于理想传输线时的142MHz; 3、1GHz阻抗匹配时,微带线时的回波损耗大于理想传输线。 3. 设计一个3节二项式匹配变换器,用于匹配10欧姆到50欧姆的传输线,中心频率是1GHz,该电路在FR4基片上用微带线实现,设计这个匹配变换器并计算 m0.1的带宽,给出回波损耗和插入损耗与频率的关系曲线,比较分析题2和题3的结果。 根据所学的理论知识,先依题意算出三节匹配微带线的阻抗值,然后通过LineCalc计算出相应微带线的长和宽,修改电路图中MLIN的相关参数。 Z1=40.89Ω W=4.198480mm L=40.404500mm Z2=22.36Ω W=9.620970mm L=38.833700mm Z3=12.23Ω W=19.83080mm L=37.648400mm 插入损耗 m0.1的带宽,即为-20dB带宽,由图计算得1325-680=645MHz; 比较分析题2和题3的结果,3节二项式匹配变换器匹配误差更大: 1、如图所示可以看出3节二项式匹配变换器匹配时回波损耗最低点明显偏离1GHz; 2、-20dB带宽为645MHz大于微带线情况; 3、但1GHz阻抗匹配时,3节二项式匹配变换器时的回波损耗小于微带线情况。 4. 题3中,若用3节切比雪夫匹配变换器实现,比较同样情况下的带宽,回波损耗和插入损耗与频率的关系曲线,比较分析题3和题4结果。 根据所学的知识可以计算出切比雪夫变换器匹配的三个微带线的阻抗,然后通过LineCalc计算出相应微带线的长和宽,修改电路图中MLIN的相关参数。Z1=35.94Ω W=4.948710mm L=40.0910mm Z2=22.11Ω W=9.6519mm L=38.8278mm Z3=13.55Ω W=17.57710mm L=37.8241mm 仿真图 插入损耗 m0.1的带宽,即为-20dB带宽,由图计算得1485-534=951MHz; 比较分析题3和题4的结果,即二项式匹配变换器与切比雪夫匹配变换器: 1、切比雪夫匹配变换器的带宽显著增加; 2、切比雪夫匹配变换器回波损耗具有等波纹特性; 3、两者的插入损耗差别不明显。 5. 对于一个负载阻抗ZL=60-j80欧姆,利用Smith Chart Utility功能,分别设计并联短路单枝节和并联开路单枝节匹配,并将Smith Chart Utility给出的匹配结果在Schematic中仿真,给出1-3GHz的回波损耗与频率的关系曲线,并给出m0.1的带宽。并联短路单枝节 计算并联短路单枝节-20dB带宽:1053-952=101MHz 并联开路单枝节 计算并联开路单枝节-20dB带宽:1023-975=48MHz 6. 并联双枝节匹配电路,并联双枝节为开路,枝节之间相距λ/8,中心工作频率为2GHz,利用理想传输线,给出1-3GHz的回波损耗与频率的关系曲线,并给出m0.1的带宽。并联双枝节, 枝节之间相距λ/8,中心工作频率为2GHz 仿真 如图在2GHz匹配 计算-20dB带宽:2012-1988=24MHz 大三上课程学习心得 英语篇: 关于六级: 四级可以不背单词,但是六级不看单词一定会死的很惨。单词书我觉得新东方的那本不错,风靡全国。 六级真题还是真的值得买的,因为六级一次能过的人不少,但是仅考一次的人很少。真题也不宜做的太早,考前一个月开始就足够了。 关于选课: 大三上有4门英语可选。科技文阅读、情景、写作和口语。 科技文阅读就是一个200人大教室,老师在讲台上放PPT。据说内容很麻烦,我听他们期末背单词那叫一个痛苦。 情景英语是在教一的语音室上课,30人小教室,上课内容都是结合教材的内容讨论事情。 口语和写作不是很清楚情况,希望别人来介绍一下。 得分的话,以前之所以情景得分最高,是因为情景班集中了四级分数高分段的同学。所以实力决定一切。从我们07级开始就是大家任意选四门课了。 情景英语篇: 小班教学的好处就是老师和同学比较熟悉。上课都是老师出一个题目,同学们分组讨论。建议口语不好的同学慎选,从小开始就是学哑巴英语的同学勿选! 期末很简单,和平时一样,讨论几个话题,但是机器会录好音,老师会回去听。10分钟结束。 这门课很训练听力和口语。 其余几门期待其他同学现身说法。 毛邓三篇: 可以肯定的是,上一年出过的大题,今年铁定不会出现在大题里。想得高分一个字:背。06级学长编写的《毛邓三葵花宝典》风靡全校,实乃居家旅行必备资料啊。 另外,不要迷恋重点,重点只是一个传说。我们07级考的论述题是论分配制度和论外交。外交在06级学长编写的“葵花宝典”中涉及很少。 操作系统篇: 关于老师: 上课的几位老师,我认为最好的还是孟祥武老师,十分风趣,课堂很活跃。不过不要光听他讲笑话了,要学习老师的思路。叶文老师的语速较快,每节课信息量很大,我自己也很难跟上老师的脚步,建议要多复习。 关于教材及内容: 操作系统,选用的是英文教材。PPT也是英文,期末出题也是英文,不过大题都可以用中文答题。书名既然叫《操作系统概念》,本书最多的还是讲授了一下操作系统中的各种概念。不过在这些零零碎碎的概念中间,还夹杂了几个非常重要的算法或者应用: 银行家算法、信号量、实存的EAT、虚存的EAT、页置换算法(FCFS,LRU等等)、进程调度算法及效率(吞吐量、平均等待时间、平均周转时间)。 以上罗列的都是很重点的东西,每年大题都会从这里出。 关于平时: 由于选用的教材没有中文版,平时大家就得辛苦的看很厚很厚的英文书。英文书的表达很地道,但是我更愿意在重点的概念旁边加一下中文的注解,哪怕是这段文字的直译,这样非常有利于复习。 作业一定要自己做,虽然流传着答案,但我更希望答案是用来做完后订正的,而不是把自己当做抄写员,把现成的答案抄给给老师看。 老师应该都会布置实验。孟祥武老师布置的都是与各种算法相关的实验,而叶文老师则是布置的是针对Linux操作系统进行观察、自己动手的实验。一句话,要想学到东西,实验自己动手。 关于考试特点: 得大题者得天下,以上我说的重点都掌握了,你就稳拿60%以上的分数。对于书中各个概念的考察,就集中在填空、选择、简答题中间。对于书中概念的复习,可以参照叶文老师给的大纲,见附件: 计算机网络篇: 关于老师: 我们07级无缘聆听王晓茹老师的教诲啊,08级的孩子们估计能遇见王晓茹老师吧。在我听过课的两位老师中,我觉得蒋砚军老师讲的真不错。 关于教材: 强烈推荐计算机网络(第四版 潘爱民译),一本黑皮的书。英文原版可以不买。 教材中心和学林书店都是主要卖英文版教材,我可以告诉大家,我英文版教材翻了20页就再也没有碰过了。这门课PPT是用英文写的,老师用中文教,期末出题都是中文的。操作系统之所以推荐看英文教材,一方面是没有对应版本的中文翻译教材,另一方面是期末出题是英文。 毕竟看计网英文版教材很费脑子,大三最好还是省点力气吧。何况,复习的时候,计网中文版教材都是抢手货。 关于平时: 计网东西很多,你要想平时一点都不付出就想得高分,不啻于痴人说梦。像我上面提到的,读中文教材效率很高。这门课概念之多,我认为仅次于汇编与接口。最好每章都有总结,复习的时候也就不会手忙脚乱了。 计网我们07级只有两个实验,一个是数据链路层的滑动窗口协议,另一个是用Wireshark等协议分析软件抓包。 第一个实验以小组来做,其实一个人足矣。书上的伪码基本和C语言差不多,不过细微之处还得自己研究一下。 第二个实验更简单,强烈推荐独自完成。Wireshark抓包实验,有助于对网络层和传输层协议进行更加深刻的理解。 作业当然也有参考答案,还是一句话,最好自己独立完成。 关于考试: 我对于这门考试有些怨念,操作系统是得大题者得天下,而计网考试的大题仅占占卷面分数的40%以下。也就是说,你要把各种概念都复习到才有可能得高分。 即使大题不重要,我也说说重点吧: 路由算法(链路状态算法、距离矢量算法)、网桥逆向学习法和flooding算法、漏桶与令牌桶算法、TCP发送窗口算法、IP与TCP头、IP数据报切分、滑动窗口协议的效率、路由器路由表选择。 另外,我们07级讲到了应用层,而以往各届的试卷都没涉及到应用层,所以没有复习到应用层的人,对于这次的试卷怨念更深了。 论坛上流传的那份计网重点还是有相当大的参考价值,不过不完全匹配。 总之,复习的时候要对照PPT,把各种基本的概念都了解清楚,对于我提到的重点完全掌握,我觉得这门课取得高分不难。 通信原理篇: 北邮不愧是信息界的黄埔军校,每个专业都会学这门课。不过咱们比信通院学的要简单不少。 教材选择的还不错,非常贴近咱们学的深度。 关于考试: 期中考试是开卷,大家尽情发挥主观能动性吧。 期末的卷子流传极少,我们今年看到居然是01级学长做过的卷子。不过参考价值还很大。通原这门课也是大题万变不离其宗。期末主要考数字部分。 期末重点: 卷积码,循环码和生成矩阵、监督矩阵,各种数字调制的波形,部分响应系统等等。 我这里有罗红老师给的期末范围: 关于平时: 作业要比期末难,如果作业自己能完全做对,书上该掌握的都掌握了,期末一定没问题。 编译原理篇: 这门课很抽象,跟硬件、操作系统都有一定联系。跟大二下学的形式语言与自动机的内容紧密联系。内容繁琐,过程很有套路但是很复杂。期末是雷打不动的六道大题。 关于平时: 编译这门课的重头戏在语法分析上,我们讲了近一个月的语法分析。而且语法分析作业也很多,那章的作业平均10页作业纸。由于课程很抽象,建议大家还是自己弄明白再做作业吧。 我们07级布置了两个实验,三个程序,分别是语法分析器两个、词法分析器。强烈建议语法分析器自己编写,通过编写这两个程序,会对语法分析那一章有更加深刻的印象。 关于考试: 期中我们考了4道大题,其中最后一道就是语法分析。这是我们考过的卷子和答案: 期末考试是6道大题。我们今年语法分析这一章考了45分。后面的内容考察了访问链与控制栈、程序块划分、语法制导定义、参数传递机制、类型表达式。卷子请到精华区找找。 汇编语言与接口技术篇: 关于教材: 老师推荐的那本实在不怎么样,建议再买两本,05级用过的两本——《IBM-32位机汇编语言》和《接口技术》(本书强烈推荐)。 老师是按自己课件内容讲的,和书的内容不完全一致,接口部分建议是新书旧书联合起来看。 关于平时: 课件只是指引作用,详细内容还得看书,尤其新旧两本书联合起来看。 作业布置很少,非常不利于督促大家学习。建议买一本微机原理与接口技术的练习册做一做。 接口实验有5个,最好准备好了再去实验室。 另外,汇编的程序也要好好编。 关于考试: 如果计算机学院要评N大名捕,我第一个提名这门课。内容多,书不好,作业少,听不会,看不懂。 由于本人考的比较差,自认没有实力点评此课,期待大牛不吝赐教。 这门课勉强算全校统考,不过咱们院比其他院难一些,卷子有70%一样。 北邮《成本会计》阶段作业三 一、多项选择题(共5道小题,共50.0分) 1.在生产多种产品的车间,期末制造费用的分配方法,常见的有(ABCD)法。A.生产工时比例法 B.生产工人工资比例法 C.机器工时比例法 D.计划分配率 2.下列方法属于辅助生产费用分配方法的有(ABCD)。 A.交互分配法 B.直接分配法 C.计划(成本)分配法 D.代数分配法 3.简化分批法的适用范围和应用条件是(ABC)。 A.同一月份投产的产品批数很多 B.月末完工产品的批数较少 C.各月间接费用水平相差不多 D.各月生产费用水平相差不多 二、单项选择题(共5道小题,共50.0分) 1.采用交互分配法分配辅助生产费用时,第一次交互分配是在(A)之间进行的。A.各受益辅助生产车间 B.辅助生产车间以外受益单位 C.各受益基本生产车间 D.各受益企业管理部门 2分配制造费用的生产工时比例法的公式为(A)。 1.2.3.分批法的成本计算对象是(C)。 A.产品品种 B.产品类别 C.产品批别 D.产品生产步骤第三篇:北邮微波仿真实验1
第四篇:北邮计算机大三上课程学习心得
第五篇:北邮《成本会计》阶段作业三