【linux】线程概念与控制
引言
当现代CPU的晶体管密度逼近物理极限,多核架构已成为突破性能瓶颈的必由之路。在这个计算密集型任务与异步IO需求并行的时代,多线程编程不再是可选项,而是开发者必须掌握的核心技能。Linux作为承载着全球90%云计算负载的操作系统,其线程实现机制既凝聚着UNIX哲学的精髓,又蕴含着处理器架构演进的智慧。
线程概念
通俗的讲:线程叫做进程内的一个执行流,CPU调度的基本单位。我们所说过一个进程是可以把自己的代码划分成一个部分,让另外的一个执行流去执行。之前我们是通过fork创建子进程然后用if判断,然后父子进程可以执行不同的代码块或者执行流(有写时拷贝)。所以一个进程是可以把自己的一部分资源交给另外一个执行流,让他去执行。如果我们今天把这个进程的代码区、已初始化、未初始化,堆区、共享区、栈区等等...尤其是代码区把它拆分成若干个不同的子区域,让我们当前进程去执行,相当于把页表分为若干部分让我们对应的当前的这个进程去使用。而这次在创建“进程”的时候,只创建一个的PCB,它最终指向的地址空间不再独立创建,而是和附近程指向同一个虚拟地址空间。我们把这种只创建PCB来让我们从父进程当中给它分配资源的这种执行流,我们就可以称其为叫做线程。
有了对进程,文件..的理解,操作系统肯定要设计专门的内核数据结构来对线程进行管理。这个结构一般称之为TCB(thread control block叫做线程控制块)。Linux的设计者认为,进程和线程都是执行流,具有极度的相似性,没必要单独设计数据结构和算法直接复用代码,使用进程来模拟线程。所以Linux内核没有真正意义上的线程,没有为线程专门设计单独的数据结构(windows有),是用pcb来模拟线程,是一种完全属于自己的一套线程方案。
CPU调度的时候以LWP为标识符表示一个特定的执行流。创建一个线程其实就是在进程中创建一个pcb,每一个pcb都有一个唯一标识lwp。操作系统调度的时候只看lwp而不看pid,pid只是系统划分资源一种统一的方式。
现在我们就可以对于进程有了一个新的认识。概念重构:什么是进程?进程就是一堆pcb一个地址空间一个页表还有对应物理内存的一部分,这个整体我们叫做一个进程。他是承担分配系统资源的基本实体。进程用来整体申请资源,线程用来伸手向进程要资源。站在CPU的视角每一个pcb(task_struct)都可以称之为轻量级进程。操作系统和用户只认线程,因为Linux没有线程这样的概念只有轻量进程的概念,所以Linux无法直接提供创建线程的系统调用接口,只能给我们提供创建轻量级进程的接口。Linux没有创建线程的系统调用接口,这个接口是由库提供给我们的。我们需要与这个原生线程库建立链接,这个库叫做pthread库。下面我们来看一看这个库在哪以及底层创建线程的系统调用函数。
#include <iostream>
#include <cstdio>
#include <cassert>
#include <pthread.h>
#include <unistd.h>using namespace std;int g_val = 0;// std::ostream fun()
std::string fun()
{return "我是一个独立的方法";// std::iostream myos;// myos << "我是一个独立的方法";// return myos;
}// 新线程
void *thread_routine(void *args)
{const char *name = (const char *)args;while (true){fun();cout << "我是新线程, 我正在运行! name: " << name << " : "<< fun() << " : " << g_val++ << " &g_val : " << &g_val << endl;sleep(1);}
}int main()
{// typedef unsigned long int pthread_t;pthread_t tid;int n = pthread_create(&tid, nullptr, thread_routine, (void *)"thread one");assert(0 == n);(void)n;// 主线程while (true){// 地址 -> ?char tidbuffer[64];snprintf(tidbuffer, sizeof(tidbuffer), "0x%x", tid);cout << "我是主线程, 我正在运行!, 我创建出来的线程的tid: " << tidbuffer << " : " << g_val << " &g_val : " << &g_val << endl;sleep(1);}return 0;
}
线程控制
线程创建
- thread是输出型参数返回该线程的tid
- attr是对于线程的属性设置(一般用默认设置传nullptr)
- start_routine是一个函数指针(线程去执行这个可重入函数)
- arg是传入函数的参数
- 创建成功返回0,不成功返回错误码。
大部分系统调用接口如果不成功会将错误码保存在全局变量errno中,关于线程函数的调用一般成功返回0,不成功返回错误码,为什么不创建一个全局变量errno,保存在errno上呢?因为线程之间的数据共享,多线程之间去访问那个全局变量,我们缺乏对数据进行有效的访问控制而带来一些问题。
线程等待
线程也是需要被等待的。如果不等待会造成类似僵尸进程的问题,内存泄漏。线程退出可以获取线程的退出信息。回收线程对应的pcb等内核资源防止内存泄漏。把线程进行join,操作系统会自动去回收曾经进程创建的轻量级进程相关的资源,把资源进回收之后就进行释放。
线程中止
在线程函数中调用pthread_exit或者return直接退出或者调用线程取消函数pthread_cancel(tid),线程要被取消,前提是这个线程已经跑起来了。线程如果是被取消的,他的退出码是-1.
exit不能用来终止线程,因为exit是用来终止进程的,任何一个执行流调用exit都会让整个进程退出。特别的,一个线程如果出现了异常,会影响去他线程。因为线程健壮性或者鲁棒性较差,进程信号是整体发给进程的。
线程分离
int pthread_detach(pthread_t thread);
pthread_t pthread_self() //获取线程tid
- 默认情况下,新创建的线程是joinable的,线程退出后,需要对其进行pthread_join操作,否则无法释放资源,从而造成系统泄漏。
- 如果不关心线程的返回值,join是一种负担,这个时候,我们可以告诉系统,当线程退出时,自动释放线程资源。
#include <iostream>#include <cstdlib>#include <string>#include <cassert>#include <vector>#include <pthread.h>#include <unistd.h>using namespace std;当成结构体使用class ThreadData{public:int number;pthread_t tid;char namebuffer[64];};class ThreadReturn{public:int exit_code;int exit_result;};1. start_routine, 现在是被几个线程执行呢?10, 这个函数现在是什么状态?重入状态2. 该函数是可重入函数吗?是的!3. 在函数内定义的变量,都叫做局部变量,具有临时性 -- 今天依旧适用 -- 在多线程情况下, 也没有问题 -- 其实每一个线程都有自己独立的栈结构!void *start_routine(void *args){sleep(1);一个线程如果出现了异常,会影响其他线程吗?会的(健壮性或者鲁棒性较差)为什么?进程信号,信号是整体发给进程的!ThreadData *td = static_cast<ThreadData *>(args); // 安全的进行强制类型转化int cnt = 10;while (cnt){cout << "cnt: " << cnt << " &cnt: " << &cnt << endl; // bugcnt--;sleep(1);return nullptr;pthread_exit(nullptr);exit(0); // 能不能用来终止线程,不能,因为exit是终止进程的!,任何一个执行流调用exit都会让整个进程退出cout << "new thread create success, name: " << td->namebuffer << " cnt: " << cnt-- << endl;int *p = nullptr;// p = nullptr;*p = 0;}线程如何终止的问题delete td;pthread_exit(nullptr);return nullptr; // 线程函数结束,return的时候,线程就算终止了return (void*)td->number; // warning, void *ret = (void*)td->number;return (void *)106;pthread_exit((void*)111); // 既然假的地址,整数都能被外部拿到,那么如何返回的是,堆空间的地址呢?对象的地址呢?ThreadReturn * tr = new ThreadReturn();tr->exit_code = 1;tr->exit_result = 106;ThreadReturn tr; // 在栈上开辟的空间 return &tr;return (void*)100; //右值}int main(){1. 我们想创建一批线程vector<ThreadData*> threads;#define NUM 10for(int i = 0; i < NUM; i++){ThreadData *td = new ThreadData();td->number = i+1;snprintf(td->namebuffer, sizeof(td->namebuffer), "%s:%d", "thread", i+1);pthread_create(&td->tid, nullptr, start_routine, td);threads.push_back(td);pthread_create(&tid, nullptr, start_routine, (void*)"thread one");pthread_create(&tid, nullptr, start_routine, namebuffer);sleep(1);}for(auto &iter : threads){cout << "create thread: " << iter->namebuffer << " : " << iter->tid << " suceesss" << endl;}线程是可以被cancel取消的!注意:线程要被取消,前提是这个线程已经跑起来了线程如果是被取消的,退出码:-1PTHREAD_CANCELED;sleep(5);for(int i = 0; i < threads.size()/2; i++){pthread_cancel(threads[i]->tid);cout << "pthread_cancel : " << threads[i]->namebuffer << " success" << endl;}for(auto &iter : threads){void *ret = nullptr; // 注意: 是void *哦? : 为什么没有见到,线程退出的时候,对应的退出信号??? 线程出异常,收到信号,整个进程都会退出!pthread_join:默认就认为函数会调用成功!不考虑异常问题,异常问题是你进程该考虑的问题!int n = pthread_join(iter->tid, (void**)&ret); // void ** retp; *retp = return (void*)td->numberassert(n == 0);cout << "join : " << iter->namebuffer << " success, exit_code: " << (long long)ret << endl;delete iter;}cout << "main thread quit " << endl;while (true){cout << "new thread create success, name: main thread" << endl;sleep(1);}pthread_t id;pthread_create(&id, nullptr, start_routine, (void *)"thread new");while (true){cout << "new thread create success, name: main thread" << endl;sleep(1);}return 0;}
线程的私有资源
线程一旦被创建,几乎所有的资源都是被所有线程共享的(代码和全局数据还有进程文件描述符表)。线程一定要有自己的私有资源。什么资源应该是线程私有的呢?pcb属性私有,上下文结构,每一个线程都要有自己独立的栈结构(保存局部变量)。因为线程是动态切换的,如果我的代码没有运行完,需要保存上下文数据和代码,然后进行线程切换,等切换回来后继续向下执行。在函数内定义的变量,叫做局部变量,具有临时性。可以证明每个线程都有自己独立的栈结构。
线程优点
- 创建一个新线程的代价要比创建一个新进程小得多
- 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多
- 线程占用的资源要比进程少很多
- 能充分利用多处理器的可并行数量
- 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务
- 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现
- I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作。
线程缺点
- 性能损失
- 一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。
- 健壮性降低
- 编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。
- 缺乏访问控制
- 进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。
- 编程难度提高
- 编写与调试一个多线程程序比单线程程序困难得多
线程用途
- 合理的使用多线程,能提高CPU密集型程序的执行效率
- 合理的使用多线程,能提高IO密集型程序的用户体验(如生活中我们一边写代码一边下载开发工具,就是多线程运行的一种表现)
面试题
与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多的原因(面试题)
- 1.进程要切换需要:切换页表 切换虚拟地址空间 切换pcb 切换上下文
- 2.线程切换:切换pcb和上下文
- 3. 软件存在一种属性叫做局部性原理,当前正在访问的代码或者数据附近的代码非常有较大的概率被访问到的热点数据,当前你正在访问第一万行代码,我们就可以先把十万行以后的代码先切出去。
-
计算机页面置换的原理:如果当前一个进程内部正在进程处理,他的代码和数据会预先或者整体被放到了cache当中。然后cpu在进行读取时,他不会中间访问内存而是现在cache中读取,如果没有命中CPU会再次从内存中读取,先缓存到cache里...。线程切换cache不用太更新,但是进程切换全部要更新。这就是与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多的原因。热点数据就是经常要被访问的数据(被当前进程以较高的概率命中的 这里对热点数据进行判断需要时间):计算密集型应用(CPU,加密,解密,算法等) 、I/O密集型应用(外设,访问磁盘显示器网络)。
-
线程tid的含义
线程库实现了对线程的管理,比操作系统实现要简单的多,所以线程库是怎么实现的呢?他直接有一个线程就创建一个这样的我们的线程的结构体,我们可以简单称之为叫做TCB(thread control block)。线程库会创建一个thread* []threads数组去管理线程。为了更好的去找到某一个线程,我们只需要找到它数组的起始位置就可以。所以线程的TID对应的就是这一块或者这一块在库当中的起始地址。
结语
Linux采用进程模拟线程,通过PCB(进程控制块)而非专用TCB管理线程,形成轻量级进程(LWP)。每个线程对应独立PCB,共享进程的虚拟地址空间(代码、数据、堆等),线程栈为私有资源。CPU调度以LWP为标识符,操作系统仅识别线程级执行流,进程作为资源分配实体,线程通过共享资源提升效率。Linux线程模型以轻量级进程为核心,平衡效率与实现复杂度,在多核时代成为高性能计算基石,但其共享资源机制对开发者线程安全提出更高要求。理解其底层机制是优化多线程程序的关键。
相关文章:
【linux】线程概念与控制
引言 当现代CPU的晶体管密度逼近物理极限,多核架构已成为突破性能瓶颈的必由之路。在这个计算密集型任务与异步IO需求并行的时代,多线程编程不再是可选项,而是开发者必须掌握的核心技能。Linux作为承载着全球90%云计算负载的操作系统…...
Cesium 自定义路径导航材质
cesium 自定义路径导航纹理图片随便更换,UI 提供设计图片即可达到效果; 打开小马的weix 关注下 搜索“技术链” 回复关键词《《路径》》获取原始代码; 拿到就能用轻松解决!帮忙点个关注吧!...
用 pytorch 从零开始创建大语言模型(五):预训练无标注数据
用 pytorch 从零开始创建大语言模型(五):预训练无标注数据 5 预训练无标注数据5.1 评估文本生成模型5.1.1 使用 GPT 生成文本5.1.2 计算文本生成损失5.1.3 计算训练集和验证集的损失 5.2 训练 LLM5.3 解码策略以控制随机性5.3.1 温度缩放&am…...
[AI速读]混合验证方案:如何高效解决RISC-V向量扩展的验证难题
RISC-V作为一种开源指令集架构,近年来在AI和高性能计算领域备受关注。其向量扩展(RVV)为处理并行数据提供了强大的支持,但复杂的异常处理和冒险检测机制也带来了验证上的巨大挑战。本文将结合一篇技术论文,解析一种混合验证方案,帮助开发者更高效地解决RVV的验证问题。 一…...
模型空间、图纸空间、布局(Layout)之间联系——CAD c#二次开发
在 AutoCAD 的二次开发中,**模型空间(Model Space)**、**图纸空间(Paper Space)** 和 **布局(Layout)** 是三个核心概念,它们的关系及开发中的操作逻辑如下: --- 1. 模…...
Linux 日常开发常用命令(解释-全)
帮助类 #查看cd命令的帮助信息 [rootcentos100 ~] help cd # 查看网卡配置信息 [rootcentos100 ~] ifconfig # 检测到目标主机是否连接正常 [rootcentos100 ~] ping IP地址[rootcentos100 ~] ssh [-p port] userremote #远程登录user 是在远程机器上的用户名,如果…...
数据库监控:确保业务连续性和用户体验
在数字化时代,数据库作为企业的数据心脏,其重要性不言而喻。无论是交易系统、客户关系管理系统,还是数据分析平台,都离不开数据库的支撑。然而,数据库的运行状态和性能直接影响着企业的业务连续性和用户体验。因此&…...
Java面试黄金宝典9
1. Redis 持久化机制 Redis 提供了两种主要的持久化机制:RDB(Redis Database)和 AOF(Append Only File),下面对这两种机制进行详细介绍。 RDB(Redis Database) 原理:RDB …...
【C#】WinForm自定义控件及窗体
前言 WinForm(Windows Forms)是Microsoft.NET框架中的技术,用于开发Windows桌面应用程序。它提供了一套丰富的控件和组件。通过拖放控件、编写事件处理程序等方式快速构建用户界面。 通过属性窗口定制这些控件的外观和行为。 通过数据绑定&am…...
VideoHelper 油猴脚本,重塑你的视频观看体验
VideoHelper 油猴脚本,重塑你的视频观看体验 在日常上网看视频时,你是否也被这些问题困扰:视频网站开头的广告又臭又长,找个合适的播放倍速要在一堆选项里翻半天,每次手动调音量、点全屏按钮繁琐又影响沉浸感…...
从收藏夹到知识图谱:书签管理器如何重塑你的信息获取方式?
在信息爆炸的今天,浏览器收藏夹早已沦为 “数字垃圾堆”—— 杂乱无章的网址、重复的标签、过期的链接,不仅降低效率,更成为信息焦虑的源头。智能书签管理器通过AI分类、跨平台同步、隐私保护等黑科技,重塑您的数字生活方式。书签…...
SOFABoot-07-版本查看
前言 大家好,我是老马。 sofastack 其实出来很久了,第一次应该是在 2022 年左右开始关注,但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 sofaboot 系列 SOFABoot-00-sofaboot 概览 SOFABoot-01-蚂蚁金服开源的 s…...
[极客大挑战 2019]Http_3.19BUUCTF练习day3(1)
BUUCTF练习day3(1)_[极客大挑战 2019]Http 打开靶场,查看源码(如果在做题时没有什么发现就查看源码) 打开Secret.php提示没有来自https://Sycsecret.buuoj.cn 添加Referer头为https://Sycsecret.buuoj.cn(提示说我们没有来自那个网址,那我们…...
golang Error的一些坑
golang Error的一些坑 golang error的设计可能是被人吐槽最多的golang设计了。 最经典的err!nil只影响代码风格设计,而有一些坑会导致我们的程序发生一些与我们预期不符的问题,开发过程中需要注意。 errors.Is判断error是否Wrap不符合预期 …...
弱网测试:全链路实战、高阶策略与自动化落地
在移动互联网时代,网络环境的不确定性成为用户体验的“隐形杀手”。弱网测试不仅是质量保障的必备环节,更是提升用户留存率和业务转化率的战略手段。 本文将从 工具链深度配置、复杂场景模拟、性能优化底层逻辑 和 自动化流水线集成 四个维度,彻底解析弱网测试的完整方法论…...
Ubuntu检查并启用 Nginx 的stream模块或重新安装支持stream模块的Nginx
stream 模块允许 Nginx 处理 TCP 和 UDP 流量,常用于负载均衡和端口转发等场景。本文将详细介绍如何检查 Nginx 是否支持 stream 模块,以及在需要时如何启用该模块。 1. 检查 Nginx 是否支持 stream 模块 首先,需要确认当前安装的 Nginx 是…...
mac brew 安装的php@7.4 打开redis扩展
1. 找到php7.4的pecl目录 一般在这个位置 cd /usr/local/Cellar/php7.4/7.4.33_8/pecl/20190902 ls 一下 有个 redis.so 于是 直接去php.ini编辑了 php.ini的路径 vim /usr/local/etc/php/7.4/php.ini 把938行添加进去 然后重启一下 php7.4 brew services restart ph…...
Redis 内存管理
Redis 内存管理 1. Redis 给缓存数据设置过期时间的作用 给缓存数据设置过期时间(TTL, Time-To-Live)有以下几个重要作用: (1) 自动释放内存 避免缓存数据无限增长,导致 Redis 内存溢出。例如,在 会话管理、短连接…...
学习CSS滤镜属性 `filter: invert()`
一、核心机制 数学原理 invert(1) 对每个像素的RGB通道执行 颜色反相计算: 新通道值 255 - 原通道值 例如 rgb(255,0,0)(纯红)会转换为 rgb(0,255,255)(青色)。 透明度处理 该滤镜会保留元素的Alpha通道(…...
网络空间安全专业发展历程及开设院校
一、专业发展历程 1. 早期探索阶段(1990年代末—2000年代初) (1)背景: 1990年代互联网进入中国,计算机病毒、黑客攻击等问题逐渐显现,社会对信息安全人才的需求开始萌芽。 (2&…...
Linux中mutex机制
在Linux中,mutex是一种用于多线程编程的同步机制,用于保护共享资源,防止多个线程同时访问或修改这些资源,从而避免竞态条件的发生。mutex 是“mutual exclusion”的缩写,意为“互斥”。 1. Mutex 的基本概念 互斥锁&…...
Web网页
1.结构与表现分离 HTML用于结构 css用于表现,增加了丰富的样式效果,极大满足了开发者的需求 选择器;用于指定css样式作用的html对象{}选择某个属性 p标签 color;本颜色 font-size:子属性 字大小 font-family;字体 font-…...
Redis 在windows下的下载安装与配置
参考链接:https://developer.aliyun.com/article/1395346 下载 Redis 访问 Redis 下载地址:https://github.com/tporadowski/redis/releases 下载 Redis 时,你可以选择 ZIP 包或 MSI 安装: ZIP包:需要手动解压、初始化、配置和…...
基于随机森林回归预测葡萄酒质量
基于随机森林回归预测葡萄酒质量 1.作者介绍2.随机森林算法与数据集介绍2.1定义2.2核心思想2.3主要步骤2.4数据集介绍 3.算法实现3.1数据加载与探索3.2数据可视化3.3数据预处理(标准化、划分训练/测试集)3.4模型训练与优化(随机森林回归 超参…...
在大数据开发中ETL是指什么?
hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在数字经济时代,数据已成为企业最核心的资产。然而,分散在业务系统、日志文件…...
Centos操作系统安装及优化
Centos操作系统安装及优化 零、环境概述 主机名 centos版本 cpu 内存 Vmware版本 ip地址 test CentOS Linux release 7.6.1810 (Core) 2C 2G 15.5.1 10.0.0.10 一、介质下载 1、7.6版本下载 CentOS7.6标准版下载链接: https://archive.kernel.org/centos-vault/7.6.1810/i…...
2025年03月10日人慧前端面试(外包滴滴)
目录 普通函数和箭头函数的区别loader 和 plugin 的区别webpack 怎么实现分包,为什么要分包webpack 的构建流程变量提升react 开发中遇到过什么问题什么是闭包vue 开发中遇到过什么问题vue中的 dep 和 watcher 的依赖收集是什么阶段什么是原型链react setState 是同…...
NLP高频面试题(十)——目前常见的几种大模型架构是啥样的
深入浅出:目前常见的几种大模型架构解析 随着Transformer模型的提出与发展,语言大模型迅速崛起,已经成为人工智能领域最为关注的热点之一。本文将为大家详细解析几种目前常见的大模型架构,帮助读者理解其核心差异及适用场景。 1…...
【数据结构】栈(Stack)、队列(Queue)、双端队列(Deque) —— 有码有图有真相
目录 栈和队列 1. 栈(Stack) 1.1 概念 1.2 栈的使用(原始方法) 1.3 栈的模拟实现 【小结】 2. 栈的应用场景 1、改变元素的序列 2、将递归转化为循环 3、逆波兰表达式求值 4、括号匹配 5、出栈入栈次序匹配 6、最小栈…...
windows清除电脑开机密码,可保留原本的系统和资料,不重装系统
前言 很久的一台电脑没有使用了,开机密码忘了,进不去系统 方法 1.将一个闲置u盘设置成pe盘(注意,这个操作会清空原来u盘的数据,需要在配置前将重要数据转移走,数据无价,别因为配置这个丢了重…...
NLP高频面试题(九)——大模型常见的几种解码方案
大模型常见的几种解码方案 在自然语言生成任务中,如何从模型生成的概率分布中选择合适的词汇,是影响文本质量的关键问题。常见的解码方法包括贪心搜索(Greedy Search)、束搜索(Beam Search)、随机采样&…...
「低延迟+快速集成:Amazon IVS如何重塑实时互动视频体验?」
引言:实时视频的爆发与开发痛点 随着直播电商、在线教育、云游戏的兴起,实时视频互动成为用户体验的核心。但自建视频服务面临高成本、高延迟、运维复杂等挑战。Amazon IVS(Interactive Video Service)作为亚马逊云科技推出的全托…...
JVM垃圾回收笔记02-垃圾回收器
文章目录 前言1.串行(Serial 收集器/Serial Old 收集器)Serial 收集器Serial Old 收集器相关参数-XX:UseSerialGC 2.吞吐量优先(Parallel Scavenge 收集器/Parallel Old 收集器)Parallel Scavenge 收集器Parallel Old 收集器相关参数-XX:UseParallelGC ~ -XX:UseParallelOldGC-…...
Agent Team 多智能体系统解析
引言 在人工智能技术高速发展的今天,"多智能体协作系统"(Agent Team)正成为突破效率瓶颈的关键技术。与传统的单体AI不同,这种由多个专业化智能体组成的协同网络,通过分工协作和动态调整,展现出…...
LintCode第1712题 - 和相同的二元子数组
描述 在由若干 0 和 1 组成的数组 A 中,有多少个和为 S 的非空子数组 样例 1: 输入:A [1,0,1,0,1], S 2 输出:4 解释: 如下面黑体所示,有 4 个满足题目要求的子数组: [1,0,1] [1,0,1] [1,0,1,0] [0,1,…...
网络HTTPS协议
Https HTTPS(Hypertext Transfer Protocol Secure)是 HTTP 协议的加密版本,它使用 SSL/TLS 协议来加密客户端和服务器之间的通信。具体来说: • 加密通信:在用户请求访问一个 HTTPS 网站时,客户端&#x…...
0322-数据库、前后端
前端 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Insert title here</title> <script srcjs/jquery-3.7.1.min.js></script> <script> //jquaryajax发起请求 //传参形式不同 post用data{}…...
六十天前端强化训练之第二十六天之Vue Router 动态路由参数大师级详解
欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗,谢谢大佬! 目录 一、知识讲解 1. Vue Router 核心概念 2. 动态路由参数原理 3. 参数传递方案对比 二、核心代码示例 1. 完整路由配置 2. 参数接收组件 3. 导航操作示例 三、实现效果示…...
L2TP实验
一、拓朴图 二、实验配置 1.基础配置 1.1接口IP及服务配置 [PPPoE Client]interface GigabitEthernet 0/0/0 [PPPoE Client-GigabitEthernet0/0/0]service-manage all permit [NAS]interface GigabitEthernet 0/0/0 [NAS-GigabitEthernet0/0/0]ip add 192.168.0.2 24 [NAS-Gi…...
uni-app——数据缓存API
数据缓存API 在 uni-app 开发中,数据缓存 API 起着重要作用,它能够将需要的数据保存到本地,同时也提供了获取本地缓存数据、移除缓存数据以及清理缓存数据的功能。在实际项目里,数据缓存 API 常被用于存储会员登录状态信息、购物…...
不做颠覆者,甘为连接器,在技术叠层中培育智能新物种
--- 一、技术融合的必然:从“非此即彼”到“兼容共生” 当大模型的热浪撞上传统IT的礁石,企业智能化的真相浮出水面: 新旧技术的“量子纠缠”:MySQL与向量数据库共享数据总线,规则引擎与大模型共处决策链路 需求进…...
尝试在软考65天前开始成为软件设计师-计算机网络
OSI/RM 七层模型 层次名功能主要协议7应用层实现具体应用功能 FTP(文件传输)、HTTP、Telnet、 POP3(邮件)SMTP(邮件) ------- DHCP、TFTP(小文件)、 SNMP、 DNS(域名) 6表示层数据格式,加密,压缩.....5会话层建立,管理&终止对话4传输层端到端连接TCP,UDP3网络层分组传输&a…...
JDBC 连接字连接 KingbaseES支持主从负载均衡参数说明。
JDBC 连接字符串是用于连接 KingbaseES(人大金仓数据库)的,支持主从负载均衡。让我们逐一解析各个参数的作用,并探讨如何调整到最优。 参数解析 jdbc:kingbase8://10.10.14.19:54321/xxx_onlinejdbc:kingbase8://:指定…...
OpenCV旋转估计(4)生成一个字符串表示的匹配图函数 matchesGraphAsString()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 matchesGraphAsString 函数是OpenCV库中的一部分,位于 cv::detail 命名空间下。这个函数的主要作用是生成一个字符串表示的匹配图&am…...
扣子平台知识库不能上传成功
扣子平台知识库不能上传成功 目录 扣子平台知识库不能上传成功查看模板复制头部到自己的excel中json数据转为excel或者csv(一定使用excel,csv总是报错) 查看模板复制头部到自己的excel中 json数据转为excel或者csv(一定使用excel&…...
CIFAR10 数据集自定义处理方法
CIFAR10 数据集自定义处理方法 可以自定义训练集和测试集中不同类别的样本的数量。可用于模拟类别不平衡问题,存在混淆数据问题。 import torch import torchvision.datasets as dsets import torchvision.transforms as transforms from torch.utils.data import…...
当发现提示少文件,少目录时时,external.css的内容
[ERROR ]17:30:44| Loger: 处理群消息时发生错误:[Errno 2] No such file or directory: \\venv\\lib\\site-packages\\ncatbot\\utils\\template/external.css venv\\lib\\site-packages\\ncatbot\\utils\\template/external.css ["https://stackpath.boots…...
OpenHarmony 开源鸿蒙北向开发——linux使用make交叉编译第三方库
这几天搞鸿蒙,需要编译一些第三方库到鸿蒙系统使用。 头疼死了,搞了一个多星期总算搞定了。 开贴记坑。 一、SDK下载 1.下载 在linux下使用命令 wget https://cidownload.openharmony.cn/version/Master_Version/OpenHarmony_5.1.0.54/20250313_02…...
【计算机网络】网络简介
文章目录 1. 局域网与广域网1.1 局域网1.2 广域网 2. 路由器和交换机3. 五元组3.1 IP和端口3.2 协议3.3 协议分层 4. OSI七层网络协议5. TCP/IP五层模型5.1 TCP/IP模型介绍5.2 网络设备所在分层 6. 封装与分用6.1 数据包的称谓6.2 封装6.3 分用 1. 局域网与广域网 1.1 局域网 …...
k8s--集群内的pod调用集群外的服务
关于如何让同一个局域网内的Kubernetes服务的Pod访问同一局域网中的电脑上的服务。 可能的解决方案包括使用ClusterIP、NodePort、Headless Service、HostNetwork、ExternalIPs,或者直接使用Pod网络。每种方法都有不同的适用场景,需要逐一分析。 例如&…...