IO模型、javaIO

news2024/11/16 23:50:23

介绍

网络通讯,一台计算机给另一台计算机传输数据,中间过程就叫做通信,也就是通过IO接口输入输出到另一台计算机,这个就叫做网络IO.

文件描述符(File descriptor)

是计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象化概念。文件描述符在形式上是一个非负整数。实际上它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统而windows为句柄的概念。

原文链接:

网络通信和IO(1):网络通信与IO基本概念/什么是IO,什么是网络通信/文件IO和网络IO的区别/什么是文件描述符/什么是阻塞IO(BIO)/什么是非阻塞IO(NIO)/JAVA中的IO_丨1?io_加班攒钱种头发的博客-CSDN博客

 

同步IO和异步IO对比

同步阻塞IO/BlockingIO

经典应用阻塞socket/BIO

如果内核数组一直没准备号,那用户进程就将一直阻塞,浪费性能,可以使用非阻塞IO优化。

 同步非阻塞IO/ non BlockingIO

 

如果内核数据还么有准备好,可以先返回错误信息给用户进程,让它需要等待(通过轮询方式再请求)

流程:

  • 应用进程向操作系统内核,发起recvfrom读取数据。
  • 操作系统内核数据没有准备好,立即返回EWOULDBLOCK错误码。
  • 应用程序轮询调用,继续向操作系统内核发起recvfrom读取数据。
  • 操作系统内核数据准备好了,从内核缓冲区拷贝到用户空间。
  • 完成调用,返回成功提示。

它依然存在性能问题,即频繁的轮询,导致频繁的系统调用,同样会消耗大量的CPU资源。可以考虑IO复用模型,去解决这个问题。

多路复用IO模型

复习下,什么是文件描述符fd(File Descriptor),它是计算机科学中的一个术语,形式上是一个非负整数。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。

IO复用模型核心思路:系统给我们提供一类函数(如我们耳濡目染的select、poll、epoll函数),它们可以同时监控多个fd的操作,任何一个返回内核数据就绪,应用进程再发起recvfrom系统调用。

IO多路复用之select

应用进程通过调用select函数,可以同时监控多个fd,在select函数监控的fd中,只要有任何一个数据状态准备就绪了,select函数就会返回可读状态,这时应用进程再发起recvfrom请求去读取数据。

非阻塞IO模型(NIO)中,需要N(N>=1)次轮询系统调用,然而借助select的IO多路复用模型,只需要发起一次系统调用就够了,大大优化了性能。

但是呢,select有几个缺点:

  • 监听的IO最大连接数有限,在Linux系统上一般为1024。
  • select函数返回后,是通过遍历fdset,找到就绪的描述符fd。(仅知道有I/O事件发生,却不知是哪几个流,所以遍历所有流)

因为存在连接数限制,所以后来又提出了poll。与select相比,poll解决了连接数限制问题。但是呢,select和poll一样,还是需要通过遍历文件描述符来获取已经就绪的socket。如果同时连接的大量客户端在一时刻可能只有极少处于就绪状态,伴随着监视的描述符数量的增长,效率也会线性下降

因此经典的多路复用模型epoll诞生。

 

IO多路复用之epoll

为了解决select/poll存在的问题,多路复用模型epoll诞生,它采用事件驱动来实现,流程图如下:

 

epoll先通过epoll_ctl()来注册一个fd(文件描述符),一旦基于某个fd就绪时,内核会采用回调机制,迅速激活这个fd,当进程调用epoll_wait()时便得到通知。这里去掉了遍历文件描述符的坑爹操作,而是采用监听事件回调的的机制。这就是epoll的亮点。

我们一起来总结一下select、poll、epoll的区别

 

epoll明显优化了IO的执行效率,但在进程调用epoll_wait()时,仍然可能被阻塞的。能不能酱紫:不用我老是去问你数据是否准备就绪,等我发出请求后,你数据准备好了通知我就行了,这就诞生了信号驱动IO模型

信号驱动模型

