这段时间复习了一下内核调试系统,注意看了一下printk的实现以及内核日志的相关知识,这里做一下总结。

1、问题的引出:

做DPDK项目时,调试rte_kni.ko时,发现printk并不会向我们想想的那样把log信息显示在我们的终端上。有人总结了三个原因:

  • 原因1:printk()有一个控制日志级别的字段,如果该字段的日记级别高于console默认的日志级别那么才会打印出来(数值越小日志级别越高,分为从0-7共计8个日志级别)。有一种简单的改变当前终端的日志级别的方法,echo 8 > /sys/kernel/printk。理论上这样printk就能输出到终端了。但是我的没有。
  • 原因2:syslogd守护进程的规则有问题,/etc/syslog.conf中定义了一些列规则,其中就包含数内核消息的处理规则,fedora中的syslogd守护进程叫做rsyslogd,相应它的规则配置文件叫rsyslog.conf,其中有一行”#kern.*                /dev/console“它的意思是把所有日志级别的内核log都输出到/dev/console即我们的终端。我们只需要把该行的'#'去掉,重启,理论上那么内核log (printk()输出也是内核log)就会输出到终端了。但是我的还是不能。
  • 原因3:系统中同时有klogd和syslogd守护进程那么不管日志级别是什么都不能输出到终端。

如果不能在终端上看到printk的输出,那么可以通过查看/var/log/messages文件,或运行dmesg命令查看,或查看/proc/kmsg文件获得信息,或是通过ctrl+alt+f2~f6进入系统文本模式装载模块,这样也可以看到prink()输出的信息,当然这里就准确对应原因1中所讲的规则。

最后说一下syslogd、直接通过/proc/kmsg、和dmesg读取printk输出缓冲区的区别:

  • syslogd:读取了缓冲区中的数据,不会删除缓冲区中的数据。
  • 直接读取/proc/kmsg:读取了缓冲区中的数据后,将缓冲区中的数据删除(klogd默认就是采用这种方法)。
  • dmesg:在不刷新缓冲区的情况下获得缓冲区的内容,并将内容返回给stdout。

