"腾讯面试经验"

  "腾讯面试经验整理"

Posted by Xu on April 16, 2018

腾讯

18.4.2 鸡哥

一面

  • 1.TCP和UDP的区别
  • 2.使用TCP,循环调用3次write,每次write一个字节,在接收方要读几次;UDP接收方是几次
  • 3.TCP已经提供了数据校验了,为什么网上下载一些文件还需要md5之类的来检测数据
  • 4.互斥的方式
  • 5.信号量和互斥量的区别,结合消费者问题说一下
    • 互斥量加锁解锁的是用一个进程,信号量可以不同
  • 6.自旋锁和互斥量的区别(自旋锁和互斥量是忙等与阻塞的区别)
  • 7.C++,析构函数为什么要用虚函数,构造函数内为什么不要调用虚函数
  • 8.C++的new delete 和c的malloc free
  • 9.跳台阶
  • 10.最大公约数
  • 11.智力题:1瓶毒药999瓶无毒,10只青蛙
  • 12.linux的ps命令

二面

  • 1.C++虚函数表的设计
  • 2.memcpy的实现
  • 3.n的阶乘(考虑溢出)
  • 4.跳台阶
  • 5.4亿个qq号排序
  • 6.一栋楼,有136层,给你两个弹珠,测出弹珠在第几层刚好摔破,弹珠摔破后,不可再使用

2018.4.9 波哥

一面

  • 项目有什么特色,难点,怎么解决的,学到了什么

二面

  • 1.内存泄露
  • 2.C++程序运行过程中crash掉时,怎么去分析错误
  • 3.项目某些功能的具体实现方式

2018.4.10 波哥 天美

一面

  • 1.C++如何实现多态
  • 2.C++如何防止类被继承(除了final)
  • 3.C++中map如何实现的,如何实现平衡的
  • 4.select和poll的区别
  • 5.内核文件系统中索引节点什么时候被删除
  • 6.洗牌问题:如何均匀洗牌
  • 7.100层楼摔砖石
  • 8.几十万个任务查找
  • 9.自旋锁是如何实现的
  • 10.TCP和UDP的区别
  • 11.TCP为什么要四次挥手
  • 12.TIME_WAIT的作用
  • 13.UDP发送1M数据怎么发送
  • 14.进程和线程区别
  • 15.进程间通信的方法和特点
  • 16.容器的i/o是如何实现隔离的

2018.4.15 鸡哥 现场

一面

  • 1.进程与线程
    • 资源
    • 调度
    • 通信
    • 健壮
  • 2.拥塞控制
    • 慢启动
    • 拥塞避免
    • 快速恢复
  • 3.a^n,求最优解
  • 4.Linux查看进程某个端口的进程
    • lsof -i:列出当前系统打开文件的工具
    • lsof -i:端口号:用于查看某一端口的占用情况,比如查看22号端口使用情况,lsof -i:22
    • netstat -tunlp:用于显示tcp,udp的端口和进程等相关情
    • netstat -tunlp|grep 端口号:用于查看指定端口号的进程情况,如查看22端口的情况,netstat -tunlp grep 22
  • 5.Linux如何查看进程的内存使用情况
    • /proc/meminfo:列出了所有你想了解的内存的使用情况
    • atop命令是一个终端环境的监控命令。它显示的是各种系统资源(CPU, memory, network, I/O, kernel)的综合,并且在高负载的情况下进行了彩色标注
    • free命令是一个快速查看内存使用情况的方法,它是对 /proc/meminfo 收集到的信息的一个概述
  • 6.Linux如何查看进程的网络I/O
    • iptraf:它可以生成多种网络统计信息包括:TCP信息、UDP数量、ICMP和OSPF信息、以太网负载信息、节点状态、IP校验错误等
  • 7.C++多态
    • 静态多态:重载、模板
    • 动态多态:继承、虚函数、指向派生类的基类指针
  • 8.有了解或者接触过一些开源项目吗
  • 9.项目,10分钟左右

2018.4.15 丁丁 现场 游戏岗

  • 1.vector push_back要注意的(内存拷贝相关)
  • 2.多态
  • 3.c++ 和 ++c 哪个不能作为左值
  • 4.判断是否是凹多边形
  • 5.对齐计算,注意 #pragma pack
  • 6.如何判断内存泄漏、内存泄漏防范和检测
  • 7.sort的实现
  • 8.vector/map等 erase要注意的
  • 9.main函数开始之前有哪些工作
  • 10.mutex 多线程 lock
  • 11.c++11 有哪些
  • 12.RAII
  • 13.智能指针
  • 14.虚函数表
  • 15.快排优化(随机选取,基本有序时等)
  • 16.reserve 和 resize
  • 17.vector<bool> 中bool的表现形式
  • 18.继承中类构造和析构的顺序,虚函数指针等的设置时间
  • 19.写过的最优秀的一些代码
  • 20.
