当前位置: 首页 > news >正文

【linux】kernel-trace

文章目录

  • linux kernel trace
    • 配置
      • trace内核配置
      • trace接口使用
        • 通用配置
        • Events配置
        • Function配置
        • Function graph配置
        • Stack trace设置
      • 跟踪器tracer功能描述
  • 使用示例
    • 1.irqsoff
    • 2.preemptoff
    • 3.preemptirqsoff

linux kernel trace

配置

源码路径: kernel/trace

trace内核配置

CONFIG_TRACING=y
CONFIG_IRQSOFF_TRACER=y
CONFIG_PREEMPT_TRACER=y
CONFIG_FUNCTION_TRACER=y
CONFIG_PREEMPTIRQ_TRACEPOINTS=y
CONFIG_FUNCTION_GRAPH_TRACER=y

trace接口使用

/sys/kernel/debug/tracing目录下提供了ftrace的设置和属性接口,对ftrace的配置可以通过echo

通用配置
available_tracers-------------当前编译及内核的跟踪器列表,current_tracer必须是这里面支持的跟踪器。
current_tracer----------------用于设置或者显示当前使用的跟踪器列表。系统启动缺省值为nop,使用echo将跟踪器名字写入即可打开。可以通过写入nop重置跟踪器。
buffer_size_kb----------------用于设置单个CPU所使用的跟踪缓存的大小。跟踪缓存为RingBuffer形式,如果跟踪太多,旧的信息会被新的跟踪信息覆盖掉。需要先将current_trace设置为nop才可以。
buffer_total_size_kb----------显示所有的跟踪缓存大小,不同之处在于buffer_size_kb是单个CPU的,buffer_total_size_kb是所有CPU的和。free_buffer-------------------此文件用于在一个进程被关闭后,同时释放RingBuffer内存,并将调整大小到最小值。
hwlat_detector/--------------Hardware Latency Detector文件夹
instances/--------------------创建不同的trace buffer实例,可以在不同的trace buffers中分开记录。
tracing_cpumask-------------可以通过此文件设置允许跟踪特定CPU,二进制格式。
per_cpu-----------------------CPU相关的trace信息,包括stats、trace、trace_pipe和trace_pipe_raw。stats:当前CPU的trace统计信息trace:当前CPU的trace文件。trace_pipe:当前CPU的trace_pipe文件。
printk_formats----------------提供给工具读取原始格式trace的文件。
saved_cmdlines---------------存放pid对应的comm名称作为ftrace的cache,这样ftrace中不光能显示pid还能显示comm。
saved_cmdlines_size----------saved_cmdlines的数目
snapshot----------------------是对trace的snapshot。echo 0 清空缓存,并释放对应内存。echo 1 进行对当前trace进行snapshot,如没有内存则分配。echo 2 清空缓存,不释放也不分配内存。
trace--------------------------查看获取到的跟踪信息的接口,echo > trace可以清空当前RingBuffer。
trace_pipe--------------------输出和trace一样的内容,但是此文件输出Trace同时将RingBuffer中的内容删除,这样就避免了RingBuffer的溢出。可以通过cat trace_pipe > trace.txt &保存文件。
trace_clock-------------------显示当前Trace的timestamp所基于的时钟,默认使用local时钟。local:默认时钟;可能无法在不同CPU间同步;global:不同CUP间同步,但是可能比local慢;counter:这是一个跨CPU计数器,需要分析不同CPU间event顺序比较有效。
trace_marker-----------------从用户空间写入标记到trace中,用于用户空间行为和内核时间同步。
trace_marker_raw------------以二进制格式写入到trace中。
trace_options----------------控制Trace打印内容或者操作跟踪器,可以通过trace_options添加很多附加信息。
options----------------------trace选项的一系列文件,和trace_options对应。
trace_stat/-------------------每个CPU的Trace统计信息
tracing_max_latency--------记录Tracer的最大延时。例如,最大中断disable时间。最大时间被记录到本文件,对应的trace被记录到“trace”文件。新的trace最有大于现在的max latency胡,才会被记录。echo xxx > tracing_max_latency // 手工设置一个门限,只有大于门限才会被记录。
tracing_on-------------------用于控制跟踪打开或停止,0停止跟踪,1继续跟踪。
tracing_thresh---------------延时记录Trace的阈值,当延时超过此值时才开始记录Trace。单位是ms,只有非0才起作用。
Events配置
available_events-------------列出系统中所有可用的Trace events,分两个层级,用冒号隔开。
events/-----------------------系统Trace events目录,在每个events下面都有enable、filter和fotmat。enable是开关;format是events的格式,然后根据格式设置 filter。
set_event---------------------将Trace events名称直接写入set_event就可以打开。
set_event_pid----------------指定追踪特定进程的events。
Function配置
vailable_filter_functions------记录了当前可以跟踪的内核函数,不在该文件中列出的函数,无法跟踪其活动。
dyn_ftrace_total_info---------显示available_filter_functins中跟中函数的数目,两者一致。
enabled_functions------------显示有回调附着的函数名称。
function_profile_enabled-----打开此选项,在trace_stat中就会显示function的统计信息。
set_ftrace_filter----------------用于显示指定要跟踪的函数
set_ftrace_notrace-------------用于指定不跟踪的函数,缺省为空。
set_ftrace_pid------------------用于指定要追踪特定进程的函数。
Function graph配置
max_graph_depth-------------函数嵌套的最大深度。
set_graph_function------------设置要清晰显示调用关系的函数,在使用function_graph跟踪器是使用,缺省对所有函数都生成调用关系。
set_graph_notrace-------------不跟踪特定的函数嵌套调用。
Stack trace设置
stack_max_size---------------当使用stack跟踪器时,记录产生过的最大stack size
stack_trace-------------------显示stack的back trace
stack_trace_filter-------------设置stack tracer不检查的函数名称