本文里的知识来至LDD3,和一位网友的博客(http://www.cnitblog.com/textbox/archive/2009/10/13/61785.html)。

 

1、printk概述:

对于做Linux内核开发的人来说,printk实在是再熟悉不过了。内核启动时显示的各种信息大部分都是通过她来实现的,在做内核驱动调试的时候大部分 时候使用她就足矣。她之所以用得如此广泛,一个是由于她使用方便,还有一个重要的原因是她的健壮性。它使用范围很广,几乎是内核的任何地方都能调用它。你既可以在中断上下文、进程上下中调用她,也可以在任何持有锁时调用她,更可以在SMP系统中调用她,且调用时连锁都不必使用。这样好的适应性来源于她的设计,一个由三个指针控制的简单“ring buffer”。

注意上面说到的是:“几乎”在内核的任何地方都可以使用。那什么地方使用会有“问题”?那就是在系统启动过程的早期,终端初始化之前的某些地方虽然可以使用,但是在终端和控制台被初始化之前所有信息都被缓存在printk的简单的ring buffer(环形缓冲区)中,直到终端和控制台被初始化之后,所有缓存信息都被一并输出。

如果你要调试的是启动过程最开始的部分(如setup_arch()),可以依靠此时能够工作的硬件设备(如串口)与外界通信,使用printk()的变体early_printk()函数。她在启动过程初期就具有在终端上打印的能力,功能与prink()类似,区别在于:

(1)函数名

(2)能够更早地工作(输出信息)

(3)她有自己的小缓存(一般为512B)

(4)一次性输出到硬件设备,不再以ring buffer的形式保留信息。

但该函数在一些构架上无法实现,所以这种办法缺少可移植性。(大多数构架都可以,包括x86和arm)。

所以,除非要在启动初期在终端上输出,否则我们认为printk()在任何情况下都能工作。这点从内核的启动代码中就可以看出,在已进入start_kernel不久就通过printk打印内核版本信息了。

2、printk的使用:

printk()和C库中的printf()在使用上最主要的区别就是 printk()指定了日志级别。

2.1:日志等级

内核根据日志级别来判断是否在终端(console)上打印消息:内核把级别比某个特定值低的所有消息显示在终端(console)上。但是所有信息都会记录在printk的“ring buffer”中。

printk有8个loglevel,定义在中:

  • #define KERN_EMERG "<0>" /* 系统不可使用 */
  • #define KERN_ALERT "<1>" /* 需要立即采取行动 */
  • #define KERN_CRIT "<2>" /* 严重情况 */
  • #define KERN_ERR "<3>" /* 错误情况 */
  • #define KERN_WARNING "<4>" /* 警告情况 */
  • #define KERN_NOTICE "<5>" /* 正常情况, 但是值得注意 */
  • #define KERN_INFO "<6>" /* 信息型消息 */
  • #define KERN_DEBUG "<7>" /* 调试级别的信息 */

/* 使用默认内核日志级别 */

#define KERN_DEFAULT ""

/*

* 标注为一个“连续”的日志打印输出行(只能用于一个

* 没有用 \n封闭的行之后). 只能用于启动初期的 core/arch 代码

* (否则续行是非SMP的安全).

*/

#define KERN_CONT ""

如果使用时没有指定日志等级,内核会选用DEFAULT_MESSAGE_LOGLEVEL,这个定义位于kernel/printk.c:

/* printk's without a loglevel use this.. */

#define DEFAULT_MESSAGE_LOGLEVEL CONFIG_DEFAULT_MESSAGE_LOGLEVEL

可以看出,这个等级是可以在内核配置时指定,这种机制是从2.6.39开始有的,如果你不去特别配置,那么默认为<4>,也就是KERN_WARNING。

内核将最重要的记录等级 KERN_EMERG定为“”,将无关紧要的调试记录等级“KERN_DEBUG”定为“<7>”。

内核用这些宏指定日志等级和当前终端的记录等级console_loglevel来决定是不是向终端上打印,使用示例如下:

printk(KERN_EMERG "log_level:%s\n", KERN_EMERG);

当编译预处理完成之后,前例中的代码实际被编译成成如下格式:

printk( "<0>" "log_level:%s\n", KERN_EMERG);

给一个printk()什么日志等级完全取决于你。那些正式、且需要保持的消息应该根据信息的性质给出相应的日志等级。但那些为了解决一个问题临时加得到处都是的调试信息可以有两种做法:

一种选择是保持终端的默认记录等级不变,给所有调试信息KERN CRIT或更低的等级以保证信息一定会被输出。

另一种方法则相反,给所有调试信息KERN DEBUG等级,而调整终端的默认记录等级为7,也可以输出所有调试信息。

两种方法各有利弊。

 

这里说到了调整内核的默认的日志级别,在我3年半前的学习笔记《 Linux设备驱动程序学习(2)-调试技术 》中有介绍,可以通过 /proc/sys/kernel/printk来改变,或者C程序调用syslog系统调用来实现。但是现在的glibc的函数接口改了,由于 syslog 这个词使用过于广泛,这个函数的名称被修改成 klogctl,所以原来博文中的代码无法使用了,以下是新版的 console_loglevel代码:

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <errno.h>

//#define __LIBRARY__ /* _syscall3 and friends are only available through this */

//#include <linux/unistd.h>

/* define the system call, to override the library function */

//_syscall3(int, syslog, int, type, char *, bufp, int, len);

 

int main(int argc, char **argv)

{

      int level;

      if (argc == 2) {

            level = atoi(argv[1]); /* the chosen console */

      } else {

            fprintf(stderr, "%s: need a single arg\n", argv[0]);

            exit(1);

      }

      if (klogctl(8, NULL, level) < 0) {

            fprintf(stderr, "%s: syslog(setlevel): %s\n",

                  argv[0], strerror(errno));

            exit(1);

      }

      exit(0);

}

 

 

2.2:相关辅助宏

如果确定printk所需要的日志等级,每次都要在其中添加以上宏,似乎有点麻烦了。所以内核黑客们定义了一些宏来方便printk的使用,这些宏在内核代码中也是随处可见:

#ifndef pr_fmt

#define pr_fmt(fmt) fmt

#endif

#define pr_emerg(fmt, ...) \

     printk(KERN_EMERG pr_fmt(fmt), ##__VA_ARGS__)

#define pr_alert(fmt, ...) \

     printk(KERN_ALERT pr_fmt(fmt), ##__VA_ARGS__)

#define pr_crit(fmt, ...) \

     printk(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__)

#define pr_err(fmt, ...) \

     printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)

#define pr_warning(fmt, ...) \

     printk(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__)

#define pr_warn pr_warning

#define pr_notice(fmt, ...) \

     printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__)

#define pr_info(fmt, ...) \

     printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)

