美团中间件C++一面-面经总结

devtools/2024/9/25 5:55:03/

1、TCP和UDP 的区别?

速记标识符:连靠刘墉宿营
解释:
面向连接vs无连接
可靠传输vs不保证可靠
字节流vs报文传输
拥塞控制流量控制vs无
速度慢vs速度快
应用场景自己描述

2、服务端处于close wait是什么情况,是由什么造成的?

close_wait是一种状态,是收到了关闭请求,并且返回了ACK确认之后的状态。

1.客户端发起关闭请求(FIN):客户端主动关闭连接,发送 FIN 报文给服务端。
2.服务端接收到 FIN,进入 CLOSE_WAIT 状态:服务端收到客户端的 FIN 报文后,向客户端发送一个 ACK 报文,确认收到了关闭请求。此时,服务端的状态变为 CLOSE_WAIT
3.等待服务端关闭连接:服务端的应用程序此时应该执行关闭操作(通常调用 close() 函数),发送 FIN 报文给客户端,并完成整个连接的关闭过程。

原因如下:
为什么会wait主要是因为:
1.服务端没有调用close() 没有及时关闭
2.资源泄漏或者代码缺陷
3.server的业务逻辑太复杂了

解决close_wait问题:
1.保证正确调用close
2.检查资源泄露
3.优化服务器逻辑
4.netstat和ss看看连接状态 可以看长时间是close_wait

3、讲讲三次握手和四次挥手?

第一次握手:client向server发送一个SYN 携带自己的初始化序列号。
第二次握手:server收到,以自己的SYN为应答,把自己的初始化序列号发送回client,并且把client的初始化序列号+1作为ACK返回。
第三次握手:client收到,把server的初始化序列号+1作为ACK发回server。

第一次挥手:client发送FIN给server来请求关闭连接
第二次挥手:server收到发回一个ACK 表示接收客户端关闭请求。
第三次挥手:server也发送一个FIN给client来请求关闭
第四次挥手:client收到,发送一个ACK作为应答,已经接收到了服务器的关闭请求。

4、讲讲慢启动?

探测网络的负载或者承受能力。

算法思路:由小到大逐渐增大拥塞窗口,当自己主机刚连进网络时如果一下注入太多资源可能造成网络拥塞,因此循序渐进的探测网络的拥塞程度。每收到一个确认报文拥塞窗口就增加一个报文段。

慢启动门限ssthresh(状态变量)防止拥塞窗口cwnd增长过大引起网络拥塞。

当cwnd<ssthresh,使用慢启动算法。
当cwnd>sshresh,停止使用慢启动算法而使用拥塞避免方法。
当cwnd = sshresh时既可以使用慢启动算法也可以使用拥塞避免算法。

5、ARP是哪层?

Address:数据链路层
处理IP-----MAC映射
作用:局域网内,通过IP地址查找MAC地址,在网络中进行数据帧传输。

6、TCP和UDP是哪层的?

传输层

7、分页置换算法你知道有啥?

FIFO-容易belady
LRU-最近最久
OPT-理论最优
CLOCK
LFU-最近最少使用
NRU
MFU

8、听说过page cache吗?

它通过将文件的数据缓存到内存中,减少对磁盘的直接访问,提高读写速度。

工作原理:

缓存文件内容:当应用程序从文件中读取数据时,操作系统会将这些数据存储到 Page Cache 中。下次读取相同的数据时,操作系统可以直接从内存中的 Page Cache 提供数据,而无需访问磁盘,减少 I/O 操作的延迟。
写入时缓存:对于写操作,操作系统通常不会立即将数据写入磁盘,而是先将数据写入 Page Cache。Page Cache 中的数据会在适当的时机(如内存压力大或文件关闭时)通过刷回机制写入磁盘,确保数据持久性。这种机制被称为 write-back 策略。
内存管理与回收:Page Cache 会占用系统内存,如果内存不足,操作系统会根据需求淘汰部分缓存页面,释放内存用于其他用途。

优点:

