当前位置: 首页 > article >正文

美团AI面试总结

一.TCP/UDP(具体忘记问的什么问题了,总之就是介绍他俩的区别)

i.TCP是面向连接、一对一通信、字节流、可靠传输,使用流量控制、拥塞避免,tcp首部20个字节,最大60字节
ii.UPD是无连接,支持多对多通信,面向报文,不可靠,首部仅8个字节

二.虚函数及其作用(这个前两天刚刚背过,结果还是有一点忘记了)

虚函数,关键字:virtual,类中都会存在一个虚函数表(vftbl),由一个虚函数表指针(vfptr)指向,虚函数表(vftbl)主要存储类中的虚函数地址。

作用:虚函数的主要作用是实现多态性。多态性是面向对象编程的一个重要特性,它允许你通过基类的指针或引用调用派生类的函数,而具体调用哪个派生类的函数取决于指针或引用所指向的对象类型。这种特性使得代码更加灵活和可扩展,主要体现在以下几个方面:

提高代码的可扩展性:当需要添加新的派生类时,不需要修改基类的代码,只需要在派生类中重写虚函数即可。

实现运行时绑定:在运行时根据对象的实际类型来决定调用哪个函数,而不是在编译时确定。

三.SQL注入攻击及其防范措施(完了这个完全没看过)

应用程序在处理用户输入时,若未对输入内容进行严格的验证和过滤,直接将被注入恶意SQL代码的输入内容拼接到 SQL 查询语句中,攻击者就能够通过构造特殊的输入,改变 SQL 语句的原意,从而达到攻击目的。

防范措施:
使用参数化查询:借助预编译语句和参数化查询,数据库会对输入进行严格的类型检查和过滤,避免恶意 SQL 代码的注入。

输入验证:在应用程序端对用户输入进行严格的验证和过滤,只允许合法的字符和格式。

最小权限原则:数据库用户应仅被赋予完成其任务所需的最小权限,减少攻击者利用注入漏洞造成的危害。

更新和维护:及时更新数据库管理系统和应用程序,修复已知的安全漏洞。

四. Linux的物理内存和虚拟内存

物理内存:指的是计算机中实际安装的随机存取存储器(RAM)芯片,是计算机用于临时存储正在运行的程序和数据的硬件设备。它是计算机进行数据处理和运算的关键组件,程序和数据只有加载到物理内存中才能被 CPU 快速访问和处理。物理内存是 CPU 直接访问的内存区域,其访问速度远高于磁盘等外部存储设备。当程序运行时,操作系统会将程序的指令和数据从磁盘加载到物理内存中,CPU 可以快速地从物理内存中读取和写入数据,从而提高程序的运行效率。

虚拟内存:是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等

五.C++定义了默认析构函数,类会默认生成什么函数

1.默认构造函数:若类中没有显式定义任何构造函数,编译器会生成一个默认构造函数。此构造函数无参数,其作用是对类的对象进行默认初始化。

2.拷贝构造函数:当用一个已存在的对象去初始化一个新对象时,编译器会生成一个拷贝构造函数。该函数会将已存在对象的成员变量逐个复制到新对象中。

3.拷贝赋值运算符:在将一个已存在的对象赋值给另一个已存在的对象时,编译器会生成一个拷贝赋值运算符。它会把源对象的成员变量逐个复制到目标对象中。

4.移动构造函数(C++11 及以后):当使用右值引用初始化一个新对象时,编译器会生成移动构造函数。它会将资源(如动态分配的内存)从源对象转移到目标对象,避免不必要的拷贝。

5移动赋值运算符(C++11 及以后):当使用右值引用对一个已存在的对象进行赋值操作时,编译器会生成移动赋值运算符。它会将资源从源对象转移到目标对象。

六.微信红包如何保证拆分功能的原子性(压力上来了)

数据库层面

