- 相关推荐
2006年11月ATI(下属AMD)笔试题及答案
ATI笔试题共有8个题目: 1:windows API里面用于线程同步的有哪些?
答案:共有12个API
1) 临界区共有五个API
(1)InitializeCriticalSection
此函数用于设置临界区对象,即对临界区对象初始化。该函数必须在执行EnterCriticalSection前调用。单个进程的线程可以为互斥同步使用临界区对象。进程负责分配临界区对象使用的内存,可以通过对CRITICAL_SECTION类型变量的定义和使用来实现。
(2)EnterCriticalSection
此函数用于等待指定的临界区对象的所有权。授予调用线程所有权后,该函数返回,临界区对象在单个进程的各线程内强制互斥同步。在线程拥有临界区对象以后,对同一个临界区对象应调用EnterCriticalSection函数,防止发生死锁。在退出临界区后用LeaveCriticalSe- ction函数使其他线程可以进入临界区。
(3)TryEnterCriticalSection
此函数用没有阻塞的方式试图进入一个临界区。若函数调用成功,则进行调用的线程拥有对临界区的所有权,否则立即返回。
(4)LeaveCriticalSection
此函数用于释放对临界区对象的所有权。每次线程对同一个对象执行EnterCriticalSection或TryEnterCriticalSection都必须调用
LeaveCriticalSection函数。
(5)DeleteCriticalSection
此函数用于删除一个临界区对象,释放所有与不再为自己所控制的临界区对象有关的资源。一个临界区对象被删除,就不能再对其调用函数EnterCriticalSection,函数TryEnterCriticalSection和函数LeaveCriticalSection了。
2) 互斥和信号量共有7个API
(1) CreateMutex
此函数用于创建命名或未命名的互斥对象。这些互斥对象用于进程同步,当互斥对象不为任何线程拥有时才处于信号态,否则将处于非信号态。若要线程释放其所有权,则线程在每次互斥对象处于非信号态时都调用函数ReleaseMutex。当不再需要互斥对象时可以使用函数CloseHandle来关闭互斥对象。当所有互斥对象的打开句柄都关闭时,就删除互斥对象。
(2)OpenMutex
用于返回存在的已命名互斥对象的句柄。该函数允许多个进程打开同一个互斥对象的句柄。该函数的调用一定要在函数CreateMutex创建互斥对象之后,当不需要句柄时可以调用CloseHandle函数。
(3)ReleaseMutex
此函数用于释放互斥对象。若函数调用成功,互斥对象处于信号态。
(4)CreateSemaphore
此函数用于创建已命名或未命名的信号量对象,信号量用计数器实现同步。每次取信号量时(可利用函数WaitForSingleObject来取),信号量计数器递减;每次ReleaseSemaphore释放信号量值时,信号量计数器递增。计数永远不会小于0或大于在lSemMaxCount参数中定义的值。
(5)OpenSemaphore
用于打开一个已经存在的命名的信号量对象。该信号量必须是函数CreateSemaphore创建的。如果不再需要时,可以用函数CloseHandle关闭返回的句柄。
(6)WaitForSingleObject
此函数仅当在参数列表中指定的对象处于信号态或超过了超时间隔时,该函数才返回。
(7)ReleaseSemaphore
用来递增信号量的计数。对于CreateSemaphore函数创建的对象使用,计数可以达到设定的最大计数值。
2: windows内核内存分为paged memory和 nonpaged memory,请问有什么区别?
答案:
paged memory:是指可以分页的内存,可以交换到硬盘文件上。
Nonpaged memory:不可分页,也就是不能交换到硬盘文件上。有些内存,比如驱动程序,内核代码是不允许交换出去的,应该常驻内存,就使用nonpaged memory。
3:请问什么情况下,cache中只放指令(数据直接从存储器存取)比cache中放数据和指令的效率高?
答案:计算密集型 cache中只放指令(数据直接从存储器存取)比cache中放数据和指令的效率高,可以充分利用指令的局部原理。
4:RISC和CISC等其他指令集相比有哪些优点,请至少举出5个。
答案:
(1)寻址方式少且简单,一般为2—3种,最多不超过4种,绝不出现存储器间接寻址方式。
(2)指令集中的指令数目一般少于100种,指令格式一般少于4种。
(3)指令功能简单,控制器多采用硬布线方式,以期更快的执行速度。
(4)平均而言,所有指令的执行时间为一个处理时钟周期。
(5)指令格式中用于指派整数寄存器的个数不少于32个,用于指派浮点数寄存器的个数不少于16个。
(6)强调通用寄存器资源的优化使用。
(7)支持指令流水并强调指令流水的优化使用。
5:选择题:如果两个节点x,y,preorder遍历,x在y之前,postorder遍历,x在y之后,请问x,y的关系为:
A x是y的左兄弟 B x是y的右兄弟
C x是y的祖先 D x是y的后裔
答案:C
6:请问下面程序如果运行会出现什么结果?如果有错误请指出并改正。
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;
}
~
答案:
程序运行会出现内存释放错误
错误共有四处,分别在下面改正的代码中标出。
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:长度应该+1 strcpy(m_str,str.m_str); }
mystring & operator=(mystring& str){
//错误3:缺少赋值重载函数 if(m_str!=NULL){ delete []m_str; } m_str=new char[strlen(str.m_str)+1];
//错误2:长度应该+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:析构函数中,应该析构数组 } } 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拿,设B拿x个,则每次A拿6-x个即可。
8:有编号1-50的人,依次排列,然后单号出列,然后剩下的人重新编号,单号出列,依次类推,最后剩下一个人,请问这个人原来编号是多少号?如果是每一次双号出列,请问这个人原来编号是多少?
答案:单号出列:32号
双号出列:1号
【11月ATI(下属AMD)笔试题及答案 】相关文章:
海尔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
面试的经典试题及答案08-03