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

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数量增大而线性下降。

当你有一个很大的socket集合时,由于网路延时或者链路空闲,

任一时刻只有很少的socket是活跃的,

但是select/poll每次调用时都会线性扫描全部集合,导致效率线性下降。

epoll不存在这个问题,在内核实现中epoll是根据每个fd上的callback函数实现,

只有活跃的socket才会主动去调用callback函数,其他状态的socket则不会。

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

无论是select/poll还是epoll都需要内核把FD消息通知给用户空间,

epoll是通过内核和用户空间mmap同一块内存实现。

4、epoll的API更加简单

包括创建一个epoll描述符、添加监听事、

阻塞等待所监听的事件发生,关闭epoll描述符等。

本文来源于牛客网

作者:图灵95

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逆向技术

脱壳第三讲,UPX压缩壳,以及补充壳知识

           脱壳第三讲,UPX压缩壳,以及补充壳知识 一丶什么是压缩壳.以及壳的原理 在理解什么是压缩壳的时候,我们先了解一下什么是壳 1.什么是壳 ...

2768
来自专栏腾讯IVWEB团队的专栏

Git commit message 和工作流规范

本文的目的是统一团队 Git commit 日志标准,便于后续代码 review,版本发布以及日志自动化生成等等;以及统一团队的 Git 工作流,包括分支使用、...

1.9K0
来自专栏智能计算时代

Envoy架构概览(8):统计,运行时配置,追踪和TCP代理

统计 特使的主要目标之一是使网络可以理解。特使根据配置如何发出大量的统计数据。一般来说,统计分为两类: 下游:下游统计涉及传入的连接/请求。它们由侦听器,HTT...

4325
来自专栏云计算教程系列

如何在Ubuntu 14.04上设置R.

R是一种流行的开源编程语言,专门用于统计计算和图形。它被统计学家广泛用于开发统计软件和执行数据分析。R的优势之一是允许用户创作和提交自己的包,因此它具有高度且易...

882
来自专栏云计算教程系列

如何在Ubuntu 14.04上设置R.

R是一种流行的开源编程语言,专门用于统计计算和图形。它被统计学家广泛用于开发统计软件和执行数据分析。R的优势之一是允许用户创作和提交自己的包,因此它具有高度且易...

660
来自专栏性能与架构

nginx 负载均衡策略

1. 轮询 轮询方式是nginx负载均衡的默认策略,根据每个server的权重值来轮流发送请求,例如: upstream backend { server...

3617
来自专栏网络

服务器模型——从单线程阻塞到多线程非阻塞(上)

前言的前言 服务器模型涉及到线程模式和IO模式,搞清楚这些就能针对各种场景有的放矢。该系列分成三部分: 单线程/多线程阻塞I/O模型 单线程非阻塞I/O模型 多...

2545
来自专栏FreeBuf

Linux内核中的递归漏洞利用

6月1号,我提交了一个linux内核中的任意递归漏洞。如果安装Ubuntu系统时选择了home目录加密的话,该漏洞即可由本地用户触发。如果想了解漏洞利用代码和短...

2926
来自专栏我的小碗汤

nginx学习之模块

这里注意了,虽然修改的是default.conf,但是检查的时候始终还是加载nginx.conf,否则报错:

742
来自专栏Python小屋

Python使用标准库urllib模拟浏览器爬取网页内容

爬取网页内容的第一步是分析目标网站源代码结构,确定自己要爬取的内容在哪里,这要求对HTML代码有一定了解,对于某些网站内容的爬取还需要具有一定的Javascri...

1001

扫码关注云+社区

领取腾讯云代金券