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

IO进程 day05

IO进程 day05

  • 9. 进程
    • 9. 9. 守护进程
      • 守护进程的特点
      • 守护进程创建步骤
  • 10. 线程
    • 10.1. 线程的概念
    • 10.2. 进程和线程的区别
    • 10.2. 线程资源
    • 10.3. 线程的函数接口
      • 1. pthread_create-创建线程
        • 线程函数和普通函数的区别
      • 2. pthread_exit
      • 3.线程资源回收函数
        • join和detach的区别
      • 获取线程号(pthread_self)
  • 11. 线程间的通信机制
    • 概念
    • 同步机制
      • 信号量
      • 无名信号量
      • 无名信号量函数接口
    • 互斥
      • 互斥锁
      • 互斥锁的函数接口
    • 条件变量
      • 条件变量函数接口

9. 进程

9. 9. 守护进程

守护进程的特点

  1. 后台进程
  2. 生命周期:从系统开始时开启,系统关闭时结束
  3. 脱离终端控制,周期执行的进程

守护进程创建步骤

1. 创建一个子进程,父进程退出,子进程变成孤儿进程,被init收养,此时变为后台进程(fork)
2. 在子进程中,创建一个新的会话,让子进程成为会话组的组长。为了让子进程完全脱离控制终端(srtsid)
3. 运行路径改为根目录,进程的运行路径不能被删除或卸载,增大子进程的权限(chdir)
4. 重设文件权限掩码,增大进程创建文件时的权限,提高灵活性(umask)
5. 关闭文件描述符,将不需要的文件描述符关闭(close)

示例

#include <stdio.h>
#include <unistd.h>int main()
{pid_t pid = 0;// 创建子进程,父进程退出pid = fork();if(pid == EOF){perror("fork err");return EOF;}if(pid == 0){// 子进程// 创建会话组setsid();// 修改运行路径chdir("/");// 重设文件权限掩码umask(0);// 关闭文件描述符for(int i = 0; i < 3; i++)close(i);// 子进程不结束while(1);}else{exit(0);}
}

练习
练习:创建一个守护进程,循环间隔1s向文件中写入字符串 hello

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc, char const *argv[])
{// 命令行判错if(argc != 2){perror("argc err");return EOF;}pid_t pid = 0;int fd = -1;// 打开文件fd = open(argv[1], O_WRONLY | O_APPEND | O_CREAT, 0666);if(fd == -1){perror("open err");return EOF;}// 创建子进程,父进程退出pid = fork();if(pid == EOF){perror("fork err");return EOF;}if(pid == 0){// 子进程// 创建会话组setsid();// 修改运行路径chdir("/");// 重设文件权限掩码umask(0);// 关闭文件描述符for(int i = 0; i < 3; i++)close(i);// 子进程不结束while(1){sleep(1);write(fd, "hello\n", 6);}}else{exit(0);}
}

10. 线程

10.1. 线程的概念

 线程是一个轻量型的进程,为了提高系统的性能引入线程,线程和进程都参与CPU的调度

10.2. 进程和线程的区别

共性:都为操作系统提供并发执行的能力

不同点线程进程
资源和调度系统调度的最小单位资源分配的最小单位
地址空间同一个进程创建的所有
线程共享进程资源
地址空间相互独立
相互通信相对简单
全局变量即可实现
需要考虑临界资源
比较复杂
借助进程间的通信机制
安全性相对较差
进程结束时会导致所有线程退出
相对更安全

10.2. 线程资源

共享资源
 可执行的指令,静态的数据,进程中打开的文件描述符,信号处理函数。当前的工作目录,用户的ID,用户的组ID
私有资源
 线程ID (TID)、PC(程序计数器)和相关寄存器、堆栈、错误号 (errno)、信号掩码和优先级、执行状态和属性
线程标识
主线程的 TID 和 PID 是相同的,每个子线程有自己独立的 TID,但它们都共享相同的 PID

10.3. 线程的函数接口

1. pthread_create-创建线程

 #include <pthread.h>
