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

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--最小覆盖子串

相关推荐
Ciderw8 分钟前
LeetCode 257. 二叉树的所有路径,dfs
数据结构·c++·算法·leetcode·面试·深度优先
亿林网络安全事业部1 小时前
等保测评:如何应对网络攻击
网络·安全·web安全
nfgo1 小时前
HTTP(超文本传输协议)基础
网络·网络协议·http
Mogu_cloud1 小时前
闲盒支持的组网方式和注意事项
网络·云计算·边缘计算
Flower#1 小时前
C. Lazy Narek (Codeforces Round 972 (Div. 2))
c++·算法·动态规划
kaixiang3001 小时前
交换机和路由器的区别
网络
无限大.2 小时前
力扣题解2207
数据结构·c++·算法
wizard_fire2 小时前
C++ 单例模式
c++·设计模式
酷帅且洋仔2 小时前
Redis——redispluspls库list及set类型相关接口使用
c++·redis·list
终端安全管理2 小时前
不在同一局域网怎么远程桌面?非局域网环境下,实现远程桌面访问的5个方法分享!
运维·服务器·网络·经验分享·科技·电脑