#define pr_cont(fmt, ...) \

     printk(KERN_CONT fmt, ##__VA_ARGS__)

 

/* 除非定义了DEBUG ,否则pr_devel()不产生任何代码 */

#ifdef DEBUG

#define pr_devel(fmt, ...) \

     printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)

#else

#define pr_devel(fmt, ...) \

     no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)

#endif

 

/* 如果你在写一个驱动,请使用dev_dbg */

#if defined(DEBUG)

#define pr_debug(fmt, ...) \

     printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)

#elif defined(CONFIG_DYNAMIC_DEBUG)

/* dynamic_pr_debug() uses pr_fmt() internally so we don't need it here */

#define pr_debug(fmt, ...) \

     dynamic_pr_debug(fmt, ##__VA_ARGS__)

#else

#define pr_debug(fmt, ...) \

     no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)

#endif

从上面的代码大家应该就可以知道这些宏的使用了。值得注意的是:pr_devel和 pr_debug这些宏只有在定义了DEBUG之后才会产生实际的 printk代码,这样方便了内核开发:在代码中使用这些宏,当调试结束,只要简单地#undef DEBUG就可以消除这些调试使用的代码,无需真正地 去删除调试输出代码。

 

2.3:输出速率控制

在调试的时候,有时某些部分可能printk会产生大量输出, 导致系统无法正常工作,并可能使系统日志ring buffer溢出(旧的信息被快速覆盖)。特别地,当使用一个慢速控制台设备(如串口), 过量输出也能拖慢系统。这样反而难于发现系统出问题的地方。所以你应当非常注意:正常操作时不应当打印任何东西,打印的输出应当是指示需要注意的异常,并 小心不要做过头。

   在某些情况下, 最好的做法是设置一个标志变量表示:已经打印过这个了,以后不再打印任何这个信息。而对于打印速率的控制内核已经提供了一个现成的宏:

#define printk_ratelimit() __printk_ratelimit(__func__)

     这个函数应当在你认为打印一个可能会出现大量重复的消息之前调用,如果这个函数返回非零值, 继续打印你的消息, 否则跳过它。典型的调用如这样:

if (printk_ratelimit())

    printk(KERN_NOTICE "The printer is still on fire\n");

printk_ratelimit通过跟踪发向控制台的消息的数量和时间来工作。当输出超过一个限度, printk_ratelimit 开始返回 0 使消息被丢弃。我们可以通过修改 :

 

/proc/sys/kern/printk_ratelimit( 可以看作一个监测周期,在这个周期内只能发出下面的控制量的信息) 

/proc/sys/kernel/printk_ratelimit_burst(以上周期内的最大消息数,如果超过了printk_ratelimit()返回0)

来控制消息的输出.

   在中还定义了其他的宏,比如printk_ratelimited(fmt, ...)等,有兴趣的朋友就去文件中看看便知,很好理解的。

 

 

2.4:最后特别提醒:

1、虽然printk很健壮,但是看了源码你就知道,这个函数的效率很低:做字符拷贝时一次只拷贝一个字节,且去调用console输出可能还产生中断。所以如果你的驱动在功能调试完成以后做性能测试或者发布的时候千万记得尽量减少printk输出,做到仅在出错时输出少量信息。否则往console输出无用信息影响性能。我刚开始学驱动的时候就犯过这样的白痴错误,在测试CAN驱动性能的时候居然printk出信息来核对,结果直接宕机。

2、printk的临时缓存printk_buf只有1K,所有一次printk函数只能记录<1K的信息到log buffer,并且printk使用的“ring buffer”

 

 

3、printk的内核实现

对于Linux的printk内核日志,常常被称为kernel ring buffer,这是由于printk的缓存实现就是使用了一个简单的ring buffer(环形缓冲区)。但是这里需要注意的是,不要和内核trace系统ring buffer混淆,虽然他们都是为了跟踪调试,但是trace系统的ring buffer实现更加完善复杂,而printk使用的ring buffer则非常简单,其实就定义了一个字符数组:

 

