1.说5中IO模型之前,要先明白几个问题。
什么是同步?什么是异步?什么是阻塞?什么是非阻塞?接下来我来回答大家。
同步和异步的区别?
同步指被调用方做完事情后再返回给调用方
异步指被调用方立马告知调用方我已接收到请求,要进行异步处理,处理完后通过回调函数通知调用当
阻塞和非阻塞的区别?
阻塞指调用方一直等待被调用方的处理结果,期间不做其他的任何事情
非阻塞指调用方等待被调用方的处理结果期间可以做其他的事情
2.linux的IO模型有哪些
IO是数据的读取和写入,用户进程读取一次IO请求分为两个阶段:等待数据到达内核缓冲区和将内核空间数据拷贝到进程空间,当用户去内核中拷贝数据时,要从用户态转为核心态
5中IO模型:
(1)同步阻塞IO模型
用户进程发起io调用后会被阻塞,等待内核数据准备完毕时就被唤醒,将内核数据复制到用户进程。这两个阶段都是阻塞的
(2)同步非阻塞IO模型
用户进程发起IO调用后,若内核数据还未准备好,进程不会被阻塞,而是给用户进程返回一个error,进程会继续干别的事,每隔一段时间就去看看内核数据是否准备好。不过将内核数据复制到用户进程这个阶段依旧是阻塞的
(3)IO多路复用模型
同步非阻塞IO要不停的查看内核中数据是否准备好,十分消耗cpu。IO多路复用让一个线程去监控一个fd文件,每个用户进程都有一个fd文件描述符,将自己的文件描述符写入这个fd文件,当某个用户进程需要的数据准备好后,这个线程就去通知用户进程。
(4)信号IO模型
当用户进程发起IO调用后,会向内核注册一个信号处理函数,进程不会被阻塞,当内核数据准备就绪时就返回一个信号给用户进程,进程就可以直接在这个信号处理函数中获取内核数据进行拷贝。拷贝这个阶段依旧是阻塞的
(5)异步非阻塞模型
前面四种全是同步的。进程在发起IO调用后,无论数据是否到达,都直接返回结果。内核数据准备好时,由内核将数据复制给用户进程。两个阶段都是非阻塞的
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/116134.html