【消息序列】详解(6):深入探讨缓冲区管理与流量控制机制

目录

一、概述

1.1. 缓冲区管理的重要性

1.2. 实现方式

1.2.1. HCI_Read_Buffer_Size 命令

1.2.2. HCI_Number_Of_Completed_Packets 事件

1.2.3. HCI_Set_Controller_To_Host_Flow_Control 命令

1.2.4. HCI_Host_Buffer_Size 命令

1.2.5. HCI_Host_Number_Of_Completed_Packets 命令

二、缓冲区管理

2.1. 蓝牙设备初始化与数据传输确认

2.1.1. 读取控制器缓冲区大小

2.1.2. 数据传输与确认

2.1.3. 生成完成数据包事件

2.1.4. 示例代码

2.2. 蓝牙设备初始化与主机流控及数据接收确认

2.2.1. 设置主机流控制

2.2.2. 通知主机缓冲区大小

2.2.3. 数据接收与确认

2.2.4. 示例代码

三、流量控制

3.1. 流量控制的工作原理

3.1.1. 缓冲区状态监控

3.1.2. 流量控制信号

3.1.3. 动态调整速率

3.2. 流量控制的作用和意义

四、总结


在资源受限的设备中,有效管理缓冲区至关重要。缓冲区作为数据传输的临时存储区域,其管理效率直接影响数据传输速度和设备整体性能。通过优化缓冲区分配策略,如动态调整缓冲区大小、采用先进先出(FIFO)等策略,可以提高数据处理的实时性和吞吐量。同时,避免缓冲区溢出和欠载也是关键,这要求设备能实时监控缓冲区状态,并根据实际情况进行动态调整。有效管理缓冲区不仅能提升数据传输效率,还能确保设备在资源有限的情况下保持最佳性能。

一、概述

1.1. 缓冲区管理的重要性

对于资源有限的设备(resource limited devices),如一些小型的物联网设备、嵌入式设备或者早期的移动设备等,它们的存储容量、处理能力等资源相对较少。在这种情况下,缓冲区管理显得尤为重要。缓冲区是内存中用于临时存储数据的区域,有效的缓冲区管理可以确保数据在传输过程中不会丢失,同时最大限度地利用有限的设备资源。不合理的缓冲区管理可能会导致资源的浪费或者数据传输错误。例如,如果缓冲区设置得过大,会占用过多本来就有限的内存资源;如果设置得过小,又可能无法有效地缓冲数据,导致数据丢失或者频繁地进行数据重传,这会消耗额外的能量和带宽等资源。

1.2. 实现方式

在蓝牙技术中,缓冲区管理可以通过主机控制器接口(HCI)的一系列命令和事件来实现。这些命令和事件允许主机和控制器之间协调数据的传输和接收。

1.2.1. HCI_Read_Buffer_Size 命令

  • 这个命令用于读取主机控制器(Host Controller)中的缓冲区大小。在设备初始化或者数据传输开始之前,通过这个命令获取缓冲区大小的信息是很关键的。
  • 例如,设备可以根据读取到的缓冲区大小来决定每次发送多少数据量是合适的。如果缓冲区大小为 1024 字节,发送端可能会将数据分成大小合适的数据包,避免一次性发送过多数据导致缓冲区溢出。

1.2.2. HCI_Number_Of_Completed_Packets 事件

  • 当一个 HCI(Host - Controller Interface)数据包成功传输到远程设备(remote device),并且收到了基带(Baseband)的确认信息后,就会产生这个事件。这一事件可以让主机(Host)了解到数据传输的完成情况,并根据需要调整发送速率。
  • 例如,在蓝牙通信中,当手机(作为主机)向蓝牙耳机(远程设备)发送音频数据包后,一旦蓝牙耳机确认收到数据包,手机就会收到这个事件通知。主机可以利用这个事件来跟踪数据传输的进度,进而调整后续的数据发送策略,比如根据已完成数据包的数量和时间间隔来决定是否需要加快或减慢数据发送速度。

1.2.3. HCI_Set_Controller_To_Host_Flow_Control 命令

  • 该命令用于设置从控制器到主机方向的流量控制。在数据从控制器传输到主机的过程中,通过启用流量控制,主机可以限制控制器发送数据的速率,从而防止数据过载并优化资源利用。
  • 例如,如果主机的处理能力有限,无法快速处理从控制器接收的数据,可以使用这个命令来限制控制器的数据发送速度,以避免主机的缓冲区溢出。这就像是在一条数据 “河流” 上安装了一个 “水闸”,可以根据主机的实际情况控制数据流入主机的速度。

1.2.4. HCI_Host_Buffer_Size 命令

  • 主机通过这个命令向控制器通知自己的缓冲区大小。这样控制器就能够了解主机的接收能力,从而合理地发送数据。
  • 例如,主机可以告诉控制器自己的缓冲区还剩下多少空间可以接收新的数据,控制器就可以根据这个信息来决定发送多少数据以及何时发送。这就好比主机告诉控制器自己的 “仓库” 还有多少空位可以存放货物(数据),让控制器能够合理安排 “发货”(发送数据)。

1.2.5. HCI_Host_Number_Of_Completed_Packets 命令

  • 当控制器从远程设备接收到数据包并向主机发送一个 HCI 数据包后,主机需要发送这个命令来确认收到,并允许控制器根据需要调整其发送策略。这一确认过程对于维持数据传输的连贯性非常重要。
  • 例如,它可以让控制器知道主机已经成功接收了数据包,从而可以继续发送下一个数据包。就像在一个快递流程中,收件人(主机)签收(发送确认命令)后,快递员(控制器)才知道包裹已经安全送达,可以继续派送下一个包裹。

这些HCI命令和事件共同构成了蓝牙技术中缓冲区管理和流量控制的基础。它们允许主机和控制器之间有效地协调数据传输,确保在资源受限的设备中实现高效、可靠的数据通信。

二、缓冲区管理

2.1. 蓝牙设备初始化与数据传输确认

在蓝牙设备的初始化阶段,主机(Host)会执行一系列关键操作以确保与控制器(Controller)之间的有效通信。其中,读取控制器可用的缓冲区大小是至关重要的一步。具体步骤如下

2.1.1. 读取控制器缓冲区大小

  • 在初始化过程中,主机通过发送特定的命令(如HCI_Read_Buffer_Size)来查询控制器当前可用的缓冲区大小。
  • 控制器接收到此命令后,会返回其缓冲区容量的信息,这有助于主机在后续的数据传输过程中做出合理的决策。

2.1.2. 数据传输与确认

  • 初始化完成后,主机开始通过控制器向远程设备发送HCI数据包。
  • 当数据包成功传输到远程设备后,远程设备的基带层会发送一个确认信号(acknowledgment)给控制器,表示数据已成功接收。

2.1.3. 生成完成数据包事件

  • 控制器在接收到基带层的确认信号后,会生成一个HCI_Number_Of_Completed_Packets事件。
  • 这个事件包含了已成功传输的数据包的数量,以及可能的其他相关信息。
  • 主机通过监听这个事件,可以实时了解数据传输的进度和状态。

在蓝牙设备的初始化阶段,主机通过读取控制器的缓冲区大小来为后续的数据传输做准备。当数据包成功传输到远程设备并收到确认信号后,控制器会生成一个事件来通知主机已完成的数据包数量。这一机制确保了主机能够实时跟踪数据传输的进度,并根据需要调整传输策略。

2.1.4. 示例代码

以下是一个简化的代码示例,用于模拟上述蓝牙通信流程中的关键步骤。请注意,此示例并未涵盖所有实际的蓝牙通信细节和错误处理机制,而是聚焦于展示初始化、数据传输确认以及完成数据包事件生成的基本流程。

#include <stdio.h>
#include <stdbool.h>// 假设的结构体,用于模拟控制器和HCI数据包
typedef struct {int bufferSize; // 缓冲区大小
} Controller;typedef struct {int packetId; // 数据包标识符// 其他数据包字段...
} HCI_Packet;// 模拟读取控制器缓冲区大小的函数
void HCI_Read_Buffer_Size(Controller* controller) {// 在实际应用中,此函数会向控制器发送命令并接收响应// 这里我们直接设置缓冲区大小为示例值controller->bufferSize = 1024; // 假设缓冲区大小为1024字节printf("Controller buffer size: %d bytes\n", controller->bufferSize);
}// 模拟数据传输的函数
bool Send_HCI_Packet(Controller* controller, HCI_Packet* packet) {// 在实际应用中,此函数会通过控制器向远程设备发送数据包// 并等待基带层的确认信号// 这里我们直接模拟成功传输printf("Sending HCI packet with ID: %d\n", packet->packetId);// 假设基带层已发送确认信号return true;
}// 模拟生成完成数据包事件的函数
void Generate_Completed_Packets_Event(int numberOfCompletedPackets) {// 在实际应用中,此函数会根据控制器的内部状态生成事件// 并通知主机printf("Generated HCI_Number_Of_Completed_Packets event with %d completed packets\n", numberOfCompletedPackets);
}int main() {Controller controller;HCI_Packet packet;// 初始化HCI_Read_Buffer_Size(&controller);// 准备数据包packet.packetId = 1; // 为数据包设置标识符// 发送数据包并等待确认if (Send_HCI_Packet(&controller, &packet)) {// 假设我们发送了一个数据包,并收到确认Generate_Completed_Packets_Event(1); // 生成完成数据包事件}return 0;
}

在这个示例中,我们定义了ControllerHCI_Packet结构体来模拟控制器和数据包。HCI_Read_Buffer_Size函数模拟了读取控制器缓冲区大小的过程,Send_HCI_Packet函数模拟了数据包的发送和确认过程,而Generate_Completed_Packets_Event函数则模拟了生成完成数据包事件的过程。

请注意,这个示例代码仅用于教学目的,并未涵盖蓝牙通信中的复杂性和细节。在实际应用中,需要使用蓝牙协议栈提供的API来实现这些功能,并处理各种可能的错误和异常情况。

2.2. 蓝牙设备初始化与主机流控及数据接收确认

在蓝牙设备的初始化阶段,除了配置控制器和读取缓冲区大小外,主机还需要通知控制器使用主机流控制,并告知主机可用的缓冲区大小。这一步骤对于确保数据在主机和控制器之间的高效、有序传输至关重要。具体步骤

2.2.1. 设置主机流控制

  • 在初始化过程中,主机通过发送特定的命令(HCI_Set_Controller_To_Host_命令)来通知控制器,主机将使用流控制机制来管理数据的接收。
  • 流控制机制允许主机在控制器发送数据之前,通过某种方式(如发送一个允许发送数据的信号)来限制数据的传输速率,从而防止主机缓冲区溢出。

2.2.2. 通知主机缓冲区大小

  • 主机在通知控制器使用流控制的同时,还会告知控制器主机当前可用的缓冲区大小。
  • 这有助于控制器在发送数据之前评估是否有足够的空间来存储即将发送的数据包,从而避免数据丢失或传输错误。
  • 就好比主机告诉控制器自己有多大的 “仓库容量”,让控制器心里有数,避免发送过多数据而 “撑爆” 主机的缓冲区,或者发送数据过少而影响整体的数据传输效率。

2.2.3. 数据接收与确认

  • 当控制器从远程设备(remote device)接收到一个数据数据包后,它会将这些数据包封装成HCI数据包,并发送给主机。
  • 主机在接收到这些数据包后,需要通过发送HCI_Host_Number_Of_Completed_Packets命令来确认数据的接收。这个命令通常包含了一个或多个已接收并成功处理的数据包的数量,以及可能的其他相关信息(如数据包的句柄或标识符)。
  • 这一确认操作有着重要意义,它相当于给控制器一个反馈信号,让控制器明确知晓主机已经成功接收到了相应的数据。只有这样,控制器才能放心地继续接收下一个来自远程设备的数据,并按照既定的规则和流程向主机发送后续的数据包,确保整个数据接收流程能够有条不紊地持续进行下去。如果没有这个确认环节,控制器就无法确定主机是否真正接收到了数据,可能会出现重复发送数据包或者暂停发送数据等影响数据传输效率和准确性的情况。

在蓝牙设备的初始化阶段,主机通过配置控制器来使用主机流控制,并通知控制器主机可用的缓冲区大小。当控制器从远程设备接收到数据包并发送给主机后,主机通过发送确认命令来反馈数据的接收情况。这一机制确保了数据在主机和控制器之间的有序传输,并防止了数据丢失或缓冲区溢出的问题。

2.2.4. 示例代码

以下是一个简化代码示例,旨在模拟设置主机流控制、通知主机缓冲区大小以及数据接收与确认。请注意,此示例并未涵盖所有实际的蓝牙通信细节和错误处理机制,而是专注于展示核心流程。

#include <stdio.h>
#include <stdbool.h>// 假设的结构体,用于模拟控制器、主机和数据包
typedef struct {bool flowControlEnabled; // 流控制是否启用int hostBufferSize;      // 主机缓冲区大小
} Controller;typedef struct {int packetId; // 数据包标识符// 其他数据包字段...
} HCI_Packet;// 模拟设置主机流控制的函数
void HCI_Set_Controller_To_Host_Flow_Control(Controller* controller, bool enable) {controller->flowControlEnabled = enable;printf("Host flow control set to: %s\n", enable ? "enabled" : "disabled");
}// 模拟通知控制器主机缓冲区大小的函数
void Notify_Controller_Host_Buffer_Size(Controller* controller, int bufferSize) {controller->hostBufferSize = bufferSize;printf("Notified controller of host buffer size: %d bytes\n", bufferSize);
}// 模拟控制器发送数据包给主机的函数
bool Send_Packet_To_Host(Controller* controller, HCI_Packet* packet) {// 在实际应用中,此函数会检查流控制和缓冲区大小// 这里我们直接模拟成功发送if (controller->flowControlEnabled && controller->hostBufferSize > 0) {printf("Sending packet with ID: %d to host\n", packet->packetId);// 假设发送后缓冲区大小减少controller->hostBufferSize -= sizeof(HCI_Packet); // 简化处理,实际应考虑数据包真实大小return true;} else {printf("Failed to send packet due to flow control or buffer size constraints\n");return false;}
}// 模拟主机确认接收数据包的函数
void HCI_Host_Confirm_Received_Packets(int numberOfPackets) {printf("Host confirmed receipt of %d packets\n", numberOfPackets);// 在实际应用中,此函数可能会向控制器发送确认信号
}int main() {Controller controller;HCI_Packet packet;// 初始化HCI_Set_Controller_To_Host_Flow_Control(&controller, true);Notify_Controller_Host_Buffer_Size(&controller, 1024); // 假设主机缓冲区大小为1024字节// 准备数据包packet.packetId = 1; // 为数据包设置标识符// 发送数据包并等待确认(模拟)if (Send_Packet_To_Host(&controller, &packet)) {// 假设我们发送了一个数据包,并收到主机的确认HCI_Host_Confirm_Received_Packets(1); // 确认接收数据包// 在实际应用中,这里可能需要更新控制器的内部状态// 例如,增加可用缓冲区大小或更新数据包计数器}// 注意:此示例未涵盖所有错误处理和恢复机制// 在实际应用中,需要添加适当的错误检查和恢复代码return 0;
}

 在这个示例中,我们定义了ControllerHCI_Packet结构体来模拟控制器和数据包。HCI_Set_Controller_To_Host_Flow_Control函数模拟了设置主机流控制的过程,Notify_Controller_Host_Buffer_Size函数模拟了通知控制器主机缓冲区大小的过程,Send_Packet_To_Host函数模拟了控制器发送数据包给主机的过程(并检查了流控制和缓冲区大小),而HCI_Host_Confirm_Received_Packets函数则模拟了主机确认接收数据包的过程。

请注意,这个示例代码仅用于教学目的,并未涵盖蓝牙通信中的复杂性和细节。在实际应用中,需要使用蓝牙协议栈提供的API来实现这些功能,并处理各种可能的错误和异常情况。 

三、流量控制

流量控制机制是蓝牙通信中一个重要的组成部分,它确保了数据在主机和控制器之间能够高效、有序地传输,而不会导致过载或数据丢失。通过动态地调整数据传输的速率,流量控制机制能够适应网络条件和设备资源的变化,从而保持数据传输的稳定性和可靠性。

3.1. 流量控制的工作原理

在蓝牙通信中,流量控制机制通常依赖于主机和控制器之间的协作。以下是流量控制的一些基本原理:

3.1.1. 缓冲区状态监控

  • 主机和控制器都会监控各自缓冲区的状态,包括缓冲区的大小、已使用空间和剩余空间等。
  • 当缓冲区满或接近满时,表明接收端可能无法及时处理更多的数据,此时需要限制数据的传输速率。
  • 相反,当缓冲区有空闲空间时,表明接收端有能力处理更多的数据,此时可以增加数据的传输速率。

3.1.2. 流量控制信号

  • 为了实现流量控制,主机和控制器之间会交换特定的流量控制信号。
  • 例如,当主机缓冲区满时,它可以向控制器发送一个“停止发送”的信号,以暂停数据的传输。
  • 当主机缓冲区有空闲空间时,它会向控制器发送一个“继续发送”的信号,以恢复数据的传输。

3.1.3. 动态调整速率

  • 根据缓冲区的状态和流量控制信号,主机和控制器可以动态地调整数据传输的速率。
  • 这种调整可以是渐进的,也可以是突然的,具体取决于网络条件和设备资源的变化情况。

3.2. 流量控制的作用和意义

流量控制机制在蓝牙通信中发挥着重要的作用,具体表现在以下几个方面:

  • 防止数据丢失:通过限制数据传输的速率,流量控制机制可以防止因缓冲区溢出而导致的数据丢失问题。
  • 提高数据传输效率:通过动态地调整数据传输的速率,流量控制机制可以确保数据在主机和控制器之间以最高的效率进行传输。
  • 适应网络条件变化:流量控制机制能够根据网络条件的变化(如带宽变化、延迟变化等)来动态地调整数据传输的速率,从而确保数据传输的稳定性和可靠性。
  • 优化设备资源利用:通过合理地分配和利用设备资源(如缓冲区空间、CPU时间等),流量控制机制可以优化设备的整体性能。

流量控制机制是蓝牙通信中一个不可或缺的组成部分。它确保了数据在主机和控制器之间能够高效、有序地传输,同时防止了资源耗尽或数据丢失的问题。在实际应用中,我们需要根据具体的网络条件和设备资源来选择合适的流量控制策略,以实现最佳的数据传输效果。

四、总结

这种基于主机缓冲区状态动态调整数据传输速率的流量控制机制,具有多方面的优势。一方面,它有助于维持数据传输的流畅性,使得数据能够按照一个相对稳定、合理的节奏在主机和控制器之间流转,不会出现长时间的停顿或者频繁的数据丢失、重传等情况,保障了数据通信的连贯性,还是对于数据完整性要求严格的文件传输等场景,都能提供良好的支持。

另一方面,通过有效地避免资源耗尽或数据丢失问题,它可以让整个系统更加稳定可靠地运行。避免资源耗尽意味着设备不会因为过度接收数据而导致内存溢出、CPU 占用过高无法响应等故障,延长了设备的使用寿命,同时也提升了用户体验;而避免数据丢失则确保了数据的完整性和准确性,对于涉及重要信息(如金融交易数据、企业关键业务数据等)的传输场景尤为关键,从根本上保障了数据通信的质量和安全性。

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

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

相关文章

Element Plus的快速入门

一、什么是Element Plus Element : 是饿了么团队研发的&#xff0c;基于Vue3&#xff0c;面向设计师和开发者的组件库。 组件&#xff1a;组成网页的部分&#xff0c;例如超链接&#xff0c;按钮&#xff0c;图片&#xff0c;表格&#xff0c;表单&#xff0c;分页条等等。 …

健身房小程序服务渠道开展

健身不单单是锻炼身体、保持身材&#xff0c;也是一种社交方式&#xff0c;城市里门店不少&#xff0c;每家都有一定流量和老客&#xff0c;但仅靠传统线下拉客/自然流量前往和线上朋友圈、短视频发硬广等方式还不够。 商家需要找到更多潜在目标客户&#xff0c;而消费者也对门…

Docker--通过Docker容器创建一个Web服务器

Web服务器 Web服务器&#xff0c;一般指网站服务器&#xff0c;是驻留于因特网上某种类型计算机的程序。 Web服务器可以向浏览器等Web客户端提供文档&#xff0c;也可以放置网站文件以供全世界浏览&#xff0c;或放置数据文件以供全世界下载。 Web服务器的主要功能是提供网上…

HTMLCSS:3D金字塔加载动画

效果演示 这段代码通过CSS3的3D变换和动画功能&#xff0c;创建了一个旋转的金字塔加载动画&#xff0c;每个侧面都有不同的颜色渐变&#xff0c;底部还有一个模糊的阴影效果&#xff0c;增加了视觉的立体感。 HTML <div class"pyramid-loader"><div cl…

selinux及防火墙

selinux说明 SELinux 是 Security-Enhanced Linux 的缩写&#xff0c;意思是安全强化的 linux 。 SELinux 主要由美国国家安全局&#xff08; NSA &#xff09;开发&#xff0c;当初开发的目的是为了避免资源的误用。 httpd进程标签&#xff08;/usr/share/nginx/html &#…

vue 富文本图片如何拖拽

在Vue项目中实现富文本编辑器&#xff08;如vue-quill-editor&#xff09;的图片拖拽功能&#xff0c;需要结合Quill.js及其相关插件进行配置 安装必要的依赖包&#xff1a; 你需要安装vue-quill-editor作为富文本编辑器的基础组件。为了支持图片拖拽功能&#xff0c;你还需要…

秋招面试基础总结,Java八股文基础(串联知识),四万字大全

目录 值传递和引用传递 静态变量和静态代码块的执行顺序 Java​​​​​​​集合的框架&#xff0c;Set,HashSet,LinkedHashSet这三个底层是什么 多线程篇 Java实现多线程的方式 假设一个线程池&#xff0c;核心线程数是2&#xff0c;最大线程数是3&#xff0c;阻塞队列是4…

MySQL原理简介—12.MySQL主从同步

大纲 1.异步复制为MySQL搭建一套主从复制架构 2.半同步复制为MySQL搭建一套主从复制架构 3.GTID为MySQL搭建一套主从复制架构 4.并行复制降低主从同步延迟或强制读主库 1.异步复制为MySQL搭建一套主从复制架构 (1)MySQL主从复制的原理 (2)搭建主从复制架构的配置 (1)MySQ…

一文了解Spring提供的几种扩展能力

基于 spring bean 的扩展 1. BeanPostProcessor spring 提供的针对 bean 的初始化过程时提供的扩展能力&#xff0c;从方法名也很容易看出&#xff0c;提供的两个方法分别是为 bean 对象提供了初始化之前以及初始化之后的扩展能力。 package com.wyl.conf;import org.spring…

【隐私计算大模型】联邦深度学习之拆分学习Split learning原理及安全风险、应对措施以及在大模型联合训练中的应用案例

Tips&#xff1a;在两方场景下&#xff0c;设计的安全算法&#xff0c;如果存在信息不对等性&#xff0c;那么信息获得更多的一方可以有概率对另一方实施安全性攻击。 1. 拆分学习原理 本文介绍了一种适用于隐私计算场景的深度学习实现方案——拆分学习&#xff0c;又称分割…

Linux 下进程基本概念与状态

文章目录 一、进程的定义二、 描述进程-PCBtask_ struct内容分类 三、 进程状态 一、进程的定义 狭义定义&#xff1a;进程是正在运行的程序的实例&#xff08;an instance of a computer program that is being executed&#xff09;。广义定义&#xff1a;进程是一个具有一定…

k8s1.31版本最新版本集群使用容器镜像仓库Harbor

虚拟机 rocky9.4 linux master node01 node02 已部署k8s集群版本 1.31 方法 一 使用容器部署harbor (1) wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo yum -y install docker-ce systemctl enable docker…

数据库MYSQL——表的设计

文章目录 前言三大范式&#xff1a;几种实体间的关系&#xff1a;一对一关系&#xff1a;一对多关系&#xff1a;多对多关系&#xff1a; 前言 之前的博客中我们讲解的是关于数据库的增删改查与约束的基本操作&#xff0c; 是在已经创建数据库&#xff0c;表之上的操作。 在实…

自然语言处理: RAG优化之Embedding模型选型重要依据:mteb/leaderboard榜

本人项目地址大全&#xff1a;Victor94-king/NLP__ManVictor: CSDN of ManVictor git地址&#xff1a;https://github.com/opendatalab/MinerU 写在前面: 笔者更新不易&#xff0c;希望走过路过点个关注和赞&#xff0c;笔芯!!! 写在前面: 笔者更新不易&#xff0c;希望走过路…

《生成式 AI》课程 作业6 大语言模型(LLM)的训练微调 Fine Tuning -- part1

资料来自李宏毅老师《生成式 AI》课程&#xff0c;如有侵权请通知下线 Introduction to Generative AI 2024 Spring 该文档主要介绍了国立台湾大学&#xff08;NTU&#xff09;2024 年春季 “生成式人工智能&#xff08;GenAI&#xff09;” 课程的作业 5&#xff08;GenAI HW…

LSA详情与特殊区域

LSA是构成LSDB的重要原材料&#xff0c;在OSPF中发挥很大作用。 报文 通用头部 LS age&#xff1a;LSA寿命&#xff0c;0-3600s Options&#xff1a;可选项 LS type&#xff1a;LSA类型&#xff0c;三要素之一 Link State ID&#xff1a;LSAID 三要素之一 Advertising Ro…

网安瞭望台第4期:nuclei最新poc分享

国内外要闻 多款 D-Link 停产路由器漏洞&#xff1a;攻击者可远程执行代码 近日&#xff0c;知名网络硬件制造商 D-Link 发布重要安全公告。由于存在严重的远程代码执行&#xff08;RCE&#xff09;漏洞&#xff0c;其敦促用户淘汰并更换多款已停产的 VPN 路由器型号。 此次…

面试经典 150 题:205,55

205. 同构字符串 【解题思路】 来自大佬Krahets 【参考代码】 class Solution { public:bool isIsomorphic(string s, string t) {map<char, char> Smap, Tmap;for(int i0; i<s.size(); i){char a s[i], b t[i];//map容器存在该字符&#xff0c;且不等于之前映射…

IEC61850读服务器目录命令——GetServerDirectory介绍

IEC61850标准中的GetServerDirectory命令是变电站自动化系统中非常重要的一个功能&#xff0c;它主要用于读取服务器的目录信息&#xff0c;特别是服务器的逻辑设备节点&#xff08;LDevice&#xff09;信息。以下是对GetServerDirectory命令的详细介绍。 目录 一、命令功能 …

【PHP】 环境以及插件的配置,自学笔记(一)

文章目录 环境的准备安装 XAMPPWindowMacOS 配置开发环境Vscode 关于 PHP 的插件推荐Vscode 配置 php 环境Apache 启动Hello php配置热更新 参考 环境的准备 下载 XAMPP , 可以从 官网下载 https://www.apachefriends.org/download.html 安装 XAMPP XAMPP 是一个跨平台的集成开…