阻塞非阻塞同步异步与IO模型

1. 阻塞与非阻塞

阻塞与非阻塞是针对做一件事情的时候,如果遇到一个需要耗时操作,是等待完成,还是不等待。

举个例子,烧开水。当经历了拿锅、接水、点火等操作,来到了一个耗时操作,烧水。

烧水是一个耗时操作,如果:

  1. 阻塞,意思就是,你就在这个地方等水烧开,其他什么也不干。
  2. 非阻塞,就表示水已经烧上了,你可以走开,去客厅看会儿电视,然后可以每隔几分钟来厨房看一下水烧开了没

阻塞虽然有点傻,但是它能及时相应水烧开这个事件。

非阻塞,在轮询检查中间可能水就已经烧开了,让你不能及时了解到水烧开这个事件。

2. 同步与异步

同步与异步是在做一件事情的时候,需要做另一件事情,是等待另一件事情完成,还是不等待。

例如:在解析HTML文档的时候,发现需要一些数据,这些数据可以通过JavaScript去获取,那么:

  1. 同步,就是在JavaScript去拿数据这段时间,解析动作停止了,直到JavaScript把数据拿回来
  2. 异步,就是可以单独启用一个线程去执行JavaScript拿数据这个操作,这样解析动作可以继续,当拿到数据数据之后,拿数据的线程通知主线程就可以

3. 阻塞IO模型

用户程序执行recvfrom系统调用,然后就在这个地方等到recvfrom完成,什么都不做。

4. 非阻塞IO模型

户程序执行recvfrom系统调用,然后直接就走了,然后开始轮询检查,内核缓冲区数据是否准备好。

5. IO复用模型

非阻塞IO模型的轮询机制不错,但是每一个IO都来轮询,有点浪费,所以IO复用模型通过一个select(poll)系统调用统一轮询。

当用户执行一个读操作时,把对应文件或者套接字的fd传递给select,select就可以一直遍历fd,看有哪些fd的数据准备好了,准备好了就通知对应的进程。

6. 信号驱动IO模型

通过sigaction系统调用,当数据准备好了通知用户程序调用recvfrom。

信号驱动IO模型和IO复用模型差不多,不过没有select的fd数量限制问题。

7. 异步IO模型

异步IO模型就是,用户程序说我要读xxx数据,然后就走了。然后系统执行读操作,并把数据从内核空间拷贝到用户空间之后,在通知用户程序,完全的VIP服务。

和信号驱动IO模型相比,异步IO模型更加智能,不需要用户程序在调用recvfrom了,相当于数据准备好,并且帮你读完了再通知你,而不是通知你来读数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值