技术面中常见问题

计算机网络

  • 简述七层模型/五层模型/四层模型

  • 从用户在浏览器输入baidu.com,到浏览器最终渲染出baidu.com页面,中间发生了什么

  • 介绍下http状态码

  • 介绍下https协议的原理

数据库

  • 外连接(左、右连接)、内连接的区别

  • 分库分表

操作系统

  • 优先级调度算法

  • 饥饿是什么

  • 死锁是什么?如何检测?如何避免?

C++

  • 虚函数

  • 堆栈空间区别

  • 堆栈空间:malloc的是堆空间还是栈空间

  • 什么情况下会出现Segmentation fault

软件测试

  • 如何对一个文件传输的网页进行测试

  • 如何测试一个用户登录页面

  • 压力测试会关注哪些性能指标

  • 针对一个接口,你会从哪些维度来测试

  • V型图、测试流程

shell

  • 根目录下,查找所有目录中名为abc的文件夹

  • 修改权限 chmod 后边的三位数是什么

  • 跨系统拷贝 scp

介绍下对称、非对称加密

算法题:大多数都是剑指offer/力扣 Interview 75原题

答案(使用AI生成)

计算机网络

  • 简述七层模型/五层模型/四层模型

    七层模型(OSI):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

    五层模型:物理层、数据链路层、网络层、传输层、应用层(简化OSI模型,合并会话层和表示层)。

    四层模型(TCP/IP):网络接口层、互联网层、传输层、应用层。

  • 从用户在浏览器输入baidu.com,到浏览器最终渲染出baidu.com页面,中间发生了什么

    DNS 解析:将 baidu.com 解析为 IP 地址。

    TCP 连接:通过三次握手建立 TCP 连接。

    发送 HTTP/HTTPS 请求:浏览器向服务器发送请求。

    服务器处理请求:服务器返回 HTML、CSS、JS 等资源。

    浏览器渲染页面:解析 HTML,加载 CSS 和 JS,最终展示页面。

  • 介绍下http状态码

    HTTP 状态码用于表示服务器对请求的响应结果,主要分类如下:

    • 1xx(信息性,不常用):请求已接收,继续处理。

    • 2xx(成功):请求成功,如 200 OK

    • 3xx(重定向):需要进一步操作,如 301 Moved Permanently302 Found

    • 4xx(客户端错误):请求有错误,如 404 Not Found403 Forbidden

    • 5xx(服务器错误):服务器无法完成请求,如 500 Internal Server Error

  • 介绍下https协议的原理

    HTTPS(HyperText Transfer Protocol Secure)是在 HTTP 基础上加入 SSL/TLS 加密,确保数据传输的安全性。其主要原理包括 对称加密、非对称加密、数字证书TLS 握手过程

    核心过程:

    1. 浏览器向服务器发起 HTTPS 请求。

    2. 服务器返回 SSL 证书,包含公钥。

    3. 客户端验证证书,并使用公钥加密一个随机对称密钥。

    4. 服务器用私钥解密,双方开始使用对称加密通信。

    5. 数据加密传输,防止中间人攻击。

数据库

  • 外连接(左、右连接)、内连接的区别

    内连接(INNER JOIN):只返回两张表中匹配的记录。

    外连接(OUTER JOIN)包括 左连接(LEFT JOIN)和 右连接(RIGHT JOIN)

    • 左连接(LEFT JOIN):返回左表的所有记录,即使右表没有匹配项,未匹配部分填充 NULL

    • 右连接(RIGHT JOIN):返回右表的所有记录,即使左表没有匹配项,未匹配部分填充 NULL

  • 分库分表

【答案】

  • 分库:将数据拆分到不同的数据库中,通常按业务模块或用户维度分库,适用于大规模数据和高并发场景。

  • 分表:将一张大表拆成多张小表,通常按时间、ID 范围等规则分表,以提高查询和写入效率。

【解析】

  1. 为什么要分库分表?

    • 单机数据库性能瓶颈:随着数据量增长,单个数据库难以支撑大规模查询和写入。

    • 磁盘存储限制:数据库文件过大会影响索引效率。

    • 高并发需求:分库分表可以提高系统吞吐量,减少锁竞争。

  2. 分库(Database Sharding)

    • 按业务分库:不同业务使用不同的数据库(如 user_dborder_db)。

    • 按用户 ID 取模分库:如 user_id % 4,将数据存入 db0 ~ db3

    • 按地理区域分库:例如不同国家/地区的数据存入不同数据库。

    • 优点:数据库并发能力提升,单库压力减少。

    • 缺点:跨库事务、跨库查询变复杂。

  3. 分表(Table Sharding)

    • 水平分表:将一张大表拆成多张表(如 user_0user_1…)。

    • 垂直分表:按字段拆分(如 user_basic_infouser_financial_info)。

    • 分表策略

      • 按时间分表(如 orders_202401orders_202402)。

      • 按 ID 取模(如 user_id % 4)。

      • 按范围分表(如 user_id 1-10万在 user_1 表,10万-20万在 user_2 表)。

    • 优点:单表数据减少,索引效率提升。

    • 缺点:查询时可能需要合并数据,代码复杂度增加。

  4. 分库分表常见中间件

    • MyCat:分库分表代理,支持 SQL 路由。

    • ShardingSphere:提供分库分表、读写分离。

    • Vitess:Google 开源的分库分表解决方案。

示例:分表查询(按 user_id 取模分 4 张表)

SELECT * FROM user_${user_id % 4} WHERE id = #{user_id};

在代码层面,需要动态拼接 SQL,访问不同的表。

操作系统

  • 优先级调度算法

  • 饥饿是什么

    饥饿是指某些低优先级进程长期得不到 CPU 资源或其他系统资源,导致执行无限推迟。

    解决方法

    1. 老化(Aging):随着等待时间增加,提高进程优先级。

    2. 轮询机制(Round-Robin):给每个进程分配时间片,防止长期等待。

    3. 动态调整调度策略:如 CPU 负载均衡,保证所有进程都有执行机会。

  • 介绍下死锁如何检测、如何避免

    死锁的四个必要条件(同时满足才会发生死锁):

    1. 互斥(Mutual Exclusion):资源只能被一个进程占有。

    2. 占有且等待(Hold and Wait):进程持有资源的同时,还在等待其他资源。

    3. 不可抢占(No Preemption):资源不能被强制回收。

    4. 循环等待(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(虚函数表) 确定调用哪个函数。

    示例代码

    #include <iostream>
    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;
    }

    关键点:

    1. 虚函数表(vtable):存储了该类的所有虚函数指针。

    2. 虚指针(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)

非对称加密:使用公钥加密,私钥解密,适用于身份认证和安全通信(RSA, ECC, DSA)(HTTPS, 数字签名, SSH登录, 区块链ECC等)