目录
一、前言
在 2024 年 9 月,我参加了虾皮的 SRE 岗位面试,现将面试过程中的问题及答案整理如下,希望对大家有所帮助。
二、面试问题及答案
(一)9.7 虾皮 SRE 二面面经
- 问项目
- 在回答项目问题时,要清晰地阐述项目的背景、目标、技术架构以及自己在项目中承担的角色和贡献。重点突出项目中的亮点和挑战,以及如何解决这些挑战。
- TCP 机制和挥手
- TCP 是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP 建立连接需要三次握手,关闭连接需要四次挥手。
- 三次握手过程:
- 客户端向服务器发送一个 SYN 报文,请求建立连接。
- 服务器收到 SYN 报文后,向客户端发送一个 SYN/ACK 报文,确认客户端的请求并请求建立连接。
- 客户端收到 SYN/ACK 报文后,向服务器发送一个 ACK 报文,确认服务器的请求,连接建立成功。
- 四次挥手过程:
- 客户端向服务器发送一个 FIN 报文,请求关闭连接。
- 服务器收到 FIN 报文后,向客户端发送一个 ACK 报文,确认客户端的请求。
- 服务器向客户端发送一个 FIN 报文,请求关闭连接。
- 客户端收到 FIN 报文后,向服务器发送一个 ACK 报文,确认服务器的请求,连接关闭成功。
- 如何申请内存
- 在 C++ 中,可以使用 new 和 delete 运算符来申请和释放内存。例如:
int* ptr = new int;
delete ptr;
- 在 C 语言中,可以使用 malloc、calloc 和 realloc 函数来申请内存,使用 free 函数来释放内存。例如:
以下是数据结构题目:
- C++ 哈希表底层如何实现的
- C++ 中的哈希表通常是通过哈希函数和链表或红黑树等数据结构来实现的。
- 哈希函数将键值映射到一个整数索引,然后将键值对存储在对应的索引位置的链表或红黑树中。
- 当插入一个键值对时,首先计算键值的哈希值,然后将键值对存储在对应的索引位置的链表或红黑树中。
- 当查找一个键值对时,首先计算键值的哈希值,然后在对应的索引位置的链表或红黑树中查找键值对。
- 如何设计哈希表
- 设计哈希表需要考虑以下几个方面:
- 哈希函数的选择:哈希函数应该尽可能地将不同的键值映射到不同的索引位置,以减少哈希冲突的发生。
- 哈希表的大小:哈希表的大小应该根据预期的键值数量来选择,以减少哈希冲突的发生。
- 处理哈希冲突的方法:可以使用链表或红黑树等数据结构来处理哈希冲突。
- 哈希表的扩容:当哈希表中的键值数量超过哈希表的大小一定比例时,需要对哈希表进行扩容,以减少哈希冲突的发生。
- 设计哈希表需要考虑以下几个方面:
- 如何解决大数据下哈希扩容的问题
- 在大数据下,哈希表的扩容可能会导致性能问题。为了解决这个问题,可以采用以下方法:
- 预分配足够大的哈希表空间,以减少扩容的次数。
- 采用渐进式扩容的方法,即在哈希表需要扩容时,逐步将旧哈希表中的键值对迁移到新哈希表中,而不是一次性迁移所有键值对。
- 采用分布式哈希表的方法,将哈希表分布在多个节点上,以减少单个节点的负载。
- 在大数据下,哈希表的扩容可能会导致性能问题。为了解决这个问题,可以采用以下方法:
- 排序算法有哪些
- 常见的排序算法有冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序等。
(二)腾讯 SRE 面试(Offer 已达)
- 一面
- 自我介绍:在自我介绍中,要简洁明了地介绍自己的姓名、学历、工作经验、专业技能和项目经验等。重点突出自己的优势和亮点,以及与应聘岗位的匹配度。
- 现在的 CICD 流程:CICD 是持续集成、持续交付和持续部署的缩写。CICD 流程通常包括代码提交、构建、测试、部署等环节。在回答这个问题时,要详细地介绍自己所在团队的 CICD 流程,包括各个环节的具体操作和使用的工具。
- 如何加快生产发版时候的 CI:可以从以下几个方面来加快生产发版时候的 CI:
- 优化代码:减少代码中的冗余和复杂逻辑,提高代码的可读性和可维护性。
- 优化构建过程:使用并行构建、缓存构建结果等方法来加快构建速度。
- 优化测试过程:使用自动化测试、并行测试等方法来加快测试速度。
- 优化部署过程:使用自动化部署、容器化部署等方法来加快部署速度。
- k8s 调度器源码:k8s 调度器是 k8s 集群中的一个重要组件,负责将 Pod 分配到合适的节点上。在回答这个问题时,要了解 k8s 调度器的工作原理和源码结构,能够介绍 k8s 调度器的主要算法和流程。
- python 的装饰器实现:装饰器是 Python 中的一种高级语法,用于在不修改原函数代码的情况下,为函数添加额外的功能。在回答这个问题时,要了解装饰器的工作原理和实现方法,能够编写简单的装饰器代码。
- 二面
- 自我介绍:与一面的自我介绍类似,要简洁明了地介绍自己的姓名、学历、工作经验、专业技能和项目经验等。重点突出自己的优势和亮点,以及与应聘岗位的匹配度。
- 现有的集群部署规模:在回答这个问题时,要介绍自己所在团队的集群部署规模,包括节点数量、Pod 数量、服务数量等。同时,要介绍集群的架构和技术选型,以及如何进行集群的管理和维护。
- 迁云的主要实现步骤:迁云是将应用从本地数据中心迁移到云平台的过程。在回答这个问题时,要介绍迁云的主要实现步骤,包括评估云平台的适用性、制定迁云计划、进行数据迁移、进行应用迁移、进行测试和验证等。同时,要介绍迁云过程中可能遇到的问题和解决方案。
- 服务治理的一些细节:服务治理是指对分布式系统中的服务进行管理和监控的过程。在回答这个问题时,要介绍服务治理的一些细节,包括服务注册与发现、负载均衡、熔断降级、限流等。同时,要介绍服务治理的实现方法和使用的工具。
- 对腾讯云的 TKE 的理解:TKE 是腾讯云提供的容器服务,用于管理和部署容器化应用。在回答这个问题时,要了解 TKE 的功能和特点,能够介绍 TKE 的主要架构和使用方法。同时,要介绍自己在使用 TKE 过程中的经验和体会。
- 后续对非云原生的发展:在回答这个问题时,要介绍自己对非云原生技术的理解和看法,以及如何将非云原生技术与云原生技术相结合,实现更好的应用部署和管理。
(三)其他面试问题
- 僵尸进程和孤儿进程
- 僵尸进程是指子进程结束后,父进程没有及时回收子进程的资源,导致子进程的进程描述符仍然存在于系统中的进程。僵尸进程会占用系统资源,影响系统性能。
- 孤儿进程是指父进程结束后,子进程还在运行,此时子进程的父进程变为 init 进程的进程。孤儿进程不会影响系统性能,因为 init 进程会负责回收孤儿进程的资源。
- 进程和线程的区别
- 进程是操作系统分配资源的基本单位,线程是操作系统调度的基本单位。
- 进程拥有独立的地址空间,线程共享进程的地址空间。
- 进程的创建和销毁开销较大,线程的创建和销毁开销较小。
- 进程之间的通信需要通过操作系统提供的机制,线程之间的通信可以直接通过共享内存等方式进行。
- 虚函数
- 虚函数是在基类中声明为 virtual 的函数,在派生类中可以重写虚函数。虚函数的实现是通过虚函数表来实现的,每个包含虚函数的类都有一个虚函数表,虚函数表中存储了类中虚函数的地址。当通过基类指针或引用调用虚函数时,会根据对象的实际类型来调用相应的虚函数。
- CSAPP
- 《深入理解计算机系统》(Computer Systems: A Programmer's Perspective,简称 CSAPP)是一本介绍计算机系统的经典书籍。这本书涵盖了计算机系统的各个方面,包括计算机组成、操作系统、编译原理、网络编程等。在面试中,可能会问到关于 CSAPP 中的一些概念和知识,例如数据表示、内存管理、指令集架构、系统调用等。
- 算法竞赛,动态规划题目是怎么判断为动态规划的
- 动态规划是一种解决多阶段决策问题的算法思想。在判断一个算法竞赛题目是否可以用动态规划来解决时,可以从以下几个方面来考虑:
- 问题是否具有最优子结构性质:即问题的最优解可以由子问题的最优解推导出来。
- 问题是否具有无后效性:即当前阶段的决策只与当前状态有关,而与过去的状态无关。
- 问题是否可以用状态转移方程来描述:即可以用一个状态转移方程来描述问题的状态之间的关系。
- 动态规划是一种解决多阶段决策问题的算法思想。在判断一个算法竞赛题目是否可以用动态规划来解决时,可以从以下几个方面来考虑:
三、总结
通过这次虾皮和腾讯的 SRE 岗位面试,我对 SRE 岗位的要求和技术栈有了更深入的了解。在面试过程中,我也发现了自己的不足之处,例如对一些技术细节的掌握不够深入、对一些问题的回答不够全面等。在今后的学习和工作中,我将继续努力,不断提升自己的技术水平和综合素质,为成为一名优秀的 SRE 工程师而努力。