信号驱动IO不再用主动询问的方式去确认数据是否就绪,而是向内核发送一个信号(调用sigaction的时候建立一个SIGIO的信号),然后应用用户进程可以去做别的事,不用阻塞。当内核数据准备好后,再通过SIGIO信号通知应用进程,数据准备好后的可读状态。应用用户进程收到信号之后,立即调用recvfrom,去读取数据。

 信号驱动IO模型,在应用进程发出信号后,是立即返回的,不会阻塞进程。它已经有异步操作的感觉了。但是你细看上面的流程图,发现数据复制到应用缓冲的时候,应用进程还是阻塞的。回过头来看下,不管是BIO,还是NIO,还是信号驱动,在数据从内核复制到应用缓冲的时候,都是阻塞的。还有没有优化方案呢?AIO(真正的异步IO)!

异步IO(AIO)

前面讲的BIO,NIO和信号驱动,在数据从内核复制到应用缓冲的时候,都是阻塞的,因此都不是真正的异步。AIO实现了IO全流程的非阻塞,就是应用进程发出系统调用后,是立即返回的,但是立即返回的不是处理结果,而是表示提交成功类似的意思。等内核数据准备好,将数据拷贝到用户进程缓冲区,发送信号通知用户进程IO操作执行完毕。

流程如下:

异步IO的优化思路很简单,只需要向内核发送一次请求,就可以完成数据状态询问和数据拷贝的所有操作,并且不用阻塞等待结果。日常开发中,有类似的业务场景:

比如发起一笔批量转账,但是转账处理比较耗时,这时候后端可以先告知前端转账提交成功,等到结果处理完,再通知前端结果即可。

参考链接:看一遍就理解:IO模型详解 - 掘金

Java IO

按照流的流向分,可以分为输入流和输出流;

按照操作单元划分,可以划分为字节流和字符流;

Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,OutputStream,Reader,Writer。

Java中其他多种多样变化的流均是由它们派生出来的.

字符流和字节流是根据处理数据的不同来区分的。字节流按照8位传输,字节流是最基本的,所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。

BIO、NIO、AIO区别

BIO【同步阻塞IO blocking IO】、  ServerSocket

NIO【同步非阻塞IO Non BlockingIO】、多路复用IO   ServerSocketChannel

AIO [异步Asynchronous IO]   AsynchronousServerSocketChannel

原文链接:https://blog.csdn.net/zhcswlp0625/article/details/93461137

原文链接:https://blog.csdn.net/hequnwang10/article/details/124626326

适用场景分析

BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解;

NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持;

AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持;

原文链接:

Java中IO流分为几种?BIO,NIO,AIO 有什么区别?_java 中 io 流分为几种?bio,nio,aio 有什么区别_hequnwang10的博客-CSDN博客

java.io包基于流模型实现,提供File抽象、输入输出流等IO的功能。交互方式是同步、阻塞的方式,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞。java.io包的好处是代码比较简单、直观,缺点则是IO效率和扩展性存在局限性,容易成为应用性能的瓶颈。

java.net包下提供的部分网络API,比如Socket、ServerSocket、HttpURLConnection

也可以被归类到同步阻塞IO类库,因为网络通信同样是IO行为

java 1.4中引入了NIO框架(java.nio 包),提供了Channel、Selector、Buffer等新的抽象,可以构建多路复用IO程序,同时提供更接近操作系统底层的高性能数据操作方式.

Java7中,NIO有了进一步的改进,也就是NIO2,引入了异步非阻塞IO方式,也被称为AIO(Asynchronous IO),异步IO操作基于事件和回调机制。

zero 拷贝

在传统的数据 IO 模式中,读取一个磁盘文件,并发送到远程端的服务,就共有四次用户空间与内核空间的上下文切换,四次数据复制,包括两次 CPU 数据复制,两次 DMA 数据复制。

解放CPU,这也就是零拷贝Zero-Copy技术。数据应该可以直接从内核缓冲区直接送入Socket缓冲区。

解决思路:零拷贝技术的几个实现手段包括:mmap+write、sendfile、sendfile+DMA收集、splice等。

在Java NIO包中提供了零拷贝机制对应的API

(1)mmap + write 的零拷贝方式:

        FileChannel 的 map() 方法产生的 MappedByteBuffer:FileChannel 提供了 map() 方法

(2)sendfile 的零拷贝方式:

        FileChannel 的 transferTo、transferFrom 如果操作系统底层支持的话,transferTo、transferFrom也会使用 sendfile 零拷贝技术来实现数据的传输。

