一.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 及以后):当使用右值引用对一个已存在的对象进行赋值操作时,编译器会生成移动赋值运算符。它会将资源从源对象转移到目标对象。
六.微信红包如何保证拆分功能的原子性(压力上来了)
START TRANSACTION
开始事务,COMMIT
提交事务,ROLLBACK
回滚事务。如果在事务执行过程中出现任何错误,系统会回滚事务,保证数据的一致性。七.在这个过程中如何避免死锁(延伸问题来了,我好像答成了多进程多线程避免死锁的办法)
当数据库检测到死锁后,通常会选择一个事务进行回滚,释放该事务持有的锁,让其他事务能够继续执行。选择回滚的事务一般是代价最小的事务,例如持有锁最少、执行时间最短的事务。