BIO输给NIO了吗 —————— 开开开山怪

DuCut_1794120730156_604.mp4 立即下载

在这里插入图片描述能看到这篇博客的人估计已经对BIO和NIO有了一定的了解
采用不同的IO对系统的性能来说影响也是不容小觑的。
下面我们来看普通的BIO的通信方式。

1.阻塞IO(BIO)

1.普通的单线程的通信方式

/*
*采用单个线程进行侦听并且进行事件的处理
*/
public class ServerTest {
  public static void main(String[] args) {
		ServerSocket server;
		boolean goon = true;
		byte[] bytes = new byte[1024];
		
		try {
			server = new ServerSocket(54188);
			while(goon) {		
				Socket socket = server.accept();
				DataInputStream dis = new DataInputStream(socket.getInputStream());
				dis.read(bytes);
				dealMessage(bytes);
				DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
				dos.write(bytes);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
	public static void dealMessage(byte[] value) {
		//TODO
		//处理数据
	}

}

弱点:在不考虑多线程的情况下,BIO无法处理多个客户端的请求,并且会有两处阻塞,accept和read。

2.普通的多线程的通信方式

服务端代码:

public class ServerTest {	
	public static void main(String[] args) {
		ServerSocket server;
		boolean goon = true;
		byte[] bytes = new byte[1024];
		
		try {
			server = new ServerSocket(54188);
			while(goon) {		
				Socket socket = server.accept();
				//侦听到一个链接,利用线程池开启一个线程,进行后续的read 和 write操作
				new ThreadPool().Execute(new Commucation(socket) {
					
					@Override
					public void dealMessage(String message) {
						// TODO 进行数据的处理					
					}
				}); 
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

进行数据的读写类,实现Runnable接口

public abstract class Commucation implements Runnable{
	private Socket socket;
	private DataInputStream dis;
	private DataOutputStream dos;
	private volatile boolean goon;
	
	Commucation(Socket socket) {
		this.socket = socket;
		goon = true;
		try {
			dis = new DataInputStream(socket.getInputStream());
			dos = new DataOutputStream(socket.getOutputStream());
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

	public boolean isGoon() {
		return goon;
	}

	public void sendMessage(String message) {
		try {
			dos.writeUTF(message);
		} catch (IOException e) {
			//TODO
			//进行socket的关闭,和资源的回收
		}
	}
	public abstract void dealMessage(String message);
	

	@Override
	public void run() {
		
		while (goon) {			
			String message = null;
			try {
				message = dis.readUTF();//不管是对端异常掉线还是自己关闭自己都会触发异常
				dealMessage(message);
			} catch (IOException e) {
				//TODO
				//处理异常掉线的问题
				
			}		
		}
	}
}

一般的多线程的方法也是我们采用BIO最常用的一种线程模式,虽然解决了单线程BIO无法处理并发的弱点但问题时,但是每个链接需要独立的线程/进程单独处理,我们知道在创建新线程的时候,每个新线程会消耗系统资源,并且每个线程拥有自己的数据结构栈,消耗系统内存。
并且一个线程阻塞的时候,jvm会保存其状态,并且在上下文切换时恢复阻塞线程的状态,随着线程数的增加,会导致系统花费更多的时间来处理上下文的切换和线程的管理,更少的时间来处理链接服务。
上例虽然采用了线程池的方式,其优点是可以将线程重复利用,缺点是如果创建的线程数量较少,客户端可能等待很长的时间才能获取服务,线程池大小经过设置之后,比较固定,不能够进行动态的调整。

对于上边的BIO的阻塞情况,我们可能会采用进一步的方法进行解决就是采用非阻塞的IO,将普通的ServerSocket替换为ServerSocketChannel 将Socket替换为ScoketChannel,并且设置通道为非阻塞模式,采用轮询的方式进行设计。
采用单个线程对轮询表进行轮询。

3.非阻塞IO(NIO)

服务端主线程负责侦听

//采用单个线程记性轮询,侦听到便产生一个socketChannel,加入到轮询表,
public class ServerTest {
	
	public static void main(String[] args) {
		ServerSocketChannel serverSocketChannel;
		boolean goon = true;

		
		try {
			serverSocketChannel= ServerSocketChannel.open();
	        serverSocketChannel.bind(new InetSocketAddress(54188));
	        serverSocketChannel.configureBlocking(false);//设置为非阻塞
	        Handler handler = new Handler();
	        new Thread(handler).start();
	        while(goon) {		
	        	//serverSocketChannel设置了非阻塞模式,当侦听不到链接的时候,也不会进行阻塞
	        	//而是进行循环侦听
				SocketChannel socket = serverSocketChannel.accept();
				handler.addChannels(socket);			 
			}

		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}
}



Handler 进行轮询并且进行数据的处理

public class Handler implements Runnable{
	private List<SocketChannel> socketList;
	private volatile boolean goon;
	private ByteBuffer buffer;
	
	public Handler() {
		socketList = new CopyOnWriteArrayList<SocketChannel>();
		goon = true;
		buffer = ByteBuffer.allocate(1024);
	}
	public void addChannels(SocketChannel socketChannel) {
		try {
			socketChannel.configureBlocking(false);
		} catch (IOException e) {
			e.printStackTrace();
		}
		socketList.add(socketChannel);		
	}

	@Override
	public void run() {
		while(goon) {
			for(SocketChannel one : socketList) {
				try {
					//因为设置了非阻塞模式,通过read进行读取的时候不会阻塞
					//当没有东西可读时返回值为0
					int length = one.read(buffer);
					if(length != 0) {
						dealMessage(buffer);
					}else {
						//表明没有消息传输
					}
					
				} catch (IOException e) {
					e.printStackTrace();
				}				
			}
			
		}
		
	}
	public void dealMessage(ByteBuffer message) {
		//TODO
		//进行数据的处理
		
	}

}

其实我们在使用socket对象的时候,其实socket(套接字)只是一个引用,这个套接字的对象实际上是放在操作系统内核中,当我们采用write进行写入字节数组的时候,是将字节数组拷贝到内核区套接字对象的writeBuffer中,内核网络模块会有单独的线程负责将writeBuffer的数据拷贝到网卡及硬件。

同样,服务器内核的网络模块也会有单独线程不停的将收到的数据拷贝到套接字的readBuffer中,等待用户层来取,最终服务器的用户程序通过socket引用的read方法将readBuffer中的数据拷贝到用户程序内存中。
所以其实对于每次的write和read都会进行一次系统调用。这个系统调用就是判断是否有数据到达,如果到达就将到达的数据拷贝到套接字的buffer中。

优点:每次发起的IO请求能够立即返回,不用阻塞等待,相比之前的两种线程的模式来说,实时性较好,
缺点:虽说比前面的线程设计方案看起来更好,只采用了两个线程完成,但本身依旧存在缺点,轮询的期间,不管是read还是write,虽然不需要急进行阻塞,都要不断的访问内核,比较耗费CPU的资源,系统资源利用率较低,而且当连接数量很大时,轮询的效率比较低。

其实真正的NIO解决方法不会采用代码层的轮询方式,就是采用java代码写一个轮询的方案,而是将轮询部分的代码交给操作系统级别,主动感知socket。那就是采用一个系统的调用方法(select)。

4.IO复用

IO复用指的是应用程序只会阻塞在系统提供的方法select上,当多个通道有可读的情况的时候,select才会返回,应用程序再通过recvfrom进行系统调用进行从内核空间的数据拷贝到用户空间。
在使用的过程中,我们需要将多个SocketChannel注册到selector选择器上,并且为这些通道标记根据什么事件可以触发通道的响应,然后采用select方法进行轮询监测,一旦哪个通道的事件被触发,select即直接返回,我们可以根据selector得到注册在其上并且有数据可读的通道,然后我们通过得到的通道进行数据读取,并且处理。

我们写的Java程序其本质在轮询每个Socket的时候也需要去调用系统函数,那么轮询一次调用一次,会造成不必要的上下文切换开销。
Select会将请求从用户态空间全量复制一份到内核态空间,在内核态空间来判断每个请求是否准备好数据,完全避免频繁的上下文切换。所以效率是比我们直接在应用层写轮询要高的。

简单的Reactor模型举例IO复用

服务器端测试类:

public class serverTest {

	public static void main(String[] args) {
		try {
			new Thread(new Reactor(54188)).start();
		} catch (IOException e) {
			e.printStackTrace();
		}  

	}

}

Reactor类:

public class Reactor implements Runnable{
	final Selector selector;//相当于管理了很多个通道,也管理的侦听的通道。
	final ServerSocketChannel serverSocket;//侦听通道。
	
	public Reactor(int port) throws IOException {
		selector = Selector.open();
		serverSocket = ServerSocketChannel.open();
		serverSocket.socket().bind(new InetSocketAddress(port));
		serverSocket.configureBlocking(false);
		//注册感兴趣的事情。
		SelectionKey sk = serverSocket.register(selector, SelectionKey.OP_ACCEPT);	
		sk.attach(new Acceptor());
		//当serverScoketChannel触发侦听响应的时候,调用Acceptor类中的方法进行侦听链接,并处理
	} 
	
	class Acceptor implements Runnable{//此时的这个Acceptor是特殊的handler

		@Override
		public void run() {
			SocketChannel channel;
			try {
				channel = serverSocket.accept();
				if(channel != null) {
					//表明有客户端的链接
					//创建一个与客户端对应的通道,并将此通道注册到selector上
					new Handler(selector, channel);
					//对于侦听的客户端产生channel,但只是产生一个对象
					//并没有开启线程,并将这个channel注册到选择器上。
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}//侦听链接的客户端,并且生成一个通道
			
		}
		
	}
	public void dispatch(SelectionKey key) {//进行事件的分发的处理
		Runnable handle = (Runnable)key.attachment();
		if(handle != null) {
			handle.run();//进行执行方法;
		}
	}
	@Override
	public void run() {
		//将侦听的channel,和普通的channel都注册到selector上,针对不同的key来进行处理
		while(!Thread.interrupted()) {
			try {
				selector.select();//会进行阻塞等待,知道系统侦听到通道有响应的事件发生。
				Set<SelectionKey> selected = selector.selectedKeys();
				Iterator<SelectionKey> it = selected.iterator();
				System.out.println(selected.size());
				while(it.hasNext()) {
					//通过注册的通道进行,分发,
					//对于侦听来说,就是侦听到一个用户,然后创建通道,
					//对于用户的发送信息来说,就是普通的通道的处理过程
					dispatch(it.next());
					//需要进行遍历过的键进行删除,
					//如果对于侦听的serverSocketChannel来说,selector检测其触发了链接的响应,则会建立对应通道的key,之后通过可以会真正执行accept,
					//如果没有进行删除的话,这个通道的键会保留在key的集合中
					//那么当有别的通道有对应响应事件的时候,就会开始进行key集合的循环处理,那么这时就算serverScoketChannel没有链接的响应事件
					//同样也会去执行accept,多此一举
					it.remove();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}		
		}
	}
}

Handler类:

public class Handler implements Runnable{
	private static final int LENGTH = 64;
	final SocketChannel channel;
	final SelectionKey sk;
	ByteBuffer input = ByteBuffer.allocate(LENGTH);
	ByteBuffer output = ByteBuffer.allocate(LENGTH);
	
	
	public Handler(Selector selector, SocketChannel c) throws IOException {
		channel = c;
		c.configureBlocking(false);
		sk = channel.register(selector, SelectionKey.OP_READ);
		sk.attach(this);
		//相当于给通道绑定一个事件处理的类也就是一个handler的对象,当通道有数据,触发读响应的时候
		//会通过主线程进行dispatch分发,处理事件响应通道中的信息,那么就是执行this中的run方法,进行数据的处理,同样就是handler的功能。
	}
	
	public void dealMessage() {
	 //TODO
	//对缓冲区的的数据进行处理
    //这里对消息一个简单的输出
		System.out.println(new String(input.array()));	
		byte[] bytes = "欢迎你客户端".getBytes();
		output = ByteBuffer.wrap(bytes);
		sk.interestOps(SelectionKey.OP_WRITE);
		return;
	}

	@Override
	public void run() {
		try {
			if(sk.isReadable()) {
				read();
			}
			if(sk.isValid() && sk.isWritable()){
				send();
			}
		
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	private void read() throws IOException{//对于读写来说是先读后写,
		try {
			int length = channel.read(input);
			if(length < 0) {
				channel.close();
			}else {
			    dealMessage();
			}
		} catch (IOException e) {
			channel.close();
		}		
	}
	private void send() throws IOException {
		
		channel.write(output);
		if(!output.hasRemaining()) {
			sk.interestOps(SelectionKey.OP_READ);
		}
	}
}

客户端测试类:

public class ClientDemo {
	private static final String SERVER = "127.0.0.1";
	private static final int PORT = 54188;
	private static final int LENGTH = 64;
	
	public static void main(String[] args) throws IOException {
		byte[] argument = "你好,服务端".getBytes();	
		SocketChannel scoketChannels = SocketChannel.open();
		scoketChannels.configureBlocking(false);
		
		if(!scoketChannels.connect(new InetSocketAddress(SERVER, PORT))) {
			while(!scoketChannels.finishConnect()) {
				
				System.out.println("等待中链接中....");
			}	
		}
		ByteBuffer writeBuffer = ByteBuffer.wrap(argument);//将数组包装在缓冲区中
		ByteBuffer readBuffer = ByteBuffer.allocate(LENGTH);//分配一个新的字节缓冲区
		int readed = -1;

		
		while(readed <= 0) {
			if(writeBuffer.hasRemaining()) {//判断缓冲区中是否拥有可发送的字节				
				scoketChannels.write(writeBuffer);				
			}
			//当没有接受到数据的时候返回值为0
			readed = scoketChannels.read(readBuffer);
		}
	
		System.out.println("Received : " + new String(readBuffer.array()));
		scoketChannels.close();
	}
}

和阻塞IO相比,都需要阻塞等待,但是IO复用,同时关注了多个socketChannel,节省了线程的开销,和非阻塞IO来对比的话,因为非阻塞IO采用的是代码层面的的轮询,所有对于每个通道来说都需要进行read判断,每一轮的轮询中的每一个通道都会都会进行一次系统调用,可能存在很多通道没有数据可读,同样也需要进行系统调用。
对于IO复用来说,通过select内部轮询的方式,我们只需要对注册在selector上的有数据可读的通道进行read操作真正的读取数据,而不用每个通道都进行读取。

其实上例是简单的Reactor模型,应用了IO复用,可以基于一个阻塞对象,同时在多个事件描述上等待就绪,而不是使用多个线程,这样可以大大节省系统资源。

此博文只是一个简单的开头,之后会继续进行学习NIO和AIO,并进行总结写出。

【教育信息化】基于Java+Vue的微证书可信验证系统设计:职业技能成果数字化管理与防伪溯源 项目介绍 基于java+vue的职业技能微证书颁发与可信验证系统设计与实现(含模型描述及部分示例代码) 内容概要:本文介绍了一个基于Java和Vue的职业技能微证书颁发与可信验证系统的设计与实现,旨在解决传统职业证书管理中存在的信息分散、验证困难、易篡改、互认难等问题。系统通过构建统一的微证书业务管理体系,采用SHA-256摘要算法和RSA数字签名技术保障证书内容完整性与签发主体可信性,并结合二维码实现便捷的社会化验证。平台涵盖证书全生命周期管理,支持学习成果积累、能力画像构建及跨机构成果互认,具备完整的前后端分离架构与安全机制,适用于教育、培训与企业人力资源场景。; 适合人群:具备Java与Vue开发基础的软件工程师、高校计算机相关专业学生、职业教育信息化研究人员以及企业HR技术平台开发者。; 使用场景及目标:①实现职业技能微证书的数字化签发与防伪验证;②构建学习者个人能力档案,支持岗位匹配与人才评价;③推动教育机构、行业协会与企业间的技能成果互认与数据共享;④作为毕业设计或企业级认证平台的技术参考原型。; 阅读建议:此资源包含系统模型描述与核心代码示例,建议结合Spring Boot、MyBatis-Plus、JWT、Redis等技术栈进行实践,重点关注证书摘要生成、数字签名验证、权限控制与数据安全设计,并可通过提供的数据生成代码模拟真实业务场景进行测试。 立即下载

相关推荐

结合混合A全局规划与MPC-iLQR执行器噪声和模型不匹配(MATLAB)的差动驱动机器人导航。.zip

1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

服务发现框架 —————— 开开开山怪

想必看到这篇博客,一定对服务发现机制有一定的了解。 服务发现机制

String_guai 500

CPU进程调度可视化含源码

这是一份操作系统课程设计,用Python实现的CPU进程调度模拟器,覆盖先来先服务、短作业优先、时间片轮转、优先级调度四种算法,配甘特图可视化和指标对比。交付物包含实验报告的Markdown、HTML、PDF三件套,汇报PPT,完整Python源码,以及六张运行截图,装好依赖后运行主文件即可打开图形界面。 内容主线围绕四种调度算法展开:在左侧面板录入进程名、到达时间、服务时间和优先级,也可以随机生成一批进程;右侧选择算法并设置时间片参数,点击调度后甘特图按时间比例画出每个CPU运行片段的色带,空闲时段以灰色标注;表格逐进程列出完成时间、周转时间、带权周转时间和等待时间,并汇总三项平均值。点击对比按钮会弹出柱状图窗口,并排展示四种算法的平均周转与平均带权周转,最优算法的柱子以橙色高亮;结果可导出为CSV文件,编码带BOM保证Excel直接打开不乱码。 亮点在于调度逻辑与界面展示完全解耦:算法层只负责按规则挑下一个进程并维护就绪队列,界面层只负责渲染甘特图和指标表,中间靠数据类传递结果。想新增一种调度算法只需在算法文件里加函数并登记,界面代码无需改动。输入处理做了完整防护,到达时间为负、服务时间小于1、优先级超出范围、时间片非法等情况都会弹窗说明原因并拒绝提交,不会让程序崩溃。整个项目除matplotlib外全部使用标准库,离线环境装好Python即可运行,启动自带六个预置演示进程。 适合操作系统课程需要做课程设计的计算机相关专业学生,也适合想通过可视化方式理解四种调度算法差异的自学者。安装好matplotlib依赖后运行入口文件即可打开主窗口,自带演示数据可直接查看甘特图和指标;也可自行修改进程参数和时间片大小,对比不同算法下平均周转时间的变化。

采用JDBC解释java SPI机制和线程上下文类加载器 —————— 开开开山怪

采用JDBC解释java SPI机制和线程上下文类加载器 先说说SPI(Service Provider Interface),大部分解释是这样的,我简单总结一下就是这样,SPI机制可以做到将服务接口和和真正的服务接口的实现类分开,可以增加程序的可扩展性,通过扫描规定的路径来进行实现类的获取,可以说是一种服务发现机制。 好处就在于,在面向对象的设计中,我们一般建议基于接口的编程,如果代码中涉及到...

String_guai 600

基于.NET8开发,是一套开源、免费、跨平台、企业级在线考试软件,支持x64、x86、Arm64芯片架构的windows和linux操作系统,支持人大金仓、达梦、OceanBase数据库 等数据库

星期八在线考试系统,基于.NET8开发,是一套开源、免费、跨平台、企业级在线考试软件,支持x64、x86、Arm64芯片架构的windows和linux操作系统,支持人大金仓、达梦、OceanBase数据库 及 MySql、SqlServer、PostgreSql、SQLite 等数据库。

中国技术大败局TBL-20261107-238深度解剖报告V2.2 决策迭代版【汽车热管理】基于车速的空调内外循环控制装置:公知技术组合型伪创新专利失效分析

中国技术大败局TBL-20261107-238深度解剖报告V2.2 决策迭代版内容概要:本报告对奇瑞汽车股份有限公司申请的“一种汽车空调内外循环的控制装置及其控制方法”(专利号CN201010100392.0)进行了深度技术解剖与专利失效分析。该专利旨在通过车速信号自动切换空调内外循环,实现低速内循环防尾气、高速外循环引入新风的功能。然而,其技术方案被判定为“控制逻辑型伪创新”,核心逻辑“车速信号→阈值比较→内外循环切换”属于公知技术的常规组合,未提出新的空气质量预测模型、多源信息融合算法或预料不到的技术效果,因而不具备创造性,最终被驳回。报告指出,该专利与奇瑞多项同类专利(如184、186、207、228、231、237号)共同构成“公知信号/逻辑→公知执行器”的系统性低质量专利布局,反映出企业在技术创新路径上的重复性投入与创造性缺失。; 适合人群:企业知识产权负责人(IPR)、研发总监/CTO、投资尽调人员、专利代理机构从业者及技术研发团队。; 使用场景及目标:①识别“公知技术常规组合”类专利的创造性风险,避免无效研发投入;②指导高价值专利撰写,强调多源信息融合、动态优化模型与实证数据支撑;③为投资机构提供技术资产估值与风险甄别依据,区分低壁垒“信号替换”与高壁垒“算法创新”。; 阅读建议:此报告适用于研发与知识产权战略复盘,建议结合模块七“行业启示”与模块八“产业链坐标定位”进行系统性反思,重点关注“判距差”指标与“死海区”定位,推动企业从“功能实现”转向“模型创新”的研发范式升级。

文本文件与二进制文件区别 r 与 rb 方式 w 与 wb方式(windows)—————— 开开开山怪

文件属于外存的范畴: 其实不管是文本文件还是二进制的文件,其本质都是以二进制的方式进行存储的,只是解释的方式不同罢了,文本文件是将原本的二进制解释称文本文件的方式(也就是ASCII的方式),而二进制就是存储的时候什么样子,打开就是什么样子。 1. &amp;lt; w 和 wb方式打开文件并进行写的操作的区别&amp;gt; 最常听到回答就是: r 是以文本文件的方式打开并且是只读方式打开 rb 是以二进制的凡...

String_guai 3699

北师大版英语词汇助手练习版-win10-不适用win7

最适合白板下的英语词汇PK工具 【百度网盘APP】北师大版英语词汇助手win10,11版本 3MB 链接:https://pan.baidu.com/s/1VO6vXt-ICCh-kAPstX8LcA  提取码:chen 【百度网盘】北师大版英语词汇助手 win 7,8,10,11可通用 60MB 链接:https://pan.baidu.com/s/15z5YN5GvvAZERqhitQcu1g  提取码:chen

Google中Gson的巧妙使用 —————— 开开开山怪

这篇相当于是一个分发器中的一个内容补充,但是同时也真正巧妙的使用了Gson这个强大的类。 首先说说这个Gson的类,类中的一个方法 toJson()可以将一个任意类型转化为字符串。 并且还有另一个方法gson.fromJson(para, type),可以将一个字符串通过给出的类型转化成一个实例。 这对于我们分发器中参数content的包装和解析非常实用 ...

String_guai 401

改进差分进化算法及其求解柔性作业车间调度问题(Python代码实现)

内容概要:本文系统探讨了改进差分进化算法在求解柔性作业车间调度问题中的应用,并结合Python代码实现,展示了该算法相较于传统方法在全局搜索能力和收敛速度方面的优势。研究不仅聚焦于算法本身的改进策略,如变异、交叉和选择操作的优化,还深入分析了其在复杂制造环境中应对多目标、多约束调度问题的有效性。文中通过标准测试实例验证了算法性能,并与其他智能优化算法进行了对比分析,体现了其在实际工程应用中的潜力。此外,文档还关联了多无人机路径规划、电力系统状态估计、微电网优化、图像与信号处理等多个前沿技术领域,展现了智能优化算法在跨学科工程仿真与决策支持中的广泛适用性。; 适合人群:具备一定编程基础和工程背景,从事智能制造、自动化、工业工程、电气工程、控制科学与工程、计算机科学及相关领域的科研人员、高校研究生及企业研发技术人员。; 使用场景及目标:①为科研工作者提供可复现的智能优化算法代码框架,支持柔性作业车间调度、多无人机协同路径规划、电力系统优化等复杂工程问题的建模仿真;②辅助完成学术论文复现、课程设计、毕业设计或科研项目开发;③推动智能算法在生产调度、能源管理、交通规划等实际场景中的落地应用。; 阅读建议:建议读者结合文中提供的算法原理与代码实现,动手调试并验证不同参数设置对优化结果的影响,同时可参考荔枝科研社提供的完整资源包进行扩展学习与实践,以加深对算法机制与工程应用的理解。

复现基于改进秃鹰算法的微电网群经济优化调度研究(Matlab代码实现)

内容概要:本文聚焦于“基于改进秃鹰算法的微电网群经济优化调度”研究,提出一种改进的秃鹰优化算法(IBOA)以解决传统智能优化算法在求解过程中易陷入局部最优、收敛速度慢等问题。通过引入自适应权重、动态搜索机制及种群多样性保持策略,显著增强了算法的全局搜索能力和收敛精度。研究构建了包含光伏发电、风力发电、储能系统、可控负荷及电网交互的微电网群多主体协同调度模型,以系统综合运行成本最小化为目标函数,综合考虑功率平衡、设备出力能力、储能荷电状态、爬坡速率等多种实际约束条件。利用Matlab平台进行仿真验证,并与标准BOA、PSO、GA等经典智能算法进行对比,结果表明所提算法在降低系统运行成本、提高可再生能源消纳率及优化调度效率方面具有明显优势。; 适合人群:适用于具备电力系统基础、优化理论知识及Matlab编程能力的高校研究生、科研人员及从事微电网、综合能源系统优化调度相关工作的工程技术人员。; 使用场景及目标:①用于微电网群或多微网系统的经济调度建模与仿真;②开展新型智能优化算法的设计、改进与性能评估;③支撑含高比例可再生能源的配电系统优化运行决策; 阅读建议:建议结合提供的Matlab代码深入理解算法实现细节与调度模型构建过程,重点分析改进策略对优化性能的影响,并可通过替换场景参数或引入其他算法进行横向对比实验,进一步掌握智能优化在能源系统中的应用方法。【复现】基于改进秃鹰算法的微电网群经济优化调度研究(Matlab代码实现)

Netty | Netty 概述 一起来了解了解Netty

本文主要讲述Netty相关概念及为什么会出现Netty,Netty的作用有哪些等?以及学习Netty需要什么。 前言: 我其实更好奇的是:你是因为什么点进了这篇博客,是想要了解Netty;或者是因为自己本心中的好奇心;亦或者是业务场景中需要用Java网络编程,然后百度搜索,搜到了Netty。 如果你想要了解,这篇文章我想是适合你的。如果你是想要满足自己的好奇心,想要深究一番的,那么这篇就是Netty的开山篇。如果是业务中需要用到Netty框架,并且已经有了好的基础,我想可以直接跳过这一篇,直接进入实战加.

北 831

改进-基于新扩展移相角下的双有源桥DAB变换器仿真(EPS调制、软开关、最小应力优化)(Simulink仿真实现)

内容概要:本文系统阐述了基于新扩展移相角的双有源桥(DAB)DC-DC变换器的先进仿真研究,聚焦于EPS调制策略、软开关技术实现及最小应力优化控制目标的协同设计。通过Matlab/Simulink平台构建双闭环控制系统模型,深入剖析变换器在高频隔离、双向功率传输场景下的动态响应特性与效率优化机制。该仿真方案复现了顶级EI期刊研究成果,具备高学术参考价值,并集成于一套完整的电力电子与新能源系统仿真资源体系中,涵盖微电网、PWM整流器、LLC谐振变换器、储能管理等多个关键技术方向,配套完整的仿真代码、设计文档与理论资料,支持深度学习与二次开发; 适合人群:面向电力电子、电气工程及其自动化、新能源科学与工程等领域的研究生、科研人员以及从事高性能DC-DC变换器研发的工程师,要求具备扎实的电路理论基础、电力电子拓扑分析能力及一定的Matlab/Simulink仿真实践经验; 使用场景及目标:①深入掌握DAB变换器的核心工作原理及其在EPS调制与软开关协同下的最优控制策略;②支撑高水平科研论文的复现、改进与创新性研究;③服务于硕士课题、博士研究或企业级新能源变换器产品的前期验证与算法开发; 阅读建议:建议结合文中提供的Simulink模型与引用的权威文献进行系统学习,重点理解控制架构设计、参数整定方法与优化算法实现路径,同时可横向对比其他电力电子变换器案例,拓展系统级工程思维与科研创新能力。

(Multisim课设资料)最全面函数信号发生器(三角波+正弦波+方波信号+锯齿波仿真设计+报告文档

内容概要:本文档是一份基于Multisim平台的函数信号发生器综合性课程设计资料,系统地实现了三角波、正弦波、方波及锯齿波等多种标准波形的电路仿真设计,配套完整的仿真模型与课程报告。内容围绕模拟电子技术核心,详细阐述各类波形生成电路的工作原理、关键元器件选型、参数计算、模块化电路搭建以及Multisim环境下的仿真验证流程。同时,资料还整合了直流稳压电源、开关电源、滤波器设计等相关电子系统案例,体现出较强的综合实践性与工程应用价值,适用于电子类课程设计的全流程参考。; 适合人群:电子工程、自动化、电气工程及其自动化等专业的本科或研究生,具备电路分析、模拟电子技术基础知识,正在开展课程设计、仿真实验或毕业设计的学生。; 使用场景及目标:①完成“模拟电子技术”“电子线路设计”等课程设计任务;②掌握Multisim软件在波形发生器设计中的实际应用技能;③深入理解多波形信号发生器的电路拓扑结构与工作机理,提升电路仿真、系统调试与技术文档撰写能力。; 阅读建议:建议结合Multisim软件进行同步仿真操作,按照文档中的电路图逐步搭建并调试各子模块,重点关注波形转换的实现条件与参数匹配关系,同时参考配套报告规范撰写自身设计成果,强化理论与实践的融合。

【储能选址定容】基于多目标粒子群算法的配电网储能选址定容(Matlab代码实现)

内容概要:本文提出了一种基于多目标粒子群优化算法(MOPSO)的配电网储能系统选址定容方法,并配套提供了完整的Matlab代码实现。该方法针对配电网中储能装置的最优位置选择与容量配置问题,构建了一个综合考虑网损最小化、电压偏差改善和投资成本降低的多目标优化模型,采用MOPSO算法进行高效求解,最终获得一组Pareto最优解集,为决策者提供多样化的布局方案选择。研究以标准IEEE 33节点配电系统为算例进行仿真验证,结果表明该方法能够有效协调多个相互冲突的目标,显著提升配电网的经济性、稳定性和供电质量,具有良好的工程应用前景。; 适合人群:适用于电气工程、电力系统及其自动化等相关领域的研究生、科研人员以及从事配电网规划、储能系统设计的工程技术人员;尤其适合具备一定Matlab编程能力并熟悉智能优化算法基本原理的学习者。; 使用场景及目标:①应用于实际配电网中储能系统的科学规划与优化设计,提高系统运行效率与可靠性;②作为多目标智能优化算法在电力系统中应用的教学案例,深入理解MOPSO算法的实现机制及其在复杂工程问题中的建模思路;③支撑学术论文撰写、科研项目申报或课程设计中的算法复现、性能测试与对比分析工作。; 阅读建议:建议读者结合IEEE 33节点系统拓扑结构图与所提供的Matlab代码同步调试,重点掌握目标函数的设计、约束条件的处理以及Pareto前沿的生成过程,进一步可尝试与其他多目标算法(如NSGA-II)进行性能对比,深化对算法特性的理解与应用能力。

基于变频控制的多相交错LLC谐振变换器闭环仿真(Simulink仿真实现)

内容概要:本文档聚焦于电力电子与控制系统领域的仿真研究,核心内容为“基于变频控制的多相交错LLC谐振变换器闭环仿真”的Simulink实现。系统阐述了LLC谐振变换器的开环与闭环控制策略、软开关技术、恒压恒流双竞争控制机制、多相交错结构设计及变频调制原理,通过建模仿真深入剖析高频DC-DC变换器的工作特性与动态响应。文档整合了丰富的科研资源,涵盖双向CLLC、DAB变换器、PWM整流器、微电网优化调度、状态估计(EKF/UKF/PF)等多个前沿方向的仿真案例,形成一个体系完整、技术覆盖面广的综合性技术资料库,适用于高水平科研与工程实践。; 适合人群:电气工程、自动化、电力电子及相关专业的研究生、高校科研人员,以及从事新能源发电、电动汽车、智能电网、工业电源等领域的技术研发工程师。; 使用场景及目标:①开展高频谐振变换器拓扑结构与先进控制策略的深入研究;②完成复杂电力电子系统的建模、仿真与性能验证;③支撑SCI/EI论文撰写、科研项目申报与关键技术攻关;④辅助高校课程设计、研究生课题实践与毕业设计的仿真实验环节。; 阅读建议:建议结合文中提供的网盘资源与微信公众号资料进行系统学习,优先掌握LLC变换器的基本工作模态与谐振原理,再逐步深入闭环控制器设计与参数整定,仿真过程中应重点关注关键波形分析与系统稳定性判据,以全面提升对高频变换器动态特性的理解与工程应用能力。

同步电机的频率稳定性及构网型电力电子变换器研究(Simulink仿真、Matlab代码)

内容概要:本文深入研究同步电机的频率稳定性及其与构网型电力电子变换器的多时间尺度交互机理,系统分析同步电机在电力系统中的频率响应特性,并结合构网型变换器的控制机理,探讨两者在动态过程中的耦合影响。研究基于Simulink搭建详细的系统仿真模型,利用Matlab代码实现控制策略的设计与验证,涵盖系统建模、稳定性判据分析、鲁棒性评估及多工况动态响应仿真,重点考察不同控制参数与运行条件下系统的频率调节能力与协同稳定性,旨在提升高比例电力电子装备接入背景下电力系统的稳定运行水平。; 适合人群:具备电力系统、自动控制或电力电子等相关专业背景,从事新能源并网、微电网控制、电力系统稳定性分析、先进电力电子装置研发等方向的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于高校与科研机构的教学与课题研究,深化对同步机与构网型变换器协同控制机制的理解;②支撑新型电力系统中频率稳定控制策略的设计与仿真验证,助力电网架构优化与高端电力电子设备研发;③为高比例可再生能源并网场景下的系统动态建模、稳定性评估与控制方案制定提供技术参考与仿真工具支持。; 阅读建议:建议结合提供的Simulink仿真模型与Matlab代码进行同步实践操作,细致调试控制参数并观察系统在扰动工况下的动态响应,重点关注频率稳定性的变化规律,鼓励通过修改模型结构或控制策略开展扩展性仿真实验,以深入掌握系统交互机理与控制设计要点。

老司机避坑指南:UC3842自举驱动电路发热严重?这样选C39/C37电容值最稳

本文针对UC3842自举驱动电路发热严重的问题,深入剖析了驱动波形边沿速度与损耗的矛盾根源。通过实测数据与热成像分析,重点阐述了关键电容C39/C37的选型策略,提供了从经验公式到量化计算的优化方法,帮助工程师在发热与效率间找到最佳平衡点,并探讨了分立方案与专用驱动IC的适用场景。

lambda的博客 746
上一篇: 多文件自平衡云传输 (六)番外篇 —————— 开开开山怪
下一篇: 本地缓存-loadingCache
开开开山怪
博客等级 码龄8年 41粉丝 30原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值