FileChannel的实现类并不在JDK本身,而位于sun.nio.ch.FileChannelImpl类中,零拷贝的具体实现自然也都是native方法,看源码。

零拷贝机制的应用

零拷贝在很多框架中得到了广泛应用,一般都以Netty为例来分析。但作为大数据工程师,

Kafka 的索引文件使用的是 mmap + write 方式,数据文件使用的是 sendfile 方式

DMA(Direct Memory Access,直接内存访问):DMA 本质上是一块主板上独立的芯片,允许外设设备直接与内存存储器进行数据传输,并且不需要CPU参与的技术

扩展

问题一万个元素,普通链表无序 寻找x元素?

左边小右边大,数据结构要有序 

遍历、2分查找 O(n)对有序链表建索引,链表加多级索引的结构 就是 跳表,(以空间换时间)

跳跃表

查询/增加/删除O(logN),每一层的节点数为下一层的一半,处理方法抛硬币法。

分治【分而治之,减而治之】有路由、索引、映射

跳表的原理与实现 [图解]_Monkey Ji的博客-CSDN博客

redis和memcached区别

 

3高 高性能[不浪费就是高性能]、高可靠、高并发

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/797639.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring核心概念、IoC和DI的认识、Spring中bean的配置及实例化、bean的生命周期

初始Spring 一、Spring核心概念1.1IoC(Inversion of Contral):控制反转1.2IoC代码实现1.2DI代码实现 二、bean的相关操作2.1bean的配置2.1.1bean的基础配置2.1.2bean的别名配置2.1.3bean的作用范围配置 2.2bean的实例化 - - 构造方法2.3bean的实例化 - - 实例工厂与…

windows中注册redis服务启动时报1067错误

注册完redis服务,打开计算机 服务时确实有redis服务存在,但是点击启动时却报1067错误,而命令行用redis-server.exe redis.windows.conf 命令却也可以启动 查看6379的端口也没有被占用(netstat -ano | findstr :6379) …

【LeetCode】98.验证二叉搜索树

题目 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 1&#xff1a…

怎么在树莓派上搭建web网站,并发布到外网可访问?

文章目录 怎么在树莓派上搭建web网站,并发布到外网可访问?概述使用 Raspberry Pi Imager 安装 Raspberry Pi OS测试 web 站点安装静态样例站点 将web站点发布到公网安装 Cpolarcpolar进行token认证生成cpolar随机域名网址生成cpolar二级子域名将参数保存…

servlet基本使用

1.创建web项目(新版本idea中首先新创建新项目,再在新项目中选中添加框架支持,即可生成web项目) 2.接下来我们可以来编写代码,我们在源文件下创建包后再创键类 我们想要利用servlet,可以通过三种方式来实现 …

Mybatis 支持复杂类型方式List<String>

设置 autoResultMap true TableField(value "enums", typeHandler JacksonTypeHandler.class) <id column"enums" property"enums" typeHandler"com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />

Appium+python自动化(二十六)- Toast提示(超详解)简介

开始今天的主题 - 获取toast提示 在日常使用App过程中&#xff0c;经常会看到App界面有一些弹窗提示&#xff08;如下图所示&#xff09;这些提示元素出现后等待3秒左右就会自动消失&#xff0c;这个和我日常生活中看到的烟花和昙花是多么的相似&#xff0c;那么我们该如何获取…

在Ail Linux中手动配置IPv6

第一步&#xff0c;登录阿里云服务器控制台&#xff0c;在“概览”页面找到对应实例&#xff0c;然后单击实例ID。 第二步&#xff0c;在“实例详情”页面中的“网络信息”栏目中&#xff0c;可以发现“IPv6 地址”中没有数据&#xff0c;然后单击“专有网络”的专有网络ID。 第…

(学习笔记-系统结构)Linux内核与windows内核

内核 计算机是由各种外部硬件设备组成的&#xff0c;比如内存、CPU、硬盘等&#xff0c;如果每个应用都要和这些硬件设备对接通信协议&#xff0c;那这样太累了&#xff0c;所以这个中间人由内核来负责&#xff0c;让内核作为应用连接硬件设备的桥梁&#xff0c;应用程序只关心…

Docker 容器基础操作