int pthread_create(pthread_t  *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

 功能:创建线程
 参数:
  pthread_t *thread:线程标识,成功创建线程后,pthread_create 会将新线程的 ID 写入 thread 指向的内存位置。
  const pthread_attr_t *attr:线程属性, NULL:代表设置默认属性
  void *(*start_routine):函数名,代表线程函数,指向一个函数的指针,这个函数就是线程的执行体(也就是线程的入口函数)。该函数必须符合 void *(*start_routine)(void *) 的原型,即接受一个 void * 类型的参数,并返回一个 void * 类型的值。
  void *arg:线程函数传递的参数,不传参为NULL
 返回值:成功返回0,失败更新errno

  1. CPU调度线程也是随机的
  2. 编译时需要加上-lpthread
    示例:
#include <stdio.h>
#include <pthread.h>
// 线程函数
void *pthreadFun(void *arg)
{printf("子线程结束\n");
}
int main()
{pthread_t tid = 0;// 创建线程if(pthread_create(&tid, NULL, pthreadFun, NULL)){printf("create err\n");return EOF;}printf("主线程执行……\n");sleep(2);printf("主线程执行结束\n");return 0;
}
  1. 传参
void *pthreadFun(void *arg)
{int num = *((int *)arg);printf("子线程结束\n");
}
int main()
{int a = 121;int *p = &a;
}
线程函数和普通函数的区别
  1. 普通函数是顺序执行的,手动调用函数,执行函数操作,线程函数在创建的线程中并发执行,不会影响主程序的运行。
  2. 普通函数同步执行,线程函数异步执行
  3. 存储位置不一样,普通函数存放在当前线程的栈区空间,线程函数共享进程的全局变量和堆空间。

2. pthread_exit

#include <pthread.h>
void pthread_exit(void *retval);

 功能:退出进程
 参数:void *retval任意类型数据,一般为NULL
 返回值:空

3.线程资源回收函数

#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);

 功能:用于等待一个指定的线程结束,阻塞函数
 参数:
  thread:创建线程对象
  void **retval:指针*retval指向线程返回的参数,一般是NULL
 返回值:成功返回0,失败errno

#include <pthread.h>
int pthread_detach(pthread_t thread);

 功能:让线程结束时自动回收线程资源,让线程和主线程分离
 参数:pthread_t thread:线程ID
 返回值:成功返回0,失败EOF

join和detach的区别

在这里插入图片描述

获取线程号(pthread_self)

#include <pthread.h>
pthread_t pthread_self(void);

 功能:获取线程号
 参数:无
 返回值:成功返回线程ID

11. 线程间的通信机制

概念

 线程之间是很容易进行通信的,能够通过全局变量实现数据的共享和交换,也就是通过访问临界资源,但是多个线程在同时访问共享数据的对象时需要引入同步和互斥机制。
临界资源:一次只允许一个线程访问的资源叫临界资源

同步机制

 同步(synchronization)指的是多个任务(线程)按照约定的顺序相互配合完成一件事情

信号量

Linux中信号量分三类

  1. 内核信号量:由内核控制路径使用
  2. Posix信号量
     1. 无名信号量:存储在内存中,通常在线程间或父子进程间使用
    函数接口:sem_init\sem_wait\sem_post
     2. 有名信号量:存储在文件中,在进程间线程间都可以使用
    函数接口:sem_open\sem_wait\sem_post\sem_close
  3. System V信号量:是信号量的集合,叫信号灯集,属于IPC对象
    函数接口:semget\semctl\semop

无名信号量

 信号量:通过信号量实现同步操作,由信号量决定线程是继续运行还是阻塞等待。
 信号量代表的是某一类资源,它的值表示系统中该资源的数量,信号量>0的话,表示有资源可以使用,可以申请到资源,继续执行程序,信号量<= 0的话,表示没有资源可以使用,无法申请到资源,阻塞。
 信号量是一个受保护的量,只能通过函数接口访问
函数接口
初始化信号量:sem_init()
P操作,申请资源:sem_wait() 资源-1
V操作,释放资源:sem_post() 资源+1
注意:信号量是一个非负的整数,所以一定是 (>=0)

无名信号量函数接口

头文件

#include <semaphore.h>

sem_init()

#include <semaphore.h>
int  sem_init(sem_t *sem,  int pshared,  unsigned int value);

 功能:信号量初始化
 参数:
  sem_t *sem初始化的信号量
  int pshared信号量共享范围(0:线程间,1:进程间)
  unsigned int value信号量的初值
 返回值:成功0,失败EOF
sem_wait()

#include <semaphore.h>
int  sem_wait(sem_t *sem) 

 功能:申请资源,p操作
 参数:sem_t *sem信号量
 返回值:成功0,失败EOF
注意:函数执行时,信号量大于0,标识有资源可用;信号量为0时,表示没有资源可用,此时程序在此阻塞
sem_post()

#include <semaphore.h>
int  sem_post(sem_t *sem);

 功能:释放资源,V操作
 参数:sem_t *sem信号量
 返回值:成功0,失败EOF
sem_getvalue

 int sem_getvalue(sem_t *sem, int *sval);

 功能:获取信号量的值
 参数:
  sem_t *sem信号量对象
  int *sval信号量的值存放的变量(&)
 返回值:成功0,失败errno
sem_destroy

int sem_destroy(sem_t *sem);

 功能:销毁信号量
 参数:sem_t *sem信号量对象
 返回值:成功返回0,失败errno

互斥

 互斥:多个线程在访问临界资源时,同一时间只能一个线程进行访问

互斥锁

 互斥锁:通过互斥锁可以实现互斥机制,主要用来保护临界资源,每个临界资源都由一个互斥锁来保护,线程必须先获得互斥锁才能访问临界资源,访问完资源后释放该锁。

互斥锁的函数接口

pthread_mutex_init

int pthread_mutex_init(pthread_mutex_t  *mutex, pthread_mutexattr_t *attr);

 功能:初始化互斥锁
 参数:
  pthread_mutex_t *mutex互斥锁
  pthread_mutexattr_t *attr一般为NULL默认属性
 返回值:成功返回0,失败返回EOF
pthread_mutex_lock

int  pthread_mutex_lock(pthread_mutex_t *mutex);

 功能:申请互斥锁
 参数:pthread_mutex_t *mutex互斥锁
 返回值:成功返回0,失败返回EOF
pthread_mutex_unlock

int  pthread_mutex_unlock(pthread_mutex_t *mutex)

 功能:释放互斥锁
 参数:pthread_mutex_t *mutex互斥锁
 返回值:成功返回0,失败返回EOF
pthread_mutex_destroy

int  pthread_mutex_destroy(pthread_mutex_t  *mutex);

 功能:销毁互斥锁
 参数:pthread_mutex_t *mutex互斥锁
 返回值:成功返回0,失败返回EOF

条件变量

一般与互斥锁一起用,实现同步机制

条件变量函数接口

pthread_cond_init

int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);

 功能:初始化条件变量
 参数:
  pthread_cond_t *restrict cond条件变量对象
  const pthread_condattr_t *restrict attr为NULL,默认变量
 返回值:成功:0 失败:非0
