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

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_os_init 函数

ngx_os_init

声明在 src/os/unix/ngx_os.h

ngx_int_t ngx_os_init(ngx_log_t *log);

定义在 src\os\unix\ngx_posix_init.c

ngx_int_t
ngx_os_init(ngx_log_t *log)
{ngx_time_t  *tp;ngx_uint_t   n;
#if (NGX_HAVE_LEVEL1_DCACHE_LINESIZE)long         size;
#endif#if (NGX_HAVE_OS_SPECIFIC_INIT)if (ngx_os_specific_init(log) != NGX_OK) {return NGX_ERROR;}
#endifif (ngx_init_setproctitle(log) != NGX_OK) {return NGX_ERROR;}ngx_pagesize = getpagesize();ngx_cacheline_size = NGX_CPU_CACHE_LINE;for (n = ngx_pagesize; n >>= 1; ngx_pagesize_shift++) { /* void */ }#if (NGX_HAVE_SC_NPROCESSORS_ONLN)if (ngx_ncpu == 0) {ngx_ncpu = sysconf(_SC_NPROCESSORS_ONLN);}
#endifif (ngx_ncpu < 1) {ngx_ncpu = 1;}#if (NGX_HAVE_LEVEL1_DCACHE_LINESIZE)size = sysconf(_SC_LEVEL1_DCACHE_LINESIZE);if (size > 0) {ngx_cacheline_size = size;}
#endifngx_cpuinfo();if (getrlimit(RLIMIT_NOFILE, &rlmt) == -1) {ngx_log_error(NGX_LOG_ALERT, log, errno,"getrlimit(RLIMIT_NOFILE) failed");return NGX_ERROR;}ngx_max_sockets = (ngx_int_t) rlmt.rlim_cur;#if (NGX_HAVE_INHERITED_NONBLOCK || NGX_HAVE_ACCEPT4)ngx_inherited_nonblocking = 1;
#elsengx_inherited_nonblocking = 0;
#endiftp = ngx_timeofday();srandom(((unsigned) ngx_pid << 16) ^ tp->sec ^ tp->msec);return NGX_OK;
}

初始化操作系统相关的参数和配置,为 Nginx 的运行环境做好准备 

代码逻辑分析

  1. 操作系统特定初始化

    • 如果定义了 NGX_HAVE_OS_SPECIFIC_INIT,调用 ngx_os_specific_init 进行特定操作系统的初始化。
    • 如果失败,直接返回错误。
  2. 进程标题初始化

    • 调用 ngx_init_setproctitle 初始化进程标题设置功能。
    • 如果失败,直接返回错误。
  3. 系统参数初始化

    • 获取系统页面大小(getpagesize)并计算页面大小的对数(ngx_pagesize_shift)。
    • 初始化 CPU 缓存行大小(ngx_cacheline_size),如果支持 _SC_LEVEL1_DCACHE_LINESIZE,则从系统获取缓存行大小。
  4. CPU 核心数初始化

    • 如果定义了 NGX_HAVE_SC_NPROCESSORS_ONLN,通过 sysconf(_SC_NPROCESSORS_ONLN) 获取 CPU 核心数。
    • 如果核心数小于 1,则默认设置为 1。
  5. CPU 信息初始化

    • 调用 ngx_cpuinfo 获取 CPU 相关信息。
  6. 文件描述符限制

    • 使用 getrlimit 获取当前进程的最大文件描述符限制。
    • 如果获取失败,记录错误日志并返回错误。
  7. 非阻塞套接字标志

    • 根据是否支持 NGX_HAVE_INHERITED_NONBLOCKNGX_HAVE_ACCEPT4,设置 ngx_inherited_nonblocking 标志。
  8. 随机数种子初始化

    • 使用当前进程 ID、时间戳(秒和毫秒)生成随机数种子。
  9. 返回成功

    • 如果所有初始化步骤都成功,返回 NGX_OK

 

详解

函数签名

ngx_int_t
ngx_os_init(ngx_log_t *log)

参数:

ngx_log_t *log :日志对象指针,用于记录错误或调试信息。

返回值:

ngx_int_t Nginx 自定义的一个整数类型

  • NGX_OK :表示函数执行成功,所有初始化步骤均顺利完成。
  • NGX_ERROR :表示函数执行失败,某些初始化步骤未能完成

局部变量声明

    ngx_time_t  *tp;ngx_uint_t   n;
#if (NGX_HAVE_LEVEL1_DCACHE_LINESIZE)long         size;
#endif
  • tp:指向时间结构体 ngx_time_t 的指针,用于获取当前时间。
  • n:无符号整数,用于计算页面大小的对数。
  • size(条件编译):长整型变量,用于存储 CPU 缓存行大小。