跟踪器tracer功能描述

cat /sys/kernel/debug/tracing/available_tracers

函数类:function, function_graph, stack
延时类:irqsoff, preemptoff, preemptirqsoff, wakeup, wakeup_rt, waktup_dl
其他类:nop, mmiotrace, blk
function #追踪所有的内核函数
function_graph #和“function tracer比较类似,但它除了探测函数的入口还探测函数的出口。它可以画出一个图形化的函数调用,类似于c源代码风格
blk 	#块设备tracer
irqsoff #追踪最大关闭中断时间
preemptoff	#追踪最大关闭抢占时间
preemptirqsoff	#追踪 关闭中断 and/or 关闭抢占 的最大时间
wakeup	#追踪最高优先级普通任务从获得调度到被唤醒的最大延迟时间
wakeup_rt	#追踪RT类型的任务从获得调度到被唤醒的最大延迟时间
wakeup_dl	#追踪Deadline类型的任务从获得调度到被唤醒的最大延迟时间
mmiotrace	#追踪硬件IO
branch	#追踪likely/unlikely的分支预测情况
nop 	#空的tracer

使用示例

1.irqsoff

当中断关闭CPU不能响应任何外部的事件,将会阻止内核响应timer、鼠标中断,对应的结果就是响应延迟。

irqsoff tracer追踪关中断时间,当一个新的最大latency到来时,它会记住新的最大latency event,丢弃掉旧的最大latency event。”echo 0 >tracing_max_latency”会复位最大值。

cd /sys/kernel/debug/tracing
echo 0 > options/function-trace
echo irqsoff > current_tracer
echo 1 > tracing_on
echo 0 > tracing_max_latency
sleep 3
echo 0 > tracing_on
cat trace
 # tracer: irqsoff## irqsoff latency trace v1.1.5 on 5.10.160# --------------------------------------------------------------------# latency: 414 us, #4/4, CPU#1 | (M:desktop VP:0, KP:0, SP:0 HP:0 #P:8)#    -----------------#    | task: sh-1098 (uid:0 nice:0 policy:0 rt_prio:0)#    -----------------#  => started at: hvc_write#  => ended at:   n_tty_write---------------------------记录禁止中断时间最长的开始和结束函数###                    _------=> CPU#         #                   / _-----=> irqs-off-----------------d表示中断被disabled,'.'表示中断没有被关闭。      #                  | / _----=> need-resched-------------N-表示need_resched被设置;'.'-表示need_resched没有被设置,中断返回不会进行进程切换    #                  || / _---=> hardirq/softirq----------H-表示softirq中发生了硬件中断;h-硬件中断;s-softirq;'.'-不在中断上下文中#                  ||| / _--=> preempt-depth------------当抢占中断势能后,该域代表preempt_disabled的级别   #                  |||| /     delay            #  cmd     pid     ||||| time  |   caller---------------cmd-进程名,pid-进程id,time-表示trace从开始到当前的相对时间,delay-突出显示那些有高延迟的地方以便引起注意。!表示需要引起注意      #     \   /        |||||  \    |   /         sh-1098      1d...    0us!: __raw_spin_lock_irqsave <-hvc_writesh-1098      1d...  414us : hvc_write <-n_tty_writesh-1098      1d...  415us : tracer_hardirqs_on <-n_tty_writesh-1098      1d...  418us : <stack trace>=> n_tty_write=> file_tty_write.constprop.0=> redirected_tty_write=> new_sync_write=> vfs_write=> ksys_write=> __arm64_sys_write=> el0_svc_common.constprop.0=> do_el0_svc=> el0_svc=> el0_sync_handler=> el0_sync

