【软件构造】8.3 I/O与算法性能

软件可配置模拟前端:重塑工业4.0柔性制造的核心I/O技术 模拟输入输出(I/O)是工业自动化系统感知和控制物理世界的关键接口,负责将传感器的模拟信号转换为数字量,或将控制指令转化为驱动执行器的模拟信号。其核心在于模拟前端(AFE)的信号调理与转换原理。传统固定功能I/O模块在应对产线频繁换型时面临效率低下、备件管理复杂等挑战,其技术价值正从追求单一精度转向提供系统级的灵活性与可配置性。随着工业4.0柔性制造和预测性维护需求的增长,能够通过软件动态配置通道功能、量程的**软件可配置模拟前端**应运而生。这类技术如NXP的N-AFE系列,集成了高精度ADC/DAC、可 阅读详情

1. 软件系统的I/O

输入:系统接收的信号或数据
输出:系统发出的信号或数据
在这里插入图片描述

2.Java I/O APIs

在这里插入图片描述
例一:txt的读写

FileReader inputStream = null; 
FileWriter outputStream = null;
try { 
	inputStream = new FileReader(“in.txt"); 
	outputStream = new FileWriter("output.txt");
	int c; 
	while ((c = inputStream.read()) != -1) 
	outputStream.write(c);
} finally { 
	if (inputStream != null) 
		inputStream.close();            
	if (outputStream != null) 
		outputStream.close(); 
}

例二:bin文件的读写

FileInputStream in = null; 
FileOutputStream out = null;
try { 
	in = new FileInputStream(“in.bin"); 
	out = new FileOutputStream(“output.bin");
	int c; 
	while ((c = in.read()) != -1) 
		out.write(c);
} finally { 
	if (in != null) 
		in.close(); 
	if (out != null) 
		out.close(); 
}

3.Java nio APIs

I/O读写性能在很多场合下是系统的性能瓶颈
在这里插入图片描述
在这里插入图片描述

IONIO
Stream orientedBuffer oriented
Blocking IONon blocking IO
Selectors

Stream Oriented vs. Buffer Oriented

面向流的Java IO:从一个流中一次读一个或几个字节,对读到的字节做什么操作取决于你。读到的东西没有在任何地方被缓存。不能在流中前后移动。
面向缓冲器的Java NIO:数据被读到一个缓冲器中,之后被处理。可以在缓冲器中前后移动,这使得处理数据更加自由。

Blocking vs. Non-blocking IO

Java IO 的几个流都是blocking的:当线程调用read()或write()时,该线程被阻塞,直到有要读取的数据,或者数据被完全写入。 在此期间,该线程无法执行任何其他操作。
Java NIO的non-blocking模式允许线程请求从channel读取数据,并且要么只获取当前可用的内容,要么获取不到数据,如果当前没有数据可用,线程可以做其他的事情,而不是在数据可供读取之前保持阻塞状态。
线程在IO请求没有被阻塞时做的事情通常是在其他通道上执行IO。也就是说,单个线程现在可以管理多个输入和输出通道。

Selectors

Java NIO的selectors允许单个线程监视多个输入通道。
您可以使用selectors注册多个通道,然后使用单个线程“选择”具有可用于处理的输入的通道,或者选择准备写入的通道。
selector机制使单个线程管理多个通道更为简单
在这里插入图片描述

Buffer

缓冲区是物理内存的一部分区域,当数据从一个位置移动到另一个位置时,用来临时存储数据。
缓冲区可能在硬件中一块固定的内存位置,软件中的虚拟数据缓冲区指向物理内存中的一个位置。
所有情况中,数据缓冲区中的数据都被存储在物理存储介质中。
大多数缓冲区都是用软件实现的,由于软件通常使用更快的RAM来存储临时数据,与硬盘驱动器相比,访问时间要快得多。
缓冲区的应用场合:
数据的接收率和被加工率有区别,且这些比率是变量时。
使用BufferedReader读文件

BufferedReader br = new BufferedReader(new FileReader("file.txt")); 
try { 
	StringBuilder sb = new StringBuilder();
	String line = br.readLine(); 
	while (line != null) { 
		sb.append(line); 
		sb.append(System.lineSeparator()); 
		line = br.readLine(); 
	} 
	String everything = sb.toString(); 
} finally { 
	br.close(); 
} 

NIO中的buffers:
一个Buffer对象是包含了固定数量数据的容器,
它的行为像一个byte[]数组,但被封装为内部存储可以是一块系统内存的形式。
ByteBuffer类:
代表一个存储原始字节的,长度固定的向量。
六类操作:

  1. 绝对/相对get和put方法,读取和写入单个字节;
  2. 相对批量get方法,将连续的字节序列从此缓冲区转移到数组中
  3. 相对批量put方法,用于将字节序列或其他字节缓冲区中的连续字节序列传输到此缓冲区中;
  4. 绝对和相对的get和put方法,用于读取和写入其他基本类型的值,以特定字节顺序将它们转换为字节序列;
  5. 创建 viewbuffers 的方法,允许将字节缓冲区视为包含某些其他基本类型值的缓冲区;
  6. 压缩,复制和切片字节缓冲区的方法。

Channel

NIO buffer对象可以直接从channel中读写。
打开Channel:
Socket channel类有静态工厂方法open()

 SocketChannel sc = SocketChannel.open() ; 
 Sc.connect(new InetSocketAddress(hostname, portnumber)) 

File channels不能直接创建,首先使用传统的Java I/O机制创建FileInputStream, FileOutputStream或RandomAccessFile,然后应用 getChannel()方法取得相关联的NIO channel

RandomAccessFile raf = new RandomAccessFile(filename, “r”) ; 
FileChannel fc = raf.getChannel() ;

所有继承自ByteChannel接口的channel都提供 read()和write()方法

4.从io到nio:更好的I/O性能

4.1 Stream

/** 
* Reads all lines from a text file and prints them. 
* Uses Java 1.0-era (circa 1996) Streams to read the file. 
*/ 
public class StreamCat { 
	public static void main(String[] args) throws IOException { 
		DataInputStream dis = new DataInputStream( new FileInputStream(args[0])); 
		// Don't do this! DataInputStream.readLine is DEPRECATED! 
		String line; 
		while ((line = dis.readLine()) != null) 
			System.out.println(line); 
	} 
}

4.2 Reader

/** 
* Reads all lines from a text file and prints them. 
* Uses Java 1.1-era (circa 1997) Streams to read the file. 
*/ 
public class ReaderCat { 
	public static void main(String[] args) throws IOException { 
		try (BufferedReader rd = new BufferedReader( new FileReader(args[0]))) { 
			String line; 
			while ((line = rd.readLine()) != null) { 
			System.out.println(line); 
			// you could also wrap System.out in a PrintWriter 
			} 
		} 
	} 
}

4.3 NIO

/** 
* Reads all lines from a text file and prints them. 
* Uses nio FileChannel and ByteBuffer. 
*/ 
public class NioCat { 
	public static void main(String[] args) throws IOException { 
		ByteBuffer buf = ByteBuffer.allocate(512); 
		try (FileChannel ch = FileChannel.open(Paths.get(args[0]), StandardOpenOption.READ)) { 
			int n; 
			while ((n = ch.read(buf)) > -1) { 
				System.out.print(new String(buf.array(), 0, n)); 
				buf.clear(); 
			} 
		} 
	} 
}

4.4 Scanner

/** 
* Reads all lines from a text file and prints them 
* Uses Java 5 scanner. 
*/ 
public class ScannerCat { 
	public static void main(String[] args) throws IOException { 
		try (Scanner s = new Scanner(new File(args[0]))) { 
			while (s.hasNextLine()) 
				System.out.println(s.nextLine()); 
		} 
	} 
}

4.5 Lines

/** 
* Reads all lines from a text file and prints them. Uses Files, 
* Java 8-era Stream API (not IO Streams!) and method references. 
*/ 
public class LinesCat { 
	public static void main(String[] args) throws IOException { 
		Files.lines(Paths.get(args[0])).forEach(System.out::println); 
	} 
} 
深入解析MPC8572E:双核通信、高速I/O与嵌入式网络处理器设计实战 在嵌入式系统与网络设备开发中,多核处理器架构和高速互连技术是提升性能的关键。多核处理器通过并行计算提升处理能力,其核心挑战在于核间高效协同与数据一致性。片上网络(NoC)和硬件一致性协议等技术,解决了传统总线架构的带宽瓶颈与数据同步问题,为数据平面与控制平面的并行处理提供了硬件基础。这些技术在高性能网络处理、存储控制及无线通信等场景中价值显著,能够实现线速数据处理和低延迟通信。本文以恩智浦MPC8572E PowerQUICC III处理器为例,深入剖析其双核e500架构间的**多核通信机制**(如共享内存 阅读详情

相关推荐

深入对比:OpenCV中8种PnP算法(SOLVEPNP_EPNP/UPNP等)到底怎么选?性能实测告诉你

本文深入对比了OpenCV中8种PnP算法(包括SOLVEPNP_EPNP、UPNP等)的性能与适用场景,通过理论解析和实测数据,帮助开发者根据实际需求选择最优算法。文章详细分析了EPnP、IPPE等算法的原理与优势,并提供了AR/VR、工业测量等场景的选型建议,助力提升相机位姿估计的精度与效率。

weixin_30444111的博客 386

Linux实现的4种I/O调度算法

Linux实现了4种I/O调度算法,分别为:NOOP算法(no operate)、最后期限算法(Deadline)、完全公平队列算法(CFQ)和预期算法(Anticipatory)。 NOOP算法 不对I/O请求排序,但会合并请求,除此之外无其他任何优化。它用FIFO队列顺序提交I/O请求。NOOP算法适用于如SSD的随机访问设备,因为随机访问设备不存在磁头移动造成的寻道时间,无需做多余的事情。 最后期限算法 最后期限算法维护了三个队列,分别是具备合并和排序功能的请求队列、读请求队列和写请求队列。这

陈玉博的技术博客 1515

深入浅出块I/O子系统(五)I/O调度算法

I/O调度算法 I/O调度器(I/O Scheduler)的工作是管理块设备的请求队列。它决定队列中的请求排列顺序以及在什么时刻派发请求到块设备。这样做有利于减少磁盘寻址时间,从而提高整体性能。I/O调度程序通过两种方法来减少磁盘寻址时间:合并与排序。 1.为请求队列建立关联的I/O调度队列 2.判断bio是否可以被合并到request 3.将请求添加到I/O调度队列或请求队列 4.从I/O调度队列派发请求到请求队列 ...

sinat_37817094的博客 834

算法笔记(3)—— 快速 I/O 算法:快速输入算法、快速输出算法

本文会详细介绍快速 I/O 算法,包括快速输入算法、快速输出算法,并用 C/C++ 语言实现,还不速速进来学习!

小康2022的博客 1933

OS- -I/O之盘和时钟

OS- -I/O之盘和时钟 文章目录OS- -I/O之盘和时钟一、盘1.盘硬件磁盘RAID磁盘格式化2.磁盘臂调度算法3.错误处理4.稳定存储器二、时钟1.时钟硬件2.时钟软件3.软定时器 一、盘 盘可以说是硬件里面比较简单的构造了,同时也是最重要的。 下面我们从盘谈起,聊聊它的物理构造 1.盘硬件 盘会有很多种类型。其中最简单的构造就是磁盘(magnetic hard disks),也被称为hard disk,HDD等。 磁盘通常与安装在磁臂上的磁头配对,磁头可将数据读取或者将数据写入磁盘,因此磁

wolfGuiDao的博客 914

vivado2025安装教程:手把手带你完成环境配置

详细讲解vivado2025的安装步骤与环境配置技巧,帮助开发者快速搭建FPGA开发平台。涵盖常见问题解决方案,确保vivado2025稳定运行,提升开发效率。

weixin_42588672的博客 3007

I/O软件层次结构、I/O核心子系统以及假脱机技术(SPOOLing技术)

一、I/O软件层次结构 (一)用户层软件 (二)设备独立性软件 主要实现的功能:②设备的保护。 原理类似与文件保护。设备被看做是一种特殊的文件,不同用户对各个文件的访问权限是不一样的,同理,对设备的访问权限也不一样。 ③差错处理 设备独立性软件需要对一些设备的错误进行处理 ④设备的分配与回收 ⑤数据缓冲区管理 可以通过缓冲技术屏蔽设备之间数据交换单位大小和传输速度的差异 ⑥建立逻辑设备名到物理设备名的映射关系;根据设备类型选择调用相应的驱动程序 用户或用户层软件发出I/O操作相关系统调用的系统调用时

派拉斯兔子的博客 2221

NVIDIA DGX Spark实战指南:从开箱到AI模型高效部署

本文详细介绍了NVIDIA DGX Spark的开箱体验、硬件架构及AI模型高效部署实战指南。从1 PetaFLOP算力的迷你设备到Grace Blackwell超级芯片的深度解析,再到五分钟快速上手指南和大模型部署技巧,帮助开发者充分利用这款全球最小AI超级计算机的性能优势。

weixin_29239279的博客 1363

【操作系统-IO管理】IO层次结构

【操作系统-IO管理】IO层次结构

Mount256的博客 7687

Hermes Agent vs OpenClaw:2026 年开源 AI Agent 框架深度对比

两款 2026 年最受关注的开源 AI Agent 框架,一个主打「自进化」,一个聚焦「网关路由」——它们究竟有何不同?本文将从架构原理、核心机制、使用方式到适用场景,为你全面拆解。无论你是 AI 研究者、开发者,还是想用 AI 提升工作效率的个人用户,这篇文章都将帮助你做出最适合的选择

程序猿_三产 3738

CrossOver实战:在Mac上流畅运行《梦幻西游》端游与搬砖指南

在跨平台应用开发与系统兼容性领域,如何让为特定操作系统设计的软件在其他平台上运行,是一个经典的技术挑战。其核心原理在于通过兼容层或转译技术,将程序的系统调用和图形接口指令实时转换为目标系统能理解的格式。这项技术的价值在于极大地扩展了硬件设备的软件生态,让用户无需依赖虚拟机或双系统即可无缝使用关键应用。在游戏、专业工具等场景中,这能显著提升工作效率和用户体验。本文以经典端游《梦幻西游》为例,详细解析如何在搭载Apple Silicon或Intel芯片的Mac上,借助CrossOver这一成熟的兼容层方案,构建

weixin_30129025的博客 554

Chapter8-面向性能的软件构造方法

目录 目录 1、Metrics,Princple,and Methods of Construction for Performance 1.1、Performance Metrics(性能度量指标) 1.2、Memory Performance(存储性能) 1.2.1 Three modes of object management 1.2.2 Java Memory Model 1....

子耶 682

CMAC算法原理

2、K1 通过以下运算导出:若 L 的最高有效位等于 0,则 K1 是 L 的左移 1 位。3、K2 通过如下运算导出:若 K1 的最高有效位等于 0,则 K2 是 K1 的左移 1 位。采用了 AES 算法中的类似 CBC 模式的加密方式,即对前一个分组的密文与当前分组的明文进行异或操作后在加密,2、分块处理:首先将消息分成多个固定长度的块,若消息长度不是块大小的倍数,则可以使用填充来将其填充到合适的大小。1、子密钥计算,通过主密钥生成子密钥(key1,key2),子密钥用于最后一个块处理;

sky的博客 1658

操作系统 I/O 软件 4 层架构:从用户 printf 到磁盘中断的 10 个任务归属解析

操作系统的I/O架构演进史,本质上是一部抽象与解耦的历史。四层架构的成功在于:用户层提供稳定性:保持API多年兼容设备无关层实现可移植性:同一程序在不同硬件运行驱动层保证扩展性:新硬件无需修改内核中断层确保响应性:及时处理设备事件理解这些设计原则,比记住具体实现细节更为重要。当您下次调试驱动程序或优化I/O性能时,不妨思考:当前问题属于哪一层的责任?是否有更合适的抽象可以应用?这才是掌握操作系统I/O架构的真谛。

391

UE5.3.2 + VS2022社区版在Win11上的C++编译环境配置全解

Unreal Engine 5的C++开发依赖严格的工具链协同,其核心在于Visual Studio编译器版本、Windows SDK与引擎构建系统(UBT)的精准匹配。UE5.3.2强制要求MSVC v143.4(即VS2022 17.4+)及Windows 11 SDK 10.0.22621.0,任何偏差都会引发LNK2019链接失败、C1083头文件缺失或MSB8066构建中断等典型错误。该配置不仅关乎安装顺序,更涉及注册表清理、PATH环境变量、SDK路径注入与运行时DLL加载等底层机制。适用于Wi

weixin_33978722的博客 367

excel 利用SUBTOTAL函数计算筛选后数列总和、均值、最大、最小值

表里有三个人,咱们需要筛选出三个人,并分别计算他们的总和值。 先看一下数据范围(A1:B27) 通过筛选找张三。 按照上图所示输入函数,选择9,求和。 然后按照函数输入即可。 就能计算出结果。 筛选项选择王五,就会自动计算王五的总和。 筛选到李四就会自动计算李四的总和。 如果把9改成1,就是自动计算筛选出来的均值结果,如下图所示。 如果改成4就是取筛选项的最大值,选择5就是取最小值。 ...

yuanYW7556的博客 3万+

哈工大-软件构造-复习

作为软件工程专业的核心课程之一软件构造结束了,不为博客分数,只为能留下点什么,就来复习复习吧。 PS:下面大多都是我个人的理解,用词上可能不太严谨。 1.多维视图 讲述了一个完整的程序的解剖图,不难看出,Code-level是代码逻辑层面,Component-level是代码的物理层面代码本身的文件等等,Moment代表程序在某一时刻的情况,而Period代表程序在生产周期里面相关的事项。Bu...

小明难亡 723

win11一直弹出用户账户控制怎么解决

用户帐户控制简称UAC,是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制。近期有部分Win11用户想要关闭UAC,但是不知道应该如何操作,对此下面我就教给大家操作方法,大家可以去尝试看看。...

xitongzhijia_abc的博客 5万+

C++职工管理系统实战:从面向对象到文件I/O的完整项目设计

在软件开发中,面向对象编程(OOP)是一种核心范式,它通过封装、继承和多态等概念来组织代码,提高可维护性和复用性。其原理是将数据与操作数据的方法绑定为对象,从而模拟现实世界实体。这种设计模式的技术价值在于能够构建结构清晰、易于扩展的应用程序,尤其在管理系统中体现明显。应用场景广泛,从简单的学生信息管理到复杂的企业资源规划系统,都需要高效的数据组织和持久化方案。本文以C++实现一个职工管理系统为例,深入探讨了如何运用STL容器(如vector和map)进行数据管理,并通过文件I/O实现数据持久化,展示了如何将

weixin_33725515的博客 1298

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

同步阻塞I/O在高并发场景下的复兴:从“钝剑”到“利刃”的技术认知刷新

在软件架构设计中,I/O模型是决定系统并发能力与资源效率的核心基础。同步阻塞I/O因其直观的“一线程一连接”模式,常被视为高并发场景下的性能瓶颈,而事件驱动与异步非阻塞模型则凭借其高吞吐量成为主流选择。然而,技术的价值在于匹配场景:当工作负载呈现连接数有限但计算密集的特征,或借助虚拟线程、协程等现代并发原语时,同步阻塞模型在编程简洁性、可维护性及可观测性方面的工程实践优势便凸显出来。其原理在于,通过轻量级线程调度封装阻塞点,能在保持线性代码逻辑的同时,实现近似异步的并发处理能力。这种技术认知的刷新,使得同步

weixin_30512089的博客 286

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

o3与o4-mini实测:大模型如何实现自主数学推理

大语言模型的推理能力,正从‘提示驱动’迈向‘自主调度’——这标志着AI从语言模仿者升级为可验证、可执行、可迭代的问题求解体。其核心原理在于将思考链(Chain-of-Thought)内化为底层能力,结合符号计算、知识图谱调用与工具自治,实现对复杂数学问题(如高次多项式构造、代数簇分析)的端到端闭环求解。该能力不仅支撑数学科研协作者、代码审查机器人等高价值场景,更在工业诊断、硬件调试、学术综述等需强逻辑+多模态+可审计的工程实践中展现出生产就绪性。本文以OpenAI o3/o4-mini对欧拉问题的实测为切口

jackleechina2011212的博客 431

软件构造-8

内存管理模式: 静态 动态,基于堆 动态,基于栈 内存分配 静态内存分配:在编译阶段就已经确定好了内存分配 动态态内存分配:在运行时动态分配内存,建立新的内存对象,基于堆和栈 栈:存储方式调用以及方法执行中的局部数据,基本类型的变量和对象的引用变量在栈内分配内存 堆内存:在一个内存里分多个小块,每块包含一个对象,或者未被占用 JAVA内存管理 每个线程有自己的栈,管理...

qq_40358998的博客 210

Java性能调优-性能调优基础

所有的系统在开发完之后,多多少少都会有性能问题,我们首先要做的就是想办法把问题暴露出来,例如进行压力测试、模拟可能的操作场景等等,再通过性能调优去解决这些问题。好的系统性能调优不仅仅可以提高系统的性能,还能为公司节省资源。

千月落 759

M/o/Vfuscator安全研究论文解读:学术界的最新成果

你是否曾好奇如何让恶意代码分析变得如同逆向挑战?2025年,M/o/Vfuscator(MOV混淆器)以其革命性的单指令集混淆技术,重新定义了软件保护的边界。本文将深入剖析这一学术界与工业界瞩目的成果,带你了解如何仅用MOV指令构建完整程序,以及这种技术如何让传统逆向工程工具束手无策。 读完本文,你将掌握: - MOV混淆技术的核心原理与实现方式 - 混淆前后的代码对比及安全强度分析 - 实际应...

gitblog_00718的博客 301

Hypnos-i1-8B应用落地:高校AI实验室数学建模辅助系统部署全记录

本文介绍了如何在星图GPU平台上自动化部署Hypnos-i1-8B镜像,该8B级开源大模型专注于强推理、思维链(CoT)和数学解题。通过该平台,用户可快速搭建数学建模辅助系统,应用于高校AI实验室的微分方程求解、优化问题等复杂数学推理场景,显著提升科研和教学效率。

weixin_32661831的博客 916

360笔试3/21

Java后端面试内容:思维考察题(C++程序题,Java程序题,数学题)、计网、Linux命令、MySQL、Redis、排序题、Java语言题(Swing GUI工具包、内存优化)、算法

dachunzhangg的博客 1786
上一篇: 【软件构造】8.2 内存性能与垃圾回收
下一篇: 【软件构造】8.4 动态性能分析方法与工具
fndfnd
博客等级 码龄8年 17粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值