NGX_HAVE_LEVEL1_DCACHE_LINESIZE

是 Nginx 源码中的一个宏,用于指示当前系统是否支持获取 CPU 一级缓存(L1 Data Cache)的缓存行大小

定义在 objs/ngx_auto_config.h 中

#ifndef NGX_HAVE_LEVEL1_DCACHE_LINESIZE
#define NGX_HAVE_LEVEL1_DCACHE_LINESIZE  1
#endif

操作系统特定初始化

#if (NGX_HAVE_OS_SPECIFIC_INIT)if (ngx_os_specific_init(log) != NGX_OK) {return NGX_ERROR;}
#endif
  • NGX_HAVE_OS_SPECIFIC_INIT
  • 这是一个宏,表示是否需要执行特定操作系统的初始化逻辑。
  • ngx_os_specific_init
  • 调用特定于操作系统的初始化函数。如果初始化失败,直接返回 NGX_ERROR
  • 意图 :通过条件编译,支持不同操作系统的定制化初始化逻辑,增强跨平台兼容性。

NGX_HAVE_OS_SPECIFIC_INIT

定义在 src\os\unix\ngx_linux_config.h

#define NGX_HAVE_OS_SPECIFIC_INIT    1

 使用 gcc -E 处理条件编译后,确认一下我当前 Ubuntu 环境下的实际情况

gcc -E src/os/unix/ngx_posix_init.c \-I src/core \-I src/event \-I src/event/modules \-I src/os/unix \-I objs \> ngx_posix_init_preprocessed.c

在输出文件中查找 ngx_os_init 函数

ngx_int_t
ngx_os_init(ngx_log_t *log)
{ngx_time_t *tp;ngx_uint_t n;long size;if (ngx_os_specific_init(log) != 0) {return -1;}if (ngx_init_setproctitle(log) != 0) {return -1;}ngx_pagesize = getpagesize();ngx_cacheline_size = 64;for (n = ngx_pagesize; n >>= 1; ngx_pagesize_shift++) { }if (ngx_ncpu == 0) {ngx_ncpu = sysconf(
# 60 "src/os/unix/ngx_posix_init.c" 3 4_SC_NPROCESSORS_ONLN
# 60 "src/os/unix/ngx_posix_init.c");}if (ngx_ncpu < 1) {ngx_ncpu = 1;}size = sysconf(
# 69 "src/os/unix/ngx_posix_init.c" 3 4_SC_LEVEL1_DCACHE_LINESIZE
# 69 "src/os/unix/ngx_posix_init.c");if (size > 0) {ngx_cacheline_size = size;}ngx_cpuinfo();if (getrlimit(
# 77 "src/os/unix/ngx_posix_init.c" 3 4RLIMIT_NOFILE
# 77 "src/os/unix/ngx_posix_init.c", &rlmt) == -1) {if ((log)->log_level >= 2) ngx_log_error_core(2, log, 
# 78 "src/os/unix/ngx_posix_init.c" 3 4(*__errno_location ())
# 78 "src/os/unix/ngx_posix_init.c", "getrlimit(RLIMIT_NOFILE) failed");return -1;}ngx_max_sockets = (ngx_int_t) rlmt.rlim_cur;ngx_inherited_nonblocking = 1;tp = (ngx_time_t *) ngx_cached_time;srandom(((unsigned) ngx_pid << 16) ^ tp->sec ^ tp->msec);return 0;
}

ngx_os_specific_init

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_os_specific_init函数-CSDN博客

 进程标题初始化

    if (ngx_init_setproctitle(log) != NGX_OK) {return NGX_ERROR;}
  • ngx_init_setproctitle :初始化进程标题设置功能,允许修改进程的命令行标题(如 ps 命令中显示的内容)
  • 意图 :方便管理员通过工具查看 Nginx 进程的状态(如主进程、工作进程等)

ngx_init_setproctitle

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_setproctitle函数-CSDN博客

系统页面大小初始化

    ngx_pagesize = getpagesize();ngx_cacheline_size = NGX_CPU_CACHE_LINE;for (n = ngx_pagesize; n >>= 1; ngx_pagesize_shift++) { /* void */ }

 

  • getpagesize() :获取系统页面大小(单位为字节),例如 4KB。
  • ngx_pagesize :全局变量,存储页面大小。
  • ngx_cacheline_size :全局变量,存储 CPU 缓存行大小,默认值为 NGX_CPU_CACHE_LINE
  • for 循环 :计算页面大小的对数(ngx_pagesize_shift),即页面大小是 2 的多少次幂。例如,4KB 的页面大小对应 ngx_pagesize_shift = 12
  • 意图 :页面大小和缓存行大小是性能优化的重要参数,直接影响内存分配和 CPU 缓存效率。

getpagesize 

在 C 语言中,getpagesize() 函数用于获取系统内存页的大小(以字节为单位)

函数原型

int getpagesize(void);

返回值

  • 返回值是一个整数,表示系统内存页的大小(以字节为单位)
  • 例如,在许多现代系统上,返回值通常是 4096 字节(即 4KB)

需要包含以下头文件:

#include <unistd.h>

 NGX_CPU_CACHE_LINE

定义在 objs/ngx_auto_config.h

#ifndef NGX_CPU_CACHE_LINE
#define NGX_CPU_CACHE_LINE  64
#endif

CPU 核心数初始化

#if (NGX_HAVE_SC_NPROCESSORS_ONLN)if (ngx_ncpu == 0) {ngx_ncpu = sysconf(_SC_NPROCESSORS_ONLN);}
#endifif (ngx_ncpu < 1) {ngx_ncpu = 1;}

 

  • sysconf(_SC_NPROCESSORS_ONLN) :获取当前系统在线的 CPU 核心数。
  • ngx_ncpu :全局变量,存储 CPU 核心数。
  • 默认值处理 :如果核心数小于 1,则设置为 1(防止异常情况)。
  • 设计意图 :根据 CPU 核心数动态调整工作线程的数量,充分利用多核优势。

 NGX_HAVE_SC_NPROCESSORS_ONLN

定义在 objs/ngx_auto_config.h

#ifndef NGX_HAVE_SC_NPROCESSORS_ONLN
#define NGX_HAVE_SC_NPROCESSORS_ONLN  1
#endif

用于指示当前系统是否支持通过 sysconf(_SC_NPROCESSORS_ONLN) 获取在线 CPU 核心数。它的定义与否取决于目标操作系统和硬件平台的特性

不同的操作系统对 sysconf(_SC_NPROCESSORS_ONLN) 的支持情况不同:

  • Linux :完全支持 sysconf(_SC_NPROCESSORS_ONLN),因此该宏通常会被定义。
  • Windows :Windows 不支持 POSIX 标准的 sysconf 函数,因此该宏不会被定义

sysconf

函数原型

long sysconf(int name);
  • 返回值

    • 成功时,返回与 name 参数对应的系统配置值。
    • 如果发生错误(例如参数无效或功能不支持),返回 -1
  • 参数

    • name:指定要查询的系统配置选项。它是一个常量,表示不同的系统属性。
      • _SC_NPROCESSORS_ONLN 是其中一个常量,表示系统中当前在线的 CPU 核心数。

 CPU 缓存行大小初始化

#if (NGX_HAVE_LEVEL1_DCACHE_LINESIZE)size = sysconf(_SC_LEVEL1_DCACHE_LINESIZE);if (size > 0) {ngx_cacheline_size = size;}
#endif
  • sysconf(_SC_LEVEL1_DCACHE_LINESIZE) :获取一级缓存行大小。
  • 更新 ngx_cacheline_size :如果获取到的值有效,则更新全局变量。
  • 意图 :缓存行大小影响内存对齐和性能优化,动态获取可以适配不同的硬件架构。

 NGX_HAVE_LEVEL1_DCACHE_LINESIZE

定义在 objs/ngx_auto_config.h

#ifndef NGX_HAVE_LEVEL1_DCACHE_LINESIZE
#define NGX_HAVE_LEVEL1_DCACHE_LINESIZE  1
#endif

CPU 信息初始化

    ngx_cpuinfo();

 

  • ngx_cpuinfo :获取 CPU 的详细信息(如型号、特性等),并存储在全局变量中。

 ngx_cpuinfo

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_cpuinfo 函数-CSDN博客

文件描述符限制初始化

    if (getrlimit(RLIMIT_NOFILE, &rlmt) == -1) {ngx_log_error(NGX_LOG_ALERT, log, errno,"getrlimit(RLIMIT_NOFILE) failed");return NGX_ERROR;}ngx_max_sockets = (ngx_int_t) rlmt.rlim_cur;

 

  • getrlimit :获取当前进程的最大文件描述符限制。
  • rlmt :存储限制值的结构体。
  • ngx_max_sockets :全局变量,存储最大文件描述符数量。
  • 错误处理 :如果获取失败,记录错误日志并返回 NGX_ERROR
  • 意图 :文件描述符限制决定了 Nginx 能同时处理的最大连接数,合理设置可以避免资源耗尽。

getrlimit

getrlimit 是一个 POSIX 标准函数,用于获取当前进程的资源限制。

它允许程序查询操作系统对某种资源的硬限制(hard limit)和软限制(soft limit)

函数原型

int getrlimit(int resource, struct rlimit *rlim);
  • 返回值

    • 成功时返回 0
    • 失败时返回 -1,并设置 errno 表示错误原因。

(1) resource 参数

  • 类型 int

  • 含义 :指定要查询的资源类型。

  • 常用值

    • RLIMIT_NOFILE:表示文件描述符的最大数量(Number of Open Files)。
    • 其他可能的值包括:
      • RLIMIT_CPU:CPU 时间限制。
      • RLIMIT_DATA:数据段大小限制。
      • RLIMIT_STACK:栈大小限制。
  • 意图

    • 在这里,RLIMIT_NOFILE 被传递给 getrlimit,表示我们关心的是文件描述符的数量限制。

(2) rlim 参数

  • 类型 struct rlimit *
  • 含义 :指向一个 rlimit 结构体的指针,用于存储查询结果。
rlimit 结构体定义
struct rlimit {rlim_t rlim_cur;  // 软限制(Soft Limit)rlim_t rlim_max;  // 硬限制(Hard Limit)
};
  • rlim_cur

    • 当前生效的限制值(软限制)。
    • 进程可以动态调整软限制,但不能超过硬限制。
  • rlim_max

    • 最大允许的限制值(硬限制)。
    • 只有超级用户(root)才能修改硬限制。

意图

获取文件描述符限制

  • 文件描述符是操作系统用于管理打开文件、套接字等资源的抽象句柄。
  • 每个进程都有一个文件描述符表,其大小由 RLIMIT_NOFILE 决定。
  • 通过调用 getrlimit(RLIMIT_NOFILE, &rlmt),Nginx 获取当前进程的文件描述符限制:
    • rlmt.rlim_cur:当前允许的最大文件描述符数量(软限制)。
    • rlmt.rlim_max:理论上允许的最大文件描述符数量(硬限制)。

非阻塞套接字标志初始化

#if (NGX_HAVE_INHERITED_NONBLOCK || NGX_HAVE_ACCEPT4)ngx_inherited_nonblocking = 1;
#elsengx_inherited_nonblocking = 0;
#endif

 

  • ngx_inherited_nonblocking :全局变量,指示是否支持继承非阻塞套接字。
  • 条件编译 :根据是否支持 NGX_HAVE_INHERITED_NONBLOCKNGX_HAVE_ACCEPT4 设置标志。
  • 意图 :非阻塞套接字是高并发网络编程的基础,确保套接字行为一致。

NGX_HAVE_INHERITED_NONBLOCK

  • 含义

    • 表示当前系统是否支持继承非阻塞套接字(Inherited Non-blocking Sockets)。
    • 如果定义了该宏,则表示系统允许父进程创建的套接字在子进程中保持非阻塞状态。
  • 背景

    • 在传统的网络编程中,套接字的阻塞或非阻塞状态是由每个进程独立管理的。
    • 如果系统支持继承非阻塞套接字,则父进程设置的非阻塞状态可以直接被子进程继承,而无需额外的系统调用。
  • 优点

    • 减少了系统调用的开销,提高了性能。
    • 简化了多进程模型中的套接字管理逻辑。

NGX_HAVE_ACCEPT4

  • 含义

    • 表示当前系统是否支持 accept4 系统调用。
    • accept4 是 Linux 内核 2.6.28 引入的一个扩展版本的 accept 系统调用,允许在接收新连接时直接设置套接字选项(如非阻塞模式)。
  • 背景

    • 传统的 accept 系统调用仅返回一个新的套接字文件描述符,但无法直接设置套接字选项。
    • 使用 accept4 可以在接收连接的同时设置套接字为非阻塞模式或其他选项,从而减少额外的系统调用。
  • 优点

    • 提高了性能,减少了系统调用次数。
    • 简化了代码逻辑,避免了在 accept 后手动调用 fcntl 或其他函数来设置套接字选项。

 随机数种子初始化

    tp = ngx_timeofday();srandom(((unsigned) ngx_pid << 16) ^ tp->sec ^ tp->msec);
  • ngx_timeofday :获取当前时间戳。
  • srandom :设置随机数种子。
  • 种子生成公式 (进程 ID << 16) ^ 当前秒数 ^ 当前毫秒数
  • 意图 :随机数种子用于生成唯一的随机数序列,避免每次运行时生成相同的随机数。

ngx_timeofday

定义在 src/core/ngx_times.h

#define ngx_timeofday()      (ngx_time_t *) ngx_cached_time

srandom

srandom 是标准库函数,用于设置随机数生成器的种子。

种子值决定了随机数序列的初始状态。如果种子值不同,生成的随机数序列也会不同。

返回成功

    return NGX_OK;

 

相关文章:

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_os_init 函数

ngx_os_init 声明在 src/os/unix/ngx_os.h ngx_int_t ngx_os_init(ngx_log_t *log); 定义在 src\os\unix\ngx_posix_init.c ngx_int_t ngx_os_init(ngx_log_t *log) {ngx_time_t *tp;ngx_uint_t n; #if (NGX_HAVE_LEVEL1_DCACHE_LINESIZE)long size; #endif#if (NGX…...

记录一次部署PC端网址全过程

当我查看我之前写的文章时、顿时惊奇发出感慨&#xff1a;啥时候写的&#xff1f;是我写的么&#xff1f;疑惑重重… 所以说&#xff0c;好记性不如烂笔头。 记录一次部署PC端网址全过程 部署PC端网址分是三步&#xff1a;第一步&#xff1a;申请域名并映射到外网IP &#xff0…...

QML 实现一个动态的启动界面

QML 实现一个动态的启动界面 一、效果查看二、源码分享三、所用到的资源下载 一、效果查看 二、源码分享 工程结构 main.qml import QtQuick import QtQuick.Controls import QtQuick.Dialogs import Qt.labs.platformWindow {id:windowwidth: 640height: 400visible: truetit…...

视频HDR技术详解,你的电脑怎么播放HDR视频?

闲聊&#xff1a;前两天在b站上面看到影视飓风的视频&#xff0c;让我有点疑惑&#xff0c;我不知道为什么播放视频有设备撑不住一说&#xff0c;所以感兴趣去ytb下载了4k原片30hz刷新的&#xff0c;然后测试一下我的电脑能不能播放&#xff0c;发现还是可以的&#xff0c;视觉…...

Spring统一功能处理:拦截器、响应与异常的统一管理

目录 一.拦截器 二.统一数据返回格式 三.统一异常处理 一.拦截器 拦截器是Spring框架提供的核功能之&#xff0c;主要来拦截的请求&#xff0c;在指定法前后&#xff0c;根据业务需要执预先设定的代码。 也就是说&#xff0c;允许开发员提前预定义些逻辑&#xff0c;在的请…...

2025年度福建省职业院校技能大赛高职组“信息安全管理与评估”赛项规程

2025 年度福建省职业院校技能大赛 高 职组“ 信息安全管理与评估 ”赛项规程 一、赛项名称 省赛编号&#xff1a;GZ032 赛项名称&#xff1a;信息安全管理与评估 赛项组别&#xff1a;高职组 竞赛形式&#xff1a; 团体赛 二、竞赛目的 为全面贯彻落实国家网络强国战略&#x…...

Vue 中 nextTick 的原理详解

1. 为什么需要 nextTick Vue 采用 异步渲染机制&#xff0c;当响应式数据发生变化时&#xff0c;Vue 并不会立即更新 DOM&#xff0c;而是将这些变化放入一个 队列 中&#xff0c;并在 同一事件循环&#xff08;Event Loop&#xff09;中合并相同的修改&#xff0c;最后执行批…...

vue 手写分页

【先看效果】 &#xff08;1&#xff09;内容小于2页 不展示页码 &#xff08;2&#xff09;1 < 内容页数< 限定展示页码 展示&#xff1a;页码、上下页&#xff1b;隐藏&#xff1a;首页、末页图标&#xff0c;上、下一区间码。即&#xff1a;&#xff08;页数&#…...

跟着柳叶刀数字健康,学习如何通过病理切片预测分子分类对预后的影响|项目复现

小罗碎碎念 项目复现 今天和大家分享一个非常具有参考价值的项目,手把手带着大家复现一篇发表在柳叶刀数字健康的文章。 花了六个小时才完成的这篇推送,信息量非常大,遇到了很多报错问题,但是解决以后的感觉是非常爽的,先给大家展示一下最终的成果——在同一张切片上,通…...

DuodooBMS源码解读之 sale_change模块

销售变更模块用户使用手册 一、模块概述 本扩展模块主要包含两个主要的 Python 文件&#xff1a;sale_change/report/sale_change_report.py 和 sale_change/wizard/sale_change_download.py&#xff0c;提供了销售变更报表查看和销售变更单下载的功能。以下是详细的使用说明…...

基于 Highcharts 实现 Vue 中的答题统计柱状图组件

在现代 Web 开发中&#xff0c;数据可视化是一个重要的组成部分&#xff0c;而 Highcharts 是一个广泛使用的 JavaScript 图表库&#xff0c;可以帮助开发者在 Web 页面上轻松地绘制丰富的图表。在本文中&#xff0c;我们将基于 Highcharts 创建一个用于答题统计的柱状图&#…...

MySQL 插入更新语句(insert…on duplicate key update语句 )

我们日常在使用 insert into 语句向表中插入数据时&#xff0c;一定遇到过主键或唯一索引冲突的情况&#xff0c;当遇到这种情况时&#xff0c;MySQL默认的反应是报错并停止执行后续的语句&#xff0c;为了避免这种情况&#xff0c;你有3种选择&#xff1a; 使用insert ignore…...

Jenkins整合Jmeter实现接口自动化测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、安装jmeter 下载&#xff1a;http://jmeter.apache.org/download_jmeter.cgi 这里我用了一台Windows安装jmeter用来写接口测试的脚本&#xff0c;启动前修改j…...

基于LM Arena 的 LLM 基准测试排行榜:DeepSeek-R1 排名第 5

打开 Arena 网站&#xff1a;https://lmarena.ai/&#xff0c;点开 Leaderboard 可以看到上图的排行榜&#xff0c;可以看到 DeepSeek-R1 排名第 5。...

游戏引擎学习第116天

回顾昨天的工作 本次工作内容主要集中在游戏开发的低级编程优化&#xff0c;尤其是手动优化软件渲染。工作目的之一是鼓励开发者避免依赖外部库&#xff0c;而是深入理解代码并进行优化。当前阶段正进行SIMD&#xff08;单指令多数据&#xff09;优化&#xff0c;使用Intel推荐…...

【AI绘画】大卫• 霍克尼风格——自然的魔法(一丹一世界)

大卫• 霍克尼&#xff0c;很喜欢这个老头&#xff0c;“艺术是一场战斗”。老先生零九年有了iphone&#xff0c;开始用iphone画画&#xff0c;一零年开始用ipad画画&#xff0c;用指头划拉&#xff0c;据说五分钟就能画一幅&#xff0c;每天早上随手画几幅送给身边的朋友。很c…...

当湖南家具遇上DeepSeek:极满家开启智能家居新时代

在湖南的街头巷尾&#xff0c;总流传着这样一句话&#xff1a;家具有温度&#xff0c;生活才有味道。走进铂乐极满家的展厅&#xff0c;只有被阳光浸润的原木香气&#xff0c;和智能家居跳动的温暖建议。DeepSeek就推荐了能自动调节高度的智能款&#xff0c;连护眼灯角度都算好…...

#渗透测试#批量漏洞挖掘#畅捷通T+远程命令执行漏洞

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 一、漏洞概况 二、攻击特征 三、应急处置…...

Docker挂载数据显式挂载和隐式挂载的区别

项目使用的Docker file 创建数据卷挂载点&#xff0c;结果发现宿主机目录中的数据卷路径下是空的&#xff0c;才知道docker file中创建的数据卷是隐式挂载&#xff0c;并不会在宿主机上留下持久化数据&#xff0c;随着容器被删除隐式挂载的数据卷也会跟着被删除 后面改为在jen…...

深度解析应用层协议-----HTTP与MQTT(涵盖Paho库)

HTTP协议概述 1.1 HTTP的基本概念 HTTP是一种应用层协议&#xff0c;使用TCP作为传输层协议&#xff0c;默认端口是80&#xff0c;基于请求和响应的方式&#xff0c;即客户端发起请求&#xff0c;服务器响应请求并返回数据&#xff08;HTML&#xff0c;JSON&#xff09;。在H…...

MySQL八股学习笔记

文章目录 一、MySQL结构1.宏观结构1.1.Server层1.2.存储引擎层 2.建立链接-连接器3.查询缓存4.解析SQL-解析器&#xff08;1&#xff09;词法分析&#xff08;2&#xff09;语法分析 5.执行SQL5.1.预处理器 prepare5.2.优化器 optimize5.3.执行器 execute&#xff08;1&#xf…...

C++ 设计模式-备忘录模式

游戏存档实现&#xff0c;包括撤销/重做、持久化存储、版本控制和内存管理 #include <iostream> #include <memory> #include <deque> #include <stack> #include <chrono> #include <fstream> #include <sstream> #include <ct…...

Jenkins 环境搭建---基于 Docker

前期准备 提前安装jdk、maven、nodeJs&#xff08;如果需要的话&#xff09; 创建 jenkins 环境目录&#xff0c;用来当做挂载卷 /data/jenkins/ 一&#xff1a;拉取 Jenkins 镜像 docker pull jenkins/jenkins:lts 二&#xff1a;设置 Jenkins挂载目录 mkdir -p ~/jen…...

【动态规划篇】:解析背包问题--动态规划塑造的算法利器

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;动态规划篇–CSDN博客 文章目录 一.01背包问题1.模板题2.例题1.分割等和子集2.目标和3.最后…...

ok113i平台——多媒体播放器适配

1. 视频播放支持 1.1 在Linux平台交叉编译ffmpeg动态库&#xff0c;详情查看《ok113i平台——交叉编译音视频动态库》 提取如下动态库&#xff1a; libavcodec.so.58.134.100 libavdevice.so.58.13.100 libavfilter.so.7.110.100 libavformat.so.58.76.100 libavutil.so.56.…...

【保姆级教程】DeepSeek R1+RAG,基于开源三件套10分钟构建本地AI知识库

一、总体方案 目前在使用 DeepSeek 在线环境时&#xff0c;页面经常显示“服务器繁忙&#xff0c;请稍后再试”&#xff0c;以 DeepSeek R1 现在的火爆程度&#xff0c;这个状况可能还会持续一段时间&#xff0c;所以这里给大家提供了 DeepSeek R1 RAG 的本地部署方案。最后实现…...

线程与进程的深入解析及 Linux 线程编程

在操作系统中&#xff0c;进程和线程是进行并发执行的两种基本单位。理解它们的区别和各自的特点&#xff0c;能够帮助开发者更好地进行多任务编程&#xff0c;提高程序的并发性能。本文将探讨进程和线程的基础概念&#xff0c;及其在 Linux 系统中的实现方式&#xff0c;并介绍…...

微信问题总结(onpageshow ,popstate事件)

此坑描述 订单详情某按钮点击&#xff0c;通过window.location.href跳转到&#xff08;外部&#xff09;第三方链接后&#xff0c;回退后&#xff0c;在ios中生命周期和路由导航钩子都失效了&#xff0c;无法触发。 在安卓中无视此坑&#xff0c; 回退没有问题 解决 原因&am…...

自己安装一台DeepSeek的服务器

找一台还可以的Linux服务器&#xff0c;登录后执行&#xff1a; curl -fsSL https://ollama.com/install.sh | sh 等待安装完成&#xff1a; 执行命令&#xff0c;根据服务器能力安装不同版本的AI模型&#xff1a; ollama run llama3.2 下一步就开始对话吧&#xff1a; llam…...

面阵工业相机提高餐饮业生产效率

餐饮行业是一个快节奏、高要求的领域&#xff0c;该领域对生产过程中每一个阶段的效率和准确性都有很高的要求。在食品加工、包装、质量控制和库存管理等不同生产阶段实现生产效率的优化是取得成功的关键步骤。面阵工业相机能够一次性捕捉对象的二维区域图像&#xff0c;并支持…...

Java 中 HTTP 协议版本使用情况剖析

Java 中 HTTP 协议版本使用情况剖析 一、HTTP/1.1 与 HTTP/2 概述 (一)HTTP/1.1 HTTP/1.1 是广泛应用且成熟的 HTTP 协议版本,它在互联网发展历程中扮演了重要角色。其特点主要包括: 连接方式:默认采用短连接,即每次请求都要建立新的 TCP 连接,请求完成后断开。不过也…...

计算机网络之物理层——基于《计算机网络》谢希仁第八版

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…...

DeepSeek 助力 Vue 开发:打造丝滑的缩略图列表(Thumbnail List)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

day56 第十一章:图论part06

108.冗余连接 注意init初始化 改进&#xff1a; 其实只有一条边冗余&#xff0c;改为&#xff0c;如果两条边在同一个集合里&#xff0c;就输出&#xff0c;不然加入。 #include <iostream> #include <vector> using namespace std;int n 1005; vector<int>…...

conda 配置源

无论是Anaconda vs Miniconda vs Miniforge 中的哪个&#xff0c;只要使用conda就涉及源&#xff0c;换源的目的是为了加速包的获取 修改配置文件 通过修改用户目录下的 .condarc 文件来使用 不同系统下的 .condarc 目录如下&#xff1a; Linux: ${HOME}/.condarcmacOS: ${…...

LangChain大模型应用开发:多模态输入与自定义输出

介绍 大家好&#xff0c;博主又来给大家分享知识了。今天给大家分享的内容是使用LangChain进行大模型应用开发中的多模态输入与自定义输出。 LangChain中的多模态数据输入是指将多种不同形式的数据作为输入提供给基于语言模型的应用程序或系统&#xff0c;以丰富交互内容和提…...

HarmonyOS 开发套件 介绍 ——上篇

HarmonyOS 开发套件 介绍 ——上篇 在当今科技飞速发展的时代&#xff0c;操作系统作为智能设备的核心&#xff0c;其重要性不言而喻。而HarmonyOS&#xff0c;作为华为推出的全新操作系统&#xff0c;正以其独特的魅力和强大的功能&#xff0c;吸引着越来越多的开发者和用户的…...

【Unity Shader编程】之图元装配与光栅化

执行方式&#xff1a;自动完成 图元装配自动化流程 顶点坐标存入装配区 → 按绘制模式连接顶点 → 生成完整几何图元 示例&#xff1a;gl.drawArrays(gl.TRIANGLES, 0, 3)自动生成三角形 会自动自动裁剪超出屏幕范围&#xff08;NDC空间外&#xff09;的三角形&#xff0c;仅保…...

小游戏-记忆卡牌

1、游戏开始4张卡牌&#xff0c;每次过关后新增两张&#xff0c;总共64张卡&#xff0c;可以修改数组EMOJIS&#xff0c;添加表情&#xff0c;增加卡牌数量 2、新建txt文件&#xff0c;将代码粘贴进去&#xff0c;保存后&#xff0c;将txt修改后缀名为html的格式 <!DOCTYPE…...

数据结构——二叉树经典习题讲解

各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦 大家好&#xff0c;我们今天来学习java数据结构的二叉树 递归很重要的一些注意事项&#xff1a; 1&#xff1a;递归你能不能掌握在于&#xff1…...

centos 9 时间同步服务

在 CentOS 9 中&#xff0c;默认的时间同步服务是 chrony&#xff0c;而不是传统的 ntpd。 因此&#xff0c;建议使用 chrony 来配置和管理时间同步。 以下是使用 chrony 配置 NTP 服务的步骤&#xff1a; 1. 安装 chrony 首先&#xff0c;确保系统已安装 chrony。 在 CentOS…...

视觉应用工程师(面试)

视觉应用工程师&#xff08;面试&#xff09; 1.自我介绍、会的技能、项目 2.相机和机械手调试过程 检查硬件&#xff0c;看软件驱动是否链接&#xff0c;调节相机和镜头保证能够识别这个物料&#xff0c;看接口和通讯是否正常&#xff0c;如&#xff1a;波特率&#xff0c;数…...

macos sequoia 禁用 ctrl+enter 打开鼠标右键菜单功能

macos sequoia默认ctrlenter会打开鼠标右键菜单&#xff0c;使得很多软件有冲突。关闭方法&#xff1a; end...

【后端基础】布隆过滤器原理

文章目录 一、Bloom Filter&#xff08;布隆过滤器&#xff09;概述1. Bloom Filter 的特点2. Bloom Filter 的工作原理 二、示例1. 添加与查询2. 假阳性 三、Bloom Filter 的操作1、假阳性概率2、空间效率3、哈希函数的选择 四、应用 Bloom Filter 是一种非常高效的概率型数据…...

cs*n 网页内容转为html 加入 onenote

csdn上有好用的内容&#xff0c;我们怎么将它们加到 onenote 里吃灰呢。 一、创建 新html create_html.py import sysdef create_html_file(filename):# 检查是否提供了文件名if not filename:print("请提供HTML文件名")return# 创建HTML内容html_content f"…...

输入搜索、分组展示选项、下拉选取,全局跳转页,el-select 实现 —— 后端数据处理代码,抛砖引玉展思路

详细前端代码写于上一篇&#xff1a;输入搜索、分组展示选项、下拉选取&#xff0c;el-select 实现&#xff1a;即输入关键字检索&#xff0c;返回分组选项&#xff0c;选取跳转到相应内容页 —— VUE项目-全局模糊检索 【效果图】&#xff1a;分组展示选项 【去界面操作体验】…...

蓝桥杯 Java B 组之岛屿数量、二叉树路径和(区分DFS与回溯)

Day 3&#xff1a;岛屿数量、二叉树路径和&#xff08;区分DFS与回溯&#xff09; &#x1f4d6; 一、深度优先搜索&#xff08;DFS&#xff09;简介 深度优先搜索&#xff08;Depth-First Search&#xff0c;DFS&#xff09;是一种用于遍历或搜索树或图的算法。它会沿着树的分…...

【论文阅读】SAM-CP:将SAM与组合提示结合起来的多功能分割

导言 近年来&#xff0c;视觉基础模型的快速发展推动了多模态理解的进步&#xff0c;尤其是在图像分割任务中。例如&#xff0c;Segment Anything模型&#xff08;SAM&#xff09;在图像Mask分割上表现出色&#xff0c;但在语义及实例分割方面仍存在局限。本文提出的SAM-CP&am…...

JUC并发—9.并发安全集合四

大纲 1.并发安全的数组列表CopyOnWriteArrayList 2.并发安全的链表队列ConcurrentLinkedQueue 3.并发编程中的阻塞队列概述 4.JUC的各种阻塞队列介绍 5.LinkedBlockingQueue的具体实现原理 6.基于两个队列实现的集群同步机制 4.JUC的各种阻塞队列介绍 (1)基于数组的阻塞…...

爱普生 SG-8101CE 可编程晶振在笔记本电脑的应用

在笔记本电脑的精密架构中&#xff0c;每一个微小的元件都如同精密仪器中的齿轮&#xff0c;虽小却对整体性能起着关键作用。如今的笔记本电脑早已不再局限于简单的办公用途&#xff0c;其功能愈发丰富多样。从日常轻松的文字处理、网页浏览&#xff0c;到专业领域中对图形处理…...