微信支付一面(90mins)
- 自我介绍;
- 操作系统是怎么将我 2G 的物理内存映射为 4G 的?
答:虚拟内存的相关知识,然后面试官追问: - 要是内存中没有需要访问的数据呢?
答:可以通过缺页中断,使用某种页面置换算法来从磁盘上换入内存。面试官进一步: - 你知道有哪些页面置换算法,是怎么做的?
答:被步步紧逼的我一时竟想不起,面试官问你会怎么设计,我又想起来了,答了先进先出、第二次机会、NRU,期间将 LRU 介绍很混乱,与最佳页面置换算法说串了.... 面试官不易不挠: - 那你来写个 LRU 吧,实现这样一个类
然后手撕了十几二十分钟,按照 LeetCode 上的思路写了,然而落了面试官的圈套了: - 假如要让把你写的 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 在使用时还存在什么问题?
我:还存在多线程方面的安全问题吧,因为其中有缓存区域,在多个线程同时访问会出现问题。 - 如何解决多线程访问共享资源?你知道哪些方法?
答:锁机制...
面试官:知道加锁就可以了,你还知道其他的方式吗?
答:....暂时想不到了。
面试官:你知道无锁编程吗?
答:之前看过一篇介绍的,但不太了解。
面试官:那我们继续下一个问题。 - C++ 里的 static 关键字了解吗,有哪些作用?
分别答了全局静态变量,局部静态变量,静态函数,类内静态函数,主要的作用还是隐藏。应该答的差不多,面试官没有再追问。 - C++ 里的 new 是怎么作用的?
答了 new delete 操作内存的过程,提到了底层的 malloc free 函数,面试官问再底层呢?答了 mmap 不知道对不对,面试官继续问 mmap 可以做什么?回答说自己写的服务器中使用 mmap 将文件映射到内存。面试官问还有吗,回答说不知道了。 - 如果运行你的代码,依次会进行哪些处理?
答:会经过预处理、编译、汇编和链接过程。预处理会处理 #开头的一些预编译代码;编译阶段进行词法分析和语法分析,生成汇编代码文件,汇编规程将回答代码翻译为机器码,最后将不同的代码文件进行链接生成可执行文件。
面试官:词法分析有什么作用?语法分析有什么作用?
答:词法分析将文本代码翻译为一个个的单词,语法分析来分析一段代码的语义。
面试官:在编译阶段会进行哪些处理?
答:....
面试官:比如 #include 的文件是在预处理阶段复制的 ...
答:哦,想到了内联函数是在编译阶段进行展开的,其他的想不到了。
面试官:那继续下一个链接阶段,链接阶段有哪些关键字?
答:... 想不到。
面试官:那我们继续,还有还多问题呢... - 现在我们抛开你写的代码,假如一个 C++ 程序输出 Hello World ,你介绍一下它从运行到输出的过程?
介绍了从输入运行后,创建子进程,分配内存空间,设置 CPU 环境,等待调度,页面置换等过程。 - 进程和线程的区别?携程有了解吗?
提到了进程和线程拥有的资源,面试官问进程具体都有哪些资源?答了地址空间、文件句柄、信号等,面试官问还能想到其他的吗,想不到了,面试官说还有进程通信的一些资源....
面试官问我最熟悉的什么?操作系统?计算机网络?说了比较熟悉计算机网络。所以,面试官开始问计网的内容。 - 假如 A 和 B 进行数据传输,你认为会存在什么安全问题?
答:数据篡改、被监听、身份认证等问题。
面试官:如何解决这些问题?
回答了 HTTPS 采取的相关措施。面试官追问:混合加密解释一下,具体怎么传输的? - 数字证书是怎么验证的?
这块不太熟悉,回答的比较随意。 - TCP 怎么保证可靠传输的?要是我使用 UDP 要实现可靠传输怎么实现?
答:UDP 可以在应用层来实现可靠传输,比如可以设计数据校验、确认和重传等功能。
面试官:你提到了 TCP 的超时重传,那重传时间要怎么设计?
答:....
面试官:好吧,这里不了解的话也就想不到了,我们继续... - HTTP 有 keep-alive,TCP 也有 keep-alive,它们有什么区别吗?
答:啊,这我会,HTTP 的 keep-alive 是长连接,TCP 的 keep-alive 是保活机制,用来探测对端 TCP 是否还存活。激动了,导致回答的也不太清晰....
面试官:那我再最后问一个数据库... - 数据库索引了解吗?索引都有哪些结构?
回答了 MySQL 的 B+ 树,以及其他对比的数据结构红黑树,跳表和哈希表等。面试官问怎么选择?比如为什么 MySQL 用 B+ 树,而 Redis 的 zset 用跳表?回答说应用场景不同,MySQL 用来在磁盘上存取海量数据,Redis 是内存中数据库,主要用来做缓存....面试官说答的不太对,回去之后可以再看看。 - 反问:
- 微信支付做什么具体业务?
- 整体的面试流程是怎么样的?
面试官:2 轮技术面 + 2 轮面委 + HR 面
我:面委,面什么?
面试官:也是面技术,比我面试的难度要大。
我:啊,比你面的还难?(笑...)
讨论 & 交流
这里汇总一下答的不太好的地方,也欢迎大家指教!
- C++ 程序在预处理、编译、汇编和链接阶段分别会进行的处理,在各个阶段分别还有哪些关键字开始作用;
- C++ 程序在动态申请内存空间时,底层具体是如何操作的,使用了哪些库函数,哪些系统调用;
- 为什么 move 可以将左值转为右值?和 forward 的区别是什么;
- 数据库索引,不同的数据库使用了结构来实现索引,以及为什么使用。
...
总结:
不愧是腾讯的 WXG 部门,这是我从七月份以来面过最综合,最难搞的面试了。好在我心态好,后面回答的时候都是笑嘻嘻的,不会就笑着说不了解了,面试官真的牛,从开始的问题到实现算法在引出来这么多方方面面,这真不是八股文能够应付的来的....好在面试官也挺和蔼的,面试过程中我们应该都算是比较轻松的吧.... 最后,不管这次能不能通过,自己都学到了很多,继续加油吧。
最后 @牛客人品酱 攒人品!
全部评论
(35) 回帖