- 相關(guān)推薦
2006年11月ATI(下屬AMD)筆試題及答案
ATI筆試題共有8個題目: 1:windows API里面用于線程同步的有哪些?
答案:共有12個API
1) 臨界區(qū)共有五個API
(1)InitializeCriticalSection
此函數(shù)用于設(shè)置臨界區(qū)對象,即對臨界區(qū)對象初始化。該函數(shù)必須在執(zhí)行EnterCriticalSection前調(diào)用。單個進程的線程可以為互斥同步使用臨界區(qū)對象。進程負責分配臨界區(qū)對象使用的內(nèi)存,可以通過對CRITICAL_SECTION類型變量的定義和使用來實現(xiàn)。
(2)EnterCriticalSection
此函數(shù)用于等待指定的臨界區(qū)對象的所有權(quán)。授予調(diào)用線程所有權(quán)后,該函數(shù)返回,臨界區(qū)對象在單個進程的各線程內(nèi)強制互斥同步。在線程擁有臨界區(qū)對象以后,對同一個臨界區(qū)對象應(yīng)調(diào)用EnterCriticalSection函數(shù),防止發(fā)生死鎖。在退出臨界區(qū)后用LeaveCriticalSe- ction函數(shù)使其他線程可以進入臨界區(qū)。
(3)TryEnterCriticalSection
此函數(shù)用沒有阻塞的方式試圖進入一個臨界區(qū)。若函數(shù)調(diào)用成功,則進行調(diào)用的線程擁有對臨界區(qū)的所有權(quán),否則立即返回。
(4)LeaveCriticalSection
此函數(shù)用于釋放對臨界區(qū)對象的所有權(quán)。每次線程對同一個對象執(zhí)行EnterCriticalSection或TryEnterCriticalSection都必須調(diào)用
LeaveCriticalSection函數(shù)。
(5)DeleteCriticalSection
此函數(shù)用于刪除一個臨界區(qū)對象,釋放所有與不再為自己所控制的臨界區(qū)對象有關(guān)的資源。一個臨界區(qū)對象被刪除,就不能再對其調(diào)用函數(shù)EnterCriticalSection,函數(shù)TryEnterCriticalSection和函數(shù)LeaveCriticalSection了。
2) 互斥和信號量共有7個API
(1) CreateMutex
此函數(shù)用于創(chuàng)建命名或未命名的互斥對象。這些互斥對象用于進程同步,當互斥對象不為任何線程擁有時才處于信號態(tài),否則將處于非信號態(tài)。若要線程釋放其所有權(quán),則線程在每次互斥對象處于非信號態(tài)時都調(diào)用函數(shù)ReleaseMutex。當不再需要互斥對象時可以使用函數(shù)CloseHandle來關(guān)閉互斥對象。當所有互斥對象的打開句柄都關(guān)閉時,就刪除互斥對象。
(2)OpenMutex
用于返回存在的已命名互斥對象的句柄。該函數(shù)允許多個進程打開同一個互斥對象的句柄。該函數(shù)的調(diào)用一定要在函數(shù)CreateMutex創(chuàng)建互斥對象之后,當不需要句柄時可以調(diào)用CloseHandle函數(shù)。
(3)ReleaseMutex
此函數(shù)用于釋放互斥對象。若函數(shù)調(diào)用成功,互斥對象處于信號態(tài)。
(4)CreateSemaphore
此函數(shù)用于創(chuàng)建已命名或未命名的信號量對象,信號量用計數(shù)器實現(xiàn)同步。每次取信號量時(可利用函數(shù)WaitForSingleObject來取),信號量計數(shù)器遞減;每次ReleaseSemaphore釋放信號量值時,信號量計數(shù)器遞增。計數(shù)永遠不會小于0或大于在lSemMaxCount參數(shù)中定義的值。
(5)OpenSemaphore
用于打開一個已經(jīng)存在的命名的信號量對象。該信號量必須是函數(shù)CreateSemaphore創(chuàng)建的。如果不再需要時,可以用函數(shù)CloseHandle關(guān)閉返回的句柄。
(6)WaitForSingleObject
此函數(shù)僅當在參數(shù)列表中指定的對象處于信號態(tài)或超過了超時間隔時,該函數(shù)才返回。
(7)ReleaseSemaphore
用來遞增信號量的計數(shù)。對于CreateSemaphore函數(shù)創(chuàng)建的對象使用,計數(shù)可以達到設(shè)定的最大計數(shù)值。
2: windows內(nèi)核內(nèi)存分為paged memory和 nonpaged memory,請問有什么區(qū)別?
答案:
paged memory:是指可以分頁的內(nèi)存,可以交換到硬盤文件上。
Nonpaged memory:不可分頁,也就是不能交換到硬盤文件上。有些內(nèi)存,比如驅(qū)動程序,內(nèi)核代碼是不允許交換出去的,應(yīng)該常駐內(nèi)存,就使用nonpaged memory。
3:請問什么情況下,cache中只放指令(數(shù)據(jù)直接從存儲器存取)比cache中放數(shù)據(jù)和指令的效率高?
答案:計算密集型 cache中只放指令(數(shù)據(jù)直接從存儲器存。┍萩ache中放數(shù)據(jù)和指令的效率高,可以充分利用指令的局部原理。
4:RISC和CISC等其他指令集相比有哪些優(yōu)點,請至少舉出5個。
答案:
(1)尋址方式少且簡單,一般為2—3種,最多不超過4種,絕不出現(xiàn)存儲器間接尋址方式。
(2)指令集中的指令數(shù)目一般少于100種,指令格式一般少于4種。
(3)指令功能簡單,控制器多采用硬布線方式,以期更快的執(zhí)行速度。
(4)平均而言,所有指令的執(zhí)行時間為一個處理時鐘周期。
(5)指令格式中用于指派整數(shù)寄存器的個數(shù)不少于32個,用于指派浮點數(shù)寄存器的個數(shù)不少于16個。
(6)強調(diào)通用寄存器資源的優(yōu)化使用。
(7)支持指令流水并強調(diào)指令流水的優(yōu)化使用。
5:選擇題:如果兩個節(jié)點x,y,preorder遍歷,x在y之前,postorder遍歷,x在y之后,請問x,y的關(guān)系為:
A x是y的左兄弟 B x是y的右兄弟
C x是y的祖先 D x是y的后裔
答案:C
6:請問下面程序如果運行會出現(xiàn)什么結(jié)果?如果有錯誤請指出并改正。
include
include
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;
}
~
答案:
程序運行會出現(xiàn)內(nèi)存釋放錯誤
錯誤共有四處,分別在下面改正的代碼中標出。
include
include
class mystring{ public: mystring(){ m_str=NULL; } mystring(mystring& str){
/*if(m_str!=NULL){ delete []m_str; }*/
//錯誤1,因為m_str沒有被初始化,所以此處可能為NULL,也可能不為NULL,如果不為null,則會出錯,因為m_str是一個隨機的值。 m_str=new char[strlen(str.m_str)+1];
//錯誤2:長度應(yīng)該+1 strcpy(m_str,str.m_str); }
mystring & operator=(mystring& str){
//錯誤3:缺少賦值重載函數(shù) if(m_str!=NULL){ delete []m_str; } m_str=new char[strlen(str.m_str)+1];
//錯誤2:長度應(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;
//錯誤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個乒乓球取勝之道,A,B兩個人輪流拿,A先拿,一次只能拿[1,5]個,獲勝者為拿到最后一個球的人。請問A第一次該拿幾個?以后又該怎么拿,才能夠確保獲勝?
答案:A先拿4個,然后B拿,設(shè)B拿x個,則每次A拿6-x個即可。
8:有編號1-50的人,依次排列,然后單號出列,然后剩下的人重新編號,單號出列,依次類推,最后剩下一個人,請問這個人原來編號是多少號?如果是每一次雙號出列,請問這個人原來編號是多少?
答案:單號出列:32號
雙號出列:1號
【11月ATI(下屬AMD)筆試題及答案 】相關(guān)文章:
海爾04年筆試題及答案07-31
2006年12月AMD筆試題07-31
AMD GPU ASIC Design Engineer筆試題08-09
迅雷2011.10.21筆試題08-10
中興2015筆試題08-02
oracle筆試題及答案08-16
2017銀行試題及答案08-04
java筆試題及答案07-28
面試的經(jīng)典試題及答案08-03