/*
D的内存布局
D* pd=new D; B2* pb2 = pd;  pb2==pd? 
*/
Class D: public B1, public B2 {};  
  • 21.智力题,智力题:打牌最优解

2018.4.15 志哥 现场

一面

  • 1.int main(int argc ,char **argc)参数的意思
    • argc是命令行总的参数个数
    • argv[]是argc个参数,其中第0个参数是程序的全名。之后的参数是命令行后面跟的用户输入的参数
  • 2.int f() const
    • 成员const函数,只能调用const成员变量,mutable除外
    • const对象只能调用const函数
  • 3.static int f(),举个使用static的例子
    • static在面向过程中:
    • static在面向对象中:
  • 4.malloc 与 new
  • 5.虚函数表
  • 6.进程通信的方式
  • 7.VM与Docker的区别

2018.4.15 波哥 现场 微信

一面

  • 1.什么是多态
    • 多态指同一个实体同时具有多种形式。它是面向对象程序设计(OOP)的一个重要特征
    • 在面向对象语言中,接口的多种不同的实现方式即为多态
    • 多态是具有表现多种形态的能力的特征,在OO中是指,语言具有根据对象的类型以不同方式处理之,特别是重载方法和继承类这种形式的能力。多态被认为是面向对象语言的必备特性
  • 2.虚函数调用过程
  • 3.进程间通信方式
  • 4.有哪几种同步方式
    • 信号量
    • 互斥量
    • 自旋锁
  • 5.什么是协程

协程概念,原理

协程是一个无优先级的子程序调度组件,允许子程序在特点的地方挂起恢复。

线程包含于进程,协程包含于线程。只要内存足够,一个线程中可以有任意多个协程,但某一时刻只能有一个协程在运行,多个协程分享该线程分配到的计算机资源

协程是在线程之上由“用户”构建的并发单元,对OS来说无感知,协程的切换由用户自己管理和调度。

为什么要有协程:协程允许我们写同步代码的逻辑,却做着异步的事,避免了回调嵌套,使得代码逻辑清晰。协程是追求极限性能和优美的代码结构的产物。

  • 6.多路转接(多路复用)有哪些方式,各有什么优缺点
    • select
    • poll
    • epoll
  • 7.手写split函数

2018.4.15 胡蝶 腾讯云

一面

  • 1.B树、B+树、红黑树
  • 2.socket、read函数各个返回值代表什么意思
  • 3.为什么链路层有MTU
    • 各种为网络对数据帧都有一个大小限制,链路层不同协议对最大帧长度做了限制,这个值就是MTU,以太网1500
    • 路径MTU:从A到B可能经过不同的网络,其中最小的MTU就是路径MTU
  • 4.进程和线程
  • 5.分页和分段
  • 6.文件系统(Windows ntfs,Linux ext2、ext3、ext4)
  • 7.快排、冒泡、插入排序原理
  • 8.三次握手、close_wait状态和time_wait状态的意义
  • 9.浏览器中输入url按entry后发生的事情
  • 10.编译原理了解多少
  • 11.进程间通信方式有哪些?怎么理解临界区
  • 12.linux操作系统怎么设置网络的一些参数
    • ifconfig
    • /etc/network/interfaces
  • 13.进程上下文怎么切换Linux进程上下文切换过程
    • 挂起一个进程,将这个进程在 CPU 中的状态(上下文)存储于内存中的PCB
    • 在内存中检索下一个进程的上下文并将其在 CPU 的寄存器中恢复
    • 跳转到程序计数器所指向的位置(即跳转到进程被中断时的代码行),以恢复该进程

2018.7.30 鸡哥 阿里

  1. 你们研究生是做云计算相关的东西?具体做了什么(应该是想了解到平时是否经常编程,做一些什么项目)。项目大概问了一下就没继续问了,都没叫我说
  2. 问问C++吧
  3. 多态?怎么实现的?
  4. static关键字?期间说类的时候提到了const,所以接着又问了const?说到const修饰成员函数的时候他又问了通过const函数怎么修改类?然后接着问const还有什么用?
  5. 继续问static和const的布局,然后问了除了2个全局数据区还有哪些?stack和heap有什么却别?(期间说到了内存泄露)
  6. 刚刚说到内存泄露,怎么检测内存泄露(valgrind,除了这个还有其他方法吗?不知)
  7. C++有什么办法管理内存泄露内?(答到3个智能指针)weak_ptr有什么用?(答到能解决shared_ptr的循环引用问题)
  8. vector和list(就是根据特性说一下什么时候用哪个),vector内存管理(感觉说了好多次了),如果我现在要删除vector的空间怎么做?(resize(0)?还有吗?不知)
  9. 了解mysql吗?(数据库不懂,本科的时候做过一点点)那表的一些连接方式知道吗?(我说了一个自然连接,通过,号进行连接,是一种笛卡尔积的链接方式,他说你确定吗?。。。我说印象中记得是这样,不过没怎么用,记得不是很清楚了)好的,没关系,那数据库就直接跳过了
  10. 问问网络吧
  11. TCP的3次握手,能不能2次?再说说4次挥手吧,客户端第3次FIN发出去连接就断开了吗?为什么?
  12. 了解select和epoll吗?(他问了为什么epoll返回后不需要轮询,我说回调,但是回调没有具体去了解)
  13. 有一个服务,这个服务会使用1个字典,可能会对字典进行修改,怎么在不中断服务的情况下进行修改(这个乱答了一通,不知道考察点,后来他又问如果多个线程要修改呢,我说了读写锁,最后是没问了,他说有一些问题,叫我下来再想想)
  14. 算法,本来想问LRU CACHE,我想思考一下,然后他主动说这个你估计平时也很少用,还是换一个吧,换了个二叉树镜像。。。
  15. 你有啥问我的吗?(问了进去会不会要学java,他说其实阿里还是很多做C++的,阿里云很多,然后他们是搞广告搜索。然后又问了如果顺利,大概会有几面,他说这个不清楚,他只是来面试,具体四面,五面,六面还是七面都要看具体情况。。。)

