同步异步阻塞非阻塞

同步和异步 阻塞和非阻塞

阻塞非阻塞是调用后是否立即返回。

同步异步是针对两个对象,"请求发起者"和"请求处理者"。发起请求后怎么获得结果,是自己反复询问,还是等别人主动通知。

一次完整的网络读操作,分为两步,第一步内核等待数据,第二步内核将数据拷贝到用户空间。

内核等待网卡的数据,内核将网卡的数据写入内核缓冲区。

内核将从内核缓冲区中将网卡的数据拷贝到用户空间。

用户进行read,内核等待网卡的数据,然后将数据拷贝到用户空间,如果用户线程一直在等待,等待时"挂起",不做任何事情。这就是阻塞。

用户在read后会立即返回结果,然后不断轮询,直到数据拷贝到用户空间。这就是非阻塞。

在内核将数据拷贝到用户空间时,用户线程在等待拷贝完成,就是同步。

在内核将数据拷贝到用户空间时,用户线程不等待,拷贝完成后,内核通知用户已经拷贝完成。这就是异步。

一次完整的网络读操作,分为两步,第一步内核等待数据,第二步内核将数据拷贝到用户空间。

调用read,然后等待内核将数据拷贝到用户空间,期间用户一直等待,不做其他事情,就是同步阻塞。

调用read,然后立即返回一个结果,不管内核是否已经完成数据的拷贝,如果没有完成就返回一个错误,然后不断地询问,每次询问都会立即返回,直到拷贝完成,返回正确结果,就是同步非阻塞。

调用read,然后去做其他的事情,直到内核完成了数据拷贝,通知用户去处理数据。就是异步非阻塞。

异步一定是非阻塞,同步可能是阻塞也可能是非阻塞。

去食堂吃饭,分为两步,第一步厨师炒完菜,第二步服务员将菜算过来。

我点好菜后,等待厨师炒完菜,再等待服务员送过来,期间什么都不做。这就是同步阻塞。

我点好菜后,就去做其他的事情,然后每隔一段时间问一下,我的菜好了吗,直到服务员端上来。这就是同步非阻塞。

我点好菜后,就去做其他的事情,服务员把菜端上来后,通知我菜好了。这就是异步非阻塞。

一次完整的网络读操作,分为两步,第一步内核等待数据,第二步内核将数据拷贝到用户空间。

epoll其实是同步IO

复制代码
用户:调用epoll_wait → 阻塞等待【步骤1完成】
内核:步骤1完成(数据到内核缓冲区)
内核:唤醒epoll_wait,返回"可读"
用户:调用recv → 进入内核,执行【步骤2】(拷贝数据)
用户:等待recv返回(拷贝完成)
用户:拿到数据

用户等待了步骤1(在epoll_wait里) 也 等待了步骤2(在recv里)。 所以是同步。

io_uring 才是异步

复制代码
用户:调用io_uring_enter,提交读请求 → 立即返回(不等待)
内核:【步骤1 + 步骤2】全权负责
     - 等待数据到达
     - 自动拷贝数据到用户指定的内存
内核:全部完成后,在完成队列里放一个完成事件
用户:稍后调用io_uring_enter(或轮询)检查完成事件
用户:发现完成事件,直接使用数据(无需再调用recv)

用户没有等待步骤1,也没有等待步骤2。全由内核干完。所以是异步。

相关推荐
数智工坊2 小时前
Zotero自建Ubuntu WebDAV附件同步方案(完美解决存储空间不足)
linux·运维·ubuntu
江畔柳前堤2 小时前
HBM:大语言模型时代的「算力血液」——从内存墙到带宽革命的深度拆解
服务器·人工智能·windows·目标检测·语言模型·自然语言处理·软件工程
独隅3 小时前
GitHub Actions 自动化运维实战:CI/CD 流水线一体化效果展示
运维·自动化·github
饺子大魔王的男人4 小时前
CentOS部署Cockpit:图形化查看系统、日志与服务状态
linux·运维·centos
不会就选b4 小时前
Linux之信号(二)
linux·运维·服务器
GlueNa2SiO35 小时前
第十八章 Linux故障排查与恢复
linux·服务器·笔记·学习
qq_267612895 小时前
Gitee项目管理推荐:从工具链割裂到DevOps全链路贯通的企业级协作实践
运维·gitee·devops
寺中人6 小时前
Linux 基础命令入门实战教程:从零掌握常用操作,新手快速上手
linux·运维·服务器·shell·linux 命令·linux 基础教程·linux 入门
V哥AI增长6 小时前
Schema.org 结构化数据与GEO技术落地:AI引擎引用机制与JSON-LD部署实证研究
大数据·运维·人工智能
小张成长计划..6 小时前
【Linux】18:基础IO
linux·运维·服务器