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

linux线程基础

1. 什么是线程

进程是承担系统资源分配的基本实体,而线程(Thread)是进程内的一个执行单元,是CPU调度的基本单位。一个进程可以包含多个线程,这些线程共享进程的地址空间和资源(如文件描述符、全局变量等),但每个线程拥有独立的栈、寄存器状态和程序计数器

(1)线程的核心特点

​​​​​​​ - 轻量级:轻量级进程、创建、销毁、切换的开销比进程小。

 - 共享进程资源:所有线程共享进程的代码段、数据段、堆、打开的文件等。

 - 独立执行流:每个线程有自己的独立的栈和 一组寄存器(线程的上下文数据)。

(2)linux线程复用 task_struct,用进程模拟线程,Linux 的线程就是轻量级进程。

 - task_struct(任务结构体)是 Linux 内核用于描述进程/线程的数据结构。在 Linux 中,进程和线程的本质是相同的,都是 task_struct 结构的实例。

 - 线程 ≈ 轻量级进程(LWP, Lightweight Process):

   - 线程是一个特殊的进程,只是共享了部分进程资源(如地址空间、文件描述符等)。

   - Linux 使用 clone() 系统调用创建线程,而不是 fork():

clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, stack);
这些 CLONE_XXX 标志决定了线程与其父进程共享哪些资源:
CLONE_VM:共享地址空间
CLONE_FS:共享文件系统信息
CLONE_FILES:共享文件描述符表
CLONE_SIGHAND:共享信号处理

(3)进程:强独占,部分共享(比如通信)

强独占

 - 每个进程都有自己的独立地址空间,不能直接访问其他进程的内存。

 - 进程间的文件描述符、变量、栈等资源默认都是互不影响的

部分共享

 - IPC 机制可以用于进程间共享数据:

​​​​​​​​​​​​​   - 共享内存(shm)

   - 管道(pipe)、消息队列(mq)

   - 套接字(socket)

(4) 线程:部分独占,强调共享

部分独占

 - 线程有自己独立的(存储局部变量、返回地址)。

 - 线程的寄存器 PC(程序计数器)、SP(栈指针)也是独立的。

强调共享:

 - 线程共享同一进程的地址空间,可以访问全局变量、堆上的数据。

 - 线程间无需 IPC,即可直接访问共享数据,提高通信效率。

 - 但也带来了同步问题,需要用 锁(mutex)、条件变量(cond)、读写锁(rwlock) 控制并发。

2. 分页式存储管理

1. 进程访问的大部分资源都是通过地址空间访问的,对资源的划分本质上就是对地址空间的划分。地址空间就像是一个“窗口”。

(1)进程的所有资源(代码、数据、堆、栈、文件描述符等)最终都是通过地址空间来组织和管理的。

(2)进程的虚拟地址空间是一个抽象的窗口,它映射到物理内存和其他资源(如文件、共享内存等)。

(3)资源的管理(包括权限、隔离和共享)本质上就是对地址空间的划分

     - 私有地址空间:进程独占,如私有变量、堆、栈等。

     - 共享地址空间:进程间通信(IPC)机制,如共享内存(shm)、文件映射等

2. 函数的本质就是虚拟地址空间(逻辑地址)的集合,让线程未来执行ELF程序的不同函数即可。

(1)在 ELF 可执行文件中,每个函数都是一段指令集合,存储在代码段(.text 段)

(2)线程运行时,通过 程序计数器(PC)和 指令指针(EIP/RIP)访问代码段的不同部分,从而调用不同函数。

(3)函数的本质就是代码段中的一段逻辑地址集合,线程的执行本质上是在不同的函数地址集合之间跳转

2.1 虚拟地址和页表

(1)物理内存的分页机制

操作系统将物理内存按照固定长度的页框进行分割,有时也称为物理页。每个页框包含一个物理页(Page),且页的大小与页框的大小相等。

 - 大多数 32 位体系结构 支持 4KB 的页。

 - 64 位体系结构 通常支持 8KB 的页。

(2)区分页和页框:

页框(Page Frame)

 - 是物理内存被划分的固定大小的存储单元(如4KB/8KB),属于硬件层面的划分。

 - 操作系统通过页框管理物理内存的分配和回收。

物理页(Physical Page)

 - 指存储于页框中的数据块,其大小与页框严格一致(例如4KB页框存放4KB的页)。

 - 页本身是逻辑概念,可以存放在物理内存的页框或磁盘(如交换空间)中。

关键关系

 - 页框是容器,页是内容

 - 当页被调入物理内存时,必须占用一个完整的页框;换出到磁盘时,页框被释放。

访问机制:

(1)CPU不直接访问物理内存地址,而是通过虚拟地址空间间接访问。虚拟地址空间是操作系统为每个进程分配的逻辑地址范围(如32位系统为0~4GB)。

(2)操作系统通过页表建立虚拟地址与物理地址的映射关系:
- 页表记录每个虚拟页(进程视角)与物理页框(内存视角)的对应关系。
- CPU访问虚拟地址时,由MMU(内存管理单元)自动查页表转换为物理地址。

(3)若目标页不在物理内存中(页表项标记为无效),则触发缺页异常,操作系统负责从磁盘调入缺失页到空闲页框,并更新页表。

总结一下,虚拟地址和页表的思想就是将虚拟内存下的逻辑地址空间分为若干页将物理内存空间分为若干页框,通过页表便能把连续的虚拟内存映射到若干个不连续的物理内存页中。

2.2 物理内存管理

假设⼀个可用的物理内存有 4GB 的空间。按照⼀个页框的大小  4KB 进行划分, 4GB 的空间就是
4GB/4KB = 1048576 个页框。

 操作系统通过`struct page` 结构体管理页框
  - 每个物理页框对应一个 `struct page`,用于跟踪页框状态(如是否空闲、被哪个进程使用等)。  
典型字段(简化示例):  

    struct page {unsigned long flags;      // 状态标志(如脏页、锁定等)atomic_t _count;          // 引用计数struct list_head list;    // 链表(用于空闲页管理)// 联合体(union)优化存储,根据页框用途复用字段};

 - 假设每个 `struct page` 占 40字节,则总开销: 

40 * 1048476B = 40MB,相对系统 4GB 内存而言,仅是很小的⼀部分罢了。

页大小的权衡
- 页过大
  - 优点:减少页表长度,降低转换开销。  
  - 缺点:内部碎片增大(如进程仅需5KB,但占用8KB页框,浪费3KB)。  

- 页过小
  - 优点:减少内部碎片。  
  - 缺点:  
    - 页表过长(4GB内存需 物理内存的大小/页框的大小(假如是512B) = 8,388,608) 个页框,页表占用更大内存)。  
    - 频繁的页转换增加CPU和MMU开销。  

- 折中选择:  
  - 4KB页(如Windows/Linux主流选择):平衡碎片与页表开销。  
  - 大页(Huge Page):针对数据库等场景,减少TLB缺失(如2MB页)。

2.3 页表

1. 32位系统下页表的空间占用分析
- 虚拟地址空间:4GB((2^32)字节)。  
- 页大小:4KB((2^12)字节)。  
- 页表项数量:  4GB/4KB = 1,048,576
- 每个页表项大小:4字节(32位物理地址)。  
- 页表总大小:   1,048,576 * 4(B) = 4MB
- 占用物理页框数:  4MB/4B = 1,048,576

核心矛盾:  
页表本身需要 1,024个连续物理页框,违背了分页机制“允许离散分配”的初衷,且浪费内存。

2. 单级页表的局限性
- 问题1:连续页框需求
  页表必须完整驻留内存,且需连续存储,与分页设计目标冲突。  
- 问题2:局部性浪费
  进程实际运行时仅访问少数页,但单级页表需维护全部映射,导致内存冗余。  

3. 解决方案:多级页表
思想:将单级页表拆分为多级结构,按需加载,避免连续存储。 

以二级页表为例(32位系统):
1. 虚拟地址划分:  
   - 10位:一级页表索引(页目录)。  
   - 10位:二级页表索引。  
   - 12位:页内偏移(4KB页大小)。  

2. 结构设计:  
   - 一级页表(页目录):  
     - 含1,024个表项,每项指向一个二级页表。  
     - 大小:1,024 * 4{字节} = 4{KB}(仅需1个物理页框)。  
   - 二级页表:  
     - 共1,024个二级页表,每个含1,024个表项。  
     - 仅需为实际使用的虚拟地址区域分配二级页表,未使用的区域不分配。  

3. 优势:  
   - 离散存储:各级页表可分散在物理内存中,无需连续。  
   - 按需加载:仅活跃的二级页表需驻留内存,节省空间。  
   - 兼容性:仍覆盖全部4GB虚拟地址空间(1,024 * 1,024 = 1,048,576个页)。  

2.4 页目录结构

虚拟地址结构解析(32位系统,4KB页)

| 10位 (页目录索引) | 10位 (页表索引) | 12位 (页内偏移) |

页目录索引(前10位):

 - 取值范围:[0, 1023],对应页目录的1,024个表项。

 - 每个表项存储下级页表的物理地址。

页表索引(中间10位):

 - 定位到具体页表中的表项,存储目标页框的物理地址。

页内偏移(后12位):

 - 与页框物理地址拼接,得到最终物理地址:

 - 物理地址=页框基地址+页内偏移物理地址

关键操作

 - CPU通过MMU自动完成两级页表查询(页目录→页表→页框)。

 - TLB(快表)缓存近期映射,加速转换。

2.5 虚拟地址与进程管理资源解析

1. 虚拟地址的本质:
- 虚拟地址是CPU看到的地址空间,是进程访问资源的唯一接口
- 每个虚拟地址对应一个资源(物理内存/文件/设备等),是资源的抽象代表
- 32位系统通常有4GB虚拟地址空间(0x00000000-0xFFFFFFFF)

2. 管理数据结构:
- `mm_struct`:进程内存的"总控结构",包含整个地址空间的统计信息

  struct mm_struct {unsigned long task_size;    /* 地址空间大小 */pgd_t *pgd;                /* 页全局目录 */struct vm_area_struct *mmap; /* 内存区域链表 */// ...};

- `vm_area_struct`:描述虚拟内存区域(VMA)的"明细表"

  struct vm_area_struct {unsigned long vm_start;     /* 区域起始地址 */unsigned long vm_end;       /* 区域结束地址 */struct file *vm_file;       /* 映射的文件(如果有) */// ...};

3. 页表的本质:
- 页表是虚拟地址到物理地址的转换地图(多级页表实现)
- 通过MMU硬件完成动态转换,进程切换时通过CR3寄存器切换页表
- 页表项不仅包含物理地址,还包含权限位(R/W/X、用户/内核等)

4. 地址空间布局示例(x86 Linux):

0xFFFF_FFFF +-----------+|  内核空间  | 所有进程共享
0xC000_0000 +-----------+|  栈(stack) | 向下增长+-----------+|    ...    |+-----------+|   堆(heap)| 向上增长+-----------+|   BSS段   |+-----------+|  数据段   |+-----------+|  代码段   |
0x0804_8000 +-----------+| 保留区域   |
0x0000_0000 +-----------+

关键结论:
1. 虚拟地址是资源的代表,通过页表实现间接访问,页表是一张虚拟到物理的地图

2. 资源共享的本质是多个页表项指向同一物理资源,是虚拟地址的共享

3. 线程轻量的本质是共享大部分地址空间(mm_struct)

4. 虚拟地址、mm_struct、v_area_struct本质:进行资源的统计数据和整体数据

5. 线程进行资源划分:本质是划分地址空间,获得一定范围的虚拟地址,再本质,就是对页表的划分

2.6 两级地址的转换

CR3 寄存器 读取页目录起始地址,再根据一级页号查页目录表,找到下⼀级页表在物理内存中
存放位置。根据二级页号查表,找到最终想要访问的内存块号。 最后结合页内偏移量得到物理地址。

物理地址生成示例

假设虚拟地址:0x12345678

页目录基地址:0x1000

页表基地址:0x2000

页框物理地址:0x8000

转换步骤

  1. 拆分虚拟地址:

    • 页目录索引:0x12345678 >> 22 & 0x3FF = 0x48

    • 页表索引:0x12345678 >> 12 & 0x3FF = 0x345

    • 页内偏移:0x678

  2. 查页目录:0x1000 + 0x48*4 → 获取页表地址0x2000

  3. 查页表:0x2000 + 0x345*4 → 获取页框地址0x8000

  4. 物理地址:0x8000 + 0x678 = 0x8678

 

MMU要先进行两次页表查询确定物理地址,在确认了权限等问题后,MMU再将这个物理地址发送到总线,内存收到之后开始读取对应地址的数据并返回。那么当页表变为N级时, 就变成了N次检索+1次读写。可见,页表级数越多查询的步骤越多,对于CPU来说等待时间越长,效率越低。
有没有提升效率的办法呢?计算机科学中的所有问题,都可以通过添加⼀个中间层来解决。 MMU 引入了新武器,就是被称为快表的 TLB (其实,就是缓存)
CPU MMU 传新虚拟地址之后, MMU 先去问 TLB 那边有没有,如果有就直接拿到物理地址发到总线给内存。但 TLB 容量比较小,难免发生  Cache Miss ,这时候 MMU 还有页表,在页表中找到之后 MMU 除了把地址发到总线传给内存,还把这条映射关系给到TLB,让它记录⼀下刷新缓存。

2.7 缺页中断

(1)当目标内存页出现以下情况时:

  1. 物理内存中无对应的物理页

  2. 物理页存在但无访问权限

(2)CPU将无法获取数据并触发缺页错误。由于数据缺失会导致计算中断,此时:

  1. CPU暂停当前用户进程的执行

  2. 进程从用户态切换到内核态

  3. 缺页中断交由内核的Page Fault Handler处理

(3)缺页中断会交给 PageFaultHandler 处理,其根据缺页中断的不同类型会进行不同的处理:
- Hard Page Fault 也被称为 Major Page Fault ,翻译为硬缺页错误/主要缺页错误,这时物理内存中 没有对应的物理页,需要CPU打开磁盘设备读取到物理内存中,再让MMU建立虚拟地址和物理地址的映射。
- Soft Page Fault 也被称为 Minor Page Fault ,翻译为软缺页错误/次要缺页错误,这时物理内存中是存在对应物理页的,只不过可能是其他进程调入的,发出缺页异常的进程不知道而已,此时MMU只需要建立映射即可,无需从磁盘读取写入内存,一般出现在多进程共享内存区域。
- Invalid Page Fault 翻译为无效缺页错误,比如进程访问的内存地址越界访问,又比如对空指针解引用内核就会报 segment fault 错误中断进程直接挂掉。

new和malloc本质上就是对物理内存的延迟申请。首先申请虚拟地址但未申请物理地址,等到真正使用时发生缺页中断,再申请物理地址。

总结

可执行程序也是文件,文件在磁盘那上都是按照4KB存储的。物理内存也被操作系统划分为4KB的内存块。

页框,struct page,struct page mem[1048576],对内存的管理转化成为对数组的管理。

最终物理地址 = 起始物理地址+页内(4KB)偏移

申请物理内存:

(1)查数组,改page

(2)建立内核数据结构的对应关系

3. 线程的优点

1. 创建与切换开销
- 线程创建
  代价更小:仅需分配栈和少量寄存器,共享进程资源(内存、文件描述符等)。  
- 进程创建  
  代价更大:需独立分配内存空间、页表、文件资源等,内核管理成本高。  

用户级线程的切换完全在用户空间进行,不需要内核介入。只有内核级线程(系统支持线程)的切换才需要内核支持。

- 切换开销对比
  |维度              | 线程切换                               | 进程切换                 |
  |------------------|---------------------------------------|-----------------------------|
  | 虚拟内存      | 无需切换(共享相同空间)   | 需切换页表(TLB刷新)         |
  | 寄存器          | 部分寄存器需保存/恢复         | 全部寄存器需保存/恢复          |
  | 缓存失效      | 仅部分缓存可能失效              | 全部缓存+TLB失效              |

线程切换不会导致TLB、Cache缓存失效。

2. 性能优势
- 资源占用
  线程更轻量:共享进程资源(如堆、全局变量),减少内存重复开销。  
- 并行能力
  多核利用率:线程可并行运行在多处理器上,加速计算密集型任务(如矩阵运算)。  
- I/O重叠
  非阻塞优化:一个线程等待I/O时,其他线程可继续计算(如Web服务器处理并发请求)。
 

3. 适用场景

(1)计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现
(2)I/O密集型应用,为了提⾼性能,将I/O操作重叠。线程可以同时等待不同的I/O操作。

4. 线程的缺点

1. 性能损失
若计算密集型线程数量 超过可用处理器核心数,会导致:  
    - 额外的同步开销(如锁竞争、上下文切换)  
    - 资源争用(CPU时间片被频繁切换,缓存利用率下降)  

简单来说就是线程创建太多会导致切换成本太高,反而导致性能损失
例如4个计算密集型线程运行在2核CPU上 → 线程频繁切换,实际吞吐量可能低于单线程。  

2. 健壮性降低
- 共享数据风险
  - 线程间共享变量可能导致:  
    - 竞态条件(Race Condition):未同步的并发访问引发数据不一致。  
    - 死锁(Deadlock):多个线程互相等待对方释放锁。  

// 线程不安全的计数器
int counter = 0;
void increment() { counter++; }  // 多线程并发调用时结果可能错误

3. 缺乏访问控制

维度进程线程
权限隔离系统调用仅影响当前进程系统调用(如chdir())影响整个进程
资源管理独立内存空间,崩溃不扩散线程崩溃可能导致整个进程退出

例如线程A调用exit() → 整个进程终止,其他线程也被强制结束。 

但缺乏访问控制也意味着线程共享资源比较容易。

4. 编程难度提高

编写与调试⼀个多线程程序比单线程程序困难得多。

5. 线程异常

在多线程环境下,线程是进程的执行单元,共享进程的地址空间和资源(如文件描述符、信号处理等)。当单个线程出现严重异常时(如 **除零错误、野指针访问、段错误**)导致线程崩溃时,整个进程也会随之崩溃

关键原因包括:

- 信号机制的全局性:  
  - 线程的异常(如 `SIGSEGV`、`SIGFPE`)会发送给**整个进程**,而非仅限异常线程。  
  - 默认情况下,这些信号会终止进程(除非程序自定义了信号处理函数)。  

- 共享地址空间:  
  - 线程的非法内存访问(如野指针)可能破坏其他线程的数据,使进程状态不可恢复。  

线程异常 vs 进程异常

| 维度              | 线程异常                     | 进程异常              |
|------------------|----------------------------|----------------------------|
| 影响范围     | 导致整个进程终止            | 仅终止当前进程              |
| 信号处理     | 信号发送到进程              | 信号发送到进程              |
| 资源回收    | 进程所有资源被释放          | 仅当前进程资源被释放        |

线程异常 ≈ 进程异常:因共享地址空间和信号机制,单个线程崩溃会牵连整个进程。  

6. linux进程vs线程

1. 核心角色

(1)进程是资源分配的基本单位

(2)线程是CPU调度的基本单位

2. 资源共享对比
(1)共享的进程资源(所有线程共用):  
  - 虚拟地址空间(代码段、堆、全局变量)  
  - 文件描述符、信号处理函数、当前工作目录  
  - 用户ID、组ID等进程属性  

(2)线程私有数据:  
线程ID、寄存器状态、errno、信号屏蔽字、调度优先级、栈等。

3. 创建与切换开销
| 操作         |  进程                                                      | 线程                             |
|------------------|--------------------------------------------------|----------------------------------------|
| 创建开销    | 高(需复制页表、文件描述符表等)  | 低(仅分配栈和寄存器,共享进程资源)     |
| 切换开销   | 高(需切换CR3寄存器,TLB刷新)    | 低(地址空间不变,仅切换线程上下文)     |

4. 通信与同步
- 进程间通信(IPC):  
  需通过 **管道、消息队列、共享内存、信号量** 等机制(跨越地址空间)。  
- 线程间通信:  
  直接读写 **共享全局变量**,但需同步机制(如互斥锁、条件变量)。  

- 进程 = 资源容器,线程 = 执行流 
 

7.线程示例

表明pthread_create不是系统调用,使用需要编译并连接pthread库

#include <iostream>
#include <string>
#include <pthread.h>
#include <unistd.h>void *threadrun(void *args)
{std::string name = (const char*)args;while(true){std::cout << "我是新线程: name: " << name << std::endl;sleep(1);}return nullptr;
}
int main()
{pthread_t tid;pthread_create(&tid, nullptr, threadrun, (void*)"thread-1");while(true){std::cout << "我是主线程..." << std::endl;sleep(1);}return 0;
}
thread: Thread.ccg++ -o $@ $^ -lpthread
.PHONY: clean
clean:rm -f thread

可以看到,当kill其中一个线程时,两个线程都停止了,说明线程之间共享进程资源

查看线程:ps -aL

LWP:light weight process 轻量级进程

在task_struct中表示进程的除了pid外还有lwp,当进程中只有一个线程时pid=lwp。所以CPU调度时看的是lwp

健壮性较低,任何一个线程崩溃都会导致整个进程崩溃 

消息混杂在一起,显示器文件本质上也是共享性资源,在没有加保护的时候会发生原子性错误

linux系统不存在真正意义上的线程,OS中中只有轻量级进程,线程时我们的叫法,linux只会提供轻量级进程的系统调用

下面是创建和父进程共享地址空间的子进程

由于用户只认线程,所有的操作系统教程只讲线程,因此在用户和linux系统之间添加一层软件层,即pthread库,pthread库把创建轻量级线程的方法封装起来,给用户提供一批创建线程的接口,这样用户就不用关心底层的LWP了。

因此linux的线程实现时在用户层实现的,我们称之为用户级线程, pthread库称之为原生线程库。

pthread_create的底层其实封装的就是clone

c++11的多线程在linux下,本质上也是封装了pthread库。在windows下是封装windows创建进程的接口。通过条件编译形成库,解决了语言的跨平台和可移植性问题

相关文章:

linux线程基础

1. 什么是线程 进程是承担系统资源分配的基本实体&#xff0c;而线程&#xff08;Thread&#xff09;是进程内的一个执行单元&#xff0c;是CPU调度的基本单位。一个进程可以包含多个线程&#xff0c;这些线程共享进程的地址空间和资源&#xff08;如文件描述符、全局变量等&a…...

进阶-数据结构部分:3、常用查找算法

飞书文档https://x509p6c8to.feishu.cn/wiki/LRdnwfhNgihKeXka7DfcGuRPnZt 顺序查找 查找算法是指&#xff1a;从一些数据之中&#xff0c;找到一个特殊的数据的实现方法。查找算法与遍历有极高的相似性&#xff0c;唯一的不同就是查找算法可能并不一定会将每一个数据都进行访…...

JavaScript 中的 for...in 和 for...of 循环详解

在 JavaScript 中&#xff0c;for...in 和 for...of 是两种常用的循环结构&#xff0c;但它们有着不同的用途和行为。很多初学者容易混淆这两者&#xff0c;本文将详细解析它们的区别、适用场景以及注意事项。 目录 for…in 循环 基本用法遍历对象属性注意事项 for…of 循环 …...

【汇总】影视仓接口地址,影视仓最新配置接口【2025.5】

&#x1f4e6; TVBOX接口分类与制作加载指南 结合参考资料&#xff0c;整理TVBOX接口的核心分类、制作方法及加载技巧&#xff0c;助你快速上手&#xff01; &#x1f310; 一、接口分类 &#x1f30d; 网络接口&#xff08;远程URL&#xff09; 特点&#xff1a;动态加载在线J…...

vue引用cesium,解决“Not allowed to load local resource”报错

vue引用cesium&#xff0c;解决“Not allowed to load local resource”报错TOC 工具 vscode node &#xff1a;v22.14.0npm &#xff1a;10.9.2vue&#xff1a;vue/cli 5.0.8 一、创建一个 Vue 3 项目 1.创建名为cesium_test的项目&#xff1a; vue create cesium_test2.…...

阿里云服务器跑模型教程

首先打开阿里云官网点击免费试用 选择250工时/月的免费仨月新人试用套餐 点击右上角主账号 选择人工智能平台PAI 然后选择交互式建模(DSW) 选择新建实例 起个名字 然后点击确定 点击打开 进入到命令行工具 下载MINIConda和对应的pytorch还有相关依赖库文件即可 然后上传…...

JavaScript入门【2】语法基础

1.JavaScript的引⼊⽅式(使用): 1.方式1:行内引用: 此种方式是将<font style"color:rgb(38,38,38);">JavaScript代码作为HTML标签的属性值使⽤,示例如下:</font><html lang"en"> <head><meta charset"UTF-8"><…...

调用DeepSeek系列模型问答时,输出只有</think>标签,而没有<think>标签

问题&#xff1a;调用DeepSeek系列模型问答时&#xff0c;输出结果缺少只有标签&#xff0c;而没有标签&#xff1f; DeepSeek官方有关说明 这里设置成这样是为了保证让模型的生成是以"<think>\n"开头的&#xff0c;然后开始思考过程&#xff0c;避免模型没…...

python:gimp 与 blender 两个软件如何协作?

GIMP&#xff08;GNU Image Manipulation Program&#xff09;和 Blender 是两个不同领域的开源工具&#xff0c;但它们在数字创作流程中常协同使用&#xff0c;以下是它们的主要联系和互补性&#xff1a; 1. 功能互补&#xff1a;2D 与 3D 的结合 GIMP 是专业的 2D 图像处理工…...

MMDetection环境安装配置

MMDetection 支持在 Linux&#xff0c;Windows 和 macOS 上运行。它需要 Python 3.7 以上&#xff0c;CUDA 9.2 以上和 PyTorch 1.8 及其以上。 MMDetection 至今也一直更新很多个版本了&#xff0c;但是对于最新的pytorch版本仍然不支持&#xff0c;我安装的时候仍然多次遇到m…...

【springboot+vue3的前后端分离项目实现支付宝的沙箱支付】

【springbootvue3的前后端分离项目实现支付宝的沙箱支付】 以下是基于SpringBoot Vue前后端分离项目实现支付宝沙箱支付的完整解决方案&#xff0c;包含关键代码和调试技巧 一、项目架构设计 二、后端实现&#xff08;SpringBoot&#xff09; 1. 添加依赖 <!-- pom.xml…...

基于Llama3的开发应用(二):大语言模型的工业部署

大语言模型的工业部署 0 前言1 ollama部署大模型1.1 ollama简介1.2 ollama的安装1.3 启动ollama服务1.4 下载模型1.5 通过API调用模型 2 vllm部署大模型2.1 vllm简介2.2 vllm的安装2.3 启动vllm模型服务2.4 API调用 3 LMDeploy部署大模型3.1 LMDeploy简介3.2 LMDeploy的安装3.3…...

MySQL只操作同一条记录也会死锁吗?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL只操作同一条记录也会死锁吗?】面试题。希望对大家有帮助&#xff1b; MySQL里where条件的顺序影响索引使用吗&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在MySQL中&#xff0c;死锁通常发生在多…...

Linux的静态库 共享库 进程 主函数的参数

1、库文件 库文件 库是一组预先编译好的方法的集合&#xff1b; Linux系统储存的位置一般在/lib和/usr/lib中 库的头文件放在/usr/include 库分类&#xff1a;静态库&#xff08;libxxx.a&#xff09;共享库&#xff08;libxxx.so&#xff09; 静态库 &#xff08;1&#…...

软件设计师考试结构型设计模式考点全解析

结构型设计模式考点全解析 一、分值占比与考察趋势分析&#xff08;75分制&#xff09; 设计模式近5年平均分值考察频率趋势分析适配器模式3-5分高频保持稳定桥接模式2-3分中频略有上升组合模式4-6分高频持续重点装饰器模式3-4分高频稳定考察代理模式5-7分高频逐年增加外观模…...

Java-Objects类高效应用的全面指南

Java_Objects类高效应用的全面指南 前言一、Objects 类概述二、Objects 类的核心方法解析2.1 requireNonNull系列方法&#xff1a;空指针检查的利器2.2 equals方法&#xff1a;安全的对象比较2.3 hashCode方法&#xff1a;统一的哈希值生成2.4 toString方法&#xff1a;灵活的对…...

PostGIS实现栅格数据入库-raster2pgsql

raster2pgsql使用与最佳实践 一、工具概述 raster2pgsql是PostGIS提供的命令行工具,用于将GDAL支持的栅格格式(如GeoTIFF、JPEG、PNG等)导入PostgreSQL数据库,支持批量加载、分块切片、创建空间索引及金字塔概览,是栅格数据入库的核心工具。 二、核心功能与典型用法 1…...

专题四:综合练习(组合问题的决策树与回溯算法)

以leetode77题为例 题目分析&#xff1a; 给一个数字n&#xff0c;你可以在1到n中选k个数字进行组合&#xff0c;注意包括1和n&#xff0c;而且通过观察实例 1&#xff0c;2和2&#xff0c;1是一样的&#xff0c;所以我们画决策树的时候&#xff0c;只需要从当前位置往后列举…...

从神经架构到万物自动化的 AI 革命:解码深度学习驱动的智能自动化新范式

目录 一、深度学习与 AI 自动化概述 二、深度学习核心技术解析 2.1 常见深度学习架构 2.2 关键算法 三、AI 自动化实践案例 3.1 图像分类自动化 3.2 自然语言处理自动化 —— 文本情感分析 ​编辑 五、自动化系统设计与实现 5.1 端到端自动化框架 5.2 自动化测试框架…...

3.5/Q1,GBD数据库最新文章解读

文章题目&#xff1a;Burden, trends, projections, and spatial patterns of lip and oral cavity cancer in Iran: a time-series analysis from 1990 to 2040 DOI&#xff1a;10.1186/s12889-025-22202-8 中文标题&#xff1a;伊朗唇癌和口腔癌的负担、趋势、预测和空间模式…...

智慧校园(含实验室)智能化专项汇报方案

该方案聚焦智慧校园(含实验室)智能化建设,针对传统实验室在运营监管、环境监测、安全管控、排课考勤等方面的问题,依据《智慧校园总体框架》等标准,设计数字孪生平台、实验室综合管理平台、消安电一体化平台三大核心平台,涵盖通信、安防、建筑设备管理等设施,涉及 395 个…...

玩转 AI · 思考过程可视化

玩转 AI 思考过程可视化 我们在开发 AI 的思维链 / 处理流时&#xff0c;难免遇到耗时较长的流程&#xff0c;如果遇到处理过慢的&#xff0c;用户什么也看不到可能丧失使用兴趣&#xff0c;对于这种情况&#xff0c;一个巧妙的产品思维就是呈现处理进度。 示例 其实完成这个页…...

hysAnalyser 从MPEG-TS导出ES功能说明

摘要 hysAnalyser 是一款特色的 MPEG-TS 数据分析工具。本文主要介绍了 hysAnalyser 从MPEG-TS 中导出选定的 ES 或 PES 功能(版本v1.0.003)&#xff0c;以便用户知悉和掌握这些功能&#xff0c;帮助分析和解决各种遇到ES或PES相关的实际问题。hysAnalyser 支持主流的MP1/MP2/…...

[YOLO模型](4)YOLO V3的介绍

文章目录 YOLO V3一、模型思想二、模型性能三、改进的地方1. 三种scale2. scale变换经典方法3. 残差连接4. 核心网络架构(1) 结构(2) 输出与先验框关系 5. Logistic分类器替代Softmax 四、总结 YOLO V3 一、模型思想 作者 Redmon 又在 YOLOv2 的基础上做了一些改进&#xff1a…...

期望是什么:(无数次的均值,结合概率)21/6=3.5

https://seeing-theory.brown.edu/basic-probability/cn.html 期望是什么:(无数次的均值,结合概率)21/6=3.5 一、期望(数学概念) 在概率论和统计学中,**期望(Expectation)**是一个核心概念,用于描述随机变量的长期平均取值,反映随机变量取值的集中趋势。 (一…...

Stacking(堆叠):集成学习中的“超级英雄团队”

在机器学习的世界里&#xff0c;如果要找一个类似漫威“复仇者联盟”的存在&#xff0c;那么**Stacking&#xff08;堆叠&#xff09;**无疑是最佳候选人。就像钢铁侠、美国队长和雷神各自拥有独特的能力&#xff0c;但只有当他们组队时才能发挥出惊人的战斗力&#xff0c;Stac…...

手写tomcat:基本功能实现(3)

TomcatRoute类 TomcatRoute类是Servlet容器&#xff0c;是Tomcat中最核心的部分&#xff0c;其本身是一个HashMap&#xff0c;其功能为&#xff1a;将路径和对象写入Servlet容器中。 package com.qcby.config;import com.qcby.Util.SearchClassUtil; import com.qcby.servlet…...

nt!MiRemovePageByColor函数分析之脱链和刷新颜色表

第0部分&#xff1a;背景 PFN_NUMBER FASTCALL MiRemoveZeroPage ( IN ULONG Color ) { ASSERT (Color < MmSecondaryColors); Page FreePagesByColor[Color].Flink; if (Page ! MM_EMPTY_LIST) { // // Remove the first entry on the zeroe…...

时间筛掉了不够坚定的东西

2025年5月17日&#xff0c;16~25℃&#xff0c;还好 待办&#xff1a; 《高等数学1》重修考试 《高等数学2》备课 《物理[2]》备课 《高等数学2》取消考试资格学生名单 《物理[2]》取消考试资格名单 职称申报材料 2024年税务申报 5月24日、25日监考报名 遇见&#xff1a;敲了一…...

3D个人简历网站 4.小岛

1.模型素材 在Sketchfab上下载狐狸岛模型&#xff0c;然后转换为素材资源asset&#xff0c;嫌麻烦直接在网盘链接下载素材&#xff0c; Fox’s islandshttps://sketchfab.com/3d-models/foxs-islands-163b68e09fcc47618450150be7785907https://gltf.pmnd.rs/ 素材夸克网盘&a…...

第十一课 蜗牛爬树

上次作业 同学们课后可以尝试找一下30以内&#xff0c;哪个整数有最多的因数呢&#xff1f; 这个整数有多少个因数呢&#xff1f; 最好使用程序来进行判断哦 int main() {int max_num 1; // 记录因数最多的数int max_count 1; // 记录最大因数个数for (int num 2; num <…...

字体样式集合

根据您提供的字体样式列表&#xff0c;以下是分类整理后的完整字体样式名称&#xff08;不含数量统计&#xff09;&#xff1a; 基础样式 • Regular • Normal • Plain • Medium • Bold • Black • Light • Thin • Heavy • Ultra • Extra • Semi • Hai…...

Spring MVC 如何处理文件上传? 需要哪些配置和依赖?如何在 Controller 中接收上传的文件 (MultipartFile)?

Spring MVC 处理文件上传主要依赖于 MultipartResolver 接口及其实现。最常用的实现是 CommonsMultipartResolver&#xff08;基于 Apache Commons FileUpload&#xff09;和 StandardServletMultipartResolver&#xff08;基于 Servlet 3.0 API&#xff09;。 以下是如何配置…...

探索C++对象模型:(拷贝构造、运算符重载)成员函数的深度解读(中篇)

前引&#xff1a;在C的面向对象编程中&#xff0c;对象模型是理解语言行为的核心。无论是类的成员函数如何访问数据&#xff0c;还是资源管理如何自动化&#xff0c;其底层机制均围绕两个关键概念展开&#xff1a;拷贝复制、取地址重载成员函数。它们如同对象的“隐形守护者”&…...

[逆向工程]C++实现DLL注入:原理、实现与防御全解析(二十五)

[逆向工程]C实现DLL注入&#xff1a;原理、实现与防御全解析&#xff08;二十五&#xff09; 引言 DLL注入&#xff08;DLL Injection&#xff09;是Windows系统下实现进程间通信、功能扩展、监控调试的核心技术之一。本文将从原理分析、代码实现、实战调试到防御方案&#x…...

gcc/g++常用参数

1.介绍 gcc用于编译c语言&#xff0c;g用于编译c 源代码生成可执行文件过程&#xff0c;预处理-编译-汇编-链接。https://zhuanlan.zhihu.com/p/476697014 2.常用参数说明 2.1编译过程控制 参数作用-oOutput&#xff0c;指定输出名字-cCompile&#xff0c;编译源文件生成对…...

51单片机课设基于GM65模块的二维码加条形码识别

系统组成 主控单元&#xff1a;51单片机&#xff08;如STC89C52&#xff09;作为核心控制器&#xff0c;协调各模块工作。 扫描模块&#xff1a;GM65条码扫描头&#xff0c;支持二维码/条形码识别&#xff0c;通过串口&#xff08;UART&#xff09;与单片机通信。 显示模块&a…...

物联网赋能7×24H无人值守共享自习室系统设计与实践!

随着"全民学习"浪潮的兴起&#xff0c;共享自习室市场也欣欣向荣&#xff0c;今天就带大家了解下在物联网的加持下&#xff0c;无人共享自习室系统的设计与实际方法。 一、物联网系统整体架构 1.1 系统分层设计 层级技术组成核心功能用户端微信小程序/H5预约选座、…...

基于多头自注意力机制(MHSA)增强的YOLOv11主干网络—面向高精度目标检测的结构创新与性能优化

深度学习在计算机视觉领域的快速发展推动了目标检测算法的持续进步。作为实时检测框架的典型代表&#xff0c;YOLO系列凭借其高效性与准确性备受关注。本文提出一种基于多头自注意力机制(Multi-Head Self-Attention, MHSA)增强的YOLOv11主干网络结构&#xff0c;旨在提升模型在…...

使用Spring Boot与Spring Security构建安全的RESTful API

使用Spring Boot与Spring Security构建安全的RESTful API 引言 在现代Web应用开发中&#xff0c;安全性是不可忽视的重要环节。Spring Boot和Spring Security作为Java生态中的主流框架&#xff0c;为开发者提供了强大的工具来构建安全的RESTful API。本文将详细介绍如何结合S…...

小刚说C语言刷题—1230蝴蝶结

1.题目描述 请输出 n 行的蝴蝶结的形状&#xff0c;n 一定是一个奇数&#xff01; 输入 一个整数 n &#xff0c;代表图形的行数&#xff01; 输出 n 行的图形。 样例 输入 9 输出 ***** **** *** ** * ** *** **** ***** 2.参考代码&#xff08;C语言版&#xff09…...

利用SenseGlove触觉手套开发XR手术训练体验

VirtualiSurg和VR触觉 作为领先的培训平台&#xff0c;VirtualiSurg自2017年以来一直利用扩展现实 (XR) 和触觉技术&#xff0c;为全球医疗保健行业提供个性化、数据驱动的学习解决方案。该平台赋能医疗专业人员进行协作式学习和培训&#xff0c;提升他们的技能&#xff0c;使…...

CT重建笔记(五)—2D平行束投影公式

写的又回去了&#xff0c;因为我发现我理解不够透彻&#xff0c;反正想到啥写啥&#xff0c;尽量保证内容质量好简洁易懂 2D平行束投影公式 p ( s , θ ) ∫ ∫ f ( x , y ) δ ( x c o s θ y s i n θ − s ) d x d y p(s,\theta)\int \int f(x,y)\delta(x cos\theta ysi…...

【Java】应对高并发的思路

在Java中应对高并发场景需要结合多方面的技术手段和设计模式&#xff0c;从线程管理、数据结构、同步机制到异步处理、IO优化等&#xff0c;都需要合理设计和配置。以下是Java在高并发场景下的主要应对策略和最佳实践&#xff1a; 1. 线程管理 1.1 线程池&#xff08;ThreadPo…...

从数据分析到数据可视化:揭开数据背后的故事

从数据分析到数据可视化:揭开数据背后的故事 大家好,今天咱们聊聊“从数据分析到数据可视化”的完整流程。说实话,数据分析和可视化这俩词听起来高大上,但咱们平时就是围绕这俩词打转——数据分析帮我们找故事,可视化则帮我们讲故事。没有它们,数据就是死的;有了它们,数…...

WPS JS宏实现去掉文档中的所有空行

WPS改造系列文章&#xff1a; 1.在WPS中通过JavaScript宏&#xff08;JSA&#xff09;调用本地DeepSeek API优化文档教程&#xff1a;在WPS中通过JavaScript宏&#xff08;JSA&#xff09;调用本地DeepSeek API优化文档教程_wps javascript-CSDN博客 2.在WPS中通过JavaScrip…...

【2025年软考中级】第一章1.6 安全性、可靠性、性能评价

文章目录 安全性、可靠性、性能评价计算机可靠性可靠性指标串并联系统可靠性并联系统可靠性N模元余系统 计算机系统性能评价信息安全加密技术对称&#xff08;私钥&#xff09;加密技术非对称加密技术&#xff08;公钥&#xff09;对称和非对称加密算法的区别数字信封原理数字签…...

MODBUS RTU通信协议详解与调试指南

一、MODBUS RTU简介 MODBUS RTU&#xff08;Remote Terminal Unit&#xff09;是一种基于串行通信&#xff08;RS-485/RS-232&#xff09;的工业标准协议&#xff0c;采用二进制数据格式&#xff0c;具有高效、可靠的特点&#xff0c;广泛应用于PLC、传感器、变频器等工业设备…...

【深度学习新浪潮】大模型时代,我们还需要学习传统机器学习么?

在大模型时代,AI 工程师仍需掌握传统机器学习知识,这不仅是技术互补的需求,更是应对复杂场景和职业发展的关键。以下从必要性和学习路径两方面展开分析: 一、传统机器学习在大模型时代的必要性 技术互补性 大模型(如GPT、BERT)擅长处理复杂语义和生成任务,但在数据量少…...

深入解析Spring Boot与Spring Security的集成实践

深入解析Spring Boot与Spring Security的集成实践 引言 在现代Web应用开发中&#xff0c;安全性是一个不可忽视的重要方面。Spring Security作为Spring生态中的安全框架&#xff0c;提供了强大的认证和授权功能。本文将结合Spring Boot&#xff0c;详细介绍如何集成Spring Se…...