static char __log_buf[__LOG_BUF_LEN];

并使用了一套指针来管理:

/*

 * 在指向log_buf时并没有用log_buf_len做限制 - 所以他们

 * 在作为下标使用前必须用掩码处理(去除CONFIG_LOG_BUF_SHIFT以上的高位)

 */

 static unsigned log_start; /* log_buf中的索引: 指向由syslog()读取的下一个字符 */

 static unsigned con_start; /* log_buf中的索引: 指向发送到console的下一个字符 */

 static unsigned log_end; /* log_buf中的索引:最近写入的字符地址 + 1 */

具体的实现CU中已经有一位博友写过了,我这里就不再啰嗦了,我转载备份了一下:《printk实现分析》

 

4、用户空间访问内核日志

用户空间访问和控制内核日志有两个接口:

(1)通过glibc的klogctl函数接口调用内核的syslog系统调用

(2)通过fs/proc/kmsg.c内核模块中导出的procfs接口:/proc/kmsg文件。

他们其实最终都调用了/kernel/printk.c中的do_syslog函数,实现对__log_buf的访问及相关变量的修改。

但值得注意的是:从/proc/kmsg中获取数据,那么__log_buf中被读取过的数据就不再保留(也就是会修改log_start指针), 然而 syslog 系统调用返回日志数据并保留数据给其他进程。读取/proc文件是 klogd的默认做法。dmesg命令可用来查看缓存的内容并保留它,其实它是将__log_buf中的所有内容返回给stdout,并不管它是否已经被读取过。

 

这里我还是推荐大家 RTFSC – Read The Fucking Source Code,自己看这些代码比什么都强,我这里就只引个路。

 

在用户空间有专门用于记录系统日志的程序,统称为“syslog守护进程”。早期及现在的大部分嵌入式系统使用的是klogd+syslogd组合,现在 大多数发行版都使用rsyslogd或者syslogd-ng了。这些用户空间的程序我这里就不分析了,我不擅长,运维的可能比较清楚。我只知道一下他们 大致的调用关系就好。

 

这里我用一张图来总结一下内核printk和日志系统的总体结构:

 

