c++服务器笔试题编程_linux C/C++服务器后台开发一百多道面试题总结

一、编程语言

1.根据熟悉的语言,谈谈两种语言的区别?

① C 和 C++的特点与区别?

C 语言特点:

1) 作为一种面向过程的结构化语言,易于调试和维护;

2) 表现能力和处理能力极强,可以直接访问内存的物理地址;

3) C 语言实现了对硬件的编程操作,也适合于应用软件的开发;

4) C 语言还具有效率高,可移植性强等特点。

C++语言特点:

1) 在 C 语言的基础上进行扩充和完善,使 C++兼容了 C 语言的面向过程特点,又成为了一种面向对象的程序设计语言;

2) 可以使用抽象数据类型进行基于对象的编程;

3) 可以使用多继承、多态进行面向对象的编程;

4) 可以担负起以模版为特征的泛型化编程。

②浅谈下C/C++和PHP语言的区别:

1)PHP弱类型语言,一种脚本语言,对数据的类型不要求过多,较多的应用于Web应用开发,现在好多互联网开发公司的主流web后台开发语言,主要框架为mvc模型,如smarty,yaf,升级的PHP7速度较快,对服务器的压力要小很多,在新浪微博已经有应用,对比很明显。

2)C/C++开发语言,C语言更偏向硬件底层开发,C++语言是目前为止我认为语法内容最多的一种语言。C/C++在执行速度上要快很多,毕竟其他类型的语言大都是C开发的,更多应用于网络编程和嵌入式编程

2.volatile是干啥用的,(必须将cpu的寄存器缓存机制回答的很透彻),使用实例有哪些?(重点)

3.static const等等的用法,(能说出越多越好)(重点)

4.extern c 作用

5.指针和引用的区别

6. 关于静态内存分配和动态内存分配的区别及过程

7. 头文件中的 ifndef/define/endif 干什么用?

8. 宏定义求两个元素的最小值

9. 分别设置和清除一个整数的第三位?

10. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒

11. 预处理器标识#error的目的是什么?

12. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?

13. 用变量a给出下面的定义

14. 中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字 __interrupt

15. memcpy函数的实现

16. Strcpy函数实现

17. strcat函数的实现

18.strncat实现

19. strcmp函数实现

20. strncmp实现

21.strlen函数实现

22. strpbrk函数实现

23. strstr函数实现

24. string实现(注意:赋值构造,operator=是关键)

25. C语言同意一些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么?

26. 用struct关键字与class关键定义类以及继承的区别

27.派生类与虚函数概述

28. 虚函数与纯虚函数区别

29.深拷贝与浅拷贝

30. stl各容器的实现原理(必考)

31.哪些库函数属于高危函数,为什么?

32.STL有7种主要容器:vector,list,deque,map,multimap,set,multiset

33.你如何理解MVC。简单举例来说明其应用。

34.C++特点是什么,多态实现机制?(面试问过)多态作用?两个必要条件?

35. 多重继承有什么问题? 怎样消除多重继承中的二义性?

36.求两个数的乘积和商数,该作用由宏定义来实现

37.什么叫静态关联,什么叫动态关联

38.什么叫智能指针?常用的智能指针有哪些?智能指针的实现?

39.枚举与#define 宏的区别

40.介绍一下函数的重载

41.派生新类的过程要经历三个步骤

42.面向对象的三个基本特征,并简单叙述之?

43.多态性体现都有哪些?动态绑定怎么实现?

44.虚函数,虚函数表里面内存如何分配?

45. 纯虚函数如何定义?含有纯虚函数的类称为什么?为什么析构函数要定义成虚函数?

46. C++中哪些不能是虚函数?

47. 类型转换有哪些?各适用什么环境?dynamic_cast转换失败时,会出现什么情况(对指针,返回NULL.对引用,抛出bad_cast异常)?

48. 如何判断一段程序是由C 编译程序还是由C++编译程序编译的?

49. 为什么要用static_cast转换而不用c语言中的转换?

50. 操作符重载(+操作符),具体如何去定义?

51. 内存对齐的原则?

52. 内联函数与宏定义的区别?

53. 动态分配对象和静态分配对象的区别?

54. explicit是干什么用的 ?

55. 内存溢出有那些因素?

56. new与malloc的区别,delete和free的区别?

57. 必须使用初始化列表初始化数据成员的情况

58.深入谈谈堆和栈

59.内存的静态分配和动态分配的区别?

60. 模版怎么实现?模版作用?

61. 多重类构造和析构的顺序

62. 迭代器删除元素的会发生什么?

