腾讯TEG信息安全部门一面

  1. 自我介绍,说了一下这是第6次面试腾讯,聊了实习做的虚拟驱动等,没有继续问什么
  2. 刷题,给了一个求最长回文序列的动态规划题,没做出来,然后还有一题前序中序遍历顺序重新构造二叉树的题。回文这个直接放弃,另一个花了十多分钟吧。
  3. TCP长链接、短连接的区别和优缺点

长连接的建立需要三次握手,然后关闭需要四次挥手,整体的开销比短连接大。

查了一下网上别人的回答:

首先是长链接,如果用的不好,可能会出现fd耗尽的问题;无法适应网络环境的变更,比如说服务器IP变了;如果需要实时性较好,那么建立的开销是不可忽略的,此时长连接更加合适。

然后是短连接,整体的资源开销小,fd耗尽概率低;需要维护一个状态,告知是那个客户端的通讯,浪费一定的网络资源;建立和关闭开销大。

  1. 什么情况下会产生coredump?什么时候不会?

大多数情况下会产生,比如segment fault,assert,terminate等,exit和断电不会,kill命令不会。

还补充了内核态程序要coredump,得配置一下。

查到的回答是:

一些信号,比如内存越界、程序assert或手动terminate,会产生coredump,此外还可以手动产生coredump,也是信号的方式。

另外一些信号,比如kill -9等产生的信号,不会coredump。

  1. C++的编译流程?

预处理,编译,包括cc1、cc2、cc3,不过现代的编译器基本只有cc1,然后链接阶段。顺便聊了一下一个公司如何通过链接阶段的扫操作将clickhouse转变为一个.so的。

  1. 如何查内存泄漏?shared_ptr和unique_ptr的挑选有准则吗?

先聊了一下公司里写C#的时候遇到的内存泄漏,即UDP通讯。假如有如下代码

text
复制代码
while (true) { udpsocket.SendAsync(data) data = udpsocket.ReceiveAsync() sleep(1) }

在receive阶段如果不考虑超时,那么这个时候可能有大量的udpsocket对象被构造了但是没有释放,这种内存泄漏是好查的。

至于C++中,回答的是address sanitaizor、static check等工具来排查。看到别人说可以用valgrind、memcheck等查。

之后我提了一下,要尽可能避免这种问题,需要在架构设计的时候想明白,然后尽可能用shared_ptr和unique_ptr来做资源的管理。于是还聊了一下shared_ptr和unique_ptr的实现和区别。最后还问我什么情况该用shared_ptr和unique_ptr,我回答是看你的对象有没有可能被多个地方引用,然后看这种引用是什么类型的。比如说二叉树遍历的时候,可以用unique_ptr+左值引用。如果生命周期模糊,那么用shared_ptr。感觉也没有说的很好,似乎只能凭借经验来选择。

  1. 数据库中,LSM树和B+树两种索引的优缺点?什么情况LSM树合适?什么情况B+树合适?

LSM树是为了解决B+树空间浪费大、固态硬盘贵、写放大浪费固态硬盘寿命的问题而发明的。

LSM树是分层结构,所有写操作、删除操作都转换为写入操作,然后当内存的memtable满了之后,将memtable存储为sst文件。由于整个是append only操作,所以写入很快,但是,有多层的sst文件就意味着一次点查找需要读取每一层中至少一个sst文件,这意味着查询效率低。

为了优化点查询,rocksdb加入了过滤器技术,这样如果过滤器报告该数据不存在,就可以略过一次sst查找。

然而范围查找,LSM树没那么容易优化,只能从上到下创建n个迭代器,挨个查找,这意味着它查询的时候相比B+树要读更多磁盘。因为B+树查找的时候是首先定位到B+树最底层的一个起始位置,然后从这开始做磁盘上的链表遍历,效率比LSM树高。

  1. 聊聊多态?

聊了C++多态是通过vptr+vtable实现的,然后聊了一种作死的行为:B1、B2继承自A,然后C继承了B1、B2。Qt有人这么干,但是他掉进去了一个走不出来的坑。

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
灵韵
下载 APP