unp笔记三 IO复用基础概念
来源:互联网 发布:小米max2保护壳淘宝 编辑:程序博客网 时间:2024/06/05 07:47
IO复用的使用场合
客户端
客户处理多个描述符(交互式输入和网络套接字),或者客户处理多个套接字
服务器
服务器处理监听套接字和已连接套接字,处理TCP和UDP,或者处理多个协议多个服务等
理解IO中的简单例子,读数据,两个阶段
1 等待数据准备好(数据从网络中到达内核缓冲区)
2 从内核缓冲区向应用进程缓冲区复制数据
UNIX下的IO模型
阻塞式IO
进程调用recvfrom,从调用recvfrom开始到数据报到达,到被复制到应用进程缓冲区中,recvfrom才返回
当然中间要是发生错误(被信号中断)也会返回
非阻塞式IO
进程把一个套接字设置成非阻塞是在通知内核:当请求的IO操作非得把本进程投入睡眠(阻塞起来)才能完成时,不要这样做,而是马上返回一个错误。
当把套接字设置成非阻塞时,调用recvfrom,在没有数据可以返回时,内核立即返回一个EWOULDBLOCK。
当内核中的数据准备好时,将数据复制到用户空间,这段时间是在recvfrom中要消耗的。
非阻塞IO往往消耗大量CPU。
IO复用
不要把IO复用看成神,其实它和阻塞IO还挺像的。select的优势在于我们可以同时等待多个描述符就绪。阻塞式IO只能同一时刻等待一个描述符,如果我们在多线程中使用阻塞式IO,则与IO复用非常相似。
我们举个往套接字上读的例子:1、进程阻塞中select上,等待内核准备好数据,当套接字可读,select返回
2、接着可以调用recvfrom,将数据从内核复制到用户进程缓冲区
信号驱动式IO
首先开启套接字的信号驱动式IO功能,安装自己建立SIGIO的信号处理函数。系统调用立即返回,进程继续工作,当数据准备好时,内核发送SIGIO信号给进程。在没收到信号的这段时间,我们各忙各的。收到信号后,再调用读写函数。
异步IO
说了那么久,现在才说异步IO,这么说,刚刚写的,以上的4中IO模型都不是异步IO,都是同步IO!
那样的话,什么才叫同步IO,什么叫异步IO?
异步IO:在IO操作过程中,不导致进程阻塞
同步IO:导致进程阻塞,直至IO操作完成。
以上4中IO,在最终从内核复制数据到进程空间时,都是要调用读写函数,并且会导致进程阻塞在此复制过程中。
这么说,异步IO就相当厉害了。所有事情完成后再通知进程,异步IO直接自己处理好2个阶段。阶段?什么阶段?看上面讲的。。。。
0 0
- unp笔记三 IO复用基础概念
- Java NIO笔记之IO基础概念
- unp笔记一 网络编程基础
- java IO基础概念
- IO的基础概念
- unp 笔记
- UNP函数笔记三: TCP客户/服务器程序示例
- J2EE学习笔记三:EJB基础概念和知识
- J2EE学习笔记三:EJB基础概念和知识 收藏
- C#基础概念【三】
- IO学习笔记(三)
- Activiti 基础概念 笔记
- 基础概念笔记
- IO基础笔记
- UNP学习笔记
- UNP 学习笔记
- UNP 学习笔记2
- UNP 学习笔记3
- 最小生成树---Kruskal/Prime算法
- tftp下载内核
- 如何修改Myeclipse10.7的Servlet模板
- MySQL启动错误ERROR! MySQL server PID file could not be found的解决办法
- 【面试准备】letcode-Binary Tree Postorder Traversal
- unp笔记三 IO复用基础概念
- 最大子数组和 (Maximum Subarray)
- ACM中常用字符串函数
- FFplay的原理(2)
- ubuntu下使用codeblocks编程运行时终端不能复制粘贴的解决方法
- POJ 2028 When Can We Meet? (又是一道水题)
- Objective-c的属性
- Ubuntu——软件源(非LTS长久支持版)
- 网络请求回来的时间字符串进行一下小转换