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

[Linux] Linux信号量深度解析与实践(代码示例)

Linux信号量深度解析与实践

文章目录

  • Linux信号量深度解析与实践
    • 一、什么是信号量
      • 1. 信号量的核心概念
      • 2. 信号量的分类
      • 3. 信号量的操作机制
    • 二、怎么用信号量
      • 1. 信号量API的深度解析
        • (1)无名信号量API
        • (2)有名信号量API
        • (3)System V信号量API
      • 2. API使用示例
        • 示例1:无名信号量实现线程同步
        • 示例2:System V信号量实现进程同步
    • 三、总结
      • 1. 信号量的适用场景
      • 2. 与互斥锁的对比
      • 3. 优化与研究方向

一、什么是信号量

1. 信号量的核心概念

  • 本质:信号量是一种非负整数计数器,用于管理共享资源的访问权限。它通过维护一个整数值来跟踪可用资源的数量,从而实现对资源的合理分配和调度。
  • 作用
    • 互斥:信号量可以确保同一时刻仅有一个进程或线程访问临界资源,避免资源竞争和数据不一致问题。例如,在多线程环境中,信号量可以保护共享内存区域,防止多个线程同时修改数据。
    • 同步:信号量用于协调多个进程或线程的执行顺序,确保它们按照预期的逻辑顺序执行。例如,在生产者-消费者模型中,信号量可以确保生产者在缓冲区未满时才能写入数据,而消费者在缓冲区非空时才能读取数据。

2. 信号量的分类

  • 按初始值
    • 二进制信号量:其值只能为0或1,通常用于实现互斥锁功能。例如,在多个线程访问共享资源时,二进制信号量可以确保同一时刻只有一个线程进入临界区。
    • 计数信号量:其值可以大于或等于0,用于管理有限数量的资源。例如,在数据库连接池中,计数信号量可以跟踪当前可用的连接数,确保不会超过最大连接限制。
  • 按使用场景
    • 无名信号量:基于共享内存实现,适用于线程间的同步。例如,在多线程程序中,无名信号量可以用于协调线程之间的任务分配。
    • 有名信号量:具有系统级标识,支持跨进程通信。例如,在分布式系统中,有名信号量可以用于协调不同进程对共享资源的访问。

3. 信号量的操作机制

  • P操作(Proberen):也称为“等待”操作,尝试减少信号量的值。如果信号量的值大于0,则将其减1并继续执行;如果信号量的值为0,则当前进程或线程将被阻塞,直到信号量的值变为正数。例如,在生产者-消费者模型中,消费者线程执行P操作以等待缓冲区中有数据可用。
  • V操作(Verhogen):也称为“释放”操作,增加信号量的值。如果信号量的值增加后大于0,则唤醒一个被阻塞的进程或线程。例如,在生产者-消费者模型中,生产者线程执行V操作以通知消费者线程有新的数据可用。

通过P操作和V操作的组合,信号量能够有效地管理资源的分配和释放,确保系统的稳定性和高效性。


二、怎么用信号量

1. 信号量API的深度解析

(1)无名信号量API

无名信号量通常用于线程间的同步,其生命周期与创建它的进程或线程绑定。以下是其核心API的详细解析:

  • sem_init:初始化信号量。

    int sem_init(sem_t *sem, int pshared, unsigned int value);
    
    • 参数
      • sem:指向信号量对象的指针,用于存储信号量的状态。
      • pshared:指定信号量的共享范围。
        • 0:信号量仅在同一进程的线程间共享。
        • 非0:信号量可在多个进程间共享(需配合共享内存使用)。
      • value:信号量的初始值,通常用于表示资源的可用数量。
    • 返回值:成功返回0,失败返回-1,并设置errno以指示错误原因。
  • sem_wait:P操作,减少信号量值。如果信号量值为0,调用线程将阻塞,直到信号量值大于0。

    int sem_wait(sem_t *sem);
    
    • 参数sem:指向信号量对象的指针。
    • 返回值:成功返回0,失败返回-1。
  • sem_post:V操作,增加信号量值。如果有线程因sem_wait而阻塞,该操作会唤醒其中一个线程。

    int sem_post(sem_t *sem);
    
    • 参数sem:指向信号量对象的指针。
    • 返回值:成功返回0,失败返回-1。
  • sem_destroy:销毁信号量,释放其占用的资源。

    int sem_destroy(sem_t *sem);
    
    • 参数sem:指向信号量对象的指针。
    • 返回值:成功返回0,失败返回-1。
