Java面试基础篇-IO

news2025/1/18 19:05:47

UNIX提供5种I/O模型

var code = “7cfcb088-556d-478a-b21d-12b255236dbd”

BIO模型

在进程空间调用recvfrom时被阻塞,直到有数据才返回。
在这里插入图片描述

NIO模型

调用recvfrom时先返回EWOULDBLOCK错误,然后轮询是否有数据。
在这里插入图片描述

I/O复用

linux提供select/poll,其支持多个fd的NIO,但是select/poll本身是阻塞的。epoll采用事件驱动的方式代替顺序扫描,其性能更高。
在这里插入图片描述

信号驱动I/O模型

调用信号处理函数,返回SINGO信号时开始调用recvfrom。
在这里插入图片描述

异步I/O

通知内核某个操作,并整个操作完成的时候通知我们。
在这里插入图片描述

I/O多路复用技术

  • select打开FD限制1024,epoll最大限制是操作系统最大文件句柄数
  • select/poll在socket很大时,需要扫描全部集合。epoll通过fd回调函数实现。
  • 使用mmap技术进行消息传递
  • epoll API更简单

Java的IO演进

  • 1.4 NIO
    增加NIO包。
  • 1.7 NIO2.0

TCP粘包/拆包问题的解决之道

TCP粘包/拆包问题

TCP协议是”流“协议,流是没有间隔的。tcp会根据缓存大小将业务上的大包划分成多个小包发送出去、也可能多个小包合成一个大包发送出去。

TCP粘包/拆包发生的原因

应用层:应用程序写入的字节大小大于套接字接口缓冲区大小。
TCP层:进行MSS大小的tcp分段。
IP层:以太网帧的payload大于MTU进行ip分片。

TCP为了避免被发送方分片,它主动把数据分成小段再交给网络层。 最大的分段大小称为 MSS(Maximum Segment Size )

TCP粘包/拆包问题的解决策略

  1. 消息定长len,例如每个报文固定200字节。那么读取到定长len后就重置计数器开始读取下一个包。
  2. 包尾加换行符分割,如ftp。
  3. 消息头+消息体。消息头包含消息总长度的字段。
  4. 更复杂的应用协议。

Netty解决tcp粘包问题

为了解决tcp粘包/拆包导致的半包读写问题,Netty默认提供了多种编解码器用于处理半包。

LineBasedFrameDecoder:原理是遍历ByteBuf中字节,以换行符分割。
StringDecoder:将接收的byte对象转换为字符串,然后调用后面的handler
如果发送的消息不是以换行符结束的,netty也有其他解码器支持。

分隔符和定长解码器的应用

TCP以流的方式进行数据传输,上层应用协议为了对消息进行区分,通常采用以下4中方式:

  • 消息长度固定,累计读取到长度综合为定长LEN的报文后,就认为读取到了一个完整的消息,将计数器置位,重新开始读取下一个数据报;
  • 将回车换行符作为消息结束符,例如FTP协议,这种方式在文本协议中应用比较广泛;
  • 将特殊的分隔符作为消息的结束标志,回车换行符就是一种特殊的分隔符;
  • 通过在消息头中定义长度字段来标识消息的总长度。

DelimiterBasedFrameDecoder
支持任意字符为分隔符
支持设置单条消息最大长度,如果找了最大长度还没找到分隔符就抛出异常。

FixedLengthFrameDecoder
使用简单,指定包长度就ok。

编解码技术

Java序列化的目的主要有两个:网络传输和对象持久化。

Java序列化缺点

  • 不支持跨语言
  • 序列化后的码流太大
  • 序列化性能低

业界主流的编解码框架

  • Google 的protobuf
  • Facebook的Thrift
  • JBoss的Marshalling

