1.为什么协程切换开销小
协程切换发生在用户态,不涉及用户态和内核态之间的转换。每次切换只需要保存和回复少量CPU寄存器上下文比如程序计数器和栈指针,不用像线程那样要经历内核调度、寄存器保存/恢复、TLB刷新等复杂操作。整个过程纯用户态,开销在纳秒级别
2.进程、线程和协程的区别
| 维度 | 进程 | 线程 | 协程 |
|---|---|---|---|
| 资源分配 | 资源分配的基本单位,独立内存空间 | 共享进程内存空间 | 共享线程资源 |
| 切换开销 | 最高(内核态切换) | 较高(内核态切换) | 最低(用户态切换,纳秒级) |
| 内存占用 | 较大 | ~4-64MB | ~2KB |
| 调度者 | 操作系统内核 | 操作系统内核 | 程序自身(用户态调度器) |
| 共行性 | 可多核并行 | 可多核并行 | 受限于所在线程,需配合调度实现并行 |
3.可不可以无限制开协程,为什么?会导致什么后果?
不可以
- 内存耗尽:每个goroutine都占用内存,数量过多耗尽系统内存
- 调度器压力:Go的GMP调度器需要管理大量的goroutine,过多会导致开销剧增
- CG压力:大量goroutine会增加垃圾回收的扫描负担
- 程序崩溃:最终可能导致OOM(Out of Memory)
4.I/O多路复用模型
5.接口耗时长,如何排查并解决?引起原因有哪些?
常见原因:
- 网络层面:网络延迟、丢包、跨机房调用
- 服务器资源:CPU/内存/IO瓶颈
- 代码逻辑:慢SQL、锁等待、死循环、频繁GC
- 依赖服务:第三方API不稳定、数据库慢查询
- 同步阻塞:线程长时间等待响应
- 过载保护缺失:未限流导致请求堆积
排查步骤:
- 链路追踪:通过分布式追踪(如Jeager)定位耗时环节
- 日志分析:查看各阶段耗时日志
- 慢查询分析:开启Mysql慢查询日志,分析慢SQL
- Profilling:CPU/内存profilling定位热点代码
- 监控告警:查看CPU、内存、网络、GC等指标
解决方案:
- 优化慢SQL(加索引、改写查询)
- 引入缓存(Redis)
- 异步处理非核心逻辑
- 增加超时控制和熔断降级
- 水平扩容
6.HTTP和HTTPS的区别,HTTPS的流程
- 区别:
HTTP明文传输,HTTPS在HTTP基础上增加LLS/TLS加密层 - HTTP默认端口80,HTTPS默认端口443
- HTTP无需证书。HTTPS需要CA签发的数字证书
- HTTPS提供加密传输、身份认证、关键性校验三重保障
HTTPS连接流程:
1.TCP三次握手
2.SSL/TLS握手(非对称加密)
- ClientHello:客户端发送支持的加密套件列表和随机数
- ServerHello:服务端选择加密算法,返回数字证书和随机数
- 证书验证:客户端验证证书有效性
- 密钥交换:通过非对称加密协商生成会话密钥(对称密钥)
- Finished:双方验证握手完整性
3.应用数据传输:使用会话密钥进行对称加密通信
7.HTTPS在建立TLS连接时,是非对称还是对称加密?传输数据时呢?
- TLS握手阶段:使用非对称加密(如RSA、ECDHE)来安全地交换密钥
- 数据传输阶段:使用对称加密(如AES)
原因:非对称加密安全性高但速度慢,适合少量数据(密钥交换);非对称加密速度快,适合大量数据(实际业务数据传输)
8.TCP和UDP的区别
| 维度 | TCP | UDP |
|---|---|---|
| 连接性 | 面向连接(三次握手) | 无连接 |
| 可靠性 | 可靠传输(校验和、重传、序号、滑动窗口、确认应答) | 尽最大努力交付,不保证可靠 |
| 顺序性 | 按序到达 | 不保证顺序 |
| 流量控制 | 有(滑动窗口) | 无 |
| 拥塞控制 | 有 | 无 |
| 速度 | 较慢 | 较快 |
| 适用场景 | 文件传输、HTTP、邮件 | 视频直播、DNS、VolP |
9.HTTP/2.0和HTTP/3.0介绍
HTTP/2.0(2015年)
- 二进制分帧:将数据拆分为二进制帧,不再使用文本格式
- 多路复用(Multiplexing):同一TCP连接上并行传输多个请求/响应
- 头部压缩(HPACK):减少重复header传输
- 服务器推送(Server Push)
- 仍存在TCP层面的队头阻塞(HPL blocking)
HTTP/3.0(2018年定稿)
- 底层传输协议从TCP改为QUIC(基于UDP)
- 彻底解决队头阻塞:QUIC为每个流独立处理丢包重传
- 更快的连接建立:0-RTT或1-RTT握手
- 内置加密(TLS 1.3)
10.虚拟内存是什么?虚拟内存和物理内存如何映射?
虚拟内存是操作系统为每个进程提供的独立、连续的虚拟地址空间,让进程认为自己独占了全部内存。它使得:
- 进程间内存隔离,互不干扰
- 可使用比物理内存更大的地址空间
- 简化内存管理(每个进程看到连续的地址空间)
映射方式——页表(Page Table) :
- 虚拟内存以页(Page) 为单位,物理内存以页框(Page Frame) 为单位
- 页表将虚拟地址转换为物理地址
- CPU中的MMU(内存管理单元) 负责地址转换
- 页表是分层组织的(多级页表),高层页表指向低层页表,最低层页表包含实际物理页地址
- 现代Linux采用五级页表层次结构
说些什么吧!