写点什么

金三银四真实面经分享

作者:王中阳Go
  • 2025-03-25
    北京
  • 本文字数:2943 字

    阅读完需:约 10 分钟

从今天开始,不定期分享组织内部成员在金三银四期间的真实面经以及详解,感兴趣的朋友可以把关注点一下,每天学习一点点,进步一点点!

线程和 Goroutine 的区别,线程适用于什么场景,Goroutine 适用于什么场景

  1. 区别

  2. 调度方式:线程由操作系统内核调度,Goroutine 由 Go 运行时调度。

  3. 资源开销:线程栈固定(通常 1MB 以上),创建和销毁开销大;Goroutine 初始栈仅 2KB,可动态扩展,创建成本极低。

  4. 并发数量:线程数量受操作系统限制(通常数千),Goroutine 可轻松创建数十万甚至更多。

  5. 通信方式:线程依赖共享内存和锁同步,易引发竞态条件;Goroutine 通过 Channel 通信,避免显式锁。

  6. 上下文切换:线程切换涉及内核态与用户态切换,开销大;Goroutine 切换由运行时管理,仅调整栈指针,开销小。

  7. 适用场景

  8. 线程:适用于计算密集型任务(如科学计算、图像处理)或需要直接操作底层硬件资源的场景。

  9. Goroutine:适合高并发、I/O 密集型任务(如 Web 服务器、微服务)、需要轻量级并发单元的场景。



进程的生命周期,上下文切换

  1. 生命周期

  2. 创建:通过fork()exec()生成新进程,分配资源(如内存、文件描述符)。

  3. 就绪:进程等待 CPU 调度,进入就绪队列。

  4. 运行:占用 CPU 执行指令。

  5. 阻塞:因等待 I/O 或资源而暂停,进入阻塞队列。

  6. 终止:完成任务或被强制终止,释放资源。

  7. 上下文切换

  8. 定义:保存当前进程的 CPU 状态(寄存器、程序计数器等),加载下一个进程的状态。

  9. 开销:涉及内核态与用户态切换、缓存刷新(如 TLB)。

  10. 类型

  11. 进程切换:切换地址空间,开销最大。

  12. 线程切换:共享进程地址空间,开销较小。

  13. 中断切换:仅保存内核态上下文,不涉及用户态资源。



操作系统一切皆文件,文件描述符

  1. 概念

  2. 文件描述符(FD):非负整数,用于标识进程打开的文件、套接字等资源。

  3. 与 inode 关系:FD 指向内核维护的打开文件表条目,最终关联到文件系统的 inode(存储元数据)。

  4. 作用

  5. 统一接口:通过read()write()等系统调用操作所有资源(如磁盘文件、网络套接字)。

  6. 资源隔离:每个进程维护独立的 FD 表,避免冲突。



TCP 三次握手,五层模型和七层模型

  1. TCP 三次握手

  2. 过程

  3. SYN:客户端发送 SYN 包(序列号x)。

  4. SYN-ACK:服务端返回 SYN 包(序列号y)和 ACK(x+1)。

  5. ACK:客户端发送 ACK(y+1),连接建立。

  6. 目的:确认双方收发能力,同步初始序列号。

  7. 网络模型

  8. OSI 七层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

  9. TCP/IP 五层:物理层、数据链路层、网络层、传输层、应用层(合并会话层、表示层)。

  10. 核心区别:OSI 理论性强,TCP/IP 更贴近实际协议(如 HTTP 位于应用层,TCP/UDP 在传输层)。



HTTPS 和 HTTP 的区别

  1. 加密与安全

  2. HTTP:明文传输,易被窃听或篡改。

  3. HTTPS:通过 SSL/TLS 加密数据,支持身份认证(CA 证书),防止中间人攻击。

  4. 协议细节

  5. 端口:HTTP 默认 80,HTTPS 默认 443。

  6. 性能:HTTPS 因加密计算增加延迟,但现代硬件优化后差距缩小。



TCP 和 UDP 的区别

  1. 连接与可靠性

  2. TCP:面向连接,通过三次握手建立可靠传输,支持丢包重传、流量控制。

  3. UDP:无连接,不保证可靠性,适合实时性要求高的场景(如视频流)。

  4. 头部开销

  5. TCP:头部较大(20 字节),包含序列号、确认号等字段。

  6. UDP:头部仅 8 字节,开销小。

  7. 适用场景

  8. TCP:Web 浏览(HTTP)、文件传输(FTP)。

  9. UDP:DNS 查询、在线游戏、VoIP。



说一下 go 的 chanel,了解 CSP 模型吗

Channel 是 Go 语言中用于 goroutine 间通信 的核心机制,本质是一个类型化的队列,遵循 先进先出 的规则。


CSP 模型是一种并发编程模型。它强调通过通信来共享内存,而不是通过共享内存来通信。CSP 模型基于 goroutine 和 channel 实现的。在 CSP 中,在 Go 中是 goroutine 是独立的,它们之间通过 channel 传递消息来协作,而不是通过共享变量。