pthread_cond_wait

int pthread_cond_wait(pthread_cond_t *restrict cond,    pthread_mutex_t *restrict mutex);

 功能:等待信号的产生
 参数:
  pthread_cond_t *restrict cond条件变量对象
  pthread_mutex_t *restrict mutex互斥锁
 返回值:成功:0 失败:非0
注意:没有信号的时候函数会阻塞,同时解锁;等到条件产生,函数会结束结束阻塞同时上锁
pthread_cond_signal

int pthread_cond_signal(pthread_cond_t *cond);

 功能:产生条件变量信号
 参数:pthread_cond_t *cond条件变量
 返回值:成功:0,失败:非0
注意:一定要pthread_cond_wait先执行,再产生条件
pthread_cond_destroy

int pthread_cond_destroy(pthread_cond_t *cond);

 功能:将条件变量销毁
 参数:pthread_cond_t *cond条件变量
 返回值:成功:0,失败:非0

相关文章:

IO进程 day05

IO进程 day05 9. 进程9. 9. 守护进程守护进程的特点守护进程创建步骤 10. 线程10.1. 线程的概念10.2. 进程和线程的区别10.2. 线程资源10.3. 线程的函数接口1. pthread_create-创建线程线程函数和普通函数的区别 2. pthread_exit3.线程资源回收函数join和detach的区别 获取线程…...