减少磁盘 I/O:通过缓存文件数据,可以大大减少对磁盘的访问,提升文件读写性能。
提高系统性能:由于内存的访问速度远快于磁盘,Page Cache 能显著减少文件操作的延迟。
Write-back 提高效率:对于写操作,Page Cache 可以减少频繁的磁盘写操作,等到适合的时机再批量写入,优化了写入性能。

运作过程:

读操作:当文件被读取时,操作系统首先会检查 Page Cache 是否已有相应数据。如果缓存命中,直接从 Page Cache 中返回数据。如果缓存未命中,则从磁盘加载页面到 Page Cache 中,并将数据返回给请求进程。
写操作:写操作也会被暂时存储在 Page Cache 中,数据不会立即写入磁盘。当内存压力增大或者文件关闭时,操作系统会将这些脏页(已被修改但尚未写回磁盘的页面)刷回磁盘,确保数据的一致性。

Page Cache 和虚拟内存:

Page Cache
是虚拟内存管理的一部分。操作系统将文件系统的页面和内存管理结合起来,通过文件映射将文件数据加载到虚拟地址空间。实际上,Page Cache
与应用程序的内存页(如进程的代码、堆栈等)共享相同的物理内存池,因此 Page Cache 的大小会根据系统内存的可用性进行动态调整。

9、满二叉树有多少个点 ?

深度为d 总数为2^d-1

10、怎么找链表上的环(快慢指针)?

这个很经典 快指针两步 慢指针一步
如果有环一定相遇 (想跑道)
没有环的话 快指针就回到nullptr

11、说说为啥用B+树,比较一下红黑树?

1.b+树只有数据存储在叶子节点,每次IO操作读取的内容更大,减少访问磁盘的次数
2.叶子节点之间还有链表连接,方便范围查询。
3.b+树多路查找,更加的矮胖,访问的节点数少。
4.查找时所有路径长度相同,查找时间更加稳定。
5.适合在磁盘或者外存,而不是红黑树的RAM

12、LSM树听说过吗?

Log-Structured Merge-tree
特别适用于需要大量写操作的场景,比如日志系统、数据库和文件系统。
LSM树的主要思想是将写操作批量化,并延迟写入磁盘,从而提高写入效率。它通过将数据分布到不同的存储层来实现高效的写入和读取。

写入操作(MemTable):当数据写入 LSM 树时,首先会写入到内存中的一个数据结构,通常是一个跳表或平衡二叉搜索树,称为 MemTable。MemTable 是一个内存中树结构的实现,提供了快速的插入和查找操作。数据刷新(SSTable):当 MemTable 达到一定的大小时,它会被转换为一个不可变的数据结构,称为 Immutable MemTable。此时,MemTable 被写入到磁盘中,生成一个 SSTable(Sorted String Table) 文件。SSTable 是一种有序的数据文件,适合于高效的顺序读写。合并操作(Merge):随着时间的推移,多个 SSTable 文件可能会积累在磁盘中。为了保持读取性能,LSM 树会定期执行合并操作,将多个 SSTable 文件合并成更大的 SSTable 文件。这个过程称为 Compaction。合并操作会将数据重新排序、删除重复或过时的数据,并优化存储结构,以减少后续的查询开销。读取操作:在查询数据时,LSM 树首先会查询 MemTable,如果数据不在 MemTable 中,则会在 SSTable 文件中查找。读取操作通常会涉及到多个 SSTable 文件,但合并操作会优化查询路径,使得查询效率较高。

优势

高效的写入性能:写操作主要在内存中的 MemTable 进行,内存写入速度快,减少了直接对磁盘的频繁写入。数据写入磁盘时是批量操作,合并过程也能优化写入效率。
顺序写入优化:LSM 树的写操作是顺序写入到磁盘上的 SSTable 文件中,这对于现代存储设备(如 SSD)来说是非常高效的,因为顺序写入比随机写入性能更好。
减少磁盘碎片:合并操作可以减少磁盘碎片,优化存储布局,减少后续的读取开销。
高效的范围查询:SSTable 文件是有序的,这使得范围查询非常高效,尤其是在合并操作优化之后。

劣势

