腾讯后台开发面试题--整理1

可参照这篇博客一起看:http://blog.chinaunix.net/uid-29867011-id-4508083.html


linux和os:

netstat tcpdump ipcs ipcrm (如果这四个命令没听说过或者不能熟练使用,基本上可以回家,通过的概率较小 ^_^ ,这四个命令的熟练掌握程度基本上能体现面试者实际开发和调试程序的经验)

http://blog.csdn.net/fycy2010/article/details/48194375


cpu 内存 硬盘 等等与系统性能调试相关的命令必须熟练掌握,设置修改权限 tcp网络状态查看 各进程状态 抓包相关等相关命令 必须熟练掌握

awk sed需掌握


共享内存的使用实现原理(必考必问,然后共享内存段被映射进进程空间之后,存在于进程空间的什么位置?共享内存段最大限制是多少?)

http://blog.csdn.net/fycy2010/article/details/48194863


c++进程内存空间分布(注意各部分的内存地址谁高谁低,注意栈从高道低分配,堆从低到高分配)


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

《程序员的自我修养》P57 

.bss段在ELF中仅有一个占位符,不占据磁盘空间


使用过哪些进程间通讯机制,并详细说明(重点)

makefile编写,虽然比较基础,但是会被问到

gdb调试相关的经验,会被问到


如何定位内存泄露?

http://blog.csdn.net/fycy2010/article/details/48195933

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


32位系统一个进程最多多少堆内存?

《程序员的自我修养》P168


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


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

#include<stdio.h>
int main()
{
unsigned int i = 0xffffffff;
if ( i > 0)
{
printf("64bit \n");
}
else
{
printf("32bits \n");
}
system("pause");
return 0;
}


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

用union


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


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

《程序员的自我修养》P25


说出你所知道的各类linux系统的各类同步机制(重点)


什么是死锁?如何避免死锁(每个技术面试官必问)


列举说明linux系统的各类异步机制

Linux的I/O机制经历了一下几个阶段的演进:
1. 同步阻塞I/O: 用户进程进行I/O操作,一直阻塞到I/O操作完成为止。
2. 同步非阻塞I/O: 用户程序可以通过设置文件描述符的属性O_NONBLOCK,I/O操作可以立即返回,但是并不保证I/O操作成功。
3. 异步事件阻塞I/O: 用户进程可以对I/O事件进行阻塞,但是I/O操作并不阻塞。通过select/poll/epoll等函数调用来达到此目的。
4. 异步时间非阻塞I/O: 也叫做异步I/O(AIO),用户程序可以通过向内核发出I/O请求命令,不用等带I/O事件真正发生,可以继续做另外的事情,等I/O操作完成,内核会通过函数回调或者信号机制通知用户进程。这样很大程度提高了系统吞吐量。

http://blog.csdn.net/liukun321/article/details/7018811


exit() _exit()的区别?

_exit 和exit的区别与联系:

_exit 函数的作用是:直接使进程停止运行,清除其使用的内存空间,并清除其在内核的各种数据结构;

exit 函数则在这些基础上做了一些小动作,在执行退出之前还加了若干道工序。exit() 函数与 _exit() 函数的最大区别在于exit()函数在调用exit  系统调用前要检查文件的打开情况,把文件缓冲区中的内容写回文件,即所有缓冲的输出数据都被冲洗。

另外,可以通过atexit注册终止处理函数,这些函数是在执行exit时自动调用的  

注意前者为库函数,后者为系统调用。


如何实现守护进程?

《APUE》P343

http://www.embedu.org/Column/Column198.htm

http://blog.csdn.net/russell_tao/article/details/7090033


linux的内存管理机制是什么?

《CSAPP》P554

http://www.cnblogs.com/zhaoyl/p/3695517.html


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

http://blog.csdn.net/rainharder/article/details/7975387


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

(1)库函数可能调用一个或多个系统调用,但它们并不是内核的入口点,有些库函数就不会使用任何系统调用。

(2)可以在必要时替换库函数,但不能替换系统调用。比如sbrk按应用程指定字节增加或减少进程地址空间,而malloc在用户空间管理这块由sbrk分配的空间,能实现一种特定类型的分配。

(3)应用程序可以调用库函数或系统调用,而很多库函数则调用系统调用。

(4)系统调用提供的是一种最小接口,而库函数则提供比较复杂的功能,比如是带上缓冲区。

(5)有相当一部分系统调用时可重入的,比如read write open lseek等,但标准IO库则则是不可重入的,因为它们使用了静态数据结构、或者调用了malloc和free,或者以不可重入的方式使用全局数据结构。