极力推荐阅读:《内核日志:API 及实现----从内核到用户空间的日志》

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. Servlet对象实例化之后存储到哪里了

    Servlet对象实例化之后存储到哪里了 大多数的Web容器都是将该Servlet对象以及对应的url-pattern存储到Map集合中了 在web容器中有这样一个Map集合 Map<String, Servlet> key value -------------------------------------- /login LoginServlet对象…...

    2024/4/3 15:41:46
  2. 一些常见的正则匹配

    前言:最近工作中用到了正则匹配,参考了以下两个网站,自己结合做了以下总结。 脚本之家:脚本之家 菜鸟教程:菜鸟教程正则匹配 1、匹配中文:[\u4e00-\u9fa5] 2、英文字母:[a-zA-Z] 3、数字:[0-9] 4、匹配中文,英文字母和数字及下划线:^[\u4e00-\u9fa5_a-zA-Z0-9]+$ 同时判…...

    2024/4/23 13:48:33
  3. Python 基础学习 --- Note 05 ---元组(tuple)

    NB: 元组的元素不能被修改1 创建元组 1.1 创建空元组 emptyTuple1 = tuple() emptyTuple2 = ()1.2 创建仅包含一个元素的元组注意有逗号 oneElementTuple = (1, ) 如果没有逗号 errorOneTuple = (1) print(errorOneTuple == 1) # True1.3 创建包含多个元素的元组 normalTu…...

    2024/4/17 4:35:04
  4. VM虚拟机安装树莓派系统

    VM虚拟机安装树莓派系统,没钱买树莓派,就用虚拟机体验一下...

    2024/4/1 4:51:41
  5. LeetCode696. 计数二进制子串

    给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。重复出现的子串要计算它们出现的次数。示例 1 :输入: "00110011" 输出: 6 解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“11…...

    2024/4/8 7:29:11
  6. Spark学习笔记(二)——分布式计算原理

    Spark分布式计算原理Spark分布式计算原理一、Spark WordCount运行原理二、Stage1、stage概念2、为什么划分:3、划分的好处4、RDD之间的依赖关系5、spark中如何划分stage三、DAG工作原理四、Spark Shuffle过程五、RDD持久化六、RDD共享变量1、广播变量2、累加器七、RDD分区设计…...

    2024/4/19 3:13:56
  7. FPGA中浮点数的定点化笔记

    FPGA中浮点数的定点化笔记 关于基本相关知识参考该博客 本文只针对FPGA中相关类型题目的做法思考整理,方便查看和复习,以后有时间再深入研究。 浮点数的定点化 FPGA 1.基础概念 浮点数: 简单来说,就是小数点的位置不是固定的 定点数: 简单来说,小数点的位置是固定的,也就是…...

    2024/4/23 8:36:04
  8. Hbase基本语句

    一、 HBase Shell操作1.1 基本操作1.进入HBase客户端命令行[@hadoop102 hbase]$ bin/hbase shell2.查看帮助命令hbase(main):001:0> help3.查看当前数据库中有哪些表hbase(main):002:0> list1.2 表的操作1.创建表hbase(main):002:0> create student,info2.插入数…...

    2024/4/23 20:04:38
  9. 数据链路层CRC循环冗余检测实例

    CRC循环冗余检测 目的:接收端通过检测码检测收到的的数据是否有差错,如果有差错,丢弃帧,没有差错,接受帧。 一、例:发送一个数据为1101011011,采用CRC生成多项***式P(X)=x^4+x+1。试求应添加在数据后的余数。 解释: 发送的帧=数据位M(X)+冗余位R(X) 本例子中: 1.数据位…...

    2024/4/22 0:15:10
  10. rancher/ui 路由资源对应表

    架构分析主要技术栈基础web框架: Ember.js构建脚手架: Ember CLIember-engines: http://ember-engines.com/国际化: 读配置文件打包工具: WebPackdom操作: jqueryNodejs框架: express生态+http-proxy图表使用的: echarts 和 d3样式: node-sass没有使用大的组件库,只是使用了一…...

    2024/4/8 7:52:16
  11. 高速接口----7系列收发器GTP(1)

    1. 前言最近在做以太网相关的东西,其中一个其中想要使用MAC通过光电转换模块来完成数据的收发。在Artix7系列FPGA当中,有GTP这个高速收发器。我手上的板子上的核心芯片是ZYNQ7015,这是一个带一个QUAD的ZYNQ FPGA,上面的收发器是GTP。对于其他稍微高端一点的ZYNQ上带有收发器…...

    2024/4/19 20:01:17
  12. YApi内网部署

    YApi内网部署 在showdoc开始收费的前提下,在公司服务器上搭建了YApi,下面记录下搭建的过程及遇到的问题 官方网址 参考地址 遇到的问题 1.点击开始部署后未出现如下页面我这边在安装的过程中卡在安装依赖库的页面,说是node下少了一个文件,我这边以为部署失败,进行重新部署…...

    2024/3/29 3:10:27
  13. java实现单链表的增删改查

    java实现单链表的增删改查 public class LinkListOrderTest {public static void main(String[] args) {}}class LinkListByOrder {// 创建一个头结点private HeroNode heroNode = new HeroNode(0, "", "");public HeroNode getHeroNode() {return heroNod…...

    2024/4/24 12:52:24
  14. pip修改镜像源(Ubuntu18.04)

    由于网络原因,pip的国外镜像源慢得要命,我们一般都要修改为国内镜像源,最近发现豆瓣镜像源挺不错的,可推荐给大家试试。最近为了学习TensorFlow2.0,安装了一个Ubuntu18.04版本,然后安装了anaconda。环境准备就绪之后,就可以开始敲代码实战,但在过程中,我们往往需要安装…...

    2024/3/30 8:20:55
  15. mysql 查询加强

    分页查询 基本语法 select 字段 from 表名 where子句 limit 起始位置,取出多少条记录(偏移量) mysql记录的编号是从 0 开始编号 快速入门案例 按照empno号降序取出3条数据 mysql> select * from emp; +-------+--------+--------...

    2024/3/29 3:10:24
  16. 狂神说java笔记-zgc-ElasticSearch7.6

    狂神说java笔记-zgc-ElasticSearch7.6elasticsearch:安装:1 解压,2 bin3 启动 目录:bin 启动文件config 配置文件log4j2 日志配置文件jvm.options java 虚拟机相关的配置elasticsearch.yml elasticsearch 的配置文件! 默认 9200 端口! 跨域!lib 相关jar包logs 日志!modu…...

    2024/4/11 11:38:54
  17. 统计素数并求和

    统计素数并求和统计给定整数M和N区间内素数的个数并对它们求和。 输入格式: 输入在一行中给出两个正整数M和N(1≤M≤N≤500)。 输出格式: 在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。 输入样例: 10 31 输出样例: 7 143本题中采用的判断素数的方法…...

    2024/3/29 3:10:22
  18. leetcode两数之和 C语言

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。方法1:双循环/*** Note: The returned array must be malloced, assume caller …...

    2024/3/29 3:10:21
  19. 快乐的JS正则表达式(三)

    ?的用途。小任务:匹配一段网址如var str = "http://www.123.com/";注意http也可以是httpsvar str = "http://i.cnblogs.com/"; var reg = /https?:\/\/[a-z]+\.[a-z0-9]+\.[a-z]+\//; console.log(reg.exec(str)); //["http://i.cnblogs.com/"…...

    2024/3/29 3:10:20
  20. 《Java程序设计精典教程》习题答案 编著:胡伏湘,雷军环 清华大学出版社 第三章习题答案

    一、简答题 1.类的修饰符包括哪些?各起什么作用? 包括访问控制符(表示被访问权限)、抽象类说明符abstract(说明是否是抽象类)、最终类说明符final(表示是否是最终类)。 2.什么是抽象类?什么是抽象方法?抽象方法与普通方法有什么不同? 以abstract作为关键字,如果有…...

    2024/4/24 16:58:45

最新文章

  1. 使用IOPaint实现图片擦除路人

    IOPaint 是一个免费的开源的 inpainting/outpainting 工具&#xff0c;由最先进的 AI 模型提供支持。 IOPaint 中使用各种模型来修改图像&#xff1a; 擦除&#xff1a;删除任何不需要的物体、缺陷、水印、人物。修复&#xff1a;对图像的特定部分进行修改、添加新对象或替换…...

    2024/4/25 1:11:01
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 途游游戏,科锐国际(计算机类),快手,CVTE,得物,蓝禾,奇安信,顺丰,康冠科技,金证科技24春招内推

    途游游戏&#xff0c;科锐国际&#xff08;计算机类&#xff09;&#xff0c;快手&#xff0c;CVTE&#xff0c;得物&#xff0c;蓝禾&#xff0c;奇安信&#xff0c;顺丰&#xff0c;康冠科技&#xff0c;金证科技24春招内推 ①得物 【岗位】技术&#xff0c;设计&#xff0c;…...

    2024/4/17 20:13:50
  4. Claude-3全解析:图片问答,专业写作能力显著领先GPT-4

    人工智能技术的飞速发展正在深刻改变着我们的工作和生活方式。作为一名资深的技术爱好者&#xff0c;我最近有幸体验了备受瞩目的AI助手Claude-3。这款由Anthropic公司推出的新一代智能工具展现出了非凡的实力&#xff0c;尤其在图像识别和专业写作领域的表现更是让人眼前一亮&…...

    2024/4/25 0:29:08
  5. vscode安装通义灵码

    作为vscode的插件&#xff0c;直接使用 通义灵码-灵动指间&#xff0c;快码加编&#xff0c;你的智能编码助手 通义灵码&#xff0c;是一款基于通义大模型的智能编码辅助工具&#xff0c;提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研…...

    2024/4/24 15:00:15
  6. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/4/25 1:03:45
  7. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/4/24 1:17:44
  8. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/4/24 11:04:21
  9. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/4/24 9:59:40
  10. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/4/24 11:04:20
  11. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/4/24 11:04:20
  12. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/4/24 9:58:43
  13. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/4/24 11:04:19
  14. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/4/24 11:04:19
  15. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/4/24 11:04:18
  16. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/4/24 11:04:18
  17. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/4/24 11:04:17
  18. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/4/24 1:18:42
  19. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/4/24 1:18:59
  20. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/4/24 11:04:13
  21. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/4/24 11:04:13
  22. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/4/24 11:04:13
  23. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/4/24 9:54:49
  24. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/4/24 10:43:15
  25. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/4/25 1:03:22
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57