(2)有名信号量API

有名信号量通过文件系统中的路径名标识,可用于进程间同步。以下是其核心API的详细解析:

  • sem_open:创建或打开有名信号量。

    sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);
    
    • 参数
      • name:信号量的路径名,必须以/开头。
      • oflag:打开标志,如O_CREAT(创建信号量)或O_EXCL(确保信号量不存在)。
      • mode:权限模式,仅在创建信号量时有效。
      • value:信号量的初始值。
    • 返回值:成功返回信号量指针,失败返回SEM_FAILED
  • sem_close:关闭有名信号量,释放进程对信号量的引用。

    int sem_close(sem_t *sem);
    
    • 参数sem:指向信号量对象的指针。
    • 返回值:成功返回0,失败返回-1。
  • sem_unlink:删除有名信号量,释放其占用的系统资源。

    int sem_unlink(const char *name);
    
    • 参数name:信号量的路径名。
    • 返回值:成功返回0,失败返回-1。
(3)System V信号量API

System V信号量是一种更复杂的信号量机制,支持信号量集和原子操作。以下是其核心API的详细解析:

  • semget:创建或获取信号量集。

    int semget(key_t key, int nsems, int semflg);
    
    • 参数
      • key:信号量集的键值,通常通过ftok生成。
      • nsems:信号量集中信号量的数量。
      • semflg:创建标志,如IPC_CREAT(创建信号量集)或IPC_EXCL(确保信号量集不存在)。
    • 返回值:成功返回信号量集标识符,失败返回-1。
  • semctl:控制信号量集,支持多种操作,如设置信号量值、删除信号量集等。

    int semctl(int semid, int semnum, int cmd, ...);
    
    • 参数
      • semid:信号量集标识符。
      • semnum:信号量集中的信号量编号。
      • cmd:控制命令,如SETVAL(设置信号量值)、IPC_RMID(删除信号量集)。
      • 可变参数:根据cmd的不同,可能需要传递额外的参数。
    • 返回值:成功返回0或特定值,失败返回-1。
  • semop:执行PV操作,支持对信号量集的原子操作。

    int semop(int semid, struct sembuf *sops, size_t nsops);
    
    • 参数
      • semid:信号量集标识符。
      • sops:指向操作数组的指针,每个操作描述对信号量的操作。
      • nsops:操作数组的大小。
    • 返回值:成功返回0,失败返回-1。

2. API使用示例

示例1:无名信号量实现线程同步
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>sem_t sem; // 定义无名信号量void* thread_func(void* arg) {sem_wait(&sem); // P操作,尝试获取信号量,若信号量为0则阻塞printf("Thread %ld: Accessing critical section\n", (long)arg);sleep(1); // 模拟临界区操作,例如访问共享资源sem_post(&sem); // V操作,释放信号量,唤醒等待的线程return NULL;
}int main() {pthread_t t1, t2;// 初始化信号量,第二个参数为0表示信号量在线程间共享,第三个参数为1表示信号量初始值为1(二进制信号量)sem_init(&sem, 0, 1); // 创建两个线程,分别执行thread_func函数pthread_create(&t1, NULL, thread_func, (void*)1);pthread_create(&t2, NULL, thread_func, (void*)2);// 等待两个线程执行完毕pthread_join(t1, NULL);pthread_join(t2, NULL);sem_destroy(&sem); // 销毁信号量,释放相关资源return 0;
}

示例代码编译与运行说明

  • 使用以下命令编译代码:
    gcc sem_example.c -lpthread -o sem_example
    
  • 运行生成的可执行文件:
    ./sem_example
    
  • 运行结果示例:
    Thread 1: Accessing critical section
    Thread 2: Accessing critical section
    
  • 解释:
    • 该程序使用无名信号量实现了两个线程对临界区的互斥访问。
    • 信号量初始值为1,表示临界区未被占用。
    • 线程1和线程2通过sem_waitsem_post操作确保同一时间只有一个线程进入临界区。
    • sleep(1)模拟了临界区操作,确保线程在临界区中停留一段时间。
    • 最终,两个线程依次访问临界区,避免了竞争条件的发生。
