界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问 ;然而,对齐的内存访问仅需要一次访问。 34. int i=10, j=10, k=3; k*=i+j; k最后的值是? 答案:60,此题考察优先级,实际写成: k*=(i+j);,赋值运算符优先级最低 35. 对数据库的一张表进行操作,同时要对另一张表进行操作,如何实现 答案:将操作多个表的操作放入到事务中进行处理 36. TCP/IP 建立连接的过程 (3-way shake) 答案:在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状 态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个 SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1) ,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 37. ICMP是什么协议,处于哪一层 答案:Internet控制报文协议,处于网络层(IP层) 38. 触发器怎么工作的 答案:触发器主要是通过事件进行触发而被执行的,当对某一表进行诸如UPDATE、 INSERT 、 DELETE 这些操作时,数据库就会自动执行触发器所定义的SQL 语句,从而确保对数 据的处理必须符合由这些SQL 语句所定义的规则。 39. winsock建立连接的主要实现步骤 答案:服务器端:socker()建立套接字,绑定(bind)并监听(listen),用accept() 等待客户端连接。 客户端:socker()建立套接字,连接(connect)服务器,连接上后使用send()和recv( ),在套接字上写读数据,直至数据交换完毕,closesocket()关闭套接字。 服务器端:accept()发现有客户端连接,建立一个新的套接字,自身重新开始等待连 接。该新产生的套接字使用send()和recv()写读数据,直至数据交换完毕,closesock et()关闭套接字。 40. 动态连接库的两种方式 答案:调用一个DLL中的函数有两种方法: 1.载入时动态链接(load-time dynamic linking),模块非常明确调用某个导出函数 ,使得他们就像本地函数一样。这需要链接时链接那些函数所在DLL的导入库,导入库向 系统提供了载入DLL时所需的信息及DLL函数定位。 2.运行时动态链接(run-time dynamic linking),运行时可以通过LoadLibrary或Loa dLibraryEx函数载入DLL。DLL载入后,模块可以通过调用GetProcAddress获取DLL函数的 出口地址,然后就可以通过返回的函数指针调用DLL函数了。如此即可避免导入库文件了 。 41. 一个32位的机器,该机器的指针是多少位 答案:指针是多少位只要看地址总线的位数就行了。80386以后的机子都是32的数据总线。所以指针的位数就是4个字节了。 42. 关键字volatile有什么含意?并举例? 答案:提示编译器对象的值可能在编译器未监测到的情况下改变。如多线程、多CPU,变量的值可能被其它线程或运行在其它CUP的代码更改。 43. c和c++中的struct有什么不同? 答案:c和c++中struct的主要区别是c中的struct不可以含有成员函数,而c++中的struct可以。c++中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而class默认为private 44. 列举几种进程的同步机制,并比较其优缺点。 答案:原子操作 信号量机制 自旋锁 管程,会合,分布式系统 45. 进程之间通信的途径 答案:共享存储系统 消息传递系统 命名管道 46. 进程死锁的原因 答案:资源竞争及进程推进顺序非法 47. 死锁的4个必要条件 答案:互斥、请求保持、不可剥夺、环路 48. 操作系统中进程调度策略有哪几种? 答案:FCFS(先来先服务),优先级,时间片轮转,多级反馈 49. 类的静态成员和非静态成员有何区别? 答案:类的静态成员每个类只有一个,非静态成员每个对象一个 50. 纯虚函数如何定义?使用时应注意什么? 答案:virtual void f()=0; 是接口,子类必须要实现 51. 数组和链表的区别 答案:数组:数据顺序存储,固定大小 链表:数据可以随机存储,大小可动态改变 52. 线程与进程的区别和联系 线程是否具有相同的堆栈 dll是否有独立的堆栈 答案:进程是死的,只是一些资源的集合,真正的程序执行都是线程来完成的,程序启动的时候操作系统就帮你创建了一个主线程。 每个线程有自己的堆栈。 DLL中有没有独立的堆栈,这个问题不好回答,或者说这个问题本身是否有问题。因为DLL中的代码是被某些线程所执行,只有线程拥有堆栈,如果DLL中的代码是EXE中的线程所调用,那么这个时候是不是说这个DLL没有自己独立的堆栈?如果DLL中的代码是由DLL自己创建的线程所执行,那么是不是说DLL有独立的堆栈? 以上讲的是堆栈,如果对于堆来说,每个DLL有自己的堆,所以如果是从DLL中动态分配的内存,最好是从DLL中删除,如果你从DLL中分配内存,然后在EXE中,或者另外一个DLL中删除,很有可能导致程序崩溃
|