面试复盘 | 腾讯 微信支付 一面复盘

微信支付一面(90mins)


  1. 自我介绍;
  2. 操作系统是怎么将我 2G 的物理内存映射为 4G 的?
    答:虚拟内存的相关知识,然后面试官追问:
  3. 要是内存中没有需要访问的数据呢?
    答:可以通过缺页中断,使用某种页面置换算法来从磁盘上换入内存。面试官进一步:
  4. 你知道有哪些页面置换算法,是怎么做的?
    答:被步步紧逼的我一时竟想不起,面试官问你会怎么设计,我又想起来了,答了先进先出、第二次机会、NRU,期间将 LRU 介绍很混乱,与最佳页面置换算法说串了.... 面试官不易不挠:
  5. 那你来写个 LRU 吧,实现这样一个类
    然后手撕了十几二十分钟,按照 LeetCode 上的思路写了,然而落了面试官的圈套了:
  6. 假如要让把你写的 LRU 提供给别人用,那你需要怎么改?
    摸不清面试官什么意思,面试官提示:你的页面一定是 int key, int value 吗?要是使用其他类型怎么办?哦,我懂了,泛型编程吧,加个模板呗。
    面试官:好,那我们来看看 get 函数,你看你这里写的在 map 中查询 key,不存在就返回了 -1,还可能怎么来处理?
    答:哦,可以通过异常来报错和处理;
    面试官:嗯,这是一个方法,还有呢?
    答:....
    面试官:想一想你用的哪些库函数都怎么处理的?
    答:它们也都是返回整数值来表示错误的啊。
    面试官:.... 没关系,想不到我们就继续,接下来我们看 push 函数部分,你觉得有什么问题?
    答:...
    面试官:提示一下,你看参数部分,如果说我保存数据的结构体很大呢?
    答:我懂你的意思了,引用传递,我再加个 const 。
    面试官:还有什么问题呢? .... 提示一下,你看你的函数中哪些地方会对数据进行拷贝?
    答:哦,make_pair 和 push_back 函数会进行数据的拷贝,push_back 可以改为 emplace_back 来避免拷贝,make_pair 那里使用 move 转为右值(给自己挖坑了)。
    面试官:那你来讲一下 move 函数,和 forward 有什么区别?
    答:.... forward 不了解。
    面试官:不了解的话我们继续,你觉得你实现的 LRU 在使用时还存在什么问题?
    我:还存在多线程方面的安全问题吧,因为其中有缓存区域,在多个线程同时访问会出现问题。
  7. 如何解决多线程访问共享资源?你知道哪些方法?
    答:锁机制...
    面试官:知道加锁就可以了,你还知道其他的方式吗?
    答:....暂时想不到了。
    面试官:你知道无锁编程吗?
    答:之前看过一篇介绍的,但不太了解。
    面试官:那我们继续下一个问题。
  8. C++ 里的 static 关键字了解吗,有哪些作用?
    分别答了全局静态变量,局部静态变量,静态函数,类内静态函数,主要的作用还是隐藏。应该答的差不多,面试官没有再追问。
  9. C++ 里的 new 是怎么作用的?
    答了 new delete 操作内存的过程,提到了底层的 malloc free 函数,面试官问再底层呢?答了 mmap 不知道对不对,面试官继续问 mmap 可以做什么?回答说自己写的服务器中使用 mmap 将文件映射到内存。面试官问还有吗,回答说不知道了。
  10. 如果运行你的代码,依次会进行哪些处理?
    答:会经过预处理、编译、汇编和链接过程。预处理会处理 #开头的一些预编译代码;编译阶段进行词法分析和语法分析,生成汇编代码文件,汇编规程将回答代码翻译为机器码,最后将不同的代码文件进行链接生成可执行文件。
    面试官:词法分析有什么作用?语法分析有什么作用?
    答:词法分析将文本代码翻译为一个个的单词,语法分析来分析一段代码的语义。
    面试官:在编译阶段会进行哪些处理?
    答:....
    面试官:比如 #include 的文件是在预处理阶段复制的 ...
    答:哦,想到了内联函数是在编译阶段进行展开的,其他的想不到了。
    面试官:那继续下一个链接阶段,链接阶段有哪些关键字?
    答:... 想不到。
    面试官:那我们继续,还有还多问题呢...
  11. 现在我们抛开你写的代码,假如一个 C++ 程序输出 Hello World ,你介绍一下它从运行到输出的过程?
    介绍了从输入运行后,创建子进程,分配内存空间,设置 CPU 环境,等待调度,页面置换等过程。
  12. 进程和线程的区别?携程有了解吗?
    提到了进程和线程拥有的资源,面试官问进程具体都有哪些资源?答了地址空间、文件句柄、信号等,面试官问还能想到其他的吗,想不到了,面试官说还有进程通信的一些资源....
    面试官问我最熟悉的什么?操作系统?计算机网络?说了比较熟悉计算机网络。所以,面试官开始问计网的内容。
  13. 假如 A 和 B 进行数据传输,你认为会存在什么安全问题?
    答:数据篡改、被监听、身份认证等问题。
    面试官:如何解决这些问题?
    回答了 HTTPS 采取的相关措施。面试官追问:混合加密解释一下,具体怎么传输的?
  14. 数字证书是怎么验证的?
    这块不太熟悉,回答的比较随意。
  15. TCP 怎么保证可靠传输的?要是我使用 UDP 要实现可靠传输怎么实现?
    答:UDP 可以在应用层来实现可靠传输,比如可以设计数据校验、确认和重传等功能。
    面试官:你提到了 TCP 的超时重传,那重传时间要怎么设计?
    答:....
    面试官:好吧,这里不了解的话也就想不到了,我们继续...
  16. HTTP 有 keep-alive,TCP 也有 keep-alive,它们有什么区别吗?
    答:啊,这我会,HTTP 的 keep-alive 是长连接,TCP 的 keep-alive 是保活机制,用来探测对端 TCP 是否还存活。激动了,导致回答的也不太清晰....
    面试官:那我再最后问一个数据库...
  17. 数据库索引了解吗?索引都有哪些结构?
    回答了 MySQL 的 B+ 树,以及其他对比的数据结构红黑树,跳表和哈希表等。面试官问怎么选择?比如为什么 MySQL 用 B+ 树,而 Redis 的 zset 用跳表?回答说应用场景不同,MySQL 用来在磁盘上存取海量数据,Redis 是内存中数据库,主要用来做缓存....面试官说答的不太对,回去之后可以再看看。
  18. 反问:
    1. 微信支付做什么具体业务?
    2. 整体的面试流程是怎么样的?
      面试官:2 轮技术面 + 2 轮面委 + HR 面
      我:面委,面什么?
      面试官:也是面技术,比我面试的难度要大。
      我:啊,比你面的还难?(笑...)

讨论 & 交流


这里汇总一下答的不太好的地方,也欢迎大家指教!

  1. C++ 程序在预处理、编译、汇编和链接阶段分别会进行的处理,在各个阶段分别还有哪些关键字开始作用;
  2. C++ 程序在动态申请内存空间时,底层具体是如何操作的,使用了哪些库函数,哪些系统调用;
  3. 为什么 move 可以将左值转为右值?和 forward 的区别是什么;
  4. 数据库索引,不同的数据库使用了结构来实现索引,以及为什么使用。
    ...

总结:


不愧是腾讯的 WXG 部门,这是我从七月份以来面过最综合,最难搞的面试了。好在我心态好,后面回答的时候都是笑嘻嘻的,不会就笑着说不了解了,面试官真的牛,从开始的问题到实现算法在引出来这么多方方面面,这真不是八股文能够应付的来的....好在面试官也挺和蔼的,面试过程中我们应该都算是比较轻松的吧.... 最后,不管这次能不能通过,自己都学到了很多,继续加油吧。

最后 @牛客人品酱 攒人品!

#面试复盘##腾讯##校招##面经##C++工程师#
全部评论
这是什么魔鬼
3 回复
分享
发布于 2021-08-13 23:03
这个面试官好强,前面几个问题逻辑性太强了
3 回复
分享
发布于 2021-08-14 08:55
百信银行
校招火热招聘中
官网直投
链接阶段会有extern关键字,这难度有点大啊
3 回复
分享
发布于 2021-08-14 09:38
Malloc分配空间小于128K调用brk,大于调用mmap 为什么?move底层就是直接通过一个类型转换把左值转换成右值的,forward是完美转发,不改变原值类型,左值还是左值,右值还是右值。move是全部变成右值
3 回复
分享
发布于 2021-08-14 11:14
大佬这是录音了吗?记得好细。
2 回复
分享
发布于 2021-08-14 09:31
那个LRU,“面试官:好,那我们来看看 get 函数,你看你这里写的在 map 中查询 key,不存在就返回了 -1,还可能怎么来处理?”,面试官是不是想说,不存在就返回迭代器end
2 回复
分享
发布于 2021-08-14 10:23
👍很强
1 回复
分享
发布于 2021-08-13 20:52
牛,这一套下来,确实挺难的
1 回复
分享
发布于 2021-08-13 23:48
这个一面太硬核了
1 回复
分享
发布于 2021-08-14 14:01
微信支付前天刚挂,上来撕了三道算法题,边写边讲,一小时,然后聊项目40分钟,之后就挂了
1 回复
分享
发布于 2021-08-14 14:15
合理怀疑这面试官手撕完了CSAPP
1 回复
分享
发布于 2021-08-14 16:02
太难了,我已经被wxg杀疯了
1 回复
分享
发布于 2021-08-14 19:34
tql 描述的很棒 很有代入感
1 回复
分享
发布于 2021-08-16 11:03
Zset占用空间小,调整算法简单,但是一般高度比较大,所以用在内存中,用在磁盘当中每一层高度就相当于一次磁盘io,磁盘io是非常耗时的 B+ Tree占用空间大,调整算法复杂,但是高度比较低,所以用在磁盘中,用在内存中每次调整都要浪费大量时间,达不到高速缓存的目的
5 回复
分享
发布于 2021-08-14 11:18
forward调用的也是static_cast,两个函数实现实际是一样的,都是包装了static_cast类型转换而已 完美转发主要是使用的一个称之为引用折叠的一个规则。 /*   template<typename _Tp>     constexpr _Tp&&     forward(typename std::remove_reference<_Tp>::type& __t) noexcept     { return static_cast<_Tp&&>(__t); }  template<typename _Tp>     constexpr typename std::remove_reference<_Tp>::type&&     move(_Tp&& __t) noexcept     { return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); } */
2 回复
分享
发布于 2021-08-15 14:19
@牛客人品酱 攒人品 😉
点赞 回复
分享
发布于 2021-08-13 20:09
楼主投的什么岗位呀
点赞 回复
分享
发布于 2021-08-13 21:41
你是魔鬼中的天使~
点赞 回复
分享
发布于 2021-08-13 23:19
太牛了
点赞 回复
分享
发布于 2021-08-13 23:48
我后天面委会面,听说很难😭
点赞 回复
分享
发布于 2021-08-14 00:05

相关推荐

83 357 评论
分享
牛客网
牛客企业服务