示例2:System V信号量实现进程同步
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>// 定义semun联合体,用于信号量控制操作
union semun {int val;                // SETVAL命令使用的值struct semid_ds *buf;   // IPC_STAT和IPC_SET命令使用的缓冲区unsigned short *array;  // GETALL和SETALL命令使用的数组
};int main() {// 使用ftok生成唯一的键值,用于标识信号量集key_t key = ftok(".", 1);if (key == -1) {perror("ftok");return 1;}// 创建或获取一个信号量集,包含1个信号量,权限为0666(可读可写)int semid = semget(key, 1, IPC_CREAT | 0666);if (semid == -1) {perror("semget");return 1;}// 初始化信号量值为1,表示资源可用union semun arg;arg.val = 1;if (semctl(semid, 0, SETVAL, arg) == -1) {perror("semctl SETVAL");return 1;}// 定义P操作,将信号量值减1,进入临界区struct sembuf sb = {0, -1, 0}; // 0表示信号量索引,-1表示操作值,0表示标志if (semop(semid, &sb, 1) == -1) {perror("semop P operation");return 1;}printf("Process %d: Entering critical section\n", getpid());sleep(2); // 模拟临界区操作printf("Process %d: Leaving critical section\n", getpid());// 定义V操作,将信号量值加1,离开临界区sb.sem_op = 1;if (semop(semid, &sb, 1) == -1) {perror("semop V operation");return 1;}// 删除信号量集if (semctl(semid, 0, IPC_RMID) == -1) {perror("semctl IPC_RMID");return 1;}return 0;
}

示例代码编译与运行说明

  1. 将上述代码保存为sysv_sem.c文件。
  2. 使用以下命令编译代码:
    gcc sysv_sem.c -o sysv_sem
    
  3. 运行生成的可执行文件:
    ./sysv_sem
    
  4. 运行结果将显示进程进入和离开临界区的信息,并确保临界区的互斥访问。

应用场景
该示例展示了如何使用System V信号量实现进程间的同步,适用于多进程环境中对共享资源的互斥访问,例如:

  • 多个进程访问共享内存区域时,确保同一时间只有一个进程可以修改数据。
  • 控制对文件或设备的访问,避免多个进程同时写入导致数据混乱。
  • 实现生产者-消费者模型中的缓冲区访问控制。

三、总结

1. 信号量的适用场景

信号量作为一种经典的同步机制,在操作系统和并发编程中有着广泛的应用,主要体现在以下两个方面:

  1. 互斥
    信号量常用于保护临界资源,确保同一时间只有一个线程或进程访问共享资源,从而避免数据竞争和不一致性问题。例如,在多线程环境下,多个线程可能同时访问共享内存区域或操作同一个文件。通过使用二进制信号量(即互斥信号量),可以确保每次只有一个线程进入临界区,其他线程必须等待信号量释放后才能继续执行。这种机制在数据库事务管理、文件系统操作等场景中尤为重要。

  2. 同步
    信号量还可用于协调多个任务或线程的执行顺序,确保它们按照预期的逻辑运行。典型的应用场景是生产者-消费者模型:生产者线程生成数据并将其放入缓冲区,而消费者线程从缓冲区中取出数据进行处理。通过使用信号量,可以控制缓冲区的访问,避免缓冲区溢出或空读问题。例如,设置一个信号量表示缓冲区中的可用空间数量,另一个信号量表示已填充的数据数量,从而实现生产者和消费者之间的高效协作。

2. 与互斥锁的对比

信号量与互斥锁都是用于解决并发问题的同步机制,但它们在功能和适用场景上存在显著差异:

  1. 灵活性
    信号量比互斥锁更加灵活。信号量可以管理多个资源实例,例如通过计数信号量控制多个线程同时访问某一资源池。而互斥锁仅支持二元状态(锁定或未锁定),适用于保护单一资源的场景。

  2. 资源管理
    信号量可以用于更复杂的同步场景,例如限制同时运行的线程数量或实现任务调度。而互斥锁主要用于简单的互斥访问,功能相对单一。

  3. 性能开销
    在某些场景下,信号量的实现可能比互斥锁更复杂,因此会带来额外的性能开销。但在需要管理多个资源或实现复杂同步逻辑时,信号量的优势更加明显。

