五种I/O模型,同步和异步,阻塞和非阻塞

一共有哪五种?
阻塞IO,非阻塞IO,IO复用,事件(信号)驱动IO,异步IO
阻塞(blocking)IO:在linux中,默认情况下所有的socket都是阻塞的
具体如下:使用recvfrom系统调用,此时内核开始准备数据,一般网络IO情况下,很多数据一开始都是没有到达的,内核就需要等待数据的到来,用户进程就就会进入阻塞状态,直到数据到来,就会将数据从内核拷贝的用户内存,然后内核返回结果,完成这次操作。
非阻塞(non-blocking)IO:Linux下可以通过socket设置,将其变为非阻塞
进程把一个socket设置成非阻塞是在通知内核:当所有请求的IO操作非得把本进程投入睡眠状态时,不要把本进程投入睡眠状态,而是返回一个错误。
当用户进程发出请求时,如果内核中数据没有准备好,就返回一个错误,因此用户进程可以不用等待,可以再次发出请求(就可以做其他事情了?)。
但是循环调用将大幅度增高CPU的占用率
多路复用IO
即epoll,poll,select
IO复用可以调用以上三个函数,阻塞在这三个系统调用之上,而不是阻塞在真正的IO系统上。阻塞与系统调用上,等待数据报socket变为可读,当系统调用返回socket可读时,再调用recvfrom把所读数据报复制到应用进程缓冲区。
信号驱动IO
使用信号,让内核在描述符就绪时使用SIGIO信号通知
异步IO
告知内核启动某个操作,并让内核在整个操作完成后告知进程。
与信号驱动IO的区别是:信号驱动是由内核通知我们何时可以启动一个IO操作,而异步IO是由内核通知我们IO操作何时完成 。 使用aio-read()函数

POSIX中定义:
同步IO操作:导致请求进程阻塞,直到IO操作完成
异步IO操作:不导致请求进程阻塞
所以,前四种IO操作都是同步IO操作,因为其中真正的IO操作将阻塞进程,只有异步模型与POSIX中的异步IO匹配

同步和非同步:
同步和非同步是消息传递机制

阻塞和非阻塞:
是等待调用结果的一个状态

这个两个感觉有点像,但是不一样,真的难理解。。。

参考文章:https://www.cnblogs.com/skying555/p/5028167.html

猜你喜欢

转载自blog.csdn.net/weixin_42680642/article/details/82561594
今日推荐