第一篇:北郵大三計算機體系結構實驗三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基片上用微帶線實現,設計這個匹配變換器并計算 ?m?0.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 插入損耗 ?m?0.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 仿真圖 插入損耗 ?m?0.1的帶寬,即為-20dB帶寬,由圖計算得1485-534=951MHz; 比較分析題3和題4的結果,即二項式匹配變換器與切比雪夫匹配變換器: 1、切比雪夫匹配變換器的帶寬顯著增加; 2、切比雪夫匹配變換器回波損耗具有等波紋特性; 3、兩者的插入損耗差別不明顯。 5. 對于一個負載阻抗ZL=60-j80歐姆,利用Smith Chart Utility功能,分別設計并聯短路單枝節和并聯開路單枝節匹配,并將Smith Chart Utility給出的匹配結果在Schematic中仿真,給出1-3GHz的回波損耗與頻率的關系曲線,并給出?m?0.1的帶寬。并聯短路單枝節 計算并聯短路單枝節-20dB帶寬:1053-952=101MHz 并聯開路單枝節 計算并聯開路單枝節-20dB帶寬:1023-975=48MHz 6. 并聯雙枝節匹配電路,并聯雙枝節為開路,枝節之間相距λ/8,中心工作頻率為2GHz,利用理想傳輸線,給出1-3GHz的回波損耗與頻率的關系曲線,并給出?m?0.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
第四篇:北郵計算機大三上課程學習心得
第五篇:北郵《成本會計》階段作業三