1. 阻塞与非阻塞
阻塞与非阻塞是针对做一件事情的时候,如果遇到一个需要耗时操作,是等待完成,还是不等待。
举个例子,烧开水。当经历了拿锅、接水、点火等操作,来到了一个耗时操作,烧水。
烧水是一个耗时操作,如果:
- 阻塞,意思就是,你就在这个地方等水烧开,其他什么也不干。
- 非阻塞,就表示水已经烧上了,你可以走开,去客厅看会儿电视,然后可以每隔几分钟来厨房看一下水烧开了没
阻塞虽然有点傻,但是它能及时相应水烧开这个事件。
非阻塞,在轮询检查中间可能水就已经烧开了,让你不能及时了解到水烧开这个事件。
2. 同步与异步
同步与异步是在做一件事情的时候,需要做另一件事情,是等待另一件事情完成,还是不等待。
例如:在解析HTML文档的时候,发现需要一些数据,这些数据可以通过JavaScript去获取,那么:
- 同步,就是在JavaScript去拿数据这段时间,解析动作停止了,直到JavaScript把数据拿回来
- 异步,就是可以单独启用一个线程去执行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了,相当于数据准备好,并且帮你读完了再通知你,而不是通知你来读数据。