2.preemptoff

当抢占关闭,我们除了接收中断,不能进行任务调度。

preemptoff tracer用来追踪抢占关闭时间,和irqsoff非常类似。

cd /sys/kernel/debug/tracing
echo 0 > options/function-trace
echo preemptoff > current_tracer
echo 1 > tracing_on
echo 0 > tracing_max_latency
sleep 3
echo 0 > tracing_on
cat trace

3.preemptirqsoff

关闭中断和抢占

preemptirqsoff tracer追踪抢占/中断任一被关闭的最大延迟时间

local_irq_disable();
call_function_with_irqs_off();
preempt_disable();
call_function_with_irqs_and_preemption_off();
local_irq_enable();
call_function_with_preemption_off();
preempt_enable();
  • irqsoff tracer记录的时间 = call_function_with_irqs_off() + call_function_with_irqs_and_preemption_off()

  • preemptoff tracer记录的时间 = call_function_with_irqs_and_preemption_off() + call_function_with_preemption_off()

  • preemptirqsoff tracer记录的时间 = total时间

    相关函数

    spin_lock()会调用preempt_disable() 导致**本核**的抢占调度被关闭(preempt_disable函数实际增加preempt_count来达到此效果),spin_lock_irq()是local_irq_disable()+preempt_disable()的合体。
    local_irq_disable()/loca_irq_save()的disable和save版的唯一区别是,要不要保存CPU对中断的屏蔽状态。
    spin_lock_irq()/spin_lock_irqsave(lock, flags)的唯一区别是,要不要保存CPU对中断的屏蔽状态。
    

    spin_lock()会调用preempt_disable() 导致本核的抢占调度被关闭(preempt_disable函数实际增加preempt_count来达到此效果),spin_lock_irq()是local_irq_disable()+preempt_disable()的合体。

    local_irq_disable()/loca_irq_save()的disable和save版的唯一区别是,要不要保存CPU对中断的屏蔽状态。

    spin_lock_irq()/spin_lock_irqsave(lock, flags)的唯一区别是,要不要保存CPU对中断的屏蔽状态。

 cd /sys/kernel/debug/tracingecho 0 > options/function-traceecho preemptirqsoff > current_tracerecho 1 > tracing_onecho 0 > tracing_max_latencysleep 3echo 0 > tracing_oncat trace

参考:

https://blog.csdn.net/pwl999/article/details/80420905

https://www.kernel.org/doc/html/latest/trace/ftrace.html

https://www.cnblogs.com/arnoldlu/p/7211249.html

相关文章:

【linux】kernel-trace

文章目录 linux kernel trace配置trace内核配置trace接口使用通用配置Events配置Function配置Function graph配置Stack trace设置 跟踪器tracer功能描述 使用示例1.irqsoff2.preemptoff3.preemptirqsoff linux kernel trace 配置 源码路径&#xff1a; kernel/trace trace内…...

【Golang 面试基础题】每日 5 题(一)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…...

ETCD介绍以及Go语言中使用ETCD详解

ETCD介绍以及Go语言中使用ETCD详解 什么是etcd ETCD是一个分布式、可靠的key-value存储的分布式系统,用于存储分布式系统中的关键数据;当然,它不仅仅用于存储,还提供配置共享及服务发现;基于Go语言实现 。 etcd的特点 完全复制:集群中的每个节点都可以使用完整的存档高…...

03-用户画像+Elasticsearch