Mac 散热救星:Macs Fan Control,让你的苹果电脑“冷静”又安静!

各位果粉们&#xff0c;是不是经常遇到这样的烦恼&#xff1a;用着用着电脑&#xff0c;突然就发热卡顿&#xff0c;风扇狂转噪音大得跟拖拉机似的&#xff1f;别担心&#xff0c;今天给大家安利一款超实用的软件 —— Macs Fan Control&#xff0c;它可是让苹果电脑“冷静”又…...

警惕将“数据标注”岗位包装为“大数据工程师”充数

数据标注&#xff08;Data Annotation&#xff09;是人工智能和大数据产业链中的基础性工作&#xff0c;其核心任务是为原始数据添加标签或注释&#xff0c;使计算机能够识别和学习数据中的特征&#xff0c;从而训练出更精准的机器学习或深度学习模型。以下是具体解析及它与“大…...

C语言 —— 此去经年 应是良辰好景虚设 - 函数

目录 1. 函数的概念 1.1 库函数 1.2 自定义函数 2. 形参和实参 3. return 语句 4. 数组做函数参数 5. 嵌套调用和链式访问 5.1 嵌套调用 5.2 链式访问 6. 函数的声明和定义 6.1 单个文件 6.2 多个文件 7. static 和 extern 7.1 static 修饰局部变量 7.2 static 修…...

最新前端框架选型对比与建议(React/Vue/Svelte/Angular)

前端框架选型对比与建议&#xff08;React/Vue/Svelte/Angular&#xff09; 一、核心框架技术特性对比&#xff08;基于最新版本&#xff09; 维度React 19 25Vue 3.5 12Svelte 5 25Angular 19 5核心理念函数式编程、JSX语法、虚拟DOM渐进式框架、组合式API、模板语法编译时框…...

AOP基础-01.快速入门

一.AOP 对于统计每一个业务方法的耗时这一操作&#xff0c;如果再业务层的每一个方法前获取方法运行的开始时间&#xff0c;方法结束获取结束时间&#xff0c;然后计算执行耗时&#xff0c;那这样就太繁琐了。能不能定义一个模板方法&#xff0c;使得该方法能够在业务层的方法执…...

为什么MySQL选择使用B+树作为索引结构

B树是MySQL最常见的索引结构&#xff0c;大部分存储引擎都支持 B 树索引。 相对于其他竞争力强的数据结构&#xff0c;B树都有战胜它们成为大多时候MySQL选择使用索引结构的理由&#xff1a; 第一个强有力的竞争对手是B树&#xff1a; 1. B树每个节点都存储了完整的数据&…...

基于SSA-KELM-Adaboost(麻雀搜索优化的极限学习机自适应提升算法)的多输入单输出回归预测【MATLAB】

SSA-KELM-Adaboost 是一种结合了麻雀搜索算法&#xff08;SSA&#xff09;​、核极限学习机&#xff08;KELM&#xff09;​和Adaboost集成学习的复合回归预测模型。该模型通过参数优化与集成策略提升预测精度和鲁棒性&#xff0c;适用于复杂非线性回归问题。以下是其核心理论与…...

分享些常用的工具类

一、照片 1、Unsplash&#xff1a;https://unsplash.com/ 2、pixabay&#xff1a;https://pixabay.com/zh/ 二、壁纸 1、Wallpaper Engine 2、wallhaven&#xff1a;https://wallhaven.cc/ 3、极简壁纸&#xff1a;https://bz.zzzmh.cn/ 三、AI语音 1、微软Azure项目&…...

Apache SeaTunnel 构建实时数据同步管道(最新版)

