跳到正文

进程、线程与 IO 多路复用 ​

  • 状态:未准备
  • 适用方向:共用 / Go 后端重点
  • 最近复习:待填写
  • 下次复习:待安排

一句话回答 ​

进程提供资源和地址空间隔离,线程是操作系统调度执行的单位之一;IO 多路复用让线程等待多个描述符的就绪事件,减少每连接独占阻塞线程的需要。

原理解释 ​

同进程线程共享地址空间等资源,但各有执行栈和寄存器状态,共享内存要同步。进程之间通常需管道、套接字或共享内存等 IPC;共享内存也需要协调,并非天然安全。

阻塞 IO 会等待操作满足条件;非阻塞 IO 在不能立即完成时返回状态,忙轮询会耗 CPU。Linux select/poll/epoll 用于就绪通知,epoll 维护关注项并返回就绪事件,适合大量连接场景;不能简单概括成“任何情况下 O(1)”。

LT 在仍满足就绪条件时继续通知;ET 通常需非阻塞读写到 EAGAIN,遗漏处理可能导致数据滞留。就绪不等于完整业务消息已到齐,仍需应用协议分帧。

Go 网络轮询器结合运行时,把网络等待的 goroutine 挂起并在就绪后调度。epoll 是 Linux 机制,Windows 等平台使用其他实现;不是所有文件 IO 都能按网络套接字方式轮询。

场景与边界 ​

大量长连接还消耗文件描述符、缓冲区、goroutine 和心跳资源,不是用了 epoll 就无限扩容。排查进程 CPU、内存、描述符和网络状态时,需要区分资源饱和与业务锁等待。

项目中的应用 ​

结合 EinoTalk 多实例长连接解释单机容量受什么限制;多实例在线路由是应用层能力,不由 IO 多路复用自动解决。

常见追问 ​

  • 协程切换一定不进内核? 不能绝对化,阻塞系统调用等仍涉及内核;用户态调度通常降低部分切换成本。
  • 共享内存为什么还要锁? 多步读改写和可见性仍需同步协议。
  • 连接很多 CPU 却不高? 可能大量连接空闲或等待 IO,需结合内存、FD 和队列判断。

参考资料 ​

理解机制,讲清取舍,用复盘检验掌握。