优点 es支持海量数据的写入和更新es可以和hadoop&#xff0c;hive及spark进行集成es支持hivesql的操作&#xff0c;可以通过hivesql将数据导入eses的在进行数据检索查询是速度比较快es是分布式存储 应用 全文检索 全文检索流程: 1-对文档数据(文本数据)进行分词 2-将分词…...

初学Mybatis之搭建项目环境

在连接 mysql 数据库时&#xff0c;遇到了个 bug&#xff0c;之前都能连上&#xff0c;但报错说换了个 OS 操作系统什么的 然后搜索怎么连接&#xff0c;找到了解决方法 MySQL MYSQL – 无法连接到本地MYSQL服务器 (10061)|极客教程 (geek-docs.com) 命令行输入 services.msc…...

JMeter使用小功能-(持续更新)

1、jmeter在同一个线程组内&#xff0c;uuid的复用 方式一&#xff1a; 方式二&#xff1a; 2、获得jMeter使用的线程总数 ctx.getThreadGroup().getNumberOfThreads()来表示活动线程总数 int threadNumctx.getThreadGroup().getNumThreads(); String threads Integer…...

科研绘图系列:R语言火山图(volcano plot)

介绍 火山图(Volcano Plot),也称为火山图分析,是一种在生物信息学和基因组学中常用的图形表示方法,主要用于展示基因表达数据的差异。它通常用于基因表达微阵列或RNA测序数据的可视化,帮助研究人员识别在不同条件下表达差异显著的基因。 火山图的基本构成 X轴:通常表示…...

docker firewalld 防火墙设置

1、环境 centos 7 firewalld docker-ce docker 默认会更改防护墙配置 导致添加的防火墙策略不生效&#xff0c;可以启用firewalld 重新设置策略 2、启用防火墙 systemctl start firewalld systemctl enable firewalld3、配置文件禁用docker 的iptables /etc/docker/daemon.js…...

《问题004:报错-JS问题-unknown: Invalid shorthand property initializer.》

问题描述&#xff1a; unknown: Invalid shorthand property initializer. (25:13) unknown:无效的简写属性初始化项 解决方法&#xff1a; “”应该写为“&#xff1a;”&#xff08;globalData 改成 globalData: &#xff09;...

什么是 MLPerf?

什么是 MLPerf&#xff1f; MLPerf 是一个用于衡量机器学习硬件、软件和服务性能的标准化基准测试平台。它由 MLCommons 组织开发&#xff0c;该组织是由多家领先的科技公司和学术机构组成的。MLPerf 的目标是通过一系列标准化的基准测试任务和数据集&#xff0c;提供一个统一…...

【SpringBoot】第3章 SpringBoot的系统配置

3.1 系统配置文件 3.1.1 application.properties SpringBoot支持两种不同格式的配置文件&#xff0c;一种是Properties&#xff0c;一种是YML。 SpringBoot默认使用application.properties作为系统配置文件&#xff0c;项目创建成功后会默认在resources目录下生成applicatio…...

ELK日志分析系统部署文档

一、ELK说明 ELK是Elasticsearch&#xff08;ES&#xff09; Logstash Kibana 这三个开源工具组成&#xff0c;官方网站: The Elastic Search AI Platform — Drive real-time insights | Elastic 简单的ELK架构 ES: 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它…...

ue5笔记

1 点光源 聚光源 矩形光源 参数比较好理解 &#xff08;窗口里面&#xff09;环境光混合器&#xff1a;快速创造关于环境光的组件 大气光源&#xff1a;太阳光&#xff0c;定向光源 天空大气&#xff1a;蓝色的天空和大气 高度雾&#xff1a;大气下面的高度感的雾气 体积…...

TCP重传机制详解

1.什么是TCP重传机制 在 TCP 中&#xff0c;当发送端的数据到达接收主机时&#xff0c;接收端主机会返回⼀个确认应答消息&#xff0c;表示已收到消息。 但是如果传输的过程中&#xff0c;数据包丢失了&#xff0c;就会使⽤重传机制来解决。TCP的重传机制是为了保证数据传输的…...

如何使用javascript将商品添加到购物车?

使用JavaScript将商品添加到购物车可以通过以下步骤实现&#xff1a; 创建一个购物车对象&#xff0c;可以是一个数组或者对象&#xff0c;用于存储添加的商品信息。在网页中的商品列表或详情页面&#xff0c;为每个商品添加一个“添加到购物车”的按钮&#xff0c;并为按钮绑…...

