计算机网络
-
简述七层模型/五层模型/四层模型
-
从用户在浏览器输入baidu.com,到浏览器最终渲染出baidu.com页面,中间发生了什么
-
介绍下http状态码
-
介绍下https协议的原理
数据库
-
外连接(左、右连接)、内连接的区别
-
分库分表
操作系统
-
优先级调度算法
-
饥饿是什么
-
死锁是什么?如何检测?如何避免?
C++
-
虚函数
-
堆栈空间区别
-
堆栈空间:malloc的是堆空间还是栈空间
-
什么情况下会出现Segmentation fault
软件测试
-
如何对一个文件传输的网页进行测试
-
如何测试一个用户登录页面
-
压力测试会关注哪些性能指标
-
针对一个接口,你会从哪些维度来测试
-
V型图、测试流程
shell
-
根目录下,查找所有目录中名为abc的文件夹
-
修改权限 chmod 后边的三位数是什么
-
跨系统拷贝 scp
介绍下对称、非对称加密
算法题:大多数都是剑指offer/力扣 Interview 75原题
答案(使用AI生成)
计算机网络
-
简述七层模型/五层模型/四层模型
七层模型(OSI):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
五层模型:物理层、数据链路层、网络层、传输层、应用层(简化OSI模型,合并会话层和表示层)。
四层模型(TCP/IP):网络接口层、互联网层、传输层、应用层。
-
DNS 解析:将
baidu.com
解析为 IP 地址。TCP 连接:通过三次握手建立 TCP 连接。
发送 HTTP/HTTPS 请求:浏览器向服务器发送请求。
服务器处理请求:服务器返回 HTML、CSS、JS 等资源。
浏览器渲染页面:解析 HTML,加载 CSS 和 JS,最终展示页面。
-
介绍下http状态码
HTTP 状态码用于表示服务器对请求的响应结果,主要分类如下:
-
1xx(信息性,不常用):请求已接收,继续处理。
-
2xx(成功):请求成功,如
200 OK
。 -
3xx(重定向):需要进一步操作,如
301 Moved Permanently
、302 Found
。 -
4xx(客户端错误):请求有错误,如
404 Not Found
、403 Forbidden
。 -
5xx(服务器错误):服务器无法完成请求,如
500 Internal Server Error
。
-
-
介绍下https协议的原理
HTTPS(HyperText Transfer Protocol Secure)是在 HTTP 基础上加入 SSL/TLS 加密,确保数据传输的安全性。其主要原理包括 对称加密、非对称加密、数字证书 及 TLS 握手过程。
核心过程:
-
浏览器向服务器发起 HTTPS 请求。
-
服务器返回 SSL 证书,包含公钥。
-
客户端验证证书,并使用公钥加密一个随机对称密钥。
-
服务器用私钥解密,双方开始使用对称加密通信。
-
数据加密传输,防止中间人攻击。
-
数据库
-
外连接(左、右连接)、内连接的区别
内连接(INNER JOIN):只返回两张表中匹配的记录。
外连接(OUTER JOIN)包括 左连接(LEFT JOIN)和 右连接(RIGHT JOIN)
-
左连接(LEFT JOIN):返回左表的所有记录,即使右表没有匹配项,未匹配部分填充
NULL
。 -
右连接(RIGHT JOIN):返回右表的所有记录,即使左表没有匹配项,未匹配部分填充
NULL
。
-
-
分库分表
【答案】
分库:将数据拆分到不同的数据库中,通常按业务模块或用户维度分库,适用于大规模数据和高并发场景。
分表:将一张大表拆成多张小表,通常按时间、ID 范围等规则分表,以提高查询和写入效率。
【解析】
为什么要分库分表?
单机数据库性能瓶颈:随着数据量增长,单个数据库难以支撑大规模查询和写入。
磁盘存储限制:数据库文件过大会影响索引效率。
高并发需求:分库分表可以提高系统吞吐量,减少锁竞争。
分库(Database Sharding)
按业务分库:不同业务使用不同的数据库(如
user_db
、order_db
)。按用户 ID 取模分库:如
user_id % 4
,将数据存入db0 ~ db3
。按地理区域分库:例如不同国家/地区的数据存入不同数据库。
优点:数据库并发能力提升,单库压力减少。
缺点:跨库事务、跨库查询变复杂。
分表(Table Sharding)
水平分表:将一张大表拆成多张表(如
user_0
、user_1
…)。垂直分表:按字段拆分(如
user_basic_info
、user_financial_info
)。分表策略
按时间分表(如
orders_202401
、orders_202402
)。按 ID 取模(如
user_id % 4
)。按范围分表(如
user_id
1-10万在user_1
表,10万-20万在user_2
表)。优点:单表数据减少,索引效率提升。
缺点:查询时可能需要合并数据,代码复杂度增加。
分库分表常见中间件
MyCat:分库分表代理,支持 SQL 路由。
ShardingSphere:提供分库分表、读写分离。
Vitess:Google 开源的分库分表解决方案。
示例:分表查询(按
user_id
取模分 4 张表)SELECT * FROM user_${user_id % 4} WHERE id = #{user_id};
在代码层面,需要动态拼接 SQL,访问不同的表。
操作系统
-
优先级调度算法
-
饥饿是什么
饥饿是指某些低优先级进程长期得不到 CPU 资源或其他系统资源,导致执行无限推迟。
解决方法:
-
老化(Aging):随着等待时间增加,提高进程优先级。
-
轮询机制(Round-Robin):给每个进程分配时间片,防止长期等待。
-
动态调整调度策略:如 CPU 负载均衡,保证所有进程都有执行机会。
-
-
介绍下死锁如何检测、如何避免
死锁的四个必要条件(同时满足才会发生死锁):
-
互斥(Mutual Exclusion):资源只能被一个进程占有。
-
占有且等待(Hold and Wait):进程持有资源的同时,还在等待其他资源。
-
不可抢占(No Preemption):资源不能被强制回收。
-
循环等待(Circular Wait):存在一个进程等待环,如 A→B→C→A。
检测:
(1) 资源分配图(Resource Allocation Graph, RAG)
-
进程→资源的请求用箭头表示,资源→进程的分配也用箭头表示。
-
如果存在环(Cycle),可能发生死锁(若资源只有一个实例,则一定死锁)。
(2) 银行家算法(Banker’s Algorithm)(适用于资源可重复分配场景)
-
判断系统是否处于 安全状态(Safe State),若不安全,则可能发生死锁。
预防:
-
破坏死锁的四个必要条件之一
-
使用超时策略
-
C++
-
虚函数
【答案】 虚函数是 C++ 中用于实现多态 的成员函数,它在基类中被
virtual
关键字声明,并且可以在派生类中 重写(override)。调用虚函数时,会根据实际对象类型动态绑定到对应的函数,而不是按照指针或引用的类型调用。【解析】
-
普通函数调用 是 静态绑定(Static Binding),在编译时确定函数地址。
-
虚函数调用 是 动态绑定(Dynamic Binding),在运行时根据对象的 vtable(虚函数表) 确定调用哪个函数。
示例代码
using namespace std; class Base { public: virtual void show() { cout << "Base show" << endl; } }; class Derived : public Base { public: void show() override { cout << "Derived show" << endl; } }; int main() { Base* ptr = new Derived(); ptr->show(); // 输出:Derived show(动态绑定) delete ptr; }
关键点:
-
虚函数表(vtable):存储了该类的所有虚函数指针。
-
虚指针(vptr):每个对象都有一个指向 vtable 的指针,用于动态绑定。
-
-
堆栈空间区别
比较项 堆(Heap) 栈(Stack) 分配方式 运行时动态分配 ( new/malloc
)编译时自动分配 释放方式 delete/free
需要手动释放自动释放 存储内容 动态分配的对象 局部变量、函数参数、返回地址 访问速度 慢(需要管理内存) 快(直接由 CPU 管理) 作用范围 进程的整个生命周期 仅在函数作用域内有效 溢出情况 内存泄漏(未释放) 栈溢出(Stack Overflow) -
堆栈空间:malloc的是堆空间还是栈空间
-
什么情况下会出现Segmentation fault
访问 未初始化的指针
访问 NULL 指针
访问 越界内存
访问 已释放的内存(悬空指针)
栈溢出(Stack Overflow)
修改只读区(如字符串常量)
软件测试
-
如何对一个文件传输的网页进行测试
文件传输网页的测试需要涵盖 功能测试、性能测试、安全测试、兼容性测试 等方面,以确保文件上传/下载的正确性、安全性和稳定性。
功能测试(1)上传
-
上传支持的格式,检查是否上传成功
-
上传超大文件(超出最大限制),检查是否正确提示错误
-
上传空文件,检查是否允许或提示错误
-
上传同名文件,检查如何处理(覆盖、重命名、拒绝等)
-
取消上传,检查是否正确停止
(2)下载
-
合法URL下载,确保内容完整
-
非法URL下载,检查是否返回403/404
-
断电续传测试(如支持Range请求)
性能测试
-
上传/下载速度
-
压力测试(同时上传大文件、同时进行大量并发上传)
安全测试
-
文件校验(是否可以上传、下载恶意文件,如exe, bat等,以及是否验证文件完整性,如MD5, SHA-256)
-
权限控制
-
XSS & SQL注入(通过文件名、上传路径进行 XSS、SQL 注入测试)
-
防止DDoS攻击(限制单用户上传速度和并发数量)
兼容性测试
-
不同操作系统
-
不同客户端(Web, APP, 小程序)
-
不同网络
-
-
如何测试一个用户登录页面
同上,加上各种边界值的case
-
压力测试会关注哪些性能指标
吞吐量
-
TPS – 每秒事务数(Transactions Per Second)
-
QPS – 每秒查询数(Queries Per Second)
响应时间
-
P50 – 至少50%的请求都能在该时间内完成
-
P90
-
P99
并发数
CPU使用率
内存使用率
-
-
针对一个接口,你会从哪些维度来测试
功能测试、性能测试、安全测试、兼容性测试、边界测试
-
V型图、测试流程
V型图
-
需求分析 验收测试
-
系统设计 系统测试
-
详细设计 集成测试
-
编码 单元测试
-
shell
-
根目录下,查找所有目录中名为abc的文件夹
使用
find
命令遍历/
目录,并筛选出名称为abc
且类型为目录的文件find / -type d -name "abc"
-
修改权限 chmod 后边的三位数是什么
chmod
三位数分别表示 所有者(Owner)、组(Group)、其他用户(Others) 的权限,每个数字是读(4)+写(2)+执行(1) 的权限总和(八进制数) -
跨系统拷贝 scp
本地->远程
scp localfile user@remote:/path/to/destination
远程->本地
scp user@remote:/path/to/remote/file localdir/
介绍下对称、非对称加密
对称加密:加密和解密使用相同的密钥(DES, AES)(数据库加密、硬盘加密)(BitLocker用的是AES)