读取性能的复杂性:查询操作可能需要遍历多个 SSTable 文件,虽然合并操作能够优化查询路径,但在某些情况下,读取操作可能会比较复杂和耗时。
合并操作的开销:合并操作是一个资源密集型的过程,可能会影响系统的 I/O 性能和响应时间。

应用场景

数据库系统:如 Apache Cassandra、HBase 和 LevelDB 都使用了 LSM 树来优化写入性能和范围查询能力。
日志系统:适用于需要高效写入和读取日志数据的系统。
文件系统:用于优化文件的写入和读取操作。

13、讲讲mysql 的锁?

在这里插入图片描述全局锁用于:全库逻辑备份(直接全局只读)
这个是针对MyISAM这种不支持事务的引擎。

表锁:粒度较大,但操作简单
元数据锁:用于保护对数据库对象的元数据的访问,例如表结构、索引等。
意向锁:用于协调不同粒度的锁(例如行锁和表锁)之间的冲突。

行级锁:仅锁定需要操作的具体行
在这里插入图片描述

14、讲一下innoDB?

innoDB是默认的引擎
1.支持ACID
2.支持牛逼的行锁,减少锁冲突
3.支持外键约束
4.有redo log崩溃后可以回复
5.支持数据压缩
6.支持四种事务隔离离别

talk is cheap,show me the code:

LC 76–最小覆盖子串


http://www.ppmy.cn/devtools/116831.html

相关文章

俯卧撑动作起伏识别计数系统源码分享

俯卧撑动作起伏识别计数检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Co…

armbian debian 系统安装overlayroot后无法启用

千盼万盼 终于debian12可以用了 它终于也跟ubuntu 系统一样可以安装overlayroot了 但是 满怀欣喜的装完了发现 压根没法启动 这。。。。。 原因吗 也简单。。。 默认的映像里没有busybox......... 而它有这个要求。。。 overlayroot 包中有一个小错误&#xff1a;它要求 gr…

深度学习:数据增强

目录 前言 一、为什么要使用数据增强&#xff1f; 二、数据增强有哪些方法&#xff1f; 1. 几何变换 2. 颜色变换 3. 噪声添加 4. 裁剪 5. 混合技术 6. 其他方法 三、代码实现 前言 数据增强是深度学习中常用的一种技术&#xff0c;旨在通过对训练数据进行各种变换来…

计算机毕业设计之:宠物互助平台的微信小程序系统(源码+文档+讲解)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

低代码中实现数据映射的必要性与方案

在数字化转型的浪潮中&#xff0c;低代码平台因其快速开发和灵活性而受到越来越多企业的青睐。然而&#xff0c;随着业务需求的复杂化&#xff0c;单纯依赖低代码工具往往难以满足企业在数据处理和业务逻辑上的要求。数据映射作为连接不同数据源和业务逻辑的桥梁&#xff0c;显…

【C++篇】手撕 C++ string 类:从零实现到深入剖析的模拟之路

文章目录 C string 类的模拟实现&#xff1a;从构造到高级操作前言第一章&#xff1a;为什么要手写 C string 类&#xff1f;1.1 理由与价值 第二章&#xff1a;实现一个简单的 string 类2.1 基本构造与析构2.1.1 示例代码&#xff1a;基础的 string 类实现2.1.2 解读代码 2.2 …

WPF 中的线程池

WPF 中的线程池 在 WPF 中&#xff0c;虽然应用程序主要运行在 UI 线程上&#xff0c;但我们可以使用 线程池 来执行后台任务而不会阻塞 UI 线程。WPF 中常用的线程池是 .NET 线程池&#xff0c;可以通过 ThreadPool 类或 Task 来管理后台任务。以下是 WPF 中如何使用线程池及…

TCP/IP协议详解:现代网络通信的基石

在现代网络通信中&#xff0c;TCP/IP协议&#xff08;Transmission Control Protocol/Internet Protocol&#xff0c;传输控制协议/互联网协议&#xff09;是核心基础。几乎所有的互联网通信都依赖于它&#xff0c;它为网络中的设备提供了标准的通信方法。在本文中&#xff0c;…