3. 优化与研究方向

信号量作为一种经典的同步机制,仍有进一步研究和优化的空间,特别是在以下领域:

  1. 分布式系统中的应用
    随着分布式系统的普及,信号量在跨节点同步中的应用成为一个重要研究方向。例如,如何在分布式环境中实现高效的信号量机制,以协调多个节点之间的资源访问和任务执行,是一个值得深入探讨的问题。

  2. 结合其他同步机制优化性能
    信号量可以与其他同步机制(如条件变量、屏障等)结合使用,以进一步提升系统性能。例如,在复杂的多线程应用中,通过结合信号量和条件变量,可以实现更精细的任务调度和资源管理,从而减少线程等待时间,提高系统吞吐量。

  3. 新型硬件架构的适配
    随着新型硬件架构(如多核处理器、GPU等)的发展,信号量的实现和优化需要适应这些架构的特性。例如,在GPU编程中,如何高效地实现信号量以协调多个计算单元的执行,是一个具有挑战性的研究方向。

通过以上研究方向的探索,信号量在并发控制和资源管理中的应用将更加广泛和高效,为现代计算系统的发展提供有力支持。


研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)


相关文章:

[Linux] Linux信号量深度解析与实践(代码示例)

Linux信号量深度解析与实践 文章目录 Linux信号量深度解析与实践一、什么是信号量1. 信号量的核心概念2. 信号量的分类3. 信号量的操作机制 二、怎么用信号量1. 信号量API的深度解析&#xff08;1&#xff09;无名信号量API&#xff08;2&#xff09;有名信号量API&#xff08;…...

Switch最新 模拟器 Eden(伊甸)正式发布 替代Yuzu模拟器

Switch最新 模拟器 Eden&#xff08;伊甸&#xff09;正式发布 替代Yuzu模拟器 100 帧跑满《塞尔达传说&#xff1a;旷野之息》 这款模拟器基于 Yuzu 框架开发&#xff0c;但团队强调它并非…...

[cg] [ds]深度缓冲z与线性z推导

4. GLSL 代码实现 在着色器中&#xff0c;将深度缓冲值转换为线性深度&#xff1a; float LinearizeDepth(float depth, float near, float far) {// OpenGL 的 NDC 深度范围是 [-1, 1]&#xff0c;需转换float z_ndc 2.0 * depth - 1.0;// 计算线性深度return (2.0 * near …...

clock的时钟频率check代码

在芯片验证中&#xff0c;经常遇到需要check时钟频率的场景&#xff0c;由于时钟数量有很多&#xff0c;手动写代码得到后年马月&#xff0c;所以我这边写了一个宏define&#xff0c;可以通过输入参数的形式验证需要check的时钟频率&#xff0c;大大提升了验证效率和准确率&…...

企业数字化转型是否已由信息化+自动化向智能化迈进?

DeepSeek引发的AI热潮迅速蔓延到了各个行业&#xff0c;目前接入DeepSeek的企业&#xff0c;涵盖了科技互联网、云服务、电信、金融、能源、汽车、手机等热门领域&#xff0c;甚至全国各地政府机构也纷纷引入。 在 DeepSeek 等国产 AI 技术的推动下&#xff0c;众多企业已经敏锐…...

PT5F2307触摸A/D型8-Bit MCU

1. 产品概述 ● PT5F2307是一款51内核的触控A/D型8位MCU&#xff0c;内置16K*8bit FLASH、内部256*8bit SRAM、外部512*8bit SRAM、触控检测、12位高精度ADC、RTC、PWM等功能&#xff0c;抗干扰能力强&#xff0c;适用于滑条遥控器、智能门锁、消费类电子产品等电子应用领域。 …...

嵌入式STM32学习——串口USART 2.0(printf重定义及串口发送)

printf重定义&#xff1a; C语言里面的printf函数默认输出设备是显示器&#xff0c;如果要实现printf函数输出正在串口或者LCD显示屏上&#xff0c;必须要重定义标准库函数里调用的与输出设备相关的函数&#xff0c;比如printf输出到串口&#xff0c;需要将fputc里面的输出指向…...

进程信号(上)【Linux操作系统】

文章目录 进程信号信号引入进程要如何识别信号&#xff1f;进程接收到信号的时候&#xff0c;不一定马上处理信号进程处理信号的情况 信号相关概念信号产生键盘产生通过指令向进程发送信号系统调用向进程发送信号软件条件异常错误 操作系统如何知道进程出现了异常错误&#xff…...

全方位详解微服务架构中的Service Mesh(服务网格)

一、引言 随着微服务架构的广泛应用&#xff0c;微服务之间的通信管理、流量控制、安全保障等问题变得日益复杂。服务网格&#xff08;Service Mesh&#xff09;作为一种新兴的技术&#xff0c;为解决这些问题提供了有效的方案。它将服务间通信的管理从微服务代码中分离出来&a…...

bi工具是什么意思?bi工具的主要功能有哪些?

目录 一、BI 工具是什么意思&#xff1f; 1. 基本概念 2. 发展历程 ​编辑二、BI 工具的主要功能 1. 数据连接与整合 2. 数据存储与管理 3. 数据分析与挖掘 4. 可视化呈现 5. 报表生成与分享 6. 实时监控与预警 三、BI 工具的应用场景 1. 销售与营销 2. 财务与会计…...

cocos creator使用jenkins打包微信小游戏,自动上传资源到cdn,windows版运行jenkins

cocos 版本2.4.11 在windows上jenkins的具体配置和部署&#xff0c;可参考上一篇文章cocos creator使用jenkins打包流程&#xff0c;打包webmobile_jenkins打包,发布,部署cocoscreator-CSDN博客 特别注意&#xff0c;windows上运行jenkins需要关闭windows自己的jenkins服务&a…...

PaddleOCR的Pytorch推理模块

概述 在项目中&#xff0c;遇到文字识别OCR的使用场景。 然而&#xff0c;目前效果最好的PaddleOCR只能用百度的PaddlePaddle框架运行。 常见项目中&#xff0c;往往使用更普遍的Pytorch框架&#xff0c;单独安装PaddlePaddle不仅会让项目过于臃肿&#xff0c;而且可能存在冲…...

操作系统期末复习(一)

一、选择 1.从用户的观点看&#xff0c;操作系统是&#xff08;&#xff09; A.用户与计算机之间的接口 B.控制和管理计算机资源的软件 C.合理地组织计算机工作流程的软件 由若干层次的程序按一定的结构组成的有机体 答案&#xff1a;A 2.操作系统在计算机系统中位于&#x…...

今日行情明日机会——20250521

上证指数缩量收阳线&#xff0c;个股跌多涨少&#xff0c;整体处于日线上涨末端&#xff0c;注意风险。 深证指数&#xff0c;出现60分钟的顶分型&#xff0c;需要观察方向的选择。 2025年5月21日涨停股主要行业方向分析 并购重组 涨停家数&#xff1a;9家。 代表标的&am…...

传统Spring MVC + RESTful 与 Vue3 结合 JWT Token 验证的示例

以下是针对非Spring Boot项目&#xff08;传统Spring MVC&#xff09;的示例 一、项目结构 src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── example/ │ │ ├── config/ # 配置类目录 │ │ │ ├─…...

使用Redis的Bitmap实现了签到功能

思路分析 我们可以把 年和月 作为BitMap的key&#xff0c;然后保存到一个BitMap中&#xff0c;每次签到就到对应的位上把数字从0 变为1&#xff0c;只要是1&#xff0c;就代表是这一天签到了&#xff0c;反之咋没有签到。 关键问题 问题一&#xff1a; 什么叫做连续签到天数…...

Unity-编辑器扩展-其二

今天我们来基于之前提到的编辑器扩展的内容来做一些有实际用处的内容&#xff1a; 检查丢失的组件 首先是一个比较实际的内容&#xff1a;当我们在做项目时&#xff0c;经常会涉及到预设体在不同项目或者不同文件路径下的转移&#xff0c;这个时候很容易在某个具体的prefab对…...

项目中Warmup耗时高该如何操作处理

1&#xff09;项目中Warmup耗时高该如何操作处理 2&#xff09;如何在卸载资源后Untracked和Other的内存都回收 3&#xff09;总Triangles的值是否包含了通过GPU Instancing画的三角形 4&#xff09;有没有用Lua来修复虚幻引擎中对C代码进行插桩Hook的方案 这是第432篇UWA技术知…...

php://filter的trick

php://filter流最常见的用法就是文件包含读取文件&#xff0c;但是它不止可以用来读取文件&#xff0c;还可以和RCE&#xff0c;XXE&#xff0c;反序列化等进行组合利用 filter协议介绍 php://filter是php独有的一种协议&#xff0c;它是一种过滤器&#xff0c;可以作为一个中…...

STM32 I2C硬件读写

一、I2C外设简介 STM32内部集成了硬件I2C收发电路&#xff0c;可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能&#xff0c;减轻CPU的负担支持多主机模型&#xff08;固定多主机、可变多主机&#xff09;支持7位/10位地址模式支持不同的通讯速度&a…...

Qt+线段拖曳示例代码

Qt线段拖曳示例代码&#xff0c;功能见下图。 代码如下&#xff1a; canvaswidget.h #ifndef CANVASWIDGET_H #define CANVASWIDGET_H#include <QWidget> #include <QPainter> #include <QMouseEvent> #include <QVector>class CanvasWidget : publi…...

计算机网络相关面试题

一、HTTP1.1和HTTP2的区别 HTTP/1&#xff08;主要指 HTTP/1.1&#xff09;和 HTTP/2 是 Web 协议发展中的两个重要版本&#xff0c;二者在性能、协议机制和功能特性上有显著差异。以下从多个维度对比分析&#xff0c;并结合具体案例说明&#xff1a; 一、连接与请求处理方式 1…...

docker中部署Universal Media Server (UMS)

Universal Media Server (UMS) 本身主要是作为桌面服务程序开发的&#xff08;主要面向 Java GUI DLNA 播放&#xff09;&#xff0c;但确实可以通过 Docker 进行部署。虽然官方没有提供 Docker 镜像&#xff0c;但社区有一些可用的方式可以在 Docker 中运行它。 下面是一个可…...

WordPress Elementor零基础教程

一、WordPress Elementor 是什么&#xff1f;—— 可视化网站搭建 “积木工具箱” 基础定义 Elementor 是 WordPress 的一款可视化页面构建插件&#xff0c;就如同网站搭建领域的 “PPT 编辑器”。它能让你无需编写代码&#xff0c;仅通过拖放模块&#xff08;像图片、文本、…...

鸿蒙UI开发——实现一个上拉抽屉效果

1、概 述 在项目开发中&#xff0c;我们可能会遇到临时交互的场景&#xff08;即&#xff1a;弹出一个临时交互框&#xff0c;交互完毕后继续用户的主流程&#xff09;&#xff0c;效果如下&#xff1a; 在ArkUI中&#xff0c;此类弹出窗被称为“半模态页面”&#xff0c;ArkU…...

详细介绍Qwen3技术报告中提到的模型架构技术

详细介绍Qwen3技术报告中提到的一些主流模型架构技术&#xff0c;并为核心流程配上相关的LaTeX公式。 这些技术都是当前大型语言模型&#xff08;LLM&#xff09;领域为了提升模型性能、训练效率、推理速度或稳定性而采用的关键组件。 1. Grouped Query Attention (GQA) - 分组…...

docker面试题(3)

如何临时退出一个正在交互的容器的终端&#xff0c;而不终止它 按ctrlp&#xff0c;后按ctrlq &#xff0c;如果按ctrlc会使容器内的应用进程终止&#xff0c;进而会使容器终止 很多应用容器都默认是后台运行的&#xff0c;怎么查看它们输出的日志信息 使用docker logs &#…...

2025年二级等保实施全攻略:传统架构与云等保方案深度解析

2025年&#xff0c;随着《网络安全法》的深化落实和等保2.0标准的全面推行&#xff0c;二级等保已成为中小企业及非核心业务系统的合规基线。如何在高效满足监管要求的同时&#xff0c;兼顾成本与安全效能&#xff1f;本文将结合最新政策与实战经验&#xff0c;从传统架构到云等…...

技术点对比

数据库 数据库程序在线访问与ORM访问的对比 数据库程序在线ORM访问优点性能好性能差可以处理复杂sql缺点 性能&#xff1a; 复杂sql支持&#xff1a; 开发成本&#xff1a; 架构风格 管道-过滤器风格与数据仓库风格对比 管道-过滤器风格数据仓储风格备注交互方式顺序结构…...

自监督学习与监督学习

&#x1f50d; 一、监督学习 vs 自监督学习&#xff1a;核心区别 维度监督学习&#xff08;Supervised Learning&#xff09;自监督学习&#xff08;Self-Supervised Learning&#xff09;是否需要人工标注的标签✅ 需要&#xff0c;如分类标签、边界框等❌ 不需要&#xff0c…...

Java操作数据库,JDBC

package myjdbc; import com.mysql.jdbc.Driver; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; /*** 练习JDBC&#xff0c;完成一些简单的操作。*/ public class jdbc01 {public static void main(Str…...

UML 活动图 (Activity Diagram) 使用案例

UML 活动图使用案例 UML 活动图 (Activity Diagram) 使用案例活动图的主要元素典型使用案例1. 用户登录流程2. 在线购物流程3. 订单处理系统4. 文件审批流程 活动图的优势何时使用活动图 UML 活动图 (Activity Diagram) 使用案例 活动图是UML中用于描述业务流程或系统工作流程…...

回溯法求解N皇后问题

目录 前言 一、回溯法是什么&#xff1f; 二、N皇后问题描述 分析解题思路 三、算法设计 1、递归法 2、非递归法 总结 前言 本文将从递归形式和非递归形式两种方法来介绍求解N皇后问题的回溯法&#xff0c;后续也会更新更多有关算法分析这方面的问题欢迎大家关注~&#x1f929…...

网络流量分析工具ntopng的安装与基本使用

网络流量分析工具ntopng的安装与基本使用 一、ntopng基本介绍1.1 ntopng简介1.2 主要特点1.3 使用场景 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、安装ntopng工具3.1 官网地址3.2 配置软件源3.3 添加软件源3.4 安装ntopng 四、ntopng的基本配置4.1 修改配置文件4.…...

新导游入行规范与职业发展指导

随着旅游行业的蓬勃发展&#xff0c;导游作为旅游服务的重要环节&#xff0c;其职业素养和专业能力备受关注。对于新入行的导游而言&#xff0c;了解行业规范&#xff0c;明确职业发展方向&#xff0c;是开启职业生涯的重要一步。​ 一、严格遵守行业规范​ 持证上岗&#xf…...

数据结构与算法——堆

堆 树树的概念与结构树的相关术语树的表示树形结构实际运用场景 二叉树概念与结构特殊的二叉树满二叉树完全二叉树 二叉树存储结构顺序结构链式结构 实现顺序结构二叉树堆的概念与结构堆的实现向上调整算法&#xff08;插入数据&#xff09;向下调整算法 堆的应用堆排序(建堆)向…...

【写在创作纪念日】基于SpringBoot和PostGIS的各省东西南北四至极点区县可视化

目录 前言 一、空间检索简介 1、空间表结构 2、四至空间检索 二、前后端实现 1、后端实现 2、前端集成 三、成果展示 1、东部省份 2、西部省份 3、南部省份 4、北部省份 5、中部省份 四、总结 前言 在当今数字化时代&#xff0c;地理信息数据的分析与可视化对于众…...

AI驱动新增长:亚马逊Rufus广告点击率提升300%的奥秘

在生成式人工智能迅速融入商业应用的背景下&#xff0c;全球跨境电商巨头亚马逊&#xff08;Amazon&#xff09;正以前所未有的速度重构其广告生态。2024年第一季度&#xff0c;据亚马逊官方披露&#xff0c;通过部署内部开发的AI购物助手“Rufus”&#xff0c;其平台部分广告点…...

osgEarth中视角由跟随模式切换到漫游模式后没有鼠标拖拽功能问题分析及解决方法

遇到了一个棘手的问题,就是在由跟随模式切换到漫游模式的时候,鼠标无法实现拖拽功能。后来发现是前面给自己挖的坑。 因为要实现鼠标点选某个模型后,模型需要变红色显示,所以添加了一个事件处理程序。 // 创建 场景中模型的点选功能 事件处理程序 ModelSelectionHandler* …...

网页 HTML布局(详解)

本篇讲的是&#xff1a;构成网页的三要素中的HTML HTML的基本结构标签&#xff1a; html标签&#xff1a;网页的整体 head标签&#xff1a;网页的头部 body标签&#xff1a;网页的身体 title标签&#xff1a;网页的标题 一般我们新建一个HTML就会带有这些基本的标签&#xff1a…...

为什么可以不重写m1方法

在 Java 中&#xff0c;当一个类继承另一个类并同时实现接口时&#xff0c;如果接口中的方法签名与父类中的方法签名完全相同&#xff08;包括方法名、参数列表和返回类型&#xff09;&#xff0c;那么父类的方法会自动满足接口的实现要求&#xff0c;子类无需显式重写该方法。…...

深入解析应用程序分层及 BaseDao 的封装策略

目录 1. 应用程序分层 1.1. 应用程序分层简介 1.1.1. 三层结构 1.1.2. 分层的优点 1.1.3. 分层命名 1.2. 应用程序分层实现 1.3. 在分层项目中实现查询业务 2. 封装通用的BaseDao 2.1. 封装通用的DML操作 2.2. 封装通用的查询操作 3. 总结 前言 本文讲解JDBC中的应用…...

物理机做完bond后network服务重启失败

问题描述&#xff1a; 物理机通过systemctl status network.service查看网络服务情况&#xff0c;服务状态为failed&#xff0c;报错&#xff1a;Failed to start LSB: Bring up/down netw 问题分析&#xff1a; 1、network服务于NetworkManager服务冲突 2、未使用的网卡没…...

AGI大模型(30):LangChain链的基本使用

为开发更复杂的应用程序,需要使用Chain来链接LangChain中的各个组件和功能,包括模型之间的链接以及模型与其他组件之间的链接。 链在内部把一系列的功能进行封装,而链的外部则又可以组合串联。 链其实可以被视为LangChain中的一种基本功能单元。 API地址:https://python.…...

什么导致ERP系统中BOM表频繁出错?关键因素与解决路径

企业引入 ERP 系统后&#xff0c;常因 BOM&#xff08;物料清单&#xff09;维护不规范导致计划混乱、成本失控等问题。部分工厂依赖手工录入 BOM 数据&#xff0c;存在版本管理缺失、替代物料未标注等现象&#xff0c;使得 MRP 计划出错率高&#xff0c;生产效率与质量双降。解…...

(vue)前端实现下载后端提供的URL文件

(vue)前端实现下载后端提供的URL文件 动态创建&#xff1a; function downloadFile(url, filename) {const a document.createElement(a)a.href urla.download filename || download // 设置下载文件名document.body.appendChild(a)a.click()document.body.removeChild(a) …...

Axure通过下拉框选项改变,控制字段显隐藏

要求&#xff1a;要求选择钢铁行业时&#xff0c;字段1显示&#xff0c;字段2、字段3隐藏&#xff0c;选择水泥行业时&#xff0c;字段2显示&#xff0c;字段1、字段3隐藏&#xff0c;选择发电行业时&#xff0c;字段3显示&#xff0c;字段1、字段2隐藏。 1、首先Axure拖入一个…...

Axure应用交互设计:动态面板嵌套实现超强体验感菜单表头

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:动态面板嵌套 主要内容:利用动态面板多层嵌套实现菜单表头 应用场景:广泛应用于表单表…...

CICD遇到npm error code EINTEGRITY的问题

场景 CICD编译时抛出npm error code EINTEGRITY的错误 npm error code EINTEGRITY npm error sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA integrity checksum failed when using sha512: wanted sha512-PlhdFcillOINfeV…...

C# AI(Trae工具+claude3.5-sonnet) 写前后端

这是一个AI 写的前后端分离项目,通过AI编程&#xff0c;开发电商管理系统&#xff08;登陆、注册&#xff09; 使用的AI工具为 Trae工具(字节国际版)claude3.5-sonnet(目前代码最强模型) 前端为 vue3Bootstrap 后端为 C# net5.0(因为我电脑里面已经安装了这个新版更好) do…...