线程池/内存池/mysql连接池
线程池介绍
①线程池定义:
维持和管理固定数量线程的结构,用于解决资源频繁创建和销毁的问题。
②线程池组成:
固定数量的线程、队列、任务状态管理。
④线程池的作用:
避免频繁创建和销毁线程,管理线程状态,提高系统资源利用率。
1.线程池的组成部分
①线程:
固定数量的线程用于处理任务。
②队列:
用于管理任务,通常使用队列数据结构。
③锁:
用于保护队列的数据安全,防止并发访问冲突。
2.线程池的线程数量确定
①CPU密集型任务:
线程数量与CPU核心数相同。
②IO密集型任务:
线程数量通常为两倍CPU核心数加二。
③经验公式:
通过测试确定最佳线程数量。
3.线程池的应用场景
①.性能优化:
优化耗时计算和IO操作,提高吞吐量。
②.网络IO优化:
使用线程池并发处理网络数据。
③.框架应用:
在开源框架和工作中使用线程池。
4.线程池的工作原理
①.生产消费模型:
生产者线程抛出任务到队列,消费者线程从队列中取出任务执行。
②.任务状态管理:
队列状态决定线程状态,队列为空时线程休眠,有任务时线程活跃。
③.异步任务:
任务在消费者线程中异步执行,不占用生产者线程。
5.线程池的接口设计
①.接口设计:
暴露精简的接口给用户使用,隐藏具体实现细节。
②.任务执行规范:
定义任务执行的函数指针和上下文参数。
③.线程池对象:
用于标识和管理线程池。
6.线程池的数据结构设计
①.队列设计:
使用双开口队列数据结构,支持追加和弹出操作。
②.原子变量:
用于标记线程池的退出状态,保证线程安全。
③.线程计数器:
存储线程的PID,用于管理和关闭线程。
7.具体线程池的代码实现如下
thrd_pool.c
#include <pthread.h>
#include <stdatomic.h>
#include <stdint.h>
#include <stdlib.h>
#include "thrd_pool.h"
#include "spinlock.h"/*** shell: gcc thrd_pool.c -c -fPIC* shell: gcc -shared thrd_pool.o -o libthrd_pool.so -I./ -L./ -lpthread* usage: include thrd_pool.h & link libthrd_pool.so*/typedef struct spinlock spinlock_t;//自旋锁typedef struct task_s {void *next;handler_pt func;void *arg;
} task_t;typedef struct task_queue_s {void *head;void **tail; int block;//阻塞标志spinlock_t lock;pthread_mutex_t mutex;pthread_cond_t cond;//条件变量
} task_queue_t;struct thrdpool_s {task_queue_t *task_queue;atomic_int quit;// 退出标志int thrd_count;pthread_t *threads; // 线程数组,存储线程池中的线程
};// 对称
// 资源的创建 回滚式编程
// 业务逻辑 防御式编程
static task_queue_t *
__taskqueue_create() {int ret;task_queue_t *queue = (task_queue_t *)malloc(sizeof(task_queue_t));if (queue) {ret = pthread_mutex_init(&queue->mutex, NULL);if (ret == 0) {ret = pthread_cond_init(&queue->cond, NULL);if (ret == 0) {spinlock_init(&queue->lock);queue->head = NULL;queue->tail = &queue->head;queue->block = 1;return queue;}pthread_mutex_destroy(&queue->mutex);}free(queue);}return NULL;
}static void
__nonblock(task_queue_t *queue) {pthread_mutex_lock(&queue->mutex);queue->block = 0;//。将其设置为 0,表示队列不再处于阻塞状态,线程可以继续执行。pthread_mutex_unlock(&queue->mutex);pthread_cond_broadcast(&queue->cond);
}static inline void
__add_task(task_queue_t *queue, void *task) {// 不限定任务类型,只要该任务的结构起始内存是一个用于链接下一个节点的指针void **link = (void**)task;*link = NULL;//task->next=nullspinlock_lock(&queue->lock);*queue->tail /* 等价于 queue->tail->next */ = link;queue->tail = link;spinlock_unlock(&queue->lock);pthread_cond_signal(&queue->cond);//这行代码通过 pthread_cond_signal 唤醒一个因条件变量 queue->cond 而阻塞的线程。
}static inline void *
__pop_task(task_queue_t *queue) {spinlock_lock(&queue->lock);if (queue->head == NULL) {spinlock_unlock(&queue->lock);return NULL;}task_t *task;task = queue->head;void **link = (void**)task;queue->head = *link;//更新队列的头指针 queue->head,使其指向当前任务的 next 指针(即 *link)。if (queue->head == NULL) {queue->tail = &queue->head;}spinlock_unlock(&queue->lock);return task;
}static inline void *
__get_task(task_queue_t *queue) {task_t *task;// 虚假唤醒while ((task = __pop_task(queue)) == NULL) {pthread_mutex_lock(&queue->mutex);if (queue->block == 0) {pthread_mutex_unlock(&queue->mutex);return NULL;}// 1. 先 unlock(&mtx)// 2. 在 cond 休眠// --- __add_task 时唤醒// 3. 在 cond 唤醒// 4. 加上 lock(&mtx);pthread_cond_wait(&queue->cond, &queue->mutex);pthread_mutex_unlock(&queue->mutex);}return task;
}static void
__taskqueue_destroy(task_queue_t *queue) {task_t *task;while ((task = __pop_task(queue))) {free(task);}spinlock_destroy(&queue->lock);pthread_cond_destroy(&queue->cond);pthread_mutex_destroy(&queue->mutex);free(queue);
}static void *
__thrdpool_worker(void *arg) {thrdpool_t *pool = (thrdpool_t*) arg;task_t *task;void *ctx;while (atomic_load(&pool->quit) == 0) {task = (task_t*)__get_task(pool->task_queue);if (!task) break;handler_pt func = task->func;ctx = task->arg;free(task);func(ctx);}return NULL;
}static void
__threads_terminate(thrdpool_t * pool) {atomic_store(&pool->quit, 1);__nonblock(pool->task_queue);int i;for (i=0; i<pool->thrd_count; i++) {pthread_join(pool->threads[i], NULL);}
}static int
__threads_create(thrdpool_t *pool, size_t thrd_count) {pthread_attr_t attr;//线程属性int ret;ret = pthread_attr_init(&attr);//线程属性初始化if (ret == 0) {pool->threads = (pthread_t *)malloc(sizeof(pthread_t) * thrd_count);//在堆上开辟内存if (pool->threads) {//开辟成功int i = 0;for (; i < thrd_count; i++) {if (pthread_create(&pool->threads[i], &attr, __thrdpool_worker, pool) != 0) {//创建线程break;}}pool->thrd_count = i;pthread_attr_destroy(&attr);if (i == thrd_count)return 0;__threads_terminate(pool);free(pool->threads);}ret = -1;}return ret;
}void
thrdpool_terminate(thrdpool_t * pool) {atomic_store(&pool->quit, 1);__nonblock(pool->task_queue);
}thrdpool_t *
thrdpool_create(int thrd_count) {thrdpool_t *pool;pool = (thrdpool_t*)malloc(sizeof(*pool));if (pool) {task_queue_t *queue = __taskqueue_create();if (queue) {pool->task_queue = queue;atomic_init(&pool->quit, 0);if (__threads_create(pool, thrd_count) == 0)return pool;__taskqueue_destroy(queue);}free(pool);}return NULL;
}int
thrdpool_post(thrdpool_t *pool, handler_pt func, void *arg) {if (atomic_load(&pool->quit) == 1) return -1;task_t *task = (task_t*) malloc(sizeof(task_t));if (!task) return -1;task->func = func;task->arg = arg;__add_task(pool->task_queue, task);return 0;
}void
thrdpool_waitdone(thrdpool_t *pool) {int i;for (i=0; i<pool->thrd_count; i++) {pthread_join(pool->threads[i], NULL);}__taskqueue_destroy(pool->task_queue);free(pool->threads);free(pool);
}
thrd_pool.h
#ifndef _THREAD_POOL_H
#define _THREAD_POOL_Htypedef struct thrdpool_s thrdpool_t;
// 任务执行的规范 ctx 上下文
typedef void (*handler_pt)(void * /* ctx */);#ifdef __cplusplus
extern "C"
{
#endif// 对称处理
thrdpool_t *thrdpool_create(int thrd_count);void thrdpool_terminate(thrdpool_t * pool);int thrdpool_post(thrdpool_t *pool, handler_pt func, void *arg);void thrdpool_waitdone(thrdpool_t *pool);#ifdef __cplusplus
}
#endif#endif
内存池的介绍
内存池是一种内存管理技术,以下是其简单介绍:
1.内存池的定义
内存池是在程序运行开始时,预先分配一块较大的内存空间作为 “池”,当程序需要申请内存时,直接从这个池中分配小块内存给用户,而不是每次都向操作系统申请;当用户释放内存时,也不是直接归还给操作系统,而是将其放回内存池,以便后续再次使用。
2.内存池的作用
提高内存分配效率:避免了频繁地向操作系统申请和释放内存所带来的开销。因为操作系统进行内存分配的操作相对复杂,涉及到查找合适的内存块、维护内存管理数据结构等,而从内存池中分配内存则可以快速定位到可用的内存块,大大提高了分配速度。
减少内存碎片:连续的内存分配和释放容易导致内存碎片的产生,即内存中存在许多不连续的小空闲块,无法满足较大内存分配的需求。内存池通过合理的管理策略,尽量减少这种碎片的产生,提高内存的利用率。
3.内存池的实现原理
内存块划分:内存池通常会将预先分配的大内存空间划分为不同大小的内存块,以满足不同大小的内存分配请求。这些内存块可以通过链表等数据结构进行组织,方便快速查找和分配。
分配策略:当有内存分配请求时,内存池会根据请求的大小,在相应大小的内存块链表中查找可用的内存块。如果找到,则直接返回该内存块给用户;如果没有找到合适的内存块,可能会根据具体的策略进行一些处理,如尝试从其他大小的内存块中进行拆分,或者申请新的内存空间来扩充内存池。
回收策略:当用户释放内存时,内存池会将释放的内存块标记为可用,并将其放回相应的内存块链表中。有些内存池还会采用一些优化策略,如在一定条件下将相邻的空闲内存块合并成更大的内存块,以减少内存碎片。
4.内存池的应用场景
频繁内存分配的场景:如网络服务器中处理大量的连接请求,每次请求可能都需要分配一些内存来存储相关的数据,如果没有内存池,频繁的内存分配和释放会导致性能下降。使用内存池可以提高服务器的响应速度和稳定性。
实时性要求较高的系统:如嵌入式系统中的实时操作系统,对内存分配的时间有严格要求。内存池可以保证在短时间内快速分配内存,满足实时任务的需求。
在kv存储文章的末尾有具体实现了一种简单的内存池
mysql连接池
1.课程介绍和池化技术概述
①.介绍了课程内容和目标,重点讲解了池化技术的概念及其重要性。
②.池化技术主要用于减少资源创建和销毁的次数,从而提高程序的响应性能,尤其是在高并发场景下。
③.线程池和内存池是常见的池化技术,它们通过复用资源来提升性能。
2.数据库连接池的概念和作用
①.数据库连接池是在程序启动时创建足够的数据库连接,并组成一个连接池。
②.连接池会根据程序需要动态申请、使用和释放连接。
③.数据库连接池可以提升数据库访问的性能,尤其是在高并发处理SQL指令时
3.数据库连接的定义和特性
①.数据库连接是指服务器与数据库之间的连接,通常是通过TCP连接实现的。
②.TCP连接需要经过三次握手建立连接,并通过四次挥手断开连接。
③.数据库连接是一种长连接,需要维护连接的生命周期。
4.请求回应模式和数据库访问模式
①.请求回应模式是服务器与数据库之间的交互模式,服务器主动请求数据并等待数据库的响应。
②.数据库不会主动推送数据给服务器,所有数据交互都是通过请求和回应完成的。
③.这种模式适用于所有基于访问模式的数据库操作。
5.高并发处理和MySQL的网络模型
①.高并发处理是指数据库在处理大量并发请求时的性能表现。
②.MySQL采用IO多路复用的方式来处理并发连接,主要通过select函数监听连接。
③.MySQL会为每条连接分配一个线程,并在线程中处理SQL语句。
6.数据库连接池的限制和考虑因素
①.数据库连接池的大小是受限的,受操作系统资源限制和MySQL的处理能力限制。
②.连接池的大小需要根据实际需求和系统资源进行调整。
③.长连接和短连接的选择取决于具体的应用场景和需求。
7.长连接和短连接的区别
①.长连接是指维持一条连接的活跃状态,复用连接执行SQL语句。
②.短连接是执行SQL语句后立即断开连接,不复用连接。
③.长连接适用于高并发场景,短连接适用于低并发场景。
8.TCP连接的收发数据和MySQL协议
①.TCP连接的收发数据需要遵循MySQL协议进行编码和解码。
②.MySQL驱动需要具备编码和解码MySQL协议的能力。
③.MySQL驱动可以通过官方提供或自定义实现。
9.阻塞IO和非阻塞IO的区别
①.阻塞IO是指IO函数在IO未就绪时会阻塞线程,导致线程无法继续执行其他任务。
②.非阻塞IO则不会阻塞线程,允许线程在等待IO时继续处理其他任务。
③.高性能服务器框架通常使用非阻塞IO。
10.同步连接池和异步连接池的区别
①.同步连接池是指使用同步连接方式访问数据库,会阻塞当前线程等待数据库返回结果。
②.异步连接池使用异步连接方式访问数据库,不会阻塞当前线程,通过另起线程或异步事件处理结果。
③.异步连接池的性能通常高于同步连接池。
11.同步连接的原理和应用场景
①.同步连接的原理是阻塞当前线程等待数据库返回结果。
②.同步连接适用于服务器启动时的资源初始化等场景。
③.同步连接的优点是简单直观,缺点是会阻塞线程。
12.异步连接的原理和应用场景
①.异步连接的原理是另起线程等待数据库结果,或通过异步事件处理结果。
②.异步连接适用于服务器运行过程中的业务处理场景。
③.异步连接的优点是释放主线程的处理能力,缺点是复杂度较高。
相关文章:
线程池/内存池/mysql连接池
线程池介绍 ①线程池定义: 维持和管理固定数量线程的结构,用于解决资源频繁创建和销毁的问题。 ②线程池组成: 固定数量的线程、队列、任务状态管理。 ④线程池的作用: 避免频繁创建和销毁线程,管理线程状态&…...
图解AUTOSAR_SWS_FlexRayARTransportLayer
FlexRay AUTOSAR 传输层 (FrArTp) 分析 1. AUTOSAR FlexRay 传输层架构 1.1 FlexRay AUTOSAR 传输层在AUTOSAR架构中的位置 AUTOSAR分层架构中,FlexRay AUTOSAR 传输层(FrArTp)位于通信抽象层,其上方是PDU路由器,下方是FlexRay接口。FrArTp的主要功能是实现FlexRay网络上的…...
【百日精通JAVA | SQL篇 | 第四篇】约束
SQL这一块没什么难度,主要是一个熟练度,稍微上点难度的地方,其实在于查,比较复杂,涉及到很多问题。 指定列插入 使用指定列插入的时候,未被指定的列使用默认值进行存储,默认值为空。 默认值设置…...
QEMU源码全解析 —— 块设备虚拟化(16)
接前一篇文章:QEMU源码全解析 —— 块设备虚拟化(15) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 《KVM实战 —— 原理、进阶与性能调优》—— 任永杰 程舟,机械工业出版社...
实验:IS-IS认证。
一、IS-IS认证的定义与作用分析 IS-IS认证是什么? IS-IS(Intermediate System to Intermediate System)协议是用于自治系统内部的路由协议,其认证机制主要用于保障路由信息交换的安全性,包括邻居关系建立和…...
11-产品经理-创建产品
在“产品”-“仪表盘”内,可以查看系统中关于产品及相关需求的统计。 在“产品”-“产品列表”页面,可以按项目集、项目查看其关联产品。还可以添加产品、编辑产品线、或者导出产品列表。 产品看板,通过看板方式查看产品、产品计划和产品下的…...
玄机-应急响应-入侵排查
靶机排查目标: 1.web目录存在木马,请找到木马的密码提交 查看/var/www/html。 使用find命令查找 find ./ -type f -name "*.php | xargs grep "eval("查看到1.php里面存在无条件一句话木马。 2.服务器疑似存在不死马,请找…...
MySQL基础知识(通俗版)
MySQL基础知识(通俗版) 一、MySQL基础概念 1.1 MySQL简介 想象MySQL就像一个超级大的Excel表格,但它比Excel更强大: 可以同时处理成千上万的数据可以保证数据的安全性和一致性可以支持多人同时操作可以自动备份和恢复数据 1.…...
python逆向:喜马拉雅登录案例
网址:登录 1. 点击到网页主页 先随便输入电话号码和密码 打开开发者工具,点击网络清空,然后点击登录发起网络请求 (出现一个请求包,我们发现不是我们所需要的) 我们进行验证滑块,就又出来请求…...
windows AndroidStudio上传maven中央仓库
一、插件地址:https://github.com/vanniktech/gradle-maven-publish-plugin?tabreadme-ov-file 二、Maven中心:https://vanniktech.github.io/gradle-maven-publish-plugin/central/ 2.1、中央门户帐户,用github账号登陆:gh122…...
嵌入式学习(35)-STM32F103 TXE 和TC
在USART的发送端有2个寄存器,一个是程序可以看到的USART_DR寄存器,另一个是程序看不到的移位寄存器,对应USART数据发送有两个标志,一个是TXE发送数据寄存器空,另一个是TC发送结束。 当USART_DR中的数据传送到移位寄存器后,TXE被设…...
linux Gitkraken 破解
ubuntu 安装 Gitkraken 9.x Pro 版本_gitcracken.git-CSDN博客...
Qwen-Agent框架的文件相关操作:从Assistant到BasicDocQA
在前面的几篇文章如《针对Qwen-Agent框架的Function Call及ReAct的源码阅读与解析:Agent基类篇》 、《基于Qwen-Agent框架的Function Call及ReAct方式调用自定义工具》、 《针对Qwen-Agent框架的源码阅读与解析:FnCallAgent与ReActChat篇》中,…...
2025年3月15日(5mw)
根据《NREL/TP-500-38060技术报告》,NREL 5-MW参考风力机的各部件质量及总体质量数据如下: 各部件质量数据 叶片(Blades) 单叶片质量:17,740 kg(见表2-2)总数:3片总质量:…...
docker mysql 笔记250406
docker mysql 笔记250406 以下是使用 Docker 运行 MySQL 的完整指南,包含常见配置和最佳实践: 1. 快速启动 MySQL 容器 docker run -d \--name mysql_db \-e MYSQL_ROOT_PASSWORDmy-secret-pw \-p 3306:3306 \mysql:8.02. 关键配置说明 2.1 环境变量&…...
ceph集群架构阐述
ceph集群架构阐述 首先,ceph集群也是分为客户端和服务端的,是一种高效的分布式存储系统,我们将其拆分为这两个部分来进行分析。 我大致的将服务端分为API类型、逻辑层、OSD层三个层面进行分析;将客户端按三种API类型挂载、…...
《Java八股文の文艺复兴》第十篇:量子永生架构——对象池的混沌边缘
目录 卷首语:蝴蝶振翅引发的量子海啸 第一章:混沌初开——对象池的量子涅槃(深度扩展) 第二章:混沌计算——对象复活的降维打击(技术深化) 第三章:量子试炼场——亿万级对象池全…...
(linux操作系统)程序地址空间
程序地址空间是什么? 讲这个问题之前,我们先来看一段熟悉的代码,以前学习C语言或者C语言时,就听说过程序内存分布,堆区,栈区,静态区,常量区,共享区,代码段&am…...
专业抑郁测试工具:让心理健康评估更简单
专业抑郁测试工具:让心理健康评估更简单 在这个快节奏的社会中,心理健康问题越来越受到人们的关注。为了帮助大家更好地了解自己的心理状态,我们开发了一款专业的在线抑郁测试工具。这个工具基于科学的心理量表设计,为用户提供准…...
C语言中单向链表:创建节点与插入新节点
一. 简介 单链表是一种常见且基础的数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针。 本文简单学习一下C语言中如何实现单项链表。 二. C语言实现单向链表 单向链表:单向链表是一种线性数据结构,由一…...
jsoncpp的使用
json提供的几个类: Value类:将json支持的数据类型进行包装,最终得到一个Value类型 FastWriter类:将Value对象中的数据序列化为字符串,序列化后可以得到json格式的字符串 Reader类:反序列化,将…...
【最新版】啦啦外卖v64系统独立版源码+全部小程序APP端+安装教程
一.系统介绍 啦啦外卖跑腿平台独立版,使用的都知道该系统功能非常强大,应该说是目前外卖平台功能最全的一套系统。主要是功能非常多,拿来即用,包括客户端小程序、配送端小程序、商户端小程序,还有对应四个端的APP源码…...
13-产品经理-产品多分支平台管理
禅道16.0版本开始,优化和增强了产品的分支/平台功能,主要特点如下: 多分支/平台功能兼容各种大小型项目,项目/迭代可以关联对应产品的某个分支/平台。分支/平台支持灵活管理,可以把分支/平台理解为时间层面的概念&…...
AI在医疗领域的应用
人工智能对医疗领域的革命性影响 一、智能诊断系统的突破 病理识别准确率提升乳腺癌检测准确率达94.6%(2023《Nature Medicine》)皮肤癌诊断灵敏度超过专业医师12%多模态诊断整合融合CT/MRI影像+基因组数据+电子病历急性肾损伤预测提前48小时(DeepMind)二、药物研发范式革…...
LabVIEW 在故障诊断中的算法
在故障诊断领域,LabVIEW 凭借其强大的图形化编程能力、丰富多样的工具包以及卓越的功能性能,成为工程师们进行故障诊断系统开发的得力助手。通过运用各种算法,能够对采集到的信号进行全面、深入的分析处理,从而准确地诊断出系统中…...
(自用)WebSocket创建流程
在Spring Boot项目中新建WebSocket服务,可以按照以下详细步骤进行操作: 1.创建Spring Boot项目 可以通过Spring Initializr(<>)快速创建一个新的Spring Boot项目,添加Spring Web和Spring Boot DevTools依赖&…...
C++多线程编码二
1.lock和try_lock lock是一个函数模板,可以支持多个锁对象同时锁定同一个,如果其中一个锁对象没有锁住,lock函数会把已经锁定的对象解锁并进入阻塞,直到多个锁锁定一个对象。 try_lock也是一个函数模板,尝试对多个锁…...
【最新版】金媒婚恋系统v10.5最新稳定开源+原生前端小程序 PC端+安装教程
一.系统简介 1. 红娘服务 红娘服务模块是该系统的一大特色。专业红娘会通过分析用户的个人资料和偏好, 为用户提供精准的配对建议和个性化服务。用户可以预约红娘服务,通过红娘的介入,提升配对成功率。 2. 相亲活动 相亲活动模块用于组织和管…...
[spring] spring AOP - 面向切面编程の学习
[spring] spring AOP - 面向切面编程の学习 几年前开始还在被 spring 的八股文时,AOP 就是一个比较热也比较大的点,为了面试确实背过不少,不过 AOP 实现本身做的不多,一方面也是因为 AOP 一旦配置好了基本上就不需要改什么&#…...
JavaScript 中的 Reflect 详解
Reflect 是 ES6引入的一个内置对象,它提供了一系列静态方法来操作对象,这些方法与 Proxy 处理器方法一一对应。Reflect 的设计目的是为了更优雅地操作对象,并统一某些操作的行为。 1. Reflect 的基本特点 1. 不是构造函数:不能使…...
【操作系统】linux常用命令
UP作为一个Linux系统练习两年半的个人练习生,今天分门别类地给大家整理一下常用的Linux命令,祝大家在Linux练习之路一帆风顺。 文件和目录操作 文件查看与编辑 文件查找 文件权限与所有权 进程管理 系统信息与监控 网络管理与诊断...
002 vue组件化编程
文章目录 一般方式全局组件局部组件 组件(Component)是Vue.js最强大的功能之一 组件也是一个Vue实例,也包括:data、methods、生命周期函数等 组件渲染需要html模板,所以增加了template属性,值就是HTML模板 …...
常见的 JavaScript 框架和库
在现代前端开发中,JavaScript框架和库成为了构建高效、可维护应用程序的关键工具。本文将介绍四个常见的JavaScript框架和库:React、Vue.js、Angular 和 Node.js,并探讨它们的特点、使用场景及适用场合。 1. React — 构建用户界面的JavaScri…...
005_循环结构
循环结构 循环结构的作用和应用场景for循环while循环for和while的使用规范do - while 死循环循环嵌套break、continueRandom生成随机数 循环结构的作用和应用场景 减少代码的重复编写、灵活的控制程序的执行 for循环 for (1初始化语句; 2循环条件; 3迭代语句){4循环体语句(重…...
1110+款专业网站应用程序UI界面设计矢量图标figma格式素材 Icon System | 1,100+ Icons Easily Customize
1110款专业网站应用程序UI界面设计矢量图标figma格式素材 Icon System | 1,100 Icons Easily Customize 产品特点 — 24 x 24 px 网格大小 — 2px 线条描边 — 所有形状都是基于矢量的 — 平滑和圆角 — 易于更改颜色 类别 🚨 警报和反馈 ⬆️ 箭头 &…...
leetcode 368. 最大整除子集 中等
给你一个由 无重复 正整数组成的集合 nums ,请你找出并返回其中最大的整除子集 answer ,子集中每一元素对 (answer[i], answer[j]) 都应当满足: answer[i] % answer[j] 0 ,或answer[j] % answer[i] 0 如果存在多个有效解子集&…...
项目总结之常问的一些问题
1.项目功能介绍,重难点 重难点: mock工具使用(涉及到的三方接口过多,由于网络等原因无法调通,所以测试的时候,采用mock工具来模拟返回接口真正调用后响应数据) 2.项目负责哪部分?…...
51单片机实现精确定时
一、51单片机代码 #include <reg52.h>sbit LED P3^3;extern bit b10Ms; extern bit b100Ms; extern bit b1S; extern bit b10S;void Timer0_Init() {TMOD | 0x01; // 设置定时器0为模式1TH0 (65536 - 1000) / 256; // 高8位赋初值TL0 (65536 - 1000) % 256; // 低8位…...
记一次不太顺利的Docker重装
#记录工作 一、前言 默认情况下,Windows系统上Docker Desktop 安装在 :C:\Program Files\Docker\Docker; 目前正常下载能下载到最新版本是到v4.39.0,实际已经能找到v4.40.0版本来进行修复安装; 建议尽量不要改变Doc…...
【计网】TCP 协议详解 与 常见面试题
三次握手、四次挥手的常见面试题 不用死记,只需要清楚三次握手,四次挥手的流程,回答的时候心里要记住,假设网络是不可靠的 问题(1):为什么关闭连接时需要四次挥手,而建立连接却只要三次握手? 关…...
Docker介绍
Docker介绍 Docker 本身并不是容器,而是一个使用容器的工具。容器是 Linux 内核提供的技术,Docker 只是将这种技术的使用简便化了。Docker 的主要目标是 “Build,Ship and Run Any APP,Anywhere”(“一次封装,到处运行”…...
大模型推理--Qwen2.5-Omni在A100上的初体验
过去的一周Qwen2.5-Omni产生了很高的热度,吸引了很多人的目光。它的多模态确实很吸引人,放出来的demo体验还算尚可(语音对话的延迟还是太大),所以就在A100 PCIe上实地部署了一下,初步对其速度进行了测试&am…...
二分查找例题
本篇基于b站灵茶山艾府。 34. 在排序数组中查找元素的第一个和最后一个位置 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你…...
新增一种线性回归的增量学习框架,已更新31个模型!Matlab回归预测大合集又更新啦!
目录 效果图基本介绍程序设计参考资料 效果图 基本介绍 一种线性回归的增量学习框架,程序研究的主要内容是线性回归模型的增量学习实现及其在房价预测中的应用,旨在通过分块处理数据逐步更新模型,以适应动态数据环境并减少计算资源消耗。 详…...
P1025 [NOIP 2001 提高组] 数的划分(DFS)
题目描述 将整数 n 分成 k 份,且每份不能为空,任意两个方案不相同(不考虑顺序)。 例如:n7,k3,下面三种分法被认为是相同的。 1,1,5; 1,5,1; 5,1,1. 问有多少种不同的分法。 输入格式 n,k …...
SQL Server存储过程和触发器的使用
存储过程 (1)创建存储过程,使用Employees表中的员工人数来初始化一个局部变量,并调用这个存储过程。 1. Create PROCEDURE test number1 int output --输出参数,可以从程序中返回信息 2. As 3. begin 4. D…...
Elastic 的 OpenTelemetry 分发版(EDOT)现已正式发布:开源、可用于生产环境的 OTel
作者:来自 Elastic Miguel Luna 及 Bahubali Shetti Elastic 自豪地宣布正式发布 Elastic OpenTelemetry 分发版(Elastic Distributions of OpenTelemetry - EDOT),其中包含 Elastic 自定义版本的 OpenTelemetry Collector 以及多…...
springMVC-Json交互处理
什么是JSON JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛。 采用完全独立于编程语言的文本格式来存储和表示数据。 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也…...
MySQL中的索引
explain关键字, MySQL索引特性 索引的概念 MySQL 索引是一种用于提高数据库查询效率的数据结构 数据库表中存储的数据都是以记录为单位的,如果在查询数据时直接一条条遍历表中的数据记录,那么查询的时间复杂度将会是 O ( N )。索引的价值在…...
AI小白:JavaPython开发环境双轨制搭建指南
文章目录 1 Python深度学习环境配置1.1 Anaconda生态体系建设1.2 JupyterLab高效工作流魔法命令与可视化调试扩展插件配置指南 2 Java深度学习方案:DL4J实战2.1 企业级部署架构设计2.2 集成传统Java系统Spring Boot微服务封装模型性能优化技巧 1 Python深度学习环境…...