面试复盘 | 竞技世界 提前批(已OC)
竞技世界是比较早投递的,而且是通过牛客网的 SP 专场活动投递的,整体流程比较简单,一共经历了两场面试,一场基础面 ➕ 一场综合面,分别在连续的连天内完成,效率还是比较高的。
一面(60mins)
自我介绍
- 个人的基本情况,本科和研究生阶段上过的专业课,成绩等。
计算机网络
-
介绍一下 TCP 和 UDP,以及它们的区别?
TCP 是面向连接的、可靠的、基于字节流的传输层控制协议;
UDP 是无连接的、尽最大努力传输、不保证可靠性的传输层控制协议;
它们之间的区别主要在于:(1)连接性(2)传输对象(3)可靠性(4)首部开销(5)传输方式(6)分片大小等。
-
TCP 和 UDP 分别有什么应用场景?
TCP:FTP 文件传输、 HTTP/HTTPS;
UDP:包总量较少的通信,如 DNS 、 SNMP 等;广播通信、音视频传输等。
-
TCP 的连接状态有哪些?
这里面试官主要问了四次挥手过程中出现的连接状态,回答了 ESTABLISH、FIN_WAIT_1、CLOSE_WAIT、FIN_WAIT_2、LAST_ACK、TIME_WAIT 状态。
-
SYN 洪泛攻击了解吗?是什么原理?什么是半连接队列?
半连接队列是服务器完成了第一次握手后将连接请求添加到的一个队列,而 SYN 攻击就是利用了这一点,客户端不断地发送伪造的 SYN 包来填满服务器的半连接队列,使得正常的连接请求得不到响应。
操作系统 & C++
-
进程同步和通信的方式有哪些?
同步:临界区、同步和互斥、信号量、管程;
通信:匿名管道、有名管道、消息队列、信号量、共享内存、套接字。
-
虚拟内存介绍一下?
为了更好的管理内存,操作系统将内存抽象成地址空间。每个进程拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。当进程访问到不在物理内存中的页时,发生缺页中断并进行页面置换,将缺失的页装入物理内存并重新执行失败的指令。
-
申请动态内存的时,操作系统是怎么做的?
从操作系统层面上看,malloc 是通过两个系统调用来实现的:brk 和 mmap
- brk 是将进程数据段 (.data) 的最高地址指针向高处移动,这一步可以扩大进程在运行时的堆大小;
- mmap是 在进程的虚拟地址空间中寻找一块空闲的虚拟内存,这一步可以获得一块可以操作的堆内存。
通常,分配的内存小于 128k 时,使用brk调用来申请内存,大于 128k 时就使用mmap来申请内存;进程先通过这两个系统调用获得相应的虚拟地址,但还没有映射到物理内存,当访问这些虚拟地址的时候,通过缺页中断,让内核分配相应的物理内存,这样内存分配才算完成。
-
智能指针了解吗?介绍一下
shared_ptr、weak_ptr、unique_ptr
-
share_ptr 直接类构造和用 make_shared 的区别?
区别是:shared_ptr 构造函数会执行两次内存申请,而 make_shared 则执行一次。
面试官追问具体的内存申请过程:
shared_ptr 在实现的时候使用的 refcount 技术,因此内部会有一个计数器(控制块,用来管理数据)和一个指针,指向数据。因此在执行shared_ptr<A> p2(new A)的时候,首先会申请数据的内存,然后申请内控制块,因此是两次内存申请,而make_shared<A>()则是只执行一次内存申请,将数据和控制块的申请放到一起。
-
内存泄漏和内存溢出分别是什么?
-
如何发现内存泄漏?
回答了使用 GDB 调试工具来测试,这部分没有实践过,所以了解的不深入,回答的不太好。
二面(50mins)
二面是通过微信视频面试的,面试官好像级别高一些,主要从项目和个人经历方面进行询问。
自我介绍
- 面试的多了,自我介绍部分简直倒背如流....
项目
-
为什么做这个项目?
-
这个项目你觉得最难的地方是哪一块?为什么你觉得很难?
-
除了简历上的项目,还做过其他项目吗?
回答了研究生研究的课题,面试官让详细介绍一下研究课题的项目,这就舒服多了,随便提问,毕竟正在写论文呢....
-
你研究生的专业是自然语言处理,为什么现在找的是 C++ 开发的工作n?
这里和面试官聊了好久,把自己这两年的想法转变和面试官讨论了一下,感觉聊的挺投机的,面试官挺赞同我的一些想法的,所以聊完二面也就随之结束了。末了面试官还说有问题随时联系他.....