IO通信模型

博客主要介绍了同步异步和阻塞非阻塞的概念。同步需等待调用结果返回再继续,异步则无需等待可继续执行。阻塞是进程或线程在数据未准备好时被放入等待队列,让出CPU;非阻塞则立即返回无数据,可循环忙询。还提及多路IO复用,如select、poll、epoll可提高多文件读写效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

理解同步异步:
同步:A调用B,同步的结果是A需要等待B的结果返回,A再继续走下面的逻辑, code1->B->B返回->code2
void function A() {
code 1,
B(),
code 2
}
异步:A调用B,不需要等B的返回,A可以继续执行下面的逻辑,code1,code1->B->code, 等B执行完会采用回调的方式通知A
同步异步关注的是程序的执行顺序
理解阻塞与非阻塞:
数据的读写分为两个部分,一是数据的准备阶段,二是数据从内核态拷贝到用户态的阶段,阻塞与非阻塞也是指在第一阶段里。
阻塞:正在运行的一个线程或是进程的一个状态,阻塞意味着进程或线程被放到某个资源的等待队列里。让出了CPU的执行权。一般每个IO设备的设备驱动程序都会有对调用的阻塞处理。当数据没有准备好时,正在运行的进程会调用阻塞原语,将自己阻塞。当有数据时候。通过中断进入中断处理程序,唤醒等待队列中的进程,如recvfrom。实现方式是等待队列。
非阻塞:调用设备驱动的read或是write操作时候,当数据没有准备好时,进程不会被挂起,而是立即返回没有数据,这样用户进程可以采用循环的方式忙询,直到数据准备好以后再读取。实现方式是轮询。

recvfrom,在读取的时候回判断,如果是阻塞模式,则没有数据的时候回将自己阻塞,而如果是非阻塞模式,则会直接返回-EAGAIN。有数据的话直接读取。
驱动程序提供的非阻塞方式是通过Poll函数,会返回文件描述符所代表文件的可读可写的状态。立即返回,不会阻塞。

多路IO复用:select, poll, epoll,都是通过调用设备驱动的poll函数来实现。对于多个文件的读写可以提高读写效率,但是对于单个文件的读写,与阻塞方式一样。

https://www.cnblogs.com/tomato0906/articles/7590746.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值