63. 静态成员函数和数据成员有什么意义?

64.sizeof一个类求大小(注意成员变量,函数,虚函数,继承等等对大小的影响)

65.请用C/C++实现字符串反转(不调用库函数)”abc”类型的

66.写一个函数,将字符串翻转,翻转方式如下:“I am a student”反转成“student a am I”,不借助任何库函数

67.析构函数可以抛出异常吗?为什么不能抛出异常?除了资源泄露,还有其他需考虑的因素吗?

68. 拷贝构造函数作用及用途?什么时候需要自定义拷贝构造函数?

69. 100万个32位整数,如何最快找到中位数。能保证每个数是唯一的,如何实现O(N)算法?

70. OFFSETOF(s, m)的宏定义,s是结构类型,m是s的成员,求m在s中的偏移量。

71. C++虚函数是如何实现的?

72. C++的虚函数有什么作用?

73.动态链接库的两种使用方法及特点?

二、服务器编程

1.多线程和多进程的区别(重点 必须从cpu调度,上下文切换,数据共享,多核cup利用率,资源占用,等等各方面回答,然后有一个问题必须会被问到:哪些东西是一个线程私有的?答案中必须包含寄存器,否则悲催)!

1)进程数据是分开的:共享复杂,需要用IPC,同步简单;多线程共享进程数据:共享简单,同步复杂

2)进程创建销毁、切换复杂,速度慢 ;线程创建销毁、切换简单,速度快

3)进程占用内存多, CPU利用率低;线程占用内存少, CPU利用率高

4)进程编程简单,调试简单;线程 编程复杂,调试复杂

5)进程间不会相互影响 ;线程一个线程挂掉将导致整个进程挂掉

6)进程适应于多核、多机分布;线程适用于多核

线程所私有的:

线程id、寄存器的值、栈、线程的优先级和调度策略、线程的私有数据、信号屏蔽字、errno变量、

2. 多线程锁的种类有哪些?

3. 自旋锁和互斥锁的区别?

4.进程间通信和线程间通信

5.多线程程序架构,线程数量应该如何设置?

6.什么是原子操作,gcc提供的原子操作原语,使用这些原语如何实现读写锁?

7.网络编程设计模式,reactor/proactor/半同步半异步模式?

8.有一个计数器,多个线程都需要更新,会遇到什么问题,原因是什么,应该如何做?如何优化?

9.如果select返回可读,结果只读到0字节,什么情况?

10. connect可能会长时间阻塞,怎么解决?

11.keepalive 是什么东西?如何使用?

12.socket什么情况下可读?

13.udp调用connect有什么作用?

14. socket编程,如果client断电了,服务器如何快速知道?

三、liunx操作系统

1.熟练netstat tcpdump ipcs ipcrm

netstat:检查网络状态,tcpdump:截获数据包,ipcs:检查共享内存,ipcrm:解除共享内存

2.共享内存段被映射进进程空间之后,存在于进程空间的什么位置?共享内存段最大限制是多少?

将一块内存映射到两个或者多个进程地址空间。通过指针访问该共享内存区。一般通过mmap将文件映射到进程地址共享区。

存在于进程数据段,最大限制是0x2000000Byte

3.进程内存空间分布情况

4.ELF是什么?其大小与程序中全局变量的是否初始化有什么关系(注意未初始化的数据放在bss段)

5.动态链接和静态链接的区别?

6.32位系统一个进程最多有多少堆内存

7.写一个c程序辨别系统是64位 or 32位

8.写一个c程序辨别系统是大端or小端字节序

9.信号:列出常见的信号,信号怎么处理?

10.i++ 是否原子操作?并解释为什么?

11.说出你所知道的各类linux系统的各类同步机制(重点),什么是死锁?如何避免死锁(每个技术面试官必问)

12、exit() _exit()的区别?

13、如何实现守护进程?

14、linux的任务调度机制是什么?

15、标准库函数和系统调用的区别?

16、系统如何将一个信号通知到进程?

17. fork()一子进程程后父进程的全局变量能不能使用?

18. 请画出socket通信连接过程

19. 请用socket消息队列实现“同步非阻塞”和“异步阻塞”两种模式,并指出两者的差别和优劣

四、网络编程

1. TCP头大小,包含字段?三次握手,四次断开描述过程,都有些什么状态。状态变迁图。TCP/IP收发缓冲区(2次)

头部大小是20字节,包含数据如下:

三次握手:

四次释放:

状态变迁图:

收发缓冲区:

2. 使用udp和tcp进程网络传输,为什么tcp能保证包是发送顺序,而 udp无法保证?

