认识IO模型

常见的IO函数主要有read()/write(),recv()/send(),recvmsg()/sendmsg(),readv()/writev()。谈到IO模型,首先了解一下网络数据是如何被处理及接收的,当我们使用某一IO函数时候,会向linux内核发送命令请求,内核空间创建相应文件描述符,网络数据由网络线路传播至本地主机,经网络层解析过后得到数据,内核将数据缓存在所创建文件描述符指向的缓冲区中(在内核空间中)。最后将该缓冲区的内容复制到应用程序缓冲区(在用户空间中),完成网络数据处理。

IO的方式有阻塞IO、非阻塞IO、IO复用、信号驱动、异步IO等

阻塞IO

阻塞IO是最通用的IO类型,使用这种模型进行数据接收的时候,在数据没有到之前程序会一直等待。

非阻塞IO

当把套接字设置成非阻塞的IO,则对每次请求,内核都不会阻塞,会立即返回;当没有数据到的时候,会返回一个错误(EMOULDBLOCK),直到有数据到来。相当于有个循环,一直在测试文件描述符是否可读,这显然是一种极度浪费cpu资源的IO操作模式。

IO复用

在等待数据的时候加入超时的时间,当超时时间没有用到达的时候与阻塞情况一致,而当超时时间到达仍然没有数据接收到,系统会返回,不再等待。一般使用select()或者poll()函数按照一定的超时时间轮询,直到需要等待的套接字有数据到来。

信号驱动IO

在进程开始的时候注册一个信号处理的回调函数,进程继续执行,当信号发生时,即有了IO的时间,这里即有数据到来。

异步IO模型

与信号驱动IO类似,区别在于信号驱动IO当数据到来的时候,使用信号通知注册的信号处理函数,而异步IO则在数据复制完成的时候才发送信号通知注册的信号处理函数。

你可能感兴趣的:(认识IO模型)