6.2 筆試真題 & 詳解
真題 1:
1,ISR,APC,DPC 的定義。
2,Windows/ Linux 下系統(tǒng)創(chuàng)建進(jìn)程的步驟。
3,xtoa 函數(shù),輸入是兩個(gè)整數(shù),原數(shù)字,數(shù)制,輸出是字符串。
4,實(shí)現(xiàn)內(nèi)存拷貝的 C 函數(shù)。
5,比較兩個(gè)二叉樹(shù)結(jié)構(gòu)是否一樣。
6,C++中 volatile 關(guān)鍵字的作用。
7,一個(gè)程序找錯(cuò)誤。
8,根據(jù)上述錯(cuò)誤給程序員發(fā)郵件提出改進(jìn)意見(jiàn)。
9,最喜歡的一首唐詩(shī),原因。
10,當(dāng)代最崇拜的人,原因。
真題 2:
1、選擇下面哪一個(gè)是時(shí)序電路。四個(gè)選項(xiàng)分別是 ADD XOR Latch D-Flop。
2、問(wèn)系統(tǒng)工作的最大時(shí)鐘頻率是否跟 Hold time 有關(guān),并說(shuō)明理由。
3、畫(huà)出下面兩個(gè)代碼綜合出來(lái)的電路圖,并說(shuō)明原因。 a:if(aflag)
begin opt1 <= a; opt2 <= b; end esle begin opt1 <= c; opt2 <= d; end
always@(posedge clk)
out_data <= opt1 +opt2; b: if(aflag)
out_data <= a+b; else
out_data <= c+d;
4、用圖表說(shuō)明下列腳本命令。
a: set_multicycle_path 4 -setup -from dffa/cp -to dffb/d b: set_multicycle_path 4 -setup -from dffa/cp -to dffb/d set_multicycle_path 4 -hold -from dffa/cp -to dffb/d
//這三個(gè)命令不一定完全正確,憑記憶大概是這個(gè)樣子的
5、5 分頻,用 Verilog HDL/VHDL 實(shí)現(xiàn)。
6、timescale 1ns/1ps 與`timescale 1ns/50ps 分別代表的意義以及區(qū)別。
7.分別用 shell 以及 perl(或任一你熟知的腳本語(yǔ)言)將當(dāng)前目錄下所有".c"文件后綴改 成".cc"。
真題 3:
1:windows API 里面用于線(xiàn)程同步的有哪些?
答案:共有 12 個(gè) API
1)、臨界區(qū)共有五個(gè) API。
(1)InitializeCriticalSection
此函數(shù)用于設(shè)臵臨界區(qū)對(duì)象, 即對(duì)臨界區(qū)對(duì)象初始化。該函數(shù)必須在執(zhí)行 EnterCriticalSection 前調(diào)用。單個(gè)進(jìn)程的線(xiàn)程可以為互斥同步使用臨界區(qū)對(duì)象。進(jìn)程負(fù) 責(zé)分配臨界區(qū)對(duì)象使用的內(nèi)存,可以通過(guò)對(duì) CRITICAL_SECTION 類(lèi)型變量的定義和使用 來(lái)實(shí)現(xiàn)。
(2)EnterCriticalSection
此函數(shù)用于等待指定的臨界區(qū)對(duì)象的所有權(quán)。授予調(diào)用線(xiàn)程所有權(quán)后,該函數(shù)返回, 臨界區(qū)對(duì)象在單個(gè)進(jìn)程的各線(xiàn)程內(nèi)強(qiáng)制互斥同步。在線(xiàn)程擁有臨界區(qū)對(duì)象以后,對(duì)同一 個(gè)臨界區(qū)對(duì)象應(yīng)調(diào)用
nterCriticalSection 函數(shù),防止發(fā)生死鎖。在退出臨界區(qū)后用 LeaveCriticalSection 函數(shù)使其他線(xiàn)程可以進(jìn)入臨界區(qū)。
(3)TryEnterCriticalSection
此函數(shù)用沒(méi)有阻塞的方式試圖進(jìn)入一個(gè)臨界區(qū)。若函數(shù)調(diào)用成功,則進(jìn)行調(diào)用的線(xiàn) 程擁有對(duì)臨界區(qū)的所有權(quán),否則立即返回。
(4)LeaveCriticalSection
此函數(shù)用于釋放對(duì)臨 界區(qū)對(duì)象的所有權(quán)。 每次線(xiàn)程對(duì)同一個(gè)對(duì)象執(zhí)行 EnterCriticalSection 或 TryEnterCriticalSection 都必須調(diào)用 LeaveCriticalSection 函數(shù)。
(5)DeleteCriticalSection 此函數(shù)用于刪除一個(gè)臨界區(qū)對(duì)象,釋放所有與不再為自己所控制的臨界區(qū)對(duì)象有關(guān)的資源。一個(gè)臨界區(qū)對(duì)象被刪除, 就不能再對(duì)其調(diào)用函數(shù) EnterCriticalSection ,函數(shù)TryEnterCriticalSection 和函數(shù) LeaveCriticalSection 了。
2)、互斥和信號(hào)量共有 7 個(gè) API。
(1)CreateMutex
此函數(shù)用于創(chuàng)建命名或未命名的互斥對(duì)象。這些互斥對(duì)象用于進(jìn)程同步,當(dāng)互斥對(duì) 象不為任何線(xiàn)程擁有時(shí)才處于信號(hào)態(tài),否則將處于非信號(hào)態(tài)。若要線(xiàn)程釋放其所有權(quán), 則線(xiàn)程在每次互斥對(duì)象處于非信號(hào)態(tài)時(shí)都調(diào)用函數(shù) ReleaseMutex。當(dāng)不再需要互斥對(duì)象 時(shí)可以使用函數(shù) CloseHandle 來(lái)關(guān)閉互斥對(duì)象。當(dāng)所有互斥對(duì)象的打開(kāi)句柄都關(guān)閉時(shí), 就刪除互斥對(duì)象。
(2)OpenMutex
用于返回存在的已命名互斥對(duì)象的句柄。該函數(shù)允許多個(gè)進(jìn)程打開(kāi)同一個(gè)互斥對(duì)象 的句柄。該函數(shù)的調(diào)用一定要在函數(shù) CreateMutex 創(chuàng)建互斥對(duì)象之后,當(dāng)不需要句柄時(shí) 可以調(diào)用 CloseHandle 函數(shù)。
(3)ReleaseMutex
此函數(shù)用于釋放互斥對(duì)象。若函數(shù)調(diào)用成功,互斥對(duì)象處于信號(hào)態(tài)。 (4)CreateSemaphore 此函數(shù)用于創(chuàng)建已命名或未命名的信號(hào)量對(duì)象,信號(hào)量用計(jì)數(shù)器實(shí)現(xiàn)同步。每次取信號(hào)量時(shí)(可利用函數(shù)WaitForSingleObject 來(lái)。,信號(hào)量計(jì)數(shù)器遞減;每次ReleaseSemaphore 釋放信號(hào)量值時(shí),信號(hào)量計(jì)數(shù)器遞增。計(jì)數(shù)永遠(yuǎn)不會(huì)小于 0 或大 于在 lSemMaxCount 參數(shù)中定義的值。
(5)OpenSemaphore
用于打開(kāi)一個(gè)已經(jīng)存在的命名的信號(hào)量對(duì)象。該信號(hào)量必須是 CreateSemaphore 創(chuàng) 建的。如果不再需要時(shí),可以用函數(shù) CloseHandle 關(guān)閉返回的句柄。
(6)WaitForSingleObject
此函數(shù)僅當(dāng)在參數(shù)列表中指定的對(duì)象處于信號(hào)態(tài)或超過(guò)了超時(shí)間隔時(shí),該函數(shù)才返 回。
(7)ReleaseSemaphore
用來(lái)遞增信號(hào)量的計(jì)數(shù)。對(duì)于 CreateSemaphore 函數(shù)創(chuàng)建的對(duì)象使用,計(jì)數(shù)可以達(dá) 到設(shè)定的最大計(jì)數(shù)值。
2: windows 內(nèi)核內(nèi)存分為 paged memory 和 nonpaged memory,請(qǐng)問(wèn)有什么區(qū)別? 答案:paged memory:是指可以分頁(yè)的內(nèi)存,可以交換到硬盤(pán)文件上。Nonpaged memory:不可分頁(yè),也就是不能交換到硬盤(pán)文件上。有些內(nèi)存,比如驅(qū)動(dòng)程序,內(nèi)核代碼是不允許交換出去的,應(yīng)該常駐內(nèi)存,就使用 nonpaged memory。
3:請(qǐng)問(wèn)什么情況下,cache 中只放指令(數(shù)據(jù)直接從存儲(chǔ)器存。┍ cache 中放數(shù)據(jù)和指令的效率高?
答案:計(jì)算密集型 cache 中只放指令(數(shù)據(jù)直接從存儲(chǔ)器存。┍ cache 中放數(shù)據(jù) 和指令的效率高,可以充分利用指令的局部原理。
4:RISC 和 CISC 等其他指令集相比有哪些優(yōu)點(diǎn),請(qǐng)至少舉出 5 個(gè)。
答案:(1)尋址方式少且簡(jiǎn)單,一般為 2—3 種,最多不超過(guò) 4 種,絕不出現(xiàn)存儲(chǔ)器間接尋址方式。
(2)指令集中的指令數(shù)目一般少于 100 種,指令格式一般少于 4 種。
(3)指令功能簡(jiǎn)單,控制器多采用硬布線(xiàn)方式,以期更快的執(zhí)行速度。
(4)平均而言,所有指令的執(zhí)行時(shí)間為一個(gè)處理時(shí)鐘周期。
(5)指令格式中用于指派整數(shù)寄存器的個(gè)數(shù)不少于 32 個(gè),用于指派浮點(diǎn)數(shù)寄存器的個(gè)數(shù)不少于 16 個(gè)。
(6)強(qiáng)調(diào)通用寄存器資源的優(yōu)化使用。
(7)支持指令流水并強(qiáng)調(diào)指令流水的優(yōu)化使用。
5:選擇題:
如果兩個(gè)節(jié)點(diǎn) x,y,preorder 遍歷,x 在 y 之前,postorder 遍歷,x 在y 之后,請(qǐng)問(wèn) x,y 的關(guān)系為:
A.x 是 y 的左兄弟。
B x 是 y 的右兄弟。
C.x 是 y 的祖先。 D x 是 y 的后裔。 答案:C。
6:請(qǐng)問(wèn)下面程序如果運(yùn)行會(huì)出現(xiàn)什么結(jié)果?如果有錯(cuò)誤請(qǐng)指出并改正。
include <stdlib.h> include <string.h> class mystring{ public: mystring(){ m_str=NULL;
}
mystring(mystring& str){ if(m_str!=NULL){
delete []m_str;
}
m_str=new char[strlen(str.m_str)]; strcpy(m_str,str.m_str);
}
mystring & operator=(const char *str){ if(m_str!=NULL){
delete []m_str;
}
m_str=new char[strlen(str)+1]; strcpy(m_str,str);
}
~mystring(){ if(m_str!=NULL){ delete m_str;
}
}
private:
char *m_str;
};
int main(){ mystring str1; str1="hello world"; mystring str2; str2=str1;
mystring str3=str2;
return 0;
}
答案:程序運(yùn)行會(huì)出現(xiàn)內(nèi)存釋放錯(cuò)誤,錯(cuò)誤共有四處,分別在下面改正的代碼中標(biāo)出。
include <stdlib.h> include <string.h>
class mystring{ public: mystring(){ m_str=NULL; } mystring(mystring& str){
/*if(m_str!=NULL){ delete []m_str; }*/
//錯(cuò)誤 1,因?yàn)?m_str 沒(méi)有被初始化,所以此處可能為 NULL,也可能不為 NULL, 如 果 不 為 null , 則 會(huì) 出 錯(cuò) , 因 為 m_str 是 一 個(gè) 隨 機(jī) 的 值 。 m_str=new
char[strlen(str.m_str)+1];
//錯(cuò)誤 2:長(zhǎng)度應(yīng)該+1 strcpy(m_str,str.m_str); }
mystring & operator=(mystring& str){
//錯(cuò)誤 3 : 缺少賦值重載函數(shù) if(m_str!=NULL){ delete []m_str; } m_str=new
har[strlen(str.m_str)+1];
//錯(cuò)誤 2:長(zhǎng)度應(yīng)該+1 strcpy(m_str,str.m_str); } mystring & operator=(const char
*str){ if(m_str!=NULL){ delete []m_str; } m_str=new char[strlen(str)+1]; strcpy(m_str,str); }
~mystring(){ if(m_str!=NULL){ delete []m_str;
//錯(cuò)誤 4:析構(gòu)函數(shù)中,應(yīng)該析構(gòu)數(shù)組 } } private: char *m_str; }; int main(){ mystring str1;
str1="hello world"; mystring str2; str2=str1; mystring str3=str2; return 0; }。
7:100 個(gè)乒乓球取勝之道,A,B兩個(gè)人輪流拿,A先拿,一次只能拿[1,5]個(gè), 獲勝者為拿到最后一個(gè)球的人。請(qǐng)問(wèn) A 第一次該拿幾個(gè)?以后又該怎么拿,才能夠確 保獲勝?
答案:A 先拿 4 個(gè),然后 B 拿,設(shè) B 拿 x 個(gè),則每次 A 拿 6-x 個(gè)即可。
8:有編號(hào) 1-50 的人,依次排列,然后單號(hào)出列,然后剩下的人重新編號(hào),單號(hào) 出列,依次類(lèi)推,最后剩下一個(gè)人,請(qǐng)問(wèn)這個(gè)人原來(lái)編號(hào)是多少號(hào)?如果是每一次雙號(hào) 出列,請(qǐng)問(wèn)這個(gè)人原來(lái)編號(hào)是多少?
答案:?jiǎn)翁?hào)出列:32 號(hào),雙號(hào)出列:1 號(hào)。