专栏名称: 牛客网
程序员必备求职神器,刷真题,练算法,看面经,得内推。点击查看: http://www.nowcoder.com/
目录
相关文章推荐
最红安  ·  不要买,不要吃!内含违禁成分 ·  昨天  
最红安  ·  不要买,不要吃!内含违禁成分 ·  昨天  
BRTV建外14号  ·  京东之后,美团也宣布了—— ·  2 天前  
江苏新闻  ·  知名连锁品牌被曝关店,门店遍布全国! ·  3 天前  
江苏新闻  ·  知名连锁品牌被曝关店,门店遍布全国! ·  3 天前  
51好读  ›  专栏  ›  牛客网

知识总结:I/O模型基础

牛客网  · 简书  ·  · 2017-12-20 15:19

正文

I/O基础


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


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

没有C或者C++的channel概念,只有输入输出流。

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

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


2、Linux网络I/O模型


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

描述符就是一个数字,它指向内核中的一个结构体(文件路径,数据区等属性)。


fd演示:

#include

#include

#include

#include

using namespace std;

int main(){

int fd;

fd=open("./test.cpp",O_RDONLY);

cout<

return 0;

}


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


阻塞I/O模型


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


非阻塞I/O模型


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


I/O复用模型


Linux提供了select/poll,进程将一个或多个fd传递给select或poll系统调用,

阻塞在select操作上,这样select/poll就可以帮我们侦测多个fd是否处于就绪状态。

select/poll是顺序扫描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数量增大而线性下降。







请到「今天看啥」查看全文