(6)系统调用是线程安全的,因为它对于用户程序来说是原子的;库函数大部分也是线程安全的,但是把多个函数组合在一起不保证线程安全。另外,即便系统调用是安全的,但是系统调用可以通过对内核状态的改变影响其他线程,比如操作文件描述符的系统调用,不用担心多个线程操作同一描述符就导致进程崩溃,但一个在读,另一个线程close了描述符,依然会带来不少问题。


补充一个坑爹坑爹坑爹坑爹的问题:系统如何将一个信号通知到进程?(这一题哥没有答出来)

《APUE》P233


c语言:

宏定义和展开(必须精通)

位操作(必须精通)

指针操作和计算(必须精通)

内存分配(必须精通)

sizeof必考

各类库函数必须非常熟练的实现

哪些库函数属于高危函数,为什么?(strcpy等等)

(1)缓冲区溢出的:http://blog.csdn.net/yang_yulei/article/details/45314177

(2)线程不安全的:《程序员的自我修养》P350

c++:

一个String类的完整实现必须很快速写出来(注意:赋值构造,operator=是关键)

虚函数的作用和实现原理(必问必考,实现原理必须很熟)

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

指针和引用的区别(一般都会问到)

多重类构造和析构的顺序

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

extern c 是干啥的,(必须将编译器的函数名修饰的机制解答的很透彻)

《程序员的自我修养》P90


volatile是干啥用的,(必须将cpu的寄存器缓存机制回答的很透彻)

static const等等的用法,(能说出越多越好)

数据结构或者算法:

《离散数学》范围内的一切问题皆由可能被深入问到(这个最坑爹,最重要,最体现功底,最能加分,特别是各类树结构的实现和应用)

各类排序:大根堆的实现,快排(如何避免最糟糕的状态?),bitmap的运用等等

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

网络编程:

tcp与udp的区别(必问)

《UNP》P196

udp调用connect有什么作用?

《UNP》P196

tcp连接中时序图,状态图,必须非常非常熟练

socket服务端的实现,select和epoll的区别(必问)


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

http://blog.csdn.net/fycy2010/article/details/47965163

无论是LT和ET模式,都适用于以上所说的流程。区别是,LT模式下,只要一个句柄上的事件一次没有处理完,会在以后调用epoll_wait时次次返回这个句柄,而ET模式仅在第一次返回。

这件事怎么做到的呢?当一个socket句柄上有事件时,内核会把该句柄插入上面所说的准备就绪list链表,这时我们调用epoll_wait,会把准备就绪的socket拷贝到用户态内存,然后清空准备就绪list链表,最后,epoll_wait干了件事,就是检查这些socket,如果不是ET模式(就是LT模式的句柄了),并且这些socket上确实有未处理的事件时,又把该句柄放回到刚刚清空的准备就绪链表了。所以,非ET的句柄,只要它上面还有事件,epoll_wait每次都会返回。而ET模式的句柄,除非有新中断到,即使socket上的事件没有处理完,也是不会次次从epoll_wait返回的。

epoll提供的2种玩法ET和LT,即翻译过来的边缘触发和水平触发。其实这两个中文名字倒也有些贴切。这2种使用方式针对的仍然是效率问题,只不过变成了epoll_wait返回的连接如何能够更准确些。
例如,我们需要监控一个连接的写缓冲区是否空闲,满足“可写”时我们就可以从用户态将响应调用write发送给客户端 。但是,或者连接可写时,我们的“响应”内容还在磁盘上呢,此时若是磁盘读取还未完成呢?肯定不能使线程阻塞的,那么就不发送响应了。但是,下一次epoll_wait时可能又把这个连接返回给你了,你还得检查下是否要处理。可能,我们的程序有另一个模块专门处理磁盘IO,它会在磁盘IO完成时再发送响应。那么,每次epoll_wait都返回这个“可写”的、却无法立刻处理的连接,是否符合用户预期呢?
于是,ET和LT模式就应运而生了。LT是每次满足期待状态的连接,都得在epoll_wait中返回,所以它一视同仁,都在一条水平线上。ET则不然,它倾向更精确的返回连接。在上面的例子中,连接第一次变为可写后,若是程序未向连接上写入任何数据,那么下一次epoll_wait是不会返回这个连接的。ET叫做 边缘触发,就是指,只有连接从一个状态转到另一个状态时,才会触发epoll_wait返回它。可见,ET的编程要复杂不少,至少应用程序要小心的防止epoll_wait的返回的连接出现:可写时未写数据后却期待下一次“可写”、可读时未读尽数据却期待下一次“可读”。
当然,从一般应用场景上它们性能是不会有什么大的差距的,ET可能的优点是,epoll_wait的调用次数会减少一些,某些场景下连接在不必要唤醒时不会被唤醒(此唤醒指epoll_wait返回)。但如果像我上面举例所说的,有时它不单纯是一个网络问题,跟应用场景相关。当然,大部分开源框架都是基于ET写的,框架嘛,它追求的是纯技术问题,当然力求尽善尽美。


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

tcp结束连接怎么握手,time_wait状态是什么,为什么会有time_wait状态?哪一方会有time_wait状态,如何避免time_wait状态占用资源(必须回答的详细)


tcp头多少字节?哪些字段?(必问)

什么是滑动窗口(必问)

connect会阻塞,怎么解决?(必考必问,提示:设置非阻塞,返回之后用select检测状态)

http://zhucuicui.96986.blog.163.com/blog/static/5833370220136219016445/


如果select返回可读,结果只读到0字节,什么情况?《UNP》P130 (1)(b)

MSDN的解释:For connection-oriented sockets, readability can also indicate that a request to close the socket has been received from the peer. 

If the virtual circuit was closed gracefully, and all data was received, then a recv will return immediately with zero bytes read. 

If the virtual circuit was reset, then a recv will complete immediately with an error code such as WSAECONNRESET. 

The presence of OOB data will be checked if the socket option SO_OOBINLINE has been enabled (see setsockopt).

select示意可读,recv返回0,连接正常关闭断开


keepalive 是什么东东?如何使用?

列举你所知道的tcp选项,并说明其作用。

《UNP》P171

socket什么情况下可读?

《UNP》P130


db:
mysql,会考sql语言,服务器数据库大规模数据怎么设计,db各种性能指标

最后:补充一个最最重要,最最坑爹,最最有难度的一个题目:一个每秒百万级访问量的互联网服务器,每个访问都有数据计算和I/O操作,如果让你设计,你怎么设计?


------------------------------------------------

   1. static 使用与作用
   2. inline -》中断
   3. 进程与存储
   4. 栈的两种指针
       《程序员的自我修养》P288
   5. 僵尸进程的理解
   6. awk,sed一些东西
   7. 两个集合,求交集,并集
   8. 100亿个QQ号码,可能有重复,去重,考虑时间复杂性和空间复杂性
   9. a-z求所有子集
 
   补充,TCP与UDP区别,系统调用与库区别。

面试题汇总(干货) 
计算机网络相关 
1 TCP三次握手、四次挥手
2 TCP滑动窗口机制
3 TCP拥塞控制机制
4 socket模型

C/C++相关 
1 虚析构、模板和宏
2 虚函数实现机制
3 vector与list的区别,map是如何实现的,查找效率是多少
4 extern 关键字有什么用
5 malloc和new的区别,能否malloc(1.2G)

linux以及操作系统相关 
1 内存池实现
2 进程间通信机制
3 Linux ps命令,以及看内存当前使用状态的命令
4 进程与线程的区别,共享的数据
5 进程的内存空间

算法与数据结构 (手写代码实现) 
1 大整数加、减、乘、除、求模运算实现
https://leetcode.com/problems/multiply-strings/
https://leetcode.com/problems/add-binary/
2 很多整数,找其中出现次数最多的那个数
3 单链表翻转(两个指针如何实现)、查找、删除、插入以及双向链表、有序链表合并
https://leetcode.com/problems/reverse-linked-list/
4 判断一个整数是否是2的整数次幂.(n&(n-1))
5 二分查找(注意边界条件)
6 常见排序算法的实现以及稳定性(快排跟归并考的很多)
7 字符串翻转(O(n))、匹配(KMP算法)
8 最长递增子序列(nlogn的算法)
9 链表判断是否有环,环的入口,两个链表是否相交(快慢指针)。
10 指定一个数组,求2个数的和等于指定的和(某一个数),如果是3,4,5,n个等于个的和(某一个数)呢?(可以看作背包问题)

其他 
1 红黑树的性质以及插入和删除
2 解析XML文件
3 千万级的用户,提供一个服务,该服务有很多模块,现在有一个底层模块需要优化,问怎么实现,在不影响其他服务模块以及用户体验的情况下。(面IEG)
4 卡特兰数以及公式推导(应多很多)
http://blog.csdn.net/wuzhekai1985/article/details/6764858
http://blog.csdn.net/Hackbuteer1/article/details/7450250
5 未知大小的文件,翻转整个文件
6 如果内存中有个cache存储qq号和最近登录时间问怎么样做hit和淘汰
7 检测短信敏感词
8 大数据问题
9 C++、java和PHP有什么本质区别

猜你喜欢

转载自blog.csdn.net/liu0808/article/details/80373527