Netty高性能之道

  1. 异步非阻塞通信
    Netty提供了SocketChannel和ServerSocketChannel两种不同的套接字通道实现,并且这两种都支持阻塞和非阻塞模式。

    NioEventLoop由于聚合了Selector(多路复用器),可以同时并发处理上千个SocketChannel,这可以充分提升I/O线程的运行效率。避免频繁I/O阻塞导致的线程挂起。

  2. 高效的Reactor线程模型
    单线程Reactor线程模型
    一个accpetThread接受任务,之后转发到reactor线程中进行处理。
    多线程reactor多线程模型
    有多个accpet线程
    主从Reactor多线程模型
    有多个accpet线程

  3. 无锁的串行化设计
    为了尽可能地避免锁竞争带来的性能损耗,可以通过串行化设计,即消息的处理尽可能在同一个线程内完成,期间不进行线程切换,这样就避免了多线程竞争和同步锁。

  4. 高效的并发编程

  5. 高效的系列化框架

  6. 零拷贝

  7. 内存池

  8. 灵活的TCP参数配置能力

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

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

相关文章

Minecraft 1.19.2 Forge模组开发 07.拼图建筑(jigsaw)

如果你看过之前的Minecraft 1.19.2建筑生成的话,想必会更好理解这篇教程。 效果演示效果演示效果演示 1.我们本期准备生成的建筑分为4块,所以首先需要用4个结构方块将整个建筑包括起来: 2.之后我们需要用指令拿出拼图方块: give p minecraf…

数据结构与算法——Java实现递归、迷宫回溯问题、八皇后问题

目录 一、递归 1.1 介绍递归 二、迷宫回溯问题 2.1 代码实现 三、八皇后问题 3.1 基本介绍 3.2 分析思路 3.3 代码实现 一、递归 1.1 介绍递归 简单的说:递归就是方法自己调用自己,每次传入不同的变量。 递归有助于编程者解决复杂的问题&#x…

Efficient Zero-shot Event Extraction with Context-Definition Alignment论文解读

Efficient Zero-shot Event Extraction with Context-Definition Alignment code:tencent-ailab/ZED: This is the repository for EMNLP 2022 paper “Efficient Zero-shot Event Extraction with Context-Definition Alignment” (github.com) paper:…

【手把手】分布式定时任务调度解析之Elastic-Job

1、这货怎么没怎么听过 经常使用Quartz或者Spring Task的小伙伴们,或多或少都会遇到几个痛点,比如: 1、不敢轻易跟着应用服务多节点部署,可能会重复多次执行而引发系统逻辑的错误; 2、Quartz的集群仅仅只是用来HA&…

业主应该重视装修中的“道”而不是“术”!极家精工装修好不好!

业主应该重视装修中的“道”而不是“术”!极家精工装修好不好!看了很多业主问了很多关于装修中很琐碎的事儿,比如“装修流程”、“装修应该注意什么”、“装修哪些必须要重视”、“某某材料和某某材料相比哪个好”、“家里装了什么是你最不后…

Lua中的基本数据类型

Lua中的数据类型一、Lua基本数据类型1.1、nil1.2、boolean1.3、number1.4、string1.5、function1.6、table二、Lua 通用数据结构的实现总结后言Lua是一门动态类型的脚本语言,这意味着同一个变量可以在不同时刻指向不同类型的数据。Lua代码中 一般采用一下两种做法相…

Dubbo-admin+Zookeeper 的环境搭建实操与 Could-not-extract-archive 报错踩坑

$ brew install zookeeper > Downloading https://homebrew.bintray.com/bottles/zookeeper-3.4.13.mojave.bottle.tar.gz ...先来看dubbo-admin的安装;我们先找到它在apache下的官方GitHub,官方也有相关介绍,中英文版都有(毕竟原本是中国…

[附源码]Node.js计算机毕业设计高校学科竞赛管理系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

Kibana使用

简介 Kibana是通向 Elastic 产品集的窗口。 它可以在 Elasticsearch 中对数据进行视觉探索和实时分析。 Kibana通常用于项目log日志收集分析、数据可视化分析等。 一、【Discover】搜索查询 Discover模块用于全文搜索文档(doucument),支持索引筛选、时间筛选、字段筛选、支持…