文章作者 王海林 白鲸开源 数据集成引擎研发 Apache SeaTunnel Committer & PMC Member&#xff0c;Apache SkyWalking Committer&#xff0c;多年平台研发经验&#xff0c;目前专注于数据集成领域。 导读 在当今数字化快速发展的时代&#xff0c;数据已然成为企业决策…...

96.【C语言】解析预处理(4)

目录 5.条件编译 #ifdef 其他条件编译指令 #if 多个分支的条件编译 判断是否被定义 嵌套指令 6.头文件的包含方式 本地文件包含 库文件包含 嵌套文件包含 问题:头文件的重复包含 解决问题:避免头文件的重复包含 方法1:#pragma once 方法2:#ifndef、#define和#en…...

linux用户操作与权限

Linux的root用户 root用户&#xff08;超级管理员&#xff09; root用户拥有最大的系统操作权限。 普通用户的权限一般在其home目录内是不受限的&#xff0c;但是出来自己的home目录&#xff0c;仅有只读和执行权限。 su su命令切换到root账号 语法&#xff1a;su [-] [用户…...

Proof Beyond Boundaries: Hong Kong zkNight 活动精彩回顾

2 月 19 日&#xff0c;随着夜幕的降临&#xff0c;一场汇聚行业智慧与前瞻视野的高端主题活动 ——Proof Beyond Boundaries: Hong Kong zkNight&#xff0c;在香港铜锣湾 Vpoint 的 6/F 盛大启幕。本次活动由 ZEROBASE 主办&#xff0c;Techub News 承办&#xff0c;吸引了众…...

QT零基础学习之路(五)--自定义信号和槽

源码地址&#xff08;优先更新&#xff09;&#xff1a;点击此处...

Pytorch实现之GIEGAN(生成器信息增强GAN)训练自己的数据集

简介 简介:在训练数据样本之前首先利用VAE来推断潜在空间中不同类的分布,用于后续的训练,并使用它来初始化GAN。与ACGAN和BAGAN不同的是,提出的GIEGAN有一个分类器结构,这个分类器主要判断生成的图像或者样本图像属于哪个类,而鉴别器仅判断图像是来自于生成器还是真实样…...

HTTP 动态报错码的原因和解决方法

目录 1xx&#xff08;信息性状态码&#xff09; 2xx&#xff08;成功状态码&#xff09; 3xx&#xff08;重定向状态码&#xff09; 4xx&#xff08;客户端错误状态码&#xff09; 5xx&#xff08;服务器错误状态码&#xff09; 参考文章 以下是 HTTP 动态报错码的常见原…...

单核处理器编程会简单很多的原因

乱序执行的本质:单核处理器的乱序执行(Out-of-Order Execution)允许指令动态调度以提升效率,但其核心原则是保持程序语义的单线程正确性。所有指令的最终提交(Retirement)必须严格按照程序顺序完成,以确保异常处理、中断和外部观察结果的正确性。 提交阶段的顺序性:尽管…...

C++之vector和list辨析

std::vector 和 std::list 是 C 标准库中两种常用的容器&#xff0c;它们都用于存储和管理元素集合&#xff0c;但在底层实现和性能特性上有显著的区别。 1. 底层实现 std::vector: 基于动态数组实现。元素在内存中是连续存储的。支持随机访问&#xff08;通过下标访问元素&a…...

C++ 八股(整理记录)

1. 指针和引用的区别 定义与初始化&#xff1a; 指针&#xff1a;可以声明时不初始化&#xff0c;并且可以在之后指向任何同类型的变量。指针是一个变量&#xff0c;它存储的是另一个变量的地址。 int a 10; int* p; // 声明一个指向int的指针 p &a; // 将p指向变量a的…...

docker部署GPU环境

使用 Docker 部署 GPU 环境涉及到几个关键步骤,以下是详细步骤: 1. 安装 NVIDIA 驱动程序 确保你的系统已经安装了 NVIDIA GPU 驱动。这是使用 GPU 的前提条件。 2. 安装 Docker 和 nvidia-container-toolkit 首先,确保你已经安装了 Docker。然后,安装 NVIDIA Containe…...

单片机裸机编程-时机管理