2018.08.09 百度 腾讯 迅雷

  1. 文件系统的address_space结构
  2. 文件系统的vfs_mount的结构和挂载的过程
  3. 文件系统VFS介绍
  4. 文件系统和物理内存是如何映射的
  5. 在线编程:为了提升开会的积极性,一个人不能和其直接领导一起开会,给出N个人的(姓名,积极度,领导)。找到使得开会积极度最高的人的集合
  6. 字典序输出1~n个数
  7. 一个字符串关联一个证书信息(由两个unsigned int组成),设计一个数据结构来保存这些数据,可以进行快速的增删查改,但是当增删查改特别频繁时如何优化?
  8. sendKBytes实现sendNBytes
  9. 为什么进程内部的线程在同一个命名空间
  10. 操作系统有哪些模块:处理器模块,文件模块,设备管理模块,存储器模块,IO模块

一些已解答的面试题

问题一:C++如何实现多态

实现多态的方式分为两种:静态多态和动态多态

  • 静态多态 :通过重载和模版技术实现,编译的时候就已经确定了
  • 动态多态 :通过虚函数和继承关系实现,执行动态绑定

问题二:C++如何防止类被继承(除了final)

思路1:利用private和静态函数

  • private声明构造函数,防止被继承类访问构造,但与此同时,该类的构造函数也不能被直接调用
  • 所以我们使用static静态函数来访问内部构造函数进行构造。

思路2:利用虚继承和友元来防止

  • 首先我们定义一个父类,该父类的构造函数也定义为private,然后定义一个继承类,并将该继承类定义为该父类的友元,所以继承类可以访问构造函数进行构造,且继承方式为虚继承
  • 然后该继承类不能再被继承:因为该继承类的继承方式为虚继承,所以该继承类再派生时,会先构造虚基类。但友元关系不具有继承性,所以并不能调用该父类的构造函数。所以不能被继承。

问题三:C++中map是如何实现的。

是基于红黑树实现的,红黑树实现平衡,主要通过对四种状况的单旋转和双旋转来实现的 ,具体可以见笔记STL容器底层实现。

问题四:select和epoll区别

见高级I/O:select通过轮询,epoll则是通过红黑树和回调实现

问题五:fork和vfork的区别

fork要考呗父进程的进程环境,而vfork则不需要完全拷贝父进程的进程环境,在子进程没有调用exec和exit之前,子进程与父进程共享进程环境,相当于线程的概念,此时父进程阻塞等待。

问题六:Linux如何检测内存泄漏,如何检测程序crash?

  • 内存泄漏一般是指堆内存的泄漏,堆是程序动态分配内存的地方,使用完该内存后必须要显示的释放内存,否则这一块内存就不能再被使用,我们就说这块内存泄漏了。
  • 内存泄漏检测工具:mtrace,memwatch,valgrind
  • 当某个进程崩溃时,堆栈里保存了一些关键信息,通过这些信息我们可以定位到出错的源代码位置,Linux系统里有个backtrace这些个函数可以获得当前堆栈信息,好了,到这里问题已经解决了一半,backtrace信息中的有一个地址包含了出错代码在文件中的偏移量
  • Linux下写C/C++程序的程序员,时常与Core Dump(用gdb查看)相见。在内存越界访问,收到不能处理的信号,除零等错误出现时,我们精心或不精心写就的程序就直接一命呜呼了,Core Dump是Linux仁慈地留下的程序的尸体,帮助程序员们解决了一个又一个问题
  • 编译程序,test1.c是程序文件名。执行程序,结果程序异常中断。查看系统dmesg信息,发现系统日志的错误信息: error:0 in test1[400000+1000],这条信息里的ip字段后面的数字就是test1程序出错时所程序执行的位置。使用addr2line就可以将400506转换成出错程序的位置:
addr2line -e test1 400506
out: /home/hanfoo/code/test/addr2line/test1.c:5

问题七:traceroute指令让你追踪网络数据包的路由途径