什么是死锁

死锁是指两个或多个进程(或线程)在执行过程中,因争夺资源而陷入一种互相等待的僵局死锁的四个必要条件


  1. 互斥(Mutual Exclusion)


资源一次只能被一个进程独占使用(如打印机、文件锁)。


  1. 持有并等待(Hold and Wait)


进程已持有至少一个资源,同时又在等待其他进程持有的资源。


  1. 不可抢占(No Preemption)


资源不能被强制从持有它的进程中剥夺,只能由持有者主动释放。


  1. 循环等待(Circular Wait)


存在一组进程链,每个进程都在等待下一个进程所持有的资源。


(例如:P1 等待 P2 的资源,P2 等待 P3 的资源,P3 等待 P1 的资源)

技术选型,为什么选择 ETCD 作为服务注册中心

我觉得一个服务注册中心需要具备高可用性、一致性和快速响应等特点


  • ETCD 是一个高可用的分布式键值存储系统,通常用于服务发现。

  • ETCD 使用 Raft 算法实现强一致性,确保集群中所有节点的数据实时一致,避免服务注册信息出现分歧节点故障时自动切换 Leader,保证服务注册中心持续可用。

  • 所有操作均持久化到磁盘,即使宕机也能快速恢复,避免注册信息丢失。

  • 客户端可通过 Watch API 实时监听服务实例的注册、注销或状态变化。

  • 服务消费者无需轮询,降低网络开销,提升响应速度。


与其他类型的中间件对比


  • ETCD 的读写性能高,尤其在大规模数据操作时。

  • 轻量级 :ETCD 的部署和维护成本更低。

  • ETCD 提供基于 HTTP 的 RESTful API,支持 JSON 格式的数据交互,对开发者更友好

什么是倒排索引,RaringBitmap 和不同 Bit Map 的区别,倒排索引为什么使用 BitMap 而不是 hashMap

普通 Bitmap 在处理大量数据时,尤其是稀疏数据时,空间效率不高。


比如如果有 100 万个用户 ID,但只有少数几个存在,Bitmap 仍然需要 100 万位的空间,而 RaringBitmap 可能通过压缩减少存储空间。


从时间复杂度对比他们的增删改查操作几乎所用的时间几乎相近

虚拟机跟 docker 有什么区别

  1. 架构与资源隔离方式虚拟机:基于硬件虚拟化技术(如 Hypervisor),每个虚拟机需独立运行完整的操作系统(Guest OS),包含内核、系统库等。

  2. Docker:基于操作系统级虚拟化,容器共享宿主机内核,仅隔离文件系统、进程、网络等资源,无独立操作系统。

  3. 资源消耗与性能

  4. 虚拟机:占用资源多(内存、磁盘空间等),启动速度慢(分钟级),运行需模拟完整硬件环境,性能损耗较高。

  5. Docker:资源占用极少(初始内存仅 MB 级),启动速度快(秒级),直接调用宿主机内核,性能接近原生。

  6. 隔离性与安全性

  7. 虚拟机:通过硬件虚拟化实现强隔离,不同虚拟机间互不影响,安全性更高。

  8. Docker:依赖命名空间(Namespace)和资源控制组(Cgroup),隔离性较弱,容器间共享内核可能导致安全风险(如特权容器可能影响宿主机)。

  9. 迁移与部署效率

  10. 虚拟机:镜像体积大(包含完整 OS),迁移需适配底层虚拟化平台,跨平台兼容性差。

  11. Docker:镜像轻量(仅包含应用及依赖),通过 Dockerfile 标准化构建,支持跨环境(物理机、云平台等)快速迁移和扩展。

  12. 适用场景

  13. 虚拟机:适合需完全隔离的多租户环境(如不同操作系统应用)、安全敏感场景(如金融系统)。

  14. Docker:适合微服务架构、持续集成/持续部署(CI/CD)、高密度部署(如云原生应用),以及快速迭代的开发测试环境。


其他差异


创建与销毁速度:Docker 容器秒级完成,虚拟机需分钟级。


可管理性:虚拟机有成熟管理工具(如 VMware vCenter),Docker 生态工具链更灵活但复杂度较高(如 Kubernetes)。

欢迎关注 ❤

我们搞了一个免费的面试真题共享群,互通有无,一起刷题进步。


没准能让你能刷到自己意向公司的最新面试题呢。


感兴趣的朋友们可以加我微信:wangzhongyang1993,备注:infoq 面试群。

发布于: 刚刚阅读数: 4
用户头像

王中阳Go

关注

靠敲代码在北京买房的程序员 2022-10-09 加入

【微信】wangzhongyang1993【公众号】程序员升职加薪之旅【成就】InfoQ专家博主👍掘金签约作者👍B站&掘金&CSDN&思否等全平台账号:王中阳Go

评论 (1 条评论)

发布
用户头像
也欢迎大家向我投稿最近的面经,有偿~
刚刚 · 北京
回复
没有更多了
金三银四真实面经分享_Go_王中阳Go_InfoQ写作社区