分布式系统层面

  • 事务机制:数据库事务是保证原子性的基础。微信红包系统在进行拆分操作时,可以将拆分相关的操作(如更新红包总金额、插入拆分记录等)放在一个事务中。以 MySQL 为例,使用START TRANSACTION开始事务,COMMIT提交事务,ROLLBACK回滚事务。如果在事务执行过程中出现任何错误,系统会回滚事务,保证数据的一致性。
  • 锁机制:为了避免多个并发请求同时修改红包数据导致的数据不一致问题,微信可能会使用数据库的锁机制。例如,使用行级锁,当一个请求对某个红包进行拆分操作时,会锁定该红包对应的数据库行,其他请求需要等待锁释放后才能进行操作。
  • 分布式事务协调器:微信红包系统是一个分布式系统,涉及多个服务和数据库。为了保证分布式环境下的原子性,可能会使用分布式事务协调器,如 Seata、TCC(Try-Confirm-Cancel)等。这些协调器可以协调多个服务和数据库的操作,保证整个拆分操作的原子性。
  • 消息队列:消息队列可以用于实现异步处理和最终一致性。当收到红包拆分请求时,系统会将请求信息发送到消息队列中,然后由专门的消费者进行处理。如果处理过程中出现错误,可以通过消息队列的重试机制进行重试,保证最终数据的一致性。

业务逻辑层面

  • 预检查机制:在进行红包拆分之前,系统会进行一系列的预检查,如检查红包是否已过期、剩余金额是否足够等。只有当所有预检查都通过时,才会进行实际的拆分操作。如果预检查不通过,系统会直接返回错误,不会进行后续的拆分操作,保证了操作的原子性。
  • 幂等性设计:幂等性是指一个操作无论执行多少次,所产生的影响都和执行一次的影响相同。微信红包系统在设计拆分接口时,会保证接口的幂等性。例如,为每个拆分请求生成一个唯一的请求 ID,系统在处理请求时,会先检查该请求 ID 是否已经处理过,如果已经处理过,则直接返回之前的处理结果,避免重复处理导致的数据不一致问题

七.在这个过程中如何避免死锁(延伸问题来了,我好像答成了多进程多线程避免死锁的办法)

检测死锁的方法

  • 超时机制:数据库会为每个事务设置一个超时时间,如果一个事务在规定时间内没有完成,就认为可能发生了死锁,此时会回滚该事务。
  • 死锁检测算法:数据库系统会定期运行死锁检测算法,如等待图算法,来检测是否存在死锁。如果检测到死锁,会选择一个事务进行回滚,以打破死锁。

预防死锁的策略

  • 顺序加锁:所有事务都按照相同的顺序请求锁,避免出现循环等待的情况。例如,所有事务都先对资源 A 加锁,再对资源 B 加锁。
  • 减少锁的持有时间:尽量缩短事务持有锁的时间,减少死锁发生的概率。可以将一些不必要的操作放在事务外部执行。
  • 使用意向锁:意向锁可以表示事务对某个资源有进一步加锁的意图,通过使用意向锁可以避免一些不必要的锁冲突,降低死锁的可能性。

解决死锁的办法

当数据库检测到死锁后,通常会选择一个事务进行回滚,释放该事务持有的锁,让其他事务能够继续执行。选择回滚的事务一般是代价最小的事务,例如持有锁最少、执行时间最短的事务。


http://www.kler.cn/a/590521.html

相关文章:

  • 密码学研究热点
  • obeaver 连接oracle 库 模式乱码
  • 基于 GEE 利用 Sentinel-1 双极化数据计算 SDWI 指数实现逐月提取水域面积
  • 漏洞预警 | Apache OFBiz 服务端模板注入漏洞(CVE-2025-26865)
  • ChatGPT and Claude国内使用站点
  • 汽车PKE无钥匙进入系统一键启动系统定义与原理
  • 动作捕捉手套如何让虚拟现实人机交互 “触手可及”?
  • 【GPT入门】第24课 langfuse介绍
  • Django 集成 Redis 数据库指南
  • PySide(PyQt),QGraphicsItem的坐标映射转换函数
  • 【Unity3D】Addressables使用流程
  • 使用Electron Forge打包serialport模块的详细指南
  • Go语言的智能合约
  • PlainUSR|LIA: 追求更快的卷积网络实现高效的超分辨率重建
  • 在用Docker配置Redis哨兵节点的时候出现的错误及其解决办法
  • 【Python 算法零基础 1.线性枚举】
  • DeepSeek私有化部署与安装浏览器插件内网穿透远程访问实战
  • ISP--Gamma Correction
  • 搞定python之八----操作mysql
  • 【SpringMVC】常用注解:@SessionAttributes