您的位置:首页 > 其它

IO模型基础知识

2017-05-08 20:10 162 查看
I/O基础

1、java1.4之前,java对I/O支持不完善,存在以下问题:

. 没有数据缓冲区,I/O性能存在问题。

. 没有c或者c++的channel概念,只有输入输出流

. 同步式阻塞I/O通信,通常会导致通信线程较长时间阻塞

. 支持的字符集有限,硬件可移植性不好

2、Linux网络I/O模型

linux内核将所有外部设备都看作一个文件来操作,对文件的操作都会调用内痕提供系统命令,返回一个fd(文件描述符)

fd演示:

#include<iostream>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

using namespace std;

int main(){

int fd;
fd=open("./test.cpp",O_RDONLY);
cout<<fd<<endl;
return 0;
}


3、Linux提供了5种网络I/O模型

阻塞I/O模型

用户线程调用内核操作,在内核操作返回之前一直处于阻塞

非阻塞I/O模型

用户线程调用内核操作,在内核操作返回之前轮询是否有数据返回

I/O复用模型

linux提供了select/poll,进程将一个或多个fd传递给select或poll系统调用,阻塞在select操作上,这样select/poll就可以帮我们侦测多个fd是否处于就绪状态。

select/IO是顺序扫描fd,而且支持的fd数量有限,所以使用上有限制。

Linux还提供了epoll系统调用,基于事件驱动,比顺序轮询

效率要高。

信号驱动I/O模型

执行信号函数

异步I/O模型

告知内核启动某个操作,并让内核在整个操作完成之后包括将数据从内核复制到用户缓冲区通知我们

4、I/O多路复用技术

服务端将多个客户端线程阻塞到一个select,可以使单线程情况下可以处理多个客户端请求。好处是系统开销小。

I/O多路复用应用场景:

服务器需要同时处理多个处于监听状态或者多个状态字状态的套接字。

服务器需要同时处理多种网络协议的套接字。

epoll优势

1.支持一个进程打开的FD不受限制(仅受限于操作系统的最大文件句柄数)

例如在1GB内存的机器上大约是10万各句柄左右。具体可以通过cat /proc/sys/fs/filemax 查看

2.I/O效率不会随着FD数量而线性下降

当你有一个很大的socket集合时,由于网络延时或者链路空闲,任一时刻只有很少的socket是活跃的,但是select/poll每次调用时都会线性扫描全部集合,导致效率线性下降。

epoll不存在这个问题,在内核实现中epoll是根据每个fd的callback函数实现,只有活跃的socket才会主动去调callback

函数,而其他状态的socket则不会。

3.使用mmap加速内核与用户空间的消息传递

无论是select/poll还是epoll都需要把FD消息通知给用户空间,epoll是通过内核与用户空间mmap(一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。)同一块内存实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: