【消息序列】详解(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 占用过高无法响应等故障,延长了设备的使用寿命,同时也提升了用户体验;而避免数据丢失则确保了数据的完整性和准确性,对于涉及重要信息(如金融交易数据、企业关键业务数据等)的传输场景尤为关键,从根本上保障了数据通信的质量和安全性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

虚拟局域网PPTP配置与验证(二)

虚拟局域网PPTP配置与验证(二) windows VPN客户端linux 客户端openwrt客户端性能验证虚拟局域网PPTP配置与验证(一)虚拟局域网PPTP配置与验证(二) : 本文介绍几种客户端连接PPTP服务端的方法,同时对linux/windows/openwrt 操作系统及x86、arm硬件平台下PPTP包转发性能进…

uniapp中使用uni-forms实现表单管理,验证表单

前言 uni-forms 是一个用于表单管理的组件。它提供了一种简化和统一的方式来处理表单数据&#xff0c;包括表单验证、字段绑定和提交逻辑等。使用 uni-forms可以方便地创建各种类型的表单&#xff0c;支持数据双向绑定&#xff0c;可以与其他组件及API进行良好的集成。开发者可…

Hive构建日搜索引擎日志数据分析系统

1.数据预处理 根据自己或者学校系统预制的数据 使用less sogou.txt可查看 wc -l sogou.txt 能够查看总行数 2.数据扩展部分 我的数据位置存放在 /data/bigfiles 点击q退出 将一个文件的内容传递到另一个目录文件下 原数据在 /data/bigfiles ->传递 到/data/workspac…

网络安全的学习方向和路线是怎么样的?

最近有同学问我&#xff0c;网络安全的学习路线是怎么样的&#xff1f; 废话不多说&#xff0c;先上一张图镇楼&#xff0c;看看网络安全有哪些方向&#xff0c;它们之间有什么关系和区别&#xff0c;各自需要学习哪些东西。 在这个圈子技术门类中&#xff0c;工作岗位主要有以…

深入浅出分布式缓存:原理与应用

文章目录 概述缓存分片算法1. Hash算法2. 一致性Hash算法3. 应用场景Redis集群方案1. Redis 集群方案原理2. Redis 集群方案的优势3. Java 代码示例:Redis 集群数据定位Redis 集群中的节点通信机制:Gossip 协议Redis 集群的节点通信:Gossip 协议Redis 集群的节点通信流程Red…

Mysql的加锁情况详解

最近在复习mysql的知识点&#xff0c;像索引、优化、主从复制这些很容易就激活了脑海里尘封的知识&#xff0c;但是在mysql锁的这一块真的是忘的一干二净&#xff0c;一点映像都没有&#xff0c;感觉也有点太难理解了&#xff0c;但是还是想把这块给啃下来&#xff0c;于是想通…

论文模型设置与实验数据:scBERT

Yang, F., Wang, W., Wang, F. et al. scBERT as a large-scale pretrained deep language model for cell type annotation of single-cell RNA-seq data. Nat Mach Intell 4, 852–866 (2022). https://doi.org/10.1038/s42256-022-00534-z 论文地址&#xff1a;scBERT as a…

TCP三次握手的过程是怎样的?

一开始&#xff0c;客户端和服务端都处于CLOSE状态。先是服务端主动监听某个端口&#xff0c;处于LISTEN状态。 &#xff08;1&#xff09;第一次握手 客户端会随机初始化序号&#xff08;client_isn&#xff09;&#xff0c;将此序号填入TCP首部的32位序号字段中&#xff0c…

Java核心知识详解:String类、StringBuffer、数组及日期时间的全面解析

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Java &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 标题 Java核心知识详解&#xff1a;String类、StringBuffer、数组及日期时间的全面解析 摘要 在Java中…

【MATLAB源码-第218期】基于matlab的北方苍鹰优化算法(NGO)无人机三维路径规划,输出做短路径图和适应度曲线.

操作环境&#xff1a; MATLAB 2022a 1、算法描述 北方苍鹰优化算法&#xff08;Northern Goshawk Optimization&#xff0c;简称NGO&#xff09;是一种新兴的智能优化算法&#xff0c;灵感来源于北方苍鹰的捕猎行为。北方苍鹰是一种敏捷且高效的猛禽&#xff0c;广泛分布于北…

SplatFormer: Point Transformer for Robust3D Gaussian Splatting 论文解读

目录 一、概述 二、相关工作 1、NVI新视角插值 2、稀疏视角重建 3、OOD-NVS 4、无约束重建下的正则化技术 5、基于学习的2D-to-3D模型 6、3D点云处理技术 三、SplatFormer 1、Point Transformer V3 2、特征解码器 3、损失函数 四、数据集 五、实验 一、概述 该论…

Azkaban部署

首先我们需要现在相关的组件&#xff0c;在这里已经给大家准备好了相关的安装包&#xff0c;有需要的可以自行下载。 只需要启动hadoop集群就可以&#xff0c;如果现在你的hive是打开的&#xff0c;那么请你关闭&#xff01;&#xff01;&#xff01; 如果不关会造成证书冲突…

目标检测模型优化与部署

目录 引言数据增强 随机裁剪随机翻转颜色抖动 模型微调 加载预训练模型修改分类器训练模型 损失函数 分类损失回归损失 优化器算法思路 RPN (Region Proposal Network)Fast R-CNN损失函数 部署与应用 使用 Flask 部署使用 Docker 容器化 参考资料 引言 目标检测是计算机视觉…

Charles抓包工具-笔记

摘要 概念&#xff1a; Charles是一款基于 HTTP 协议的代理服务器&#xff0c;通过成为电脑或者浏览器的代理&#xff0c;然后截取请求和请求结果来达到分析抓包的目的。 功能&#xff1a; Charles 是一个功能全面的抓包工具&#xff0c;适用于各种网络调试和优化场景。 它…

java: itext8.05 create pdf

只能调用windows 已安装的字体&#xff0c;这样可以在系统中先预装字体&#xff0c;5.0 可以调用自配文件夹的字体文件。CSharp donetItext8.0 可以调用。 /*** encoding: utf-8* 版权所有 2024 ©涂聚文有限公司 言語成了邀功盡責的功臣&#xff0c;還需要行爲每日來值班…

Kafka 生产者优化与数据处理经验

Kafka&#xff1a;分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析&#xff1a;从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析&#xff1a…

C高级学习笔记

……接上文 硬链接和软连接&#xff08;符号链接&#xff09; 硬链接 硬链接文件可以理解为文件的副本&#xff08;可以理解为复制粘贴&#xff09; ln 根据Linux系统分配给文件的inode(ls -li)号进行建立&#xff0c;没有办法跨越文件系统 格式&#xff1a;ln 被链接的文件&am…

Java基于SpringBoot+Vue的藏区特产销售平台

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

vim 分割窗口后,把状态栏给隐藏

一、基本环境 主机MacOs Sonoma 14.7主机终端Iterm2虚拟机Parallels Desktop 20 for Mac Pro Edition 版本 20.0.1 (55659)虚拟机-操作系统Ubuntu 22.04 最小安装 二、分割窗口后的截图&#xff0c;红色线条部分就是状态栏 分割后个布局是&#xff1a;顶部1行高度窗口&#x…

【数据结构】【线性表】栈的基本概念(附c语言源码)

栈的基本概念 讲基本概念还是回到数据结构的三要素&#xff1a;逻辑结构&#xff0c;物理结构和数据运算。 从逻辑结构来讲&#xff0c;栈的各个数据元素之间是通过是一对一的线性连接&#xff0c;因此栈也是属于线性表的一种从物理结构来说&#xff0c;栈可以是顺序存储和顺…