对于 RTOS 实时操作系统&#xff0c;我们是通过 TASK&#xff08;任务&#xff09;进行底层操作的&#xff0c;这与裸机编程中的函数&#xff08;fun&#xff09;类似。不同的任务或函数实现不同的功能&#xff0c;在RTOS中&#xff0c;单片机有信号量、队列等不同任务之间的通…...

使用VScode开发STM32:基于CMake(包含标准库和HAL库工程)

使用VScode开发STM32&#xff1a;基于CMake&#xff08;包含标准库和HAL库工程&#xff09; 本教程使用VScode作为代码编辑工具、Cmake作为构建系统生成器、Make进行构建系统、使用arm-none-eabi-gcc进行交叉编译、使用OpenOCD作为代码下载与调试工具&#xff0c;最终搭建出适…...

Linux操作与权限2

查看权限控制信息 序号1&#xff0c;表示文件&#xff0c;文件夹权限控制信息 序号2&#xff0c;表示文件&#xff0c;文件夹所属用户 序号3&#xff0c;表示文件&#xff0c;文件夹所属用户组 12345678910d/l/-r/-w/-x/-r/-w/-x/-r/-w/-x/- 权限细节总共分为10个槽位 表格1&…...

解析第十一页

多选707、如图所示组网,SWA、SWB、SWC、SWD运行RSTP,则以下说法正确的是? A、可以在SWB的GE0/0/2端口开启边缘端口,让连接终端的接口快速进入转发状态 B、边缘端口收到BPDU之后会重新参与生成树的计算 C、可以在SWC的GEO/0/2端口开启边缘端口,让连接终端的接口快速进入转…...

SQL之order by盲注

目录 一.order by盲注的原理 二.注入方式 a.布尔盲注 b.时间盲注 三.防御 一.order by盲注的原理 order by子句是用于按指定列排序查询结果&#xff0c;列名或列序号皆可。 order by 后面接的字段或者数字不一样&#xff0c;那么这个数据表的排序就会不同。 order by 盲…...

阻止浏览器的默认缩放机制

在移动端浏览器中&#xff0c;当用户点击输入框&#xff08;如密码输入框&#xff09;时&#xff0c;页面可能会自动放大以提高可读性。这种行为通常是由于浏览器的默认缩放机制引起的。要阻止这种自动放大行为&#xff0c;可以采取以下几种方法&#xff1a; 使用 viewport 元…...

python 引用父目录:层级的模块

from pathlib import Path import sys 获取 project 目录 project_dir Path(file).resolve().parent.parent 将 project 目录添加到 sys.path 中 sys.path.append(str(project_dir)) 导入 support 模块 import support support.print_func(“Runoob”)...

实用:查找Linux进程调度统计信息的三个方法

实用&#xff1a;查找Linux进程调度统计信息的三个方法 在现代操作系统中&#xff0c;理解进程调度行为对于优化性能和解决瓶颈问题至关重要。本文将详细介绍如何在Linux系统中获取进程从调度队列中调入&#xff08;enqueue&#xff09;和调出&#xff08;dequeue&#xff09;…...

以下是自定义针对 Vite + TypeScript 项目的完整路径别名配置流程:

以下是针对 Vite TypeScript 项目的完整路径别名配置流程&#xff1a; 1. 安装必要依赖 bash npm install -D types/node 2. 配置 vite.config.ts typescript // vite.config.ts import { defineConfig } from vite import vue from vitejs/plugin-vue import path from pat…...

基于Matlab实现汽车远近光灯识别的详细步骤及代码示例

以下是一个基于Matlab实现汽车远近光灯识别的详细步骤及代码示例&#xff0c;主要通过图像处理技术来区分远光灯和近光灯。 整体思路 图像预处理&#xff1a;包括读取图像、灰度化、去噪等操作&#xff0c;以提高后续处理的准确性。边缘检测&#xff1a;找出图像中的边缘信息…...

Solidity 开发环境

Solidity 开发环境 Solidity编辑器&#xff1a;Solidity编辑器是⼀种专⻔⽤于编写和编辑Solidity代码的编辑器。常⽤的Solidity编辑器包括 Visual Studio Code、Atom和Sublime Text。以太坊开发环境&#xff1a;以太坊开发环境&#xff08;Ethereum Development Environment&a…...

