[打基础]针对网络开发的概念扫坑
2025/12/29大约 3 分钟
[打基础]针对网络开发的概念扫坑
1、阻塞IO、非阻塞IO、阻塞、非阻塞是4个不同的东西
这是【性能优化】所说的内容,在Linux系统中,**阻塞IO、非阻塞IO、阻塞、非阻塞**确实是相关但不同的概念,但它们可以归类为**两组核心概念**,而不是完全独立的四个。以下是清晰的解释:
1. 阻塞(Blocking) vs 非阻塞(Non-blocking)
这是行为模式的分类,描述的是**调用者(如进程/线程)**在等待某个操作完成时的行为:
阻塞(Blocking)
- 调用者发起IO操作后,必须等待操作完成(如数据就绪或写入完成),期间调用者会==被挂起(睡眠),不占用CPU【也就是让出CPU】。
- 举例:read()一个空的管道时,默认会阻塞直到有数据到达。
非阻塞(Non-blocking)
- 调用者发起IO操作后,立即返回(无论操作是否完成),不会挂起。需要通过返回值或后续检查判断操作状态。
- 举例:对文件描述符设置O_NONBLOCK标志后,read()无数据时会直接返回EAGAIN或EWOULDBLOCK错误。
2. 阻塞IO(Blocking IO) vs 非阻塞IO(Non-blocking IO)
这是IO模型的分类,描述的是内核在处理IO时的行为:
- 阻塞IO(Blocking IO)
- 用户进程调用IO系统调用(如
read)后,内核会等待数据就绪(如网卡收到数据), - 特点:简单但并发性能差(需多线程/进程处理多个IO)。
- 用户进程调用IO系统调用(如
- 非阻塞IO(Non-blocking IO)
- 用户进程调用IO系统调用后,内核立即返回(无论数据是否就绪),进程需轮询(polling)检查状态。
- 特点:避免进程阻塞,但轮询会浪费CPU资源。
关键区别与联系
| 维度 | 阻塞(Blocking) | 非阻塞(Non-blocking) |
|---|---|---|
| 行为模式 | 调用者等待操作完成(挂起) | 调用者立即返回(不挂起) |
| IO模型 | 内核等待数据就绪 | 内核立即返回,需轮询 |
- 阻塞IO必然使用阻塞行为(因为进程会被挂起)。
- 非阻塞IO可以搭配非阻塞行为(如轮询),但也可与其他IO模型结合(如IO多路复用)。
Linux中的实际应用
- 设置非阻塞行为:
通过fcntl(fd, F_SETFL, O_NONBLOCK)将文件描述符设为非阻塞模式。
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);- IO模型选择:
- 阻塞IO:默认行为(如未设置
O_NONBLOCK的socket)。 - 非阻塞IO:需显式设置,通常与
select/poll/epoll结合使用(避免轮询浪费CPU)。
- 阻塞IO:默认行为(如未设置
总结
- 阻塞/非阻塞是行为模式(调用者是否等待)。
- 阻塞IO/非阻塞IO是IO模型(内核是否等待数据就绪)。
- 在Linux中,它们通常配合使用,但属于不同层次的抽象。
如果是面试或开发场景,需根据上下文明确讨论的是行为还是模型。例如,epoll是IO多路复用模型,但可以同时处理阻塞或非阻塞的文件描述符。
计算机网络-参考资料
RFC文档官网https://www.rfc-editor.org/
[美] James F.Kurose / [美] Keith W.Ross,《计算机网络-自顶向下方法》
[日]竹下隆史 / [日]村山公保 / [日]荒井透 / [日]苅田幸雄,《图解TCP/IP》
[日]上野宣,《图解HTTP》
游双,《Linux高性能服务器编程》
陈硕,《Linux多线程服务端编程》
史蒂文斯 / 芬纳 / 鲁道夫,《UNIX网络编程》