Socket 编程与 IO 模型

官官方信息技术老师·10 页·深入(追求细节与边界)·0 次浏览·33 天前
信息技术大学

Socket 编程与 IO 模型

计算机基础面试八股 · 第 1 章 计算机网络

按 空格/→ 演示下一步

问一句
1 / 10 页

全部页面点击任意一页,跳回舞台从这页播放

信息技术大学

Socket 编程与 IO 模型

计算机基础面试八股 · 第 1 章 计算机网络

1第 1 页 · Socket 编程与 IO 模型

Socket API 调用流程

一条连接的一生:服务端 bind/listen/accept 等客上门,客户端 connect 敲门。

服务端四步
socket、bind、listen、accept,阻塞等连接
客户端两步
socket、connect,三次握手在 connect 内完成
数据收发
连接即文件描述符,read/write 收发字节流
关闭
close 触发四次挥手,释放连接资源
2第 2 页 · Socket API 调用流程

服务端起服四步

从占端口到接客,四个系统调用搭好门面。

1
socket
创建通信端点,拿到文件描述符
2
bind
绑定 IP 与端口,占下门牌号
3
listen
进入监听态,排队等待连接
4
accept
取出一条连接,开始收发数据
3第 3 页 · 服务端起服四步

五种 IO 模型

等 IO 的五种姿势:从干等、轮询到全异步,核心都是别让线程闲着傻等。

阻塞 IO
数据没到就挂起线程,简单但费线程
非阻塞 IO
没数据立刻返回错误,靠轮询补位
IO 多路复用
一个线程盯一批描述符,就绪才处理
信号/异步
内核通知就绪或全程代劳,应用零等待
4第 4 页 · 五种 IO 模型

select/poll/epoll 对比

多路复用三代目:select 全量扫描,epoll 红黑树加就绪链表扛十万连接。

select
fd 上限 1024,每次调用全量拷贝再全扫描
poll
去掉数量上限,仍是全扫描,连接多会退化
epoll
注册一次内核记账,就绪列表直达,事件驱动
触发模式
LT 没读完继续提醒;ET 只报一次,要一次读完
5第 5 页 · select/poll/epoll 对比

select 与 epoll

同是多路复用,规模一上来代价天差地别。

select
  • 每次全量传入 fd 集合
  • 内核线性扫描全部
  • 连接少时开销可接受
epoll
  • 注册后内核维护兴趣列表
  • 只返回就绪的子集
  • 海量连接下的必然选择
连接量小时 select 够用;C10K 之后,epoll 的事件驱动是分水岭。
6第 6 页 · select 与 epoll

Reactor 与 Proactor 模式

网络框架的两大骨架:Reactor 通知「可以读了」,Proactor 通知「已经读完」。

Reactor
内核通知就绪,应用自己读写,同步非阻塞
Proactor
内核完成读写后回调,真异步 IO
落地
Nginx/Redis 走 Reactor,Windows IOCP 是 Proactor
7第 7 页 · Reactor 与 Proactor 模式

惊群问题

一条连接到来惊醒一窝进程,只有一个接得住,其余白醒——惊群浪费唤醒。

成因
多进程/线程等待同一事件,全部被唤醒
accept 惊群
内核已修复:只唤醒一个等待者
epoll 惊群
用 EPOLLEXCLUSIVE 或 SO_REUSEPORT 化解
8第 8 页 · 惊群问题

本节要点

  • ✓服务端四步:socket/bind/listen/accept
  • ✓IO 多路复用:一线程看护一批描述符
  • ✓epoll 就绪直达,海量连接的分水岭
  • ✓Reactor 通知就绪,Proactor 通知完成
延伸主题:写一个 echo server读读 Redis 事件循环
9第 9 页 · 本节要点

课后思考

先自己回答,再展开参考答案——能讲出来才算真懂。

1epoll 为什么快?快在省掉了哪些动作?

参考答案select 每次把整个 fd 集合拷进内核再线性扫描;epoll 注册一次、内核维护兴趣列表,事件到来只返回就绪子集——全量拷贝与全量扫描都被省掉,开销只与活跃连接相关。

2阻塞 IO 真的一无是处吗?

参考答案连接少、逻辑简单时阻塞模型代码直观、不易出错;它的成本是每连接占一个线程,连接规模一大才撑不住。模型选型看规模与团队,不看新旧。

3ET 模式为什么必须配合非阻塞 IO?

参考答案ET 只在状态变化时通知一次,应用必须一次把数据读干净;阻塞读在缓冲清空后会挂起线程,整个事件循环随之卡死。非阻塞读到 EAGAIN 才算收尾。

10第 10 页 · 课后思考