Ollama+Cherrystudio+beg-m3+Deepseek R1 32b部署本地私人知识库(2025年2月win11版)

之前综合网络各方面信息得到的配置表&#xff1a; 在信息爆炸的时代&#xff0c;数据安全和个性化需求愈发凸显。搭建本地私人知识库&#xff0c;不仅能确保数据的安全性&#xff0c;还能根据个人需求进行个性化定制&#xff0c;实现知识的高效管理和利用。随着技术的不断发展…...

vue3.0将后端返回的word文件流转换为pdf并导出+html2pdf.js将页面导出为pdf

实现思路 1.将Word文档转换为HTML&#xff1a;mammoth.js&#xff0c;它可以将.docx文件转换为HTML 2.将HTML转换为PDF&#xff1a;使用html2pdf.js将HTML转换为PDF 如果想要相同的效果&#xff0c;也可以把前端页面直接导出转换为pdf: 运用的插件&#xff1a;html2pdf.js 后端…...

【心得】缓存穿透与缓存击穿总是记混,一文从英语单词含义角度分析带你区分清楚!

一句话省流版&#xff1a;缓存穿透的英语为cache penetration,可以翻译为缓存渗透&#xff0c;“渗透”联想到网安的攻击渗透&#xff0c;故缓存穿透是绕过防护进行攻击&#xff1b; 缓存击穿的英语为"cache breakdown"&#xff0c;可以翻译为缓存故障&#xff0c;“…...

day02

作业2 为 Activity 设置2种不同的启动模式并通过 adb 命令进行查看任务栈信息&#xff0c;并且打印生命周期方法执行日志 step1&#xff1a;生成第二个Activity和相应配置、 一个是singleTask模式&#xff0c;还一个是mainActivity的默认格式 step2&#xff1a;打印生命周期…...

JavaScript 简单类型与复杂类型-堆和栈

深入理解JavaScript中的简单类型&#xff08;基本数据类型&#xff09;与复杂类型&#xff08;引用数据类型&#xff09;如何在内存中存储对于编写高效、无误的代码至关重要。本文将探讨这两种类型的差异&#xff0c;以及它们在内存中的存储机制——栈&#xff08;Stack&#x…...

五、AIGC大模型_04LLaMA-Factory基础知识与SFT实战

1、LLaMA-Factory 基本介绍 1.1 定义 LLaMA-Factory 是一个开源的大型语言模型&#xff08;LLM&#xff09;微调框架&#xff0c;旨在帮助开发者和研究人员轻松地对预训练语言模型进行定制化训练和优化 1.2 功能特点 支持多种预训练模型 LLaMA Factory 支持超过 100 种主流的…...

数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例

数字IC后端时钟树综合专题&#xff08;OCC电路案例分享&#xff09; 复杂时钟设计时钟树综合(clock tree synthesis)常见20个典型案例 1、什么是OCC&#xff1f; 片上时钟控制器(On-chip Clock Controllers &#xff0c;OCC)&#xff0c;也称为扫描时钟控制器(Scan Clock Con…...

LeetCodehot 力扣热题100 全排列

这段代码的目的是计算给定整数数组的所有全排列&#xff08;permutations&#xff09;&#xff0c;并返回一个包含所有排列的二维数组。 思路解析 在这段代码中&#xff0c;采用了 深度优先搜索&#xff08;DFS&#xff09; 和 回溯 的方法来生成所有的排列。 关键步骤&#xf…...

深度学习c++资源库:vector容器,蓝桥杯常用算法sort,unique(排序+去重)

vector容器 1.基本概念 <vector> 是 STL 中的一个容器类&#xff0c;不同于普通数组的静态空间&#xff0c;vector可以动态扩展。 动态扩展&#xff1a;并不是在原空间连接新空间&#xff0c;而是找到更大的内存空间&#xff0c;将原数据拷贝到新空间&#xff0c;释放…...

Postgresql-重置统计信息(reset statistics)