linux下syslog使用说明

syslog 系统日志应用 1) 概述 syslog是Linux默认的日志守护进程。默认的syslog配置文件是/etc/syslog.conf文件。程序,守护进程和内核提供了访问系统的日志信息。因此,任何希望生成日志信息的程序都可以向 syslog 接口呼叫生成该信息。 几乎所有的…

读《深入浅出MySQL数据库开发、优化与管理维护(第2版)》笔记1

上面3图是书中MySQL帮助的使用小节; 实测: 我用DATE_FORMAT(date,format)函数的时候经常会记不清格式化的字符是啥,这个时候我会去求助度娘,然后从零散的帖子里找一个合适的,测试一下可用,就拿来用了,但没法马上找到一个比较完整系统一点的帖子,从看此书本章节,可知使用MySQL的…

acm是什么?你准备好去打了吗?

1.引言2.acm究竟是什么?3.acm的时间安排重点网络赛的作用1.名额分配2.校内选拔icpc省赛省赛选拔赛(校内)4.acm该如何准备1.前期的算法积累1.Acwing 平台算法基础课 -y总业界良心。算法提高课 基本囊括了蓝桥杯的知识范畴算法进阶课(选) 算法中…

MYSQL 8.0 -- 事务中删除不存在的记录导致死锁

最近开发的某个功能中,线上偶尔会爆出死锁异常。再大佬同事的帮助下,最终排查出了原因,在此记录一下。 文章目录业务描述事务中删除行时锁的表现场景重现问题处理业务描述 在业绩信息维护中,可以维护相关人员列表,相关…

谁再问我 Kafka,我把这 43 张图甩给他

从Kafka诞生的早期,我就对Kafka投入了很多的关注,虽然不敢说精通Kafka, 但也算是非常熟悉了。 平时在工作之中,几乎天天都在跟这玩意儿打交道,在面试的时候,也会经常聊一些Kafka相关的内容。 Kafka 是一个优秀的分布…

二苯并环辛炔-二硫键-马来酰亚胺,DBCO-SS-Maleimide,DBCO-SS-Mal

基础产品数据(Basic Product Data): CAS号:N/A 中文名:二苯并环辛炔-二硫键-马来酰亚胺 英文名:DBCO-SS-Maleimide,DBCO-SS-Mal 详细产品数据(Detailed Product Data)&am…

C++--数据结构--并查集--高阶0711

1. 并查集 在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个 单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一 个元素归属于那个集合的运算。适合于描述这类问…

如何使用Python批量化处理Excel——零基础入门指南

本教程旨在帮助零编程基础,但是又有“批量化处理Excel表”这种需求的大家。 在进入教程时,请确保你具有以下资质: 1、 并非工作压到头上了,急需解决一批表所以想过来速成,而是愿意耐心花上几个小时学习来获得一项长久…

Redis之相关拓展(事务、监控、Jedis)

Redis之相关拓展一、事务1、介绍2、流程3、shell命令3.1 开启事务3.2 放弃事务3.3 编译型异常(代码有问题,命令有错)3.4 运行时异常二、监控(watch)1、锁1.1 悲观锁1.2 乐观锁2、注意2.1 原理2.2 流程三、Jedis1、简介…

学习Opencv不得不掌握的操作

OpenCV基本操作 1 图像的IO操作 这里我们会给大家介绍如何读取图像,如何显示图像和如何保存图像。 1.1 读取图像 API cv.imread() 参数: 要读取的图像读取方式的标志cv.IMREAD*COLOR:以彩色模式加载图像,任何图像的透明度都将…

C++ Primer笔记——explicit、string流、vector比较、emplace

目录 一.P265 抑制构造函数定义的隐式转换 二.P287 string流 三.P304 vector的比较 四.P307 在容器中特定位置添加元素 一.P265 抑制构造函数定义的隐式转换 举个例子,如果构造函数参数是string类型,那么当使用赋值符号进行初始化操作时&#xff0c…