您的位置:首页 > 其它

Netty的入门 - IO简介

2016-07-07 10:40 447 查看
开始前了解下一下几个名词:

用户空间:指的是应用程序可以直接访问的地址。

内核空间:也是系统空间,指的是应用程序不能直接访问,必须转到内核模式,由操作系统访问。

下面描述了Unix下的5钟IO模型:

1、阻塞IO模型

进程空间调用recvfrom,其系统调用直到数据包到达且复制到应用进程的缓冲区中或者发生错误时才返回,此期间会一直等待

2、非阻塞IO模型

recvfrom从应用层到内核的时候,如果该缓冲区没有数据的话,直接返回一个EWOULDBLOCK的错误,一般对非阻塞IO进行轮询检查状态

3、IO复用模型

Linux提供selest/pool,进程将一个或者多个fd传递给select或者pool系统调用,阻塞在select操作上,selest/pool可以帮我们侦测多个fd是否处于就绪状态。selest/pool是顺序扫描fd是否就绪,而且支持的fd数量有限。epoll基于时间驱动方式代替了顺序扫描,性能更高。当有fd就绪的时候,立即回调函数rollback

4、信号驱动IO模型

首先开启套接口信号驱动IO功能,通过系统调用sigaction执行一个信号处理函数(非阻塞),当数据就绪时,就为该进程生成一个sigio信号,通过信号回调通知程序调用recvfrom来读取数据

5、异步IO

告知内核启动某个操作,并让内核在整个操作完成后(包括数据从内核复制到用户自己的缓冲区)通知我们。这种模型与信号驱动模型的区别是:信号驱动IO由内核通知我们何时可以开始一个IO操作;异步IO模型由内核通知我们IO操作何时已经完成。

IO多路复用技术(epoll)

1. 支持一个进程打开的socket描述符不受限制

2. IO效率不会随FD数增加而线性下降(epoll是根据每个fd上面的callbac函数实现的,只有活跃的socket才会主动调用callback函数)

3. 使用mmap加速内核和用户空间的消息传递
4. epoll的API更加简单

推荐参考:http://elf8848.iteye.com/blog/1944219
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: