一、用户空间 & 内核空间
- 分区原因 :隔离保护,防止应用程序破坏内核、造成系统崩溃。
- 用户空间:Ring3,权限受限,不能直接访问硬件资源,必须通过系统调用。
- 内核空间:Ring0,特权态,可以直接操作 CPU、内存、网卡等硬件。
- IO 缓冲区机制 Linux 在用户、内核两侧都设置缓冲区,减少硬件交互次数,提升 IO 效率:
- 读:硬件 → 内核缓冲区 → 用户缓冲区
- 写:用户缓冲区 → 内核缓冲区 → 硬件
- IO 的两个固定阶段(所有模型都拆成这两步) ① 等待数据就绪(内核准备好数据) ② 将数据从内核缓冲区拷贝到用户空间
二、5 种 IO 模型总览(UNIX 网络编程分类)
- 阻塞 IO Blocking IO
- 非阻塞 IO Nonblocking IO
- IO 多路复用 IO Multiplexing
- 信号驱动 IO Signal Driven IO
- 异步 IO Asynchronous IO
三、阻塞 IO(Blocking IO)
调用recvfrom发起系统调用后,两个阶段全部阻塞:
- 没有数据时,进程一直阻塞等待内核数据就绪;
- 数据就绪后,阻塞等待内核把数据拷贝到用户空间;
- 拷贝完成才返回,用户进程继续执行业务。 ✅ 优点:简单、内核友好,CPU 无空转 ❌ 缺点:一个线程只能处理一个连接,并发能力差
四、非阻塞 IO(Nonblocking IO)
调用recvfrom会立刻返回,不会卡住进程:
- 无数据:直接返回错误码
EWOULDBLOCK,用户进程循环轮询调用; - 有数据:阻塞完成内核→用户空间的数据拷贝;
重点考点:仅第一阶段(等数据)非阻塞,拷贝阶段依旧阻塞 ✅ 优点:线程不会卡死,可以做别的事情 ❌ 缺点:轮询会造成 CPU 空转、CPU 占用飙升,实际很少单独使用