【MySQL】:想学好数据库,不知道这些还想咋学

客户端—服务器 客户端是一个“客户端—服务器”结构的程序 C&#xff08;client&#xff09;—S&#xff08;server&#xff09; 客户端和服务器是两个独立的程序&#xff0c;这两个程序之间通过“网络”进行通信&#xff08;相当于是两种角色&#xff09; 客户端 主动发起网…...

1.关于linux的命令

1.关于文件安装的问题 镜像站点服务器&#xff1a;cat /etc/apt/sources.list 索引文件&#xff1a;cd /var/lib/apt/lists 下载文件包存在的路径&#xff1a;cd /etc/cache/apt/archives/2.关于dpkg文件安装管理器的应用: 安装文件:sudo dpkg -i 文件名; 查找文件目录:sudo …...

【人工智能】机器学习 -- 决策树(乳腺肿瘤数)

目录 一、使用Python开发工具&#xff0c;运行对iris数据进行分类的例子程序dtree.py&#xff0c;熟悉sklearn机器实习开源库。 二、登录https://archive-beta.ics.uci.edu/ 三、使用sklearn机器学习开源库&#xff0c;使用决策树对breast-cancer-wisconsin.data进行分类。 …...

【proteus经典实战】LCD滚动显示汉字

一、简介 Proteus是一款功能丰富的电子设计和仿真软件&#xff0c;它允许用户设计电路图、进行PCB布局&#xff0c;并在虚拟环境中测试电路功能。这款软件广泛应用于教育和产品原型设计&#xff0c;特别适合于快速原型制作和电路设计教育。Proteus的3D可视化功能使得设计更加直…...

数据结构复习1

1、什么是集合&#xff1f; 就是一组数据的集合体&#xff0c;就像篮子装着苹果、香蕉等等&#xff0c;这些“水果”就代表数据&#xff0c;“篮子”就是这个集合。 集合的特点&#xff1a; 集合用于存储对象。 对象是确定的个数可以用数组&#xff0c;如果不确定可以用集合…...

订单管理系统需求规范

1. 引言 1.1 目的 本文档旨在明确描述订单管理系统的功能、非功能性需求以及约束条件&#xff0c;以指导系统的分析、设计、开发、测试和部署。 1.2 范围 本系统将支持在线订单处理&#xff0c;从客户下单到完成配送的全过程管理&#xff0c;包括库存管理、支付处理、订单跟…...

swiftui使用ScrollView实现左右滑动和上下滑动的效果,仿小红书页面

实现的效果如果所示&#xff0c;顶部的关注用户列表可以左右滑动&#xff0c;中间的内容区域是可以上下滚动的效果&#xff0c;点击顶部的toolbar也可以切换关注/发现/附近不同页面&#xff0c;实现翻页效果。 首页布局 这里使用了NavigationStack组件和tabViewStyle样式配置…...

深入理解并使用 MySQL 的 SUBSTRING_INDEX 函数

引言 在处理字符串数据时&#xff0c;经常需要根据特定的分隔符来分割字符串或提取字符串的特定部分。MySQL 提供了一个非常有用的函数 SUBSTRING_INDEX 来简化这类操作。本文将详细介绍 SUBSTRING_INDEX 的使用方法、语法&#xff0c;以及通过实际案例来展示其在数据库查询中…...

elementUI在手机端使用遇到的问题总结

之前的博客有写过用vue2elementUI封装手机端选择器picker组件&#xff0c;支持单选、多选、远程搜索多选&#xff0c;最终真机调试的时候发现有很多细节样式需要调整。此篇博客记录下我调试过程中遇到的问题和解决方法。 一、手机真机怎么连电脑本地代码调试&#xff1f; 1.确…...

【初阶数据结构】5.栈和队列

文章目录 1.栈1.1 概念与结构1.2 栈的实现2.队列2.1 概念与结构2.2 队列的实现3.栈和队列算法题3.1 有效的括号3.2 用队列实现栈3.3 用栈实现队列3.4 设计循环队列 1.栈 1.1 概念与结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操…...

高通Android 12 设置Global属性为null问题