3. epoll哪些触发模式,有啥区别?(必须非常详尽的解释水平触发和边缘触发的区别,以及边缘触发在编程中要做哪些更多的确认)

4. tcp与udp的区别(必问)为什么TCP要叫做数据流?

5.流量控制和拥塞控制的实现机制

6. 滑动窗口的实现机制

7.epoll和select的区别?

8. 网络中,如果客户端突然掉线或者重启,服务器端怎么样才能立刻知道?

9. TTL是什么?有什么用处,通常那些工具会用到它?ping? traceroute? ifconfig? netstat?

10.linux的五种IO模式/异步模式.

1)同步阻塞I/O

2)同步非阻塞I/O

3)同步I/O复用模型

4) 同步信号驱动I/O

5) 异步I/O模型

11. 请说出http协议的优缺点.

12.NAT类型,UDP穿透原理。

13.大规模连接上来,并发模型怎么设计

五、算法和数据结构

1.给定一个单向链表(长度未知),请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素。实现这个算法,并为可能出现的特例情况安排好处理措施。“倒数第m个元素”是这样规定的:当m=0时,链表的最后一个元素将被返回。

解决问题方法思路如下:

方法一、如果我们知道链表的长度n,查找倒数第m个元素,也就是查找正序的第(n - m)个元素(这里的序号只是为了分析,可能跟题目不一定正确的符合)。那么这样来说就简单很多。首先遍历链表得到链表长度,然后重新遍历一次,查找正数第(n-m)个元素。时间复杂度大约是O(2n)。

方法二、我们是不是可以提供一个辅助存储空间,是的我们在遍历到链表结束的时候可以回溯到倒数第m个元素。比如用一个支持随机访问的容器记录链表每一个节点的地址。那么这样的就可以只遍历一次链表就能得到结果。时间复杂度大约是O(n),但是我们是用空间换取时间的,辅助存储空间的大小由m决定,如果m过大也是不可取的。

方法三、头结点指针为当前指针,尾节点指针为拖后指针。开始的时候当前指针和拖后指针初始化为链表的头结点,首先我们让当前指针遍历到第m个元素,拖后指针不变;然后同步更新当前指针和拖后指针;直到当前指针为链表结尾。这样我们就能保证当前指针和拖尾指针之间的距离是m。

代码如下:Node* FindMToLastNode(Node* pHead, int m) {

// 查找到第m个元素

Node* pCurrent = pHead;

for (int i = 0; i < m; ++i)

{

if (pCurrent)

{

pCurrent = pCurrent->next;

}

else

{

return NULL;

}

}

Node* pFind = pHead;

while (pCurrent) {

pFind = pFind->next;

pCurrent = pCurrent->next;

}

return pFind;

}

2. 给定一个单向链表(长度未知),请遍历一次就找到中间的指针,假设该链表存储在只读存储器,不能被修改

3. 将一个数组生成二叉排序树

4. 查找数组中第k大的数字?

5. 红黑树的定义和解释?B树的基本性质?

6. 常见的加密算法?

7. https?

8.有一个IP库,给你一个IP,如何能够快速的从中查找到对应的IP段?不用数据库如何实现?要求省空间

9.简述一致性hash算法。

10.描述一种hash table的实现方法

11、各类树结构的实现和应用

12、hash,任何一个技术面试官必问(例如为什么一般hashtable的桶数会取一个素数?如何有效避免hash结果值的碰撞)

13.什么是平衡二叉树?

14.数组和链表的优缺点

15.最小堆插入,删除编程实现

16. 4G的long型整数中找到一个最大的,如何做?

17. 有千万个string在内存怎么高速查找,插入和删除?

18.100亿个数,求最大的1万个数,并说出算法的时间复杂度

19.设计一个洗牌的算法,并说出算法的时间复杂度。

20.请分别用递归和非递归方法,先序遍历二叉树

21.其他各种排序方法

22.哈希表冲突解决方法?

六、系统架构

1.设计一个服务,提供递增的SessionID服务,要求保证服务的高可靠性,有哪些方案?集中式/非集中式/分布式

2.多台服务器要执行计划任务,但只有拿到锁的任务才能执行,有一个中心服务器来负责分配锁,但要保证服务的高可靠性。

3.如何有效的判断服务器是否存活?服务器是否踢出集群的决策如何产生?

4.两个服务器如何在同一时刻获取同一数据的时候保证只有一个服务器能访问到数据?

5. 编写高效服务器程序,需要考虑的因素

6.QQ飞车新用户注册时,如何判断新注册名字是否已存在?(数量级:几亿)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值