NS3学习——tcpVegas算法代码详解(1)
目录
一、源码
二、详解
1.定义日志和命名空间
2.注册Typeld类:TcpVegas和GetTypeId方法的实现
3.构造函数和析构函数
4.TcpVegas类中成员函数
(1) Fork函数
(2) PktsAcked函数
(3) EnableVegas函数
(4) DisableVegas函数
一、源码
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/** Copyright (c) 2016 ResiliNets, ITTC, University of Kansas** This program is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License version 2 as* published by the Free Software Foundation;** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* GNU General Public License for more details.** You should have received a copy of the GNU General Public License* along with this program; if not, write to the Free Software* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA** Author: Truc Anh N. Nguyen <annguyen@ittc.ku.edu>** James P.G. Sterbenz <jpgs@ittc.ku.edu>, director* ResiliNets Research Group http://wiki.ittc.ku.edu/resilinets* Information and Telecommunication Technology Center (ITTC)* and Department of Electrical Engineering and Computer Science* The University of Kansas Lawrence, KS USA.*/#include "tcp-vegas.h"
#include "tcp-socket-state.h"#include "ns3/log.h"namespace ns3 {NS_LOG_COMPONENT_DEFINE ("TcpVegas");
NS_OBJECT_ENSURE_REGISTERED (TcpVegas);TypeId
TcpVegas::GetTypeId (void)
{static TypeId tid = TypeId ("ns3::TcpVegas").SetParent<TcpNewReno> ().AddConstructor<TcpVegas> ().SetGroupName ("Internet").AddAttribute ("Alpha", "Lower bound of packets in network",UintegerValue (2),MakeUintegerAccessor (&TcpVegas::m_alpha),MakeUintegerChecker<uint32_t> ()).AddAttribute ("Beta", "Upper bound of packets in network",UintegerValue (4),MakeUintegerAccessor (&TcpVegas::m_beta),MakeUintegerChecker<uint32_t> ()).AddAttribute ("Gamma", "Limit on increase",UintegerValue (1),MakeUintegerAccessor (&TcpVegas::m_gamma),MakeUintegerChecker<uint32_t> ());return tid;
}TcpVegas::TcpVegas (void): TcpNewReno (),m_alpha (2),m_beta (4),m_gamma (1),m_baseRtt (Time::Max ()),m_minRtt (Time::Max ()),m_cntRtt (0),m_doingVegasNow (true),m_begSndNxt (0)
{NS_LOG_FUNCTION (this);
}TcpVegas::TcpVegas (const TcpVegas& sock): TcpNewReno (sock),m_alpha (sock.m_alpha),m_beta (sock.m_beta),m_gamma (sock.m_gamma),m_baseRtt (sock.m_baseRtt),m_minRtt (sock.m_minRtt),m_cntRtt (sock.m_cntRtt),m_doingVegasNow (true),m_begSndNxt (0)
{NS_LOG_FUNCTION (this);
}TcpVegas::~TcpVegas (void)
{NS_LOG_FUNCTION (this);
}Ptr<TcpCongestionOps>
TcpVegas::Fork (void)
{return CopyObject<TcpVegas> (this);
}void
TcpVegas::PktsAcked (Ptr<TcpSocketState> tcb, uint32_t segmentsAcked,const Time& rtt)
{NS_LOG_FUNCTION (this << tcb << segmentsAcked << rtt);if (rtt.IsZero ()){return;}m_minRtt = std::min (m_minRtt, rtt);NS_LOG_DEBUG ("Updated m_minRtt = " << m_minRtt);m_baseRtt = std::min (m_baseRtt, rtt);NS_LOG_DEBUG ("Updated m_baseRtt = " << m_baseRtt);// Update RTT counterm_cntRtt++;NS_LOG_DEBUG ("Updated m_cntRtt = " << m_cntRtt);
}void
TcpVegas::EnableVegas (Ptr<TcpSocketState> tcb)
{NS_LOG_FUNCTION (this << tcb);m_doingVegasNow = true;m_begSndNxt = tcb->m_nextTxSequence;m_cntRtt = 0;m_minRtt = Time::Max ();
}void
TcpVegas::DisableVegas ()
{NS_LOG_FUNCTION (this);m_doingVegasNow = false;
}void
TcpVegas::CongestionStateSet (Ptr<TcpSocketState> tcb,const TcpSocketState::TcpCongState_t newState)
{NS_LOG_FUNCTION (this << tcb << newState);if (newState == TcpSocketState::CA_OPEN){EnableVegas (tcb);}else{DisableVegas ();}
}void
TcpVegas::IncreaseWindow (Ptr<TcpSocketState> tcb, uint32_t segmentsAcked)
{NS_LOG_FUNCTION (this << tcb << segmentsAcked);if (!m_doingVegasNow){// If Vegas is not on, we follow NewReno algorithmNS_LOG_LOGIC ("Vegas is not turned on, we follow NewReno algorithm.");TcpNewReno::IncreaseWindow (tcb, segmentsAcked);return;}if (tcb->m_lastAckedSeq >= m_begSndNxt){ // A Vegas cycle has finished, we do Vegas cwnd adjustment every RTT.NS_LOG_LOGIC ("A Vegas cycle has finished, we adjust cwnd once per RTT.");// Save the current right edge for next Vegas cyclem_begSndNxt = tcb->m_nextTxSequence;/** We perform Vegas calculations only if we got enough RTT samples to* insure that at least 1 of those samples wasn't from a delayed ACK.*/if (m_cntRtt <= 2){ // We do not have enough RTT samples, so we should behave like RenoNS_LOG_LOGIC ("We do not have enough RTT samples to do Vegas, so we behave like NewReno.");TcpNewReno::IncreaseWindow (tcb, segmentsAcked);}else{NS_LOG_LOGIC ("We have enough RTT samples to perform Vegas calculations");/** We have enough RTT samples to perform Vegas algorithm.* Now we need to determine if cwnd should be increased or decreased* based on the calculated difference between the expected rate and actual sending* rate and the predefined thresholds (alpha, beta, and gamma).*/uint32_t diff;uint32_t targetCwnd;uint32_t segCwnd = tcb->GetCwndInSegments ();/** Calculate the cwnd we should have. baseRtt is the minimum RTT* per-connection, minRtt is the minimum RTT in this window** little trick:* desidered throughput is currentCwnd * baseRtt* target cwnd is throughput / minRtt*/double tmp = m_baseRtt.GetSeconds () / m_minRtt.GetSeconds ();targetCwnd = static_cast<uint32_t> (segCwnd * tmp);NS_LOG_DEBUG ("Calculated targetCwnd = " << targetCwnd);NS_ASSERT (segCwnd >= targetCwnd); // implies baseRtt <= minRtt/** Calculate the difference between the expected cWnd and* the actual cWnd*/diff = segCwnd - targetCwnd;NS_LOG_DEBUG ("Calculated diff = " << diff);if (diff > m_gamma && (tcb->m_cWnd < tcb->m_ssThresh)){/** We are going too fast. We need to slow down and change from* slow-start to linear increase/decrease mode by setting cwnd* to target cwnd. We add 1 because of the integer truncation.*/NS_LOG_LOGIC ("We are going too fast. We need to slow down and ""change to linear increase/decrease mode.");segCwnd = std::min (segCwnd, targetCwnd + 1);tcb->m_cWnd = segCwnd * tcb->m_segmentSize;tcb->m_ssThresh = GetSsThresh (tcb, 0);NS_LOG_DEBUG ("Updated cwnd = " << tcb->m_cWnd <<" ssthresh=" << tcb->m_ssThresh);}else if (tcb->m_cWnd < tcb->m_ssThresh){ // Slow start modeNS_LOG_LOGIC ("We are in slow start and diff < m_gamma, so we ""follow NewReno slow start");TcpNewReno::SlowStart (tcb, segmentsAcked);}else{ // Linear increase/decrease modeNS_LOG_LOGIC ("We are in linear increase/decrease mode");if (diff > m_beta){// We are going too fast, so we slow downNS_LOG_LOGIC ("We are going too fast, so we slow down by decrementing cwnd");segCwnd--;tcb->m_cWnd = segCwnd * tcb->m_segmentSize;tcb->m_ssThresh = GetSsThresh (tcb, 0);NS_LOG_DEBUG ("Updated cwnd = " << tcb->m_cWnd <<" ssthresh=" << tcb->m_ssThresh);}else if (diff < m_alpha){// We are going too slow (having too little data in the network),// so we speed up.NS_LOG_LOGIC ("We are going too slow, so we speed up by incrementing cwnd");segCwnd++;tcb->m_cWnd = segCwnd * tcb->m_segmentSize;NS_LOG_DEBUG ("Updated cwnd = " << tcb->m_cWnd <<" ssthresh=" << tcb->m_ssThresh);}else{// We are going at the right speedNS_LOG_LOGIC ("We are sending at the right speed");}}tcb->m_ssThresh = std::max (tcb->m_ssThresh, 3 * tcb->m_cWnd / 4);NS_LOG_DEBUG ("Updated ssThresh = " << tcb->m_ssThresh);}// Reset cntRtt & minRtt every RTTm_cntRtt = 0;m_minRtt = Time::Max ();}else if (tcb->m_cWnd < tcb->m_ssThresh){TcpNewReno::SlowStart (tcb, segmentsAcked);}
}std::string
TcpVegas::GetName () const
{return "TcpVegas";
}uint32_t
TcpVegas::GetSsThresh (Ptr<const TcpSocketState> tcb,uint32_t bytesInFlight)
{NS_LOG_FUNCTION (this << tcb << bytesInFlight);return std::max (std::min (tcb->m_ssThresh.Get (), tcb->m_cWnd.Get () - tcb->m_segmentSize), 2 * tcb->m_segmentSize);
}} // namespace ns3
二、详解
1.定义日志和命名空间
#include "tcp-vegas.h" //包含TCP Vegas算法的头文件。
#include "tcp-socket-state.h" //包含TCP套接字状态的头文件#include "ns3/log.h" //包含NS-3日志功能的头文件namespace ns3 {NS_LOG_COMPONENT_DEFINE ("TcpVegas"); //定义了一个日志组件,用于记录日志信息。
NS_OBJECT_ENSURE_REGISTERED (TcpVegas);
2.注册Typeld类:TcpVegas和GetTypeId方法的实现
TypeId
TcpVegas::GetTypeId (void)
{static TypeId tid = TypeId ("ns3::TcpVegas") //设置类的名称为TcpVegas 位于ns3命名空间下.SetParent<TcpNewReno> () //设置TcpVegas的父类为TcpNewReno.AddConstructor<TcpVegas> () //添加TcpVegas类的构造函数 创建相关对象.SetGroupName ("Internet") //将TcpVegas分类到"Internet"组下.AddAttribute ("Alpha", "Lower bound of packets in network",UintegerValue (2),MakeUintegerAccessor (&TcpVegas::m_alpha),MakeUintegerChecker<uint32_t> ()).AddAttribute ("Beta", "Upper bound of packets in network",UintegerValue (4),MakeUintegerAccessor (&TcpVegas::m_beta),MakeUintegerChecker<uint32_t> ()).AddAttribute ("Gamma", "Limit on increase",UintegerValue (1),MakeUintegerAccessor (&TcpVegas::m_gamma),MakeUintegerChecker<uint32_t> ());return tid; //返回TcpVegas的TypeId对象
}
AddAttribute方法用于添加类的属性,这些属性可以在NS-3的配置系统中设置和获取。
- "Alpha"、"Beta"和"Gamma"是TcpVegas算法的三个参数,它们分别控制算法的行为:
- "Alpha":网络中数据包的下界,初始值为2。
- "Beta":网络中数据包的上界,初始值为4。
- "Gamma":增加的极限,初始值为1。
- UintegerValue:设置属性的初始值。
- MakeUintegerAccessor:创建一个访问器,用于访问和修改属性值。
- MakeUintegerChecker<uint32_t>():创建一个检查器,确保属性值是有效的无符号整数。
该段代码在NS-3中注册TcpVegas类,并设置其属性和行为,使得TcpVegas可以在NS-3的模拟中被创建和配置。
3.构造函数和析构函数
TcpVegas::TcpVegas (void) //默认构造函数: TcpNewReno (), //TcpVegas通过调用其父类TcpNewReno的默认构造函数来进行初始化m_alpha (2),m_beta (4), m_gamma (1), m_baseRtt (Time::Max ()),m_minRtt (Time::Max ()),m_cntRtt (0),m_doingVegasNow (true),m_begSndNxt (0)
{NS_LOG_FUNCTION (this); //日志记录构造函数的调用,this指向当前对象的指针
}TcpVegas::TcpVegas (const TcpVegas& sock) //复制构造函数: TcpNewReno (sock),m_alpha (sock.m_alpha),m_beta (sock.m_beta),m_gamma (sock.m_gamma),m_baseRtt (sock.m_baseRtt),m_minRtt (sock.m_minRtt),m_cntRtt (sock.m_cntRtt),m_doingVegasNow (true),m_begSndNxt (0)
{NS_LOG_FUNCTION (this);
}TcpVegas::~TcpVegas (void) //析构函数
{NS_LOG_FUNCTION (this);
}
默认构造函数:
m_alpha (2)
,m_beta (4)
,m_gamma (1)
:这些行初始化TcpVegas
算法的参数alpha
、beta
和gamma
,分别设置为2、4和1。m_baseRtt (Time::Max ())
,m_minRtt (Time::Max ())
:将基础往返时间(baseRtt
)和最小往返时间(minRtt
)初始化为最大时间值,表示它们尚未被设置。m_cntRtt (0)
:初始化往返时间计数器(cntRtt
)为0。即用于计数自连接建立以来观测到的RTT样本数量。m_doingVegasNow (true)
:初始化标志doingVegasNow
为true
,表示Vegas算法默认是启用的。m_begSndNxt (0)
:初始化发送下一个序列号(begSndNxt
)为0。- 日志系统记录构造函数的调用,
this
指向当前对象的指针。
复制构造函数:用于创建一个与另一个TcpVegas
对象sock
相同的新对象。
: TcpNewReno (sock)
:表明TcpVegas
复制构造函数首先调用其父类TcpNewReno
的复制构造函数来复制父类成员。- 接下来,复制
sock
对象中的alpha
、beta
、gamma
、baseRtt
、minRtt
和cntRtt
成员变量的值到新对象。 m_doingVegasNow (true)
和m_begSndNxt (0)
:与默认构造函数类似,初始化doingVegasNow
为true
和begSndNxt
为0。- const TcpVegas& sock:参数
sock
是TcpVegas
类型的对象引用,它指向一个已经存在的对象
4.TcpVegas类中成员函数
(1) Fork函数
Ptr<TcpCongestionOps>
TcpVegas::Fork (void)
{return CopyObject<TcpVegas> (this);
}
Fork
函数用于创建当前TcpVegas
对象的一个副本,并返回这个副本的智能指针;Ptr<TcpCongestionOps>
是一个智能指针,指向TcpCongestionOps
类型的对象。Ptr
是NS-3中用于管理对象生命周期的智能指针模板类,而TcpCongestionOps
是一个抽象基类,代表TCP拥塞控制操作。CopyObject<TcpVegas> (this)
:这是NS-3中用于复制对象的模板函数,它创建了当前对象的一个副本,并返回一个指向新对象的智能指针。这里的this
指针指向当前的TcpVegas
对象。
(2) PktsAcked函数
void
TcpVegas::PktsAcked (Ptr<TcpSocketState> tcb, uint32_t segmentsAcked,const Time& rtt)
{NS_LOG_FUNCTION (this << tcb << segmentsAcked << rtt);if (rtt.IsZero ()){return;}m_minRtt = std::min (m_minRtt, rtt);NS_LOG_DEBUG ("Updated m_minRtt = " << m_minRtt);m_baseRtt = std::min (m_baseRtt, rtt);NS_LOG_DEBUG ("Updated m_baseRtt = " << m_baseRtt);// Update RTT counterm_cntRtt++;NS_LOG_DEBUG ("Updated m_cntRtt = " << m_cntRtt);
}
- PktsAcked函数在收到ACK时被调用,用于更新最小 RTT(m_minRtt)和基础 RTT(m_baseRtt),并统计 RTT 样本的数量 (m_cntRtt)。
- 如果 rtt 为零,则直接返回,不进行任何操作。这通常是为了避免处理无效的数据(例如无效的 ACK 或零延迟的情况)。
std::min
是 C++ 标准库中的一个函数模板,它返回两个参数中的较小值。- m_minRtt 表示当前连接或当前窗口内的最小 RTT。在每次收到 ACK 包时,如果新的 RTT 比当前记录的 m_minRtt 小,就会更新 m_minRtt。
std::min(m_minRtt, rtt) 会选择 m_minRtt 和当前 RTT 中较小的一个,并将其赋值给 m_minRtt。确保 m_minRtt 始终保持为最小的 RTT 值。 - m_baseRtt 用于记录连接过程中观察到的最小 RTT(通常是在连接的初期或网络的稳定阶段)。这代表了网络的基准延迟(即理想的延迟)。
- 与 m_minRtt 类似,m_baseRtt 会更新为当前 RTT 和已有的 m_baseRtt 中的最小值。这可以确保 m_baseRtt 始终为连接期间的最小延迟。
- m_cntRtt 是 RTT 样本的计数器。每次收到 ACK 包时,都会增加 m_cntRtt 的值,表示新的 RTT 样本被记录。
baseRtt 和 minRtt的区别见:
TCP Vegas拥塞控制算法——baseRtt 和 minRtt的区别-CSDN博客
(3) EnableVegas函数
void
TcpVegas::EnableVegas (Ptr<TcpSocketState> tcb)
{NS_LOG_FUNCTION (this << tcb);m_doingVegasNow = true;m_begSndNxt = tcb->m_nextTxSequence;m_cntRtt = 0;m_minRtt = Time::Max ();
}void
TcpVegas::DisableVegas ()
{NS_LOG_FUNCTION (this);m_doingVegasNow = false;
}
EnableVegas
函数用于启用Vegas算法。m_doingVegasNow
标志被设置为true
,表示Vegas算法现在被激活。m_begSndNxt
被设置为下一个传输序列号,用于跟踪Vegas周期的开始。- 将
m_cntRtt
成员变量重置为0,在每个新的Vegas周期开始时重置这个计数器。 - 将
m_minRtt
重置为Time::Max()
,即最大可能的时间值;用于在新的Vegas周期中重新寻找最小的RTT值。
(4) DisableVegas函数
void TcpVegas::DisableVegas ()
{NS_LOG_FUNCTION (this);m_doingVegasNow = false;
}
DisableVegas
函数用于禁用Vegas算法。m_doingVegasNow
标志被设置为false
,表示Vegas算法现在被禁用。
相关文章:
NS3学习——tcpVegas算法代码详解(1)
目录 一、源码 二、详解 1.定义日志和命名空间 2.注册Typeld类:TcpVegas和GetTypeId方法的实现 3.构造函数和析构函数 4.TcpVegas类中成员函数 (1) Fork函数 (2) PktsAcked函数 (3) EnableVegas函数 (4) DisableVegas函数 一、源码 /* -*- Mode:C; c-file-style:&qu…...
【RAII | 设计模式】C++智能指针,内存管理与设计模式
前言 nav2系列教材,yolov11部署,系统迁移教程我会放到年后一起更新,最近年末手头事情多,还请大家多多谅解。 上一节我们讲述了C移动语义相关的知识,本期我们来看看C中常用的几种智能指针,并看看他们在设计模式中的运…...
亚马逊云科技re:Invent:2025年将发生新变化
自从2006年推出Simple Storage Service(S3)和Elastic Compute Cloud(EC2)云计算服务以来,亚马逊云科技在过去的18年中,一直都是全球云计算技术的开创者和引领者。而随着人工智能技术的飞速发展和生成式AI时…...
某集团GIF动态验证码识别
注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 本文识别已同步上线至OCR识别网站: http://yxlocr.nat300.top/ocr/other/16 最近某集团更新了验证码,采用gif验证码,部分数据集展示如下...
llama.cpp:PC端测试 MobileVLM -- 电脑端部署图生文大模型
llama.cpp:PC端测试 MobileVLM 1.环境需要2.构建项目3.PC测试 1.环境需要 以下是经实验验证可行的环境参考,也可尝试其他版本。 (1)PC:Ubuntu 22.04.4 (2)软件环境:如下表所示 工…...
美国加州房价数据分析01
1.项目简介 本数据分析项目目的是分析美国加州房价数据,预测房价中值。 环境要求: ancondajupyter notebookpython3.10.10 虚拟环境: pandas 2.1.1 numpy 1.26.1 matplotlib 3.8.0 scikit-learn1.3.1 2. 导入并探索数据集 通用的数据分析…...
聚类算法DBSCAN 改进总结
目录 1. HDBSCAN (Hierarchical DBSCAN) 2. OPTICS (Ordering Points To Identify the Clustering Structure) 3. DBSCAN++ (DBSCAN with Preprocessing) 4. DBSCAN with k-distance 5. Density Peaks Clustering (DPC) 6. Generalized DBSCAN (GDBSCAN) 总结 是的,DBS…...
深入理解 Spring IoC 容器与依赖注入:从基本概念到高级应用的全面解析
IoC 容器与依赖注入 一、什么是IoC容器二、IoC原理1. 原理解释2. 一个通俗易懂的解释3. 举个例子a. 传统方式:手动创建对象b. IoC 和 DI:控制反转与依赖注入c. 解释d.总结三、依赖注入(DI)的三种方式1. 构造器注入(Constructor Injection)2. 字段注入(Field Injection)…...
什么是自我控制能力?如何提高自我控制能力?
什么是自我控制能力? 自我控制能力指,在遇到外在事物或者心理活动发生变化之时,人们仍然可以把握自身,指导接下来行动的能力。自我控制能力对一个人来说非常重要,因为在遇到一些事情之事,如果因为控制能力…...
【基于rust-wasm的前端页面转pdf组件和示例】
基于rust-wasm前端页面转pdf组件和示例 朔源多余的废话花哨的吹牛那点东西要不要拿来试试事到如今 做个美梦 我觉得本文的意义在于,wasm扩展了浏览器的边界,但是又担心如同java的web applet水土不服. 如同我至今看不出塞班和iOS的不同下载地址:在github的备份 朔源…...
Issac ROS navigation测试
软硬件环境 GPU: RTX 6000 Ada 系统: Ubuntu22.4 1. 启动Issac sim 从这个网页Develop on NVIDIA Omniverse Platform | NVIDIA Developer下载Omniverse Launcher, 然后执行./omniverse-launcher-linux.AppImage,从EXCHANGE里依次安装Isa…...
WWW23-多行为级联|级联图卷积网络的多行为推荐
论文:https://arxiv.org/abs/2303.15720 代码:https://github.com/SS-00-SS/MBCGCN 这篇论文MB-CGCN和上一篇CRGCN是同一个团队的,都是级联的方式。一个用了残差,一个用了特征转换,文章最后有discussion讨论了两者的不…...
实力认可 | 通付盾入选《ISC.AI 2024创新能力全景图谱》五项领域
近日,ISC.AI 2024创新能力百强(以下简称“创新百强”)正式发布《ISC.AI 2024创新能力全景图谱》。该全景图谱是由政企、资本、高校、行业力量共同完成了领域划分、综合创新等标准的制定,整合梳理了参评的300余家数字安全厂商、120…...
『Linux学习笔记』FRPC 详细介绍及配置解析!
『Linux学习笔记』FRPC 详细介绍及配置解析! 文章目录 一. FRPC 详细介绍及配置解析FRPC 的主要功能FRPC 配置文件解析全局配置代理配置第一个代理服务第二个代理服务 配置文件整体工作流程常见配置项说明FRPC 的使用步骤注意事项结论 二. 参考文献 一. FRPC 详细介…...
JS信息收集(小迪网络安全笔记~
免责声明:本文章仅用于交流学习,因文章内容而产生的任何违法&未授权行为,与文章作者无关!!! 附:完整笔记目录~ ps:本人小白,笔记均在个人理解基础上整理,…...
nmap扫描优化
扫描优化用来提高扫描效率。当描一个大范围网络中的主机时,如果使用通用的方法可能需要很长的时间,此时可以使用一些特定选项进行扫描优化,以提高扫描效率。Nmap提供了几种优化方式,如分组扫描、设置发包方式和超时时间等。 分组…...
Nautilus源码编译傻瓜式教程二
Nautilus源码编译傻瓜式教程一 Nautilus编译 依赖项文件 接上文,点击小锤子进行编译后出现如下的错误提示 看这个报错,未找到文件或目录,再看前面的git地址是github就知道肯定是下载有问题,查找下Nautilus项目,发现在nautilus/build-aux/flatpak/org.gnome.Nautilus.json文件…...
并发编程(19)——引用计数型无锁栈
文章目录 十九、day191. 引用计数2. 代码实现2.1 单引用计数器无锁栈2.2 双引用计数器无锁栈 3. 本节的一些理解 十九、day19 上一节我们学习通过侯删链表以及风险指针与侯删链表的组合两种方式实现了并发无锁栈,但是这两种方式有以下缺点: 第一种方式…...
Santa Claus 2 (st表的lower_bound用法)
题目链接:Santa Claus 2 #pragma GCC optimize(2) #include <bits/stdc.h> #define int long long #define fi first #define se second #define all(v) v.begin(),v.end() using namespace std; const int inf 0x3f3f3f3f3f3f3f; const int N 2e55; int …...
Reed-Muller(RM)码之编码
点个关注吧! 看了一些中文的博客,RM码没有很详细的资料,所以本文尝试给出推导原理。 推导 RM码由 ( r , m ) ( r , m ) (r,m)两个参数定义,记作 R M ( r , m ) RM(r,m) RM(r,m)。其中满足 0 ≤ r ≤ m 0 ≤ r ≤ m 0≤r≤m,含义为: 码长: n = 2 m n=2^m n=2m 维数:…...
新世纪的语言智能:GPT-5技术革新与市场前景展望
目录 引言 第一章:GPT-4的成就与局限 1.1 GPT-4的成功 1.2 GPT-4的局限性 第二章:对GPT-5技术革新的预测 2.1 增强的上下文理解能力 2.2 多模态能力的提升 2.3 创造力与多样性的增强 2.4 常识性知识与伦理性的提升 第三章:GPT-5的市…...
国高材服务 | 高分子结晶动力学表征——高低温热台偏光显微镜
众所周知,聚合物制品的实际使用性能(如光学透明性、硬度、模量等)与材料内部的结晶形态、晶粒大小及完善程度有着密切的联系,因此,对聚合物结晶形态等的研究具有重要的理论和实际意义。 随着结晶条件的不用,…...
python+PyPDF2实现PDF的文本内容读取、多文件合并、旋转、裁剪、缩放、加解密、添加水印
目录 读取内容 合并文件 旋转 缩放 裁剪 加密和解密 添加水印 安装:pip install PyPDF2 -i https://pypi.tuna.tsinghua.edu.cn/simple 读取内容 from PyPDF2 import PdfReader, PdfMerger, PdfWriterdef read_pdf(pdf_path):pdf_reader PdfReader(pdf_p…...
蓝桥杯物联网开发板硬件组成
第一节 开发板简介 物联网设计与开发竞赛实训平台由蓝桥杯大赛技术支持单位北京四梯科技有限公司设计和生产,该产品可用于参加蓝桥杯物联网设计与开发赛道的竞赛实训或院校相关课程的 实践教学环节。 开发板基于STM32WLE5无线微控制器设计,芯片提供了25…...
idea2024创建JavaWeb项目以及配置Tomcat详解
今天呢,博主的学习进度也是步入了JavaWeb,目前正在逐步杨帆旗航,迎接全新的狂潮海浪。 那么接下来就给大家出一期有关JavaWeb的配置教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正…...
【蓝桥杯每日一题】分糖果——DFS
分糖果 蓝桥杯每日一题 2024-12-24 分糖果 DFS 题目描述 两种糖果分别有 9 个和 16 个,要全部分给 7 个小朋友,每个小朋友得到的糖果总数最少为 2 个最多为 5 个,问有多少种不同的分法。糖果必须全部分完。 只要有其中一个小朋友在两种方案中…...
矩阵在资产收益(Asset Returns)中的应用:以资产回报矩阵为例(中英双语)
本文中的例子来源于: 这本书,网址为:https://web.stanford.edu/~boyd/vmls/ 矩阵在资产收益(Asset Returns)中的应用:以资产回报矩阵为例 在量化金融中,矩阵作为一种重要的数学工具,被广泛用于描述和分析…...
Jimureport h2命令执行分析记录
首先找testConnection接口,前面进行了jimureport-spring-boot-starter-1.5.8.jar反编译查找,接口找到发现请求参数是json var1是JmreportDynamicDataSourceVo类型,也就是如上图的dbSource,根据打印的结果可以知道这里是local cac…...
1114 Family Property (25)
This time, you are supposed to help us collect the data for family-owned property. Given each persons family members, and the estate(房产)info under his/her own name, we need to know the size of each family, and the average area and n…...
OpenEuler 22.03 安装 flink-1.17.2 集群
零:规划 本次计划安装三台OpenEuler 22.03 版本操作系统的服务器,用于搭建 flink 集群。这里使用flink1.17.2 的原因,是便于后续与springboot的整合 服务器名IP地址作用其他应用flink01192.168.159.133主jdk11、flink-1.17.2flink02192.168.…...
SQL—leetcode—175. 组合两个表
175. 组合两个表 表: Person -------------------- | 列名 | 类型 | -------------------- | PersonId | int | | FirstName | varchar | | LastName | varchar | -------------------- personId 是该表的主键(具有唯一值的列)。 该表包含一些人的 ID 和…...
html 中 表格和表单的关系与区别
在 HTML 中,表格 (<table>) 和表单 (<form>) 是两种常用于展示数据和收集用户输入的元素。它们具有不同的功能和结构。以下是关于这两者的详细介绍: 1. HTML 表格(<table>) 表格用于展示结构化的数据…...
Android14 OTA升级速度过慢问题解决方案
软件版本:Android14 硬件平台:QCS6115 问题:OTA整包升级接近20min,太长无法忍受。 该问题为Android高版本的虚拟AB分区压缩技术所致,其实就是时间换空间,个人推测AB分区压缩会节约硬件存储空间࿰…...
Jetson xavier 刷机安装教程
在对Jetson进行刷机过程,浏览了很多的相关教程,大部分教程并不全,而且按照步骤执行会出现许多奇奇怪怪的错误,为了避免大家踩坑,这里给出了完整的解决方法,希望能够提供帮助! 首先大家需要准备…...
Hadoop集群(HDFS集群、YARN集群、MapReduce计算框架)
一、 简介 Hadoop主要在分布式环境下集群机器,获取海量数据的处理能力,实现分布式集群下的大数据存储和计算。 其中三大核心组件: HDFS存储分布式文件存储、YARN分布式资源管理、MapReduce分布式计算。 二、工作原理 2.1 HDFS集群 Web访问地址&…...
芯科科技蓝牙、Wi-Fi、Wi-SUN产品广获业界认可,技术创新引领行业潮流
物联网领军企业领跑未来无线开发平台发展 2024年,Silicon Labs(亦称“芯科科技“,NASDAQ:SLAB)在物联网(IoT)领域持续深耕,凭借创新的企业发展理念与实践、行业领先的技术与产品&am…...
C语言——数据在内存中的存储
目录 前言 一数据类型 类型归类 二整形在内存中的存储 原反补码 大小端 相关练习题 三浮点数在内存中的储存 浮点数储存规则 前言 只有取学习数据在内存中的存储,我们在以后才能定义好(用好)各种类型的数据! 一数据类型…...
后端-redis
Redis RedisString类型String类型的常用命令 Hash类型Hash类型的常用命令 List类型List类型的常用命令 Set类型Set类型的常用命令 SortedSet类型SortedSet类型的常用命令 Redis序列化缓存更新策略缓存穿透缓存雪崩缓存击穿 Redis Redis是一个key-value的数据库,key…...
sqoop,flume草稿
连xftp传sqoop压缩包到/opt/soft 目录下 cd opt/soft/ tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop cd sqoop/conf/ cp sqoop-env-template.sh sqoop-env.sh vi sqoop-env-sh export HADOOP_COMMON_HOME/opt/soft/hadoop expo…...
UE5 渲染管线 学习笔记
兰伯特 SSS为散射的意思 带Bias的可以根据距离自动切换mip的卷积值 而带Level的值mipmaps的定值 #define A8_SAMPLE_MASK .a 这样应该就很好理解了 这个只采样a通道 带Level的参考上面的 朝左上和右下进行模糊 带Bias参考上面 随机数 4D 3D 2D 1D HLSL内置UV HLSL内置鼠标坐…...
线程池使用不当导致线程死锁
线程池使用不当导致线程死锁 问题代码问题分析 问题代码 在项目开发中,为了支持并发场景,减少资源开销,通常会使用公共线程池,即预先创建一个线程池,需要并发时都将任务提交该线程池中。类似如下代码 public class T…...
SpringBoot状态机
Spring Boot 状态机(State Machine)是 Spring Framework 提供的一种用于实现复杂业务逻辑的状态管理工具。它基于有限状态机(Finite State Machine, FSM)的概念,允许开发者定义一组状态、事件以及它们之间的转换规则。…...
细说STM32F407单片机轮询方式读写SPI FLASH W25Q16BV
目录 一、工程配置 1、时钟、DEBUG 2、GPIO 3、SPI2 4、USART6 5、NVIC 二、软件设计 1、FALSH (1)w25flash.h (2) w25flash.c 1)W25Q16基本操作指令 2)计算地址的辅助功能函数 3)器…...
HTMLCSS:惊!3D 折叠按钮
这段代码创建了一个具有 3D 效果和动画的按钮,按钮上有 SVG 图标和文本。按钮在鼠标悬停时会显示一个漂浮点动画,图标会消失并显示一个线条动画。这种效果适用于吸引用户注意并提供视觉反馈。按钮的折叠效果和背景渐变增加了页面的美观性。 演示效果 HT…...
如何更好的进行时间管理
先想一下我们想要做的事情,然后拿出Excel表格将这些事情记录下来,我们把它叫做任务对这些任务按照重要性,紧急程度进行排序,拿出表格中的前六个任务,就是今天要做的任务新建另一张excel表格,表格的一列为时…...
我在华为的安全日常
在华为工作了数年后,我养成了一个习惯:每次离开座位,即便是去卫生间,我也会条件反射地锁屏电脑。晚上回到家,躺在床上,脑海中偶尔会闪过一丝疑虑:办公室的门窗是否关好?虽然这种担忧…...
for媒体打破智能座舱体验同质化,斑马智行荣获“华舆奖”优秀创
打破智能座舱体验同质化,斑马智行荣获“华舆奖”优秀创新生态伙伴 12月12日,消费者洞察与市场研究机构J.D. Power|君迪与同济大学 HVR Lab(人车关系实验室)共同发布了 2024 中国智能座舱的研究洞察,并公布了华舆奖中国…...
自己搭建专属AI:Llama大模型私有化部署
前言 AI新时代,提高了生产力且能帮助用户快速解答问题,现在用的比较多的是Openai、Claude,为了保证个人隐私数据,所以尝试本地(Mac M3)搭建Llama模型进行沟通。 Gpt4all 安装比较简单,根据 G…...
芯片Tapeout power signoff 之IR Drop Redhawk Ploc文件格式及其意义
数字IC后端工程师在芯片流程最后阶段都会使用redhawk或voltus进行设计的IR Drop功耗signoff分析。必须确保静态,动态ir drop都符合signoff标准。 在做redhawk ir drop分析前,我们需要提供一个redhawk ploc供电点坐标。 数字IC设计后端实现前期预防IR D…...
[机器学习]sklearn入门指南(1)
简介 scikit-learn(简称sklearn)是一个开源的Python机器学习库,它提供了简单而高效的工具用于数据挖掘和数据分析,并且拥有一个活跃的开发社区。它建立在NumPy、SciPy和matplotlib这些科学计算库之上,旨在提供一致且可…...