文章目录 理解 PostgreSQL 中的 pg_stat_resetpg_stat_reset 的作用与使用时机pg_stat_reset 所需权限PostgreSQL 重置统计信息的方法重置整个database重置特定表的统计重置特定function的统计重置Statistics Collector:重置 WAL&#xff08;Write-Ahead Logging&#xff09;统…...

【Uniapp-Vue3】导入uni-id用户体系

在uniapp官网的uniCloud中下载uni-id用户体系 或者直接进入加载&#xff0c;下载地址&#xff1a;uni-id-pages - DCloud 插件市场 进入以后下载插件&#xff0c;打开HbuilderX 选中项目&#xff0c;点击确定 点击跳过 点击合并 右键uniCloud文件夹下的database文件夹&#x…...

【前沿探索篇七】【DeepSeek自动驾驶:端到端决策网络】

第一章 自动驾驶的"感官革命":多模态神经交响乐团 1.1 传感器矩阵的量子纠缠 我们把8路摄像头+4D毫米波雷达+128线激光雷达的融合称为"传感器交响乐",其数据融合公式可以简化为: def sensor_fusion(cam, radar, lidar):# 像素级特征提取 (ResNet-152…...

Staruml软件的介绍安装uml类图的绘制流程

文章目录 1.uml和staruml之间的关系2.软件的安装3.配置脚本语言4.Staruml创建类图4.反向工程 1.uml和staruml之间的关系 这篇文章主要是介绍这个staruml软件的安装和相关的背景介绍&#xff1a; 我和uml初识于IDEA软件&#xff0c;学习java的你一定用过这个软件&#xff0c;当…...

神经网络发展简史:从感知机到通用智能的进化之路

引言 神经网络作为人工智能的核心技术&#xff0c;其发展历程堪称一场人类对生物大脑的致敬与超越。本文将用"模型进化"的视角&#xff0c;梳理神经网络发展的五大关键阶段&#xff0c;结合具象化比喻和经典案例&#xff0c;为读者呈现一幅清晰的AI算法发展图谱。 一…...

快节奏生活

在当今快节奏的商务环境中&#xff0c;效率成为了决定企业竞争力的关键因素之一。亿可达软件连接平台&#xff0c;以其独特的功能和优势&#xff0c;为职场人士带来了前所未有的便捷与高效&#xff0c;成为了众多用户心中的“宝藏”工具。 1、亿可达&#xff1a;自动化流程的搭…...

Windows 11【1001问】通过Rufus制作Win 11系统安装U盘

随着科技的发展&#xff0c;Windows 11 已经成为许多用户的首选操作系统。在之前的几篇文章中&#xff0c;我们详细探讨了 Windows 11 的概念、安装配置要求以及如何下载 Windows 11 镜像文件&#xff0c;并介绍了六种不同的安装方法。本篇博客将聚焦于使用 ISO 文件安装 Windo…...

spring中手写注解开发(创建对象篇)

说明&#xff1a; 在spring底层中并不是我写的如此&#xff0c;这篇只是我用我自己的方式实现了使用注解组件扫描并且 创建对象&#xff0c;方法并不是很难&#xff0c;可以看一看&#xff0c;欢迎大佬评论 第一步&#xff1a; 我们需要自己写一个注解&#xff0c;我用的是idea…...

DeepSeek进入开源周,分享几点关于开源的思考

最近DeepSeek进入开源周&#xff0c;又把差点被大众遗忘在角落的开源话题拉了出来。 作为一个开源作者&#xff0c;也分享几点关于开源的思考。 AI对开源的影响 开源项目遇到的最大困难 开源项目不应该商业化 你的开源项目是垃圾...

大模型训练中的数据不平衡问题及其解决策略

目录 大模型训练中的数据不平衡问题及其解决策略 一、数据不平衡问题的影响 二、处理数据不平衡问题的方法 1. 过采样&#xff08;Oversampling&#xff09; 2. 欠采样&#xff08;Undersampling&#xff09; 3. 代价敏感学习&#xff08;Cost-Sensitive Learning&#xf…...