Docker容器基础操作 容器(container)是Docker镜像的运行实例,类似于可执行文件与进程的关系,Docker是容器引擎,相当于系统平台。 容器的生命周期 容器的基础操作(以 tomcat8.0 为例) # 拉取tomcat8.0镜像 [root@tudou tudou]# docker pull tomcat:8.0 8.0: Pulling f…

【山河送书第四期】:《Python之光:Python编程入门与实战》参与活动,免费送书五本!!

【山河送书第四期】&#xff1a;《Python之光&#xff1a;Python编程入门与实战》参与活动&#xff0c;免费送书五本&#xff01;&#xff01; 书本简介本书亮点配套丰富购买链接参与方式往期赠书回顾&#xff1a; 书本简介 作为一种极其流行的编程语言&#xff0c;Python已经…

评测报告的结论如何写?

背景 最近组内同学开始编写评测报告&#xff0c;报告中的结论中存在以下几种情况&#xff1a; 1.结论是一大段文字&#xff0c;像散文一样 2.评测数据结果中存在多个数据维度&#xff0c;将所有的数据结果都罗列到结论中&#xff0c;主要信息不突出 3.只是将评测数据罗列到…

QT多线程编程基础

文章目录 前言一、线程&#xff0c;进程 介绍二、创建线程三、终止线程总结 前言 一、线程&#xff0c;进程 介绍 线程&#xff1a; 是操作系统中独立运行的最小单位。每个线程都有自己的执行路径、程序计数器、堆栈和一组寄存器。线程共享进程的资源&#xff0c;如内存和文件…

突破AI医疗对话MDS瓶颈,深兰科技·科学院论文被国际顶会SIGIR 2023收录

7月23日&#xff5e;27日&#xff0c;人工智能领域智能信息检索方向最权威的国际会议“第46届国际计算机学会信息检索大会”(SIGIR 2023)在中国台湾省台北市举行。大会公布了投稿论文入选名单&#xff0c;由深兰科技科学院多名科技研发人员合力撰写的论文《MDKG&#xff1a;基于…

【ADS】导入CMOS衬底文件+使用coilsys生成电感

新建工程经常忘记怎么操作&#xff0c;简记防遗忘。 操作步骤 1.unzip file2.原理图仿真3.Layout加载衬底文件4.使用coilsys生成电感 1.unzip file designKits-》unzip&#xff0c;选择对应库的压缩包&#xff0c;我这里是&#xff08;TSMC_CRN65GP_v2.zip&#xff09;。 为了…

MySQL碎片清理

为什么产生&#xff1f; 经过大量增删改的表&#xff0c;都可能存在碎片 MySQL数据结构是B树&#xff0c; 删除某一记录&#xff0c;只会标记为删除&#xff0c;后续插入一条该区间的记录&#xff0c;就会复用这个位置。 删除整个数据页的记录&#xff0c;则整个页标记为“可…

C语言getchar函数和putchar函数

getchar()是输入字符的函数 putchar是输出字符的函数 需要包含头文件&#xff1a;<stdio.h>

关于avs和avs2编码stuffing bit的一点理解

avs和avs2编码标准关于结尾有一点和h264的不同。 比如一段视频通过avsx编码后&#xff0c;如果最后1位是字节对齐的&#xff08;也就是说编码后的流刚好是8*n bit&#xff09;&#xff0c;那么就要在最后1bit后面再增加一字节0x80(1000 0000). 如果最后1bit没有对齐&#xff0c…

封装 vue3 入场动画 插件 并发布到 npm

准备 vue create entry-animate 只需要简单的项目框架即可&#xff0c;router\vuex 都不用&#xff1b; 封装过程 src 目录下新建 package&#xff0c;package文件夹是存放我们封装的组件的&#xff1b;还需要加一个入口文件&#xff0c;在 package 中加一个 index.js 文件&a…

BHQ-2 Maleimide,BHQ2 马来酰亚胺,用于检测生物分子的存在和浓度变化

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ BHQ-2 Mal&#xff0c;BHQ2 Maleimide&#xff0c;BHQ-2 马来酰亚胺 PART1----​Product structure&#xff1a; PART2----​Product specifications&#xff1a; 1.CAS No&#xff1a;N/A 2.Molecular formula&#xff1…