1、最近在做app调用framework.jar需求&#xff0c;尝试在frameworks/base/packages/SettingsProvider/res/values/defaults.xml增加属性 <integer name"def_xxxxx">1</integer> 2、在frameworks\base\packages\SettingsProvider\src\com\android\provide…...

Xcode代码静态分析:构建无缺陷代码的秘诀

Xcode代码静态分析&#xff1a;构建无缺陷代码的秘诀 在软件开发过程中&#xff0c;代码质量是至关重要的。Xcode作为Apple的官方集成开发环境&#xff08;IDE&#xff09;&#xff0c;提供了强大的代码静态分析工具&#xff0c;帮助开发者在编写代码时发现潜在的错误和问题。…...

Qt各个版本安装的保姆级教程

文章目录 前言Qt简介下载Qt安装包安装Qt找到Qt的快捷方式总结 前言 Qt是一款跨平台的C图形用户界面应用程序开发框架&#xff0c;广泛应用于桌面软件、嵌入式软件、移动应用等领域。Qt的强大之处在于其高度的模块化和丰富的工具集&#xff0c;可以帮助开发者快速、高效地构建出…...

数学建模--优劣解距离法TOPSIS

目录 简介 TOPSIS法的基本步骤 延伸 优劣解距离法&#xff08;TOPSIS&#xff09;的历史发展和应用领域有哪些&#xff1f; 历史发展 应用领域 如何准确计算TOPSIS中的理想解&#xff08;PIS&#xff09;和负理想解&#xff08;NIS&#xff09;&#xff1f; TOPSIS方法在…...

Springboot开发之 Excel 处理工具(三) -- EasyPoi 简介

引言 Springboot开发之 Excel 处理工具&#xff08;一&#xff09; – Apache POISpringboot开发之 Excel 处理工具&#xff08;二&#xff09;-- Easyexcel EasyPoi是一款基于 Apache POI 的高效 Java 工具库&#xff0c;专为简化 Excel 和 Word 文档的操作而设计。以下是对…...

wordpress拼音/百度竞价推广效果好吗

C语言之类型转换 类型之间的转换 1.c语言中的数据类型可以进行转换 —强制类型转换 —隐式类型转换 //示例1 int main() {long l 800;int i (int)l; //强制类型转换return 0; }//示例2 int main() {short s 800;int i s; //隐式类型转换//no error,no warningreturn …...

网站建设收入的发票/网络营销案例范文

创建类的对象 类的实例化 实例化类 类和对象的使用&#xff08;面向对象思想落地的实现&#xff09;&#xff1a; 1.创建类&#xff0c;设计类的成员 2.创建类的对象 3.通过“对象.属性”或“对象.方法”调用对象的结构 如果创建了一个类的多个对象&#xff0c;则每个对象…...

成都公司网页制作/seo高级优化技巧

https://www.leiphone.com/news/201803/Tw0nrq6vGDIvbmXr.html 雷锋网(公众号&#xff1a;雷锋网)获悉&#xff0c;3月13日&#xff0c;东芝发布新AR眼镜dynaEdge AR&#xff0c;其由一个单臂眼镜和一个分离的计算单元组成。眼镜售价1899美元&#xff0c;面向企业级用户。 当所…...

怎样建立商贸网站/百度快照手机入口

A一我护灯近次感观片近次感观片近次感观片近JAX(async JavaScript and XML)&#xff0c;指的是通过 JavaScript 的异步通信&#xff0c;从服务器获取 XML 文档从中提取数据&#xff0c;再更新当前网页的对应部分&#xff0c;而不用刷新整个网页。后来&#xff0c;AJAX 这个词就…...

wordpress 文章关联/广告推广费用一般多少

[JLOI2011]飞行路线 二维spfa&#xff0c;不过需要优化&#xff0c;用优先队列比较快&#xff0c;手打普通队列应该也可以 #include<iostream> #include<cstdio> #include<cstring> #include<queue> #define maxn 10005 using namespace std; int n,m,…...

团结湖网站建设/南京seo整站优化技术

静态绑定和动态绑定是C多态性的一种特性。 1、对象的静态类型和动态类型&#xff1a; 对象的静态类型&#xff1a;对象在声明是采用的类型&#xff0c;在编译期确定&#xff1b; 对象的动态类型&#xff1a;当前对象所指的类型&#xff0c;在运行期决定&#xff0c;对象的动态类…...