深度理解linux系统—— 进程概念
一、进程
进程,什么是进程?
在课本,教材中是这样描述的:程序的一个执行示例,正在执行的程序;
从内核角度来说,进程就是担当分配系统资源(CPU时间,内存)的实体。
这样说还是太抽象的,还是不能理解到底什么才是进程。
我们现在来想一下,程序要想运行,就要加载到内存,那在内存到底有多少等待执行程序呢?
很显然有很多,在内存当中有很多个等待执行的程序的代码和数据,那操作系统是不是要管理这些代码和数据?
那操作系统是如何管理的呢?还记得上篇文章理解管理中的:先描述、再组织
先描述,如何去描述:记录这些代码和数据的详细信息,记录在PCB
中(也称为进程控制块)。
再组织,将每一个代码和数据对于的PCB
通过数据结构(链表
)组织管理起来。
这里我们先不管PCB
和内核数据结构是什么;我们的进程在这里其实就是PCB
+数据。
这里我们的进程就是:内核的数据结构对象 + 自己的代码和数据。
说简单一点就是:
PCB
+ 代码和数据(在linux
操作系统中,PCB
就是task_struct
结构体)
描述 - PCB
PCB
,博主在计算机操作系统这门课程中学习到过PCB
,在学校中老师讲述的PCB
就是描述一个进程的各种详细信息。
虽然说学习过PCB
,但还是不懂这是什么啊?
简单来说
PCB
就是进程属性的集合,因为进程的信息都被放在进程控制块(PCB
)中。
PCB
是操作系统中对进程控制块的统称,linux
下PCB
是task_struct
。
那我们老是说PCB
是描述进程的属性,那到底有哪些属性呢?
- 标识符:描述进程的唯一标识符,区别其他进程。
- 状态:进程当前所处的状态。
- 优先级:相对于其他进程当前进程的优先级。
- 程序计数器:程序即将被执行的下一条指令的地址。
- 内存指针:包括程序代码和进程相关数据的指针,还用其他进程共享的内存块的指针。
- 上下文数据:程序执行时处理器的寄存器中的数据
I/O
状态信息:包括显示的I/O
请求,分配给进程的I/O
设备的进程使用的文件列表- 记账信息:可能包括处理器时间综合,使用的时钟数综合,时间限制等。
- 其他信息…
不看不知道,一看吓一跳啊,进程属性居然这么多;不过不用着急,我们一点点的来看进程这些属性。
组织
描述了进程PCB
,那如何将进程PCB
组织起来呢?
所有运行在系统中的进程都以
task_struct
链表的形式存储在内核中
简单来说就是在操作系统中存在一个全局链表,我们所有加载到内存中的程序对应的PCB
都在这个全局链表中。
二、查看进程
有了对进程的了解之后,这里有一个疑问,我们在linux
下使用的指令,它是不是进程?
是的,我们执行的所有指令、工具、我们自己的程序,运行起来它都是进程。
说了这么多,我们在linux
操作系统下,能不能查看进程呢?
当然是可以的;
查看进程信息
1. 在linux
操作系统中,我们所有的进程信息都存放在/proc
这个系统文件夹中
一眼看去眼花缭乱的,没关系,我们接着往下看,在有一定了解之后再回来看;
2. 我们可以通过指令top
和ps
来查看进程信息
top
ps
/ps -axj
这里我们写一个程序,写成死循环,否则运行时间太短查看不到。
//process.c
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{while(1){sleep(1);}return 0;
}
这里用到的指令
ps -axj
:查看所有进程信息;
ps - axj | head -1
:查看第一行信息(第一行是显示每一列指的是什么)
ps - axj | grep process
:在ps - axj
查看的所有进程信息中,搜索process
。
&&
:使用&&
可以依次执行多个指令。
补充:
我们对于一个正在运行中的程序,如果不想让它继续运行,按下
Ctrl + c
即可;
Ctrl + c
终止程序其实就是杀死进程。我们也可以使用
kill
指令来终止一个进程
进程标识符pid
通过查看我们进程可以发现进行有非常多的属性,现在来看进程标识符pid
;
进程标识符是描述进程唯一的,和其他进程区别的;也就是说每一个进程它的pid
都不相同;
getpid()
,获取当前进程的pid
我们可以通过man getpid
来查看man
手册中 的getpid
。
可以看到查询的是
2
号手册,这表明这里的getpid
是一个系统调用。使用时需要包含头文件
<sys/types.h>
和<unistd.h>
。
这里我们修改一下我们的代码:
//process.c
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{while(1){printf("I am a process, my pid : %d\n",getpid());sleep(1);}return 0;
}
这里我们每次循环打印一次,然后休眠一秒。
看到这里,我们知道了pid
,那ppid
又是什么东西?
父子进程
ppid
就是父进程的pid
;
当我们在一个进程
a
中创建了一个新的进程b
,那这个新的进程b
就是我们旧进程a
的子进程,a
就是进程b
的父进程有父进程可以有多个子进程,但是一个子进程只能有一个父进程
我们可以通过getppid
来获得父进程的pid
。
可以看到
getppid
也是一个系统调用,它返回的是父进程的pid
。
现在我们再修改一下代码,输出一个程序的父进程。
//process.c
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{printf("I am a process, my pid : %d\n",getpid());return 0;
}
这里留一个小疑问上图中process
的ppid
是2015,那2015进程是什么?
父子进程这里就不过多描述了,主要记住父子进程关系就行。
创建进程
上面程序是我们自己写的代码,通过编译链接形成可执行程序,我们可以通过运行程序来创建进程;那我们可不可以在程序执行的过程中创建进程呢?
当然是可以的,这里我们可以使用系统调用
fork
来在程序运行过程中创建进程;
如果man
手册查看fork
可以发现,它是用来创建一个子进程的系统调用;
这里我们先不看返回值问题,我们先来看一下应该进程创建另外一个进程的现象
//process.c
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{printf("prcess running, pid : %d\n",getpid());fork();//创建进程printf("I am a process, my pid : %d, my ppid : %d\n",getpid(),getppid());return 0;
}
这里重点看这个系统调用的返回值:
如果创建子进程成功,就返回子进程的
pid
给父进程,返回0
给子进程;如果创建失败就返回-1
给父进程,子进程未创建。
这里我们可以是不是就可以根据fork
的返回值来判断,当前进程是父进程还是子进程;然后进行分流,让父进程和子进程执行不同的代码。
//process.c
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{pid_t id = fork();//也使用int类型接受返回值if(id < 0){//创建子进程失败perror("fork");return -1;}else if(id == 0){//子进程while(1){printf("我是一个子进程, 我的pid: %d, 我的ppid: %d\n",getpid(),getppid());sleep(1);}}else{//父进程while(1){printf("我是一个父进程, 我的pid: %d, 我的ppid: %d\n",getpid(),getppid());}}return 0;
}
这里我们使用了循环执行指令
while :; do ps -axj | head -1 && ps -axj | grep process; sleep 1; done
我们可以看到,我们父进程的pid是
4199
,创建的子进程的ppid
是4199
也就是我们的父进程。
这里了解到了通过fork
的返回值来进行父子进程分流,我们现在来思考几个问题:
fork
为什么有两个返回值- 两个返回值是如何分别给父子进程返回的
首先,为什么要有两个返回值?
我们知道一个父进程它可以有多个子进程,而一个子进程只能有一个父进程;
那在父进程中,它怎么知道其子进程是哪一个进程呢?所以在父进程中要存储下来我们子进程的
pid
;还用我们要实现父子进程的分流,那只能通过
fork
的返回值来判断父子进程。
OK,这里有两个返回值理解,但是**fork
是如何实现给父子进程返回不同的值的?**
在解释这个之前,我们先来看一个现象:
//process.c
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{int x = 0;pid_t id = fork();//也使用int类型接受返回值if(id < 0){//创建子进程失败perror("fork");return -1;}else if(id == 0){//子进程while(1){printf("我是一个子进程, 我的pid: %d, 我的ppid: %d; x = %d\n",getpid(),getppid(),x);x+=10;sleep(1);}}else{//父进程while(1){printf("我是一个父进程, 我的pid: %d, 我的ppid: %d; x = %d\n",getpid(),getppid(),x);}}return 0;
}
可以看到,我们子进程修改
x
时,是不影响父进程的x
的数据的;这是因为父子进程共享代码,数据在修改的时候是会进行写时拷贝的。
那我们现在来看,fork
是如何实现给父子进程返回不同的返回值的。
简单来说,就是在
fork
函数返回之前,子进程已经创建完成了(如果创建失败就只有父进程执行,返回-1
);那在
fork
中已经有了父子进程的分流,而子进程修改数据不影响父进程的数据;所以子进程返回给子进程,父进程返回给父进程,这样实现
fork
返回给父子进程不同的返回值。
程序进程的父进程是什么?
在上面留了一个疑问,我们程序执行是进程的父进程2015
它是什么?(这里博主测试时是2015
,其他时候可能不是)
我们不妨来看一下,
2015
这个进程是什么?
可以看到2015
这个进程是-bash
,那bash
是什么呢?
在
Linux
系统中,bash
是最常用的命令行解释器(shell
);还记得在学习
Linux
系统中的权限时,提到过shell
,它是用户与操作系统之间的接口,负责将我们的指令翻译成内核理解的指令。
bash
是shell
的一种实现,简单来说bash
就是LInux中的命令行解释器;
我们再来想一想,我们在执行程序时,只是简单的让程序运行起来,那谁为我们创建这一个进程呢?显而易见的就是-bash
了。
-bash
是 登录Shell
当用户通过系统级登录(
ssh
、本地终端邓丽、su - username
切换用户)时,系统会启动一个登录Shell
;这里可以简单理解为系统为我们创建一个
-hash
进程
三、查看系统文件/proc
我们在上面提到了系统文件/proc
,这里面存放了所有进程信息;
那在我们自己的程序运行时,我们的进程会不会也在这个里面?
这里我们简单运行一个程序,查看一下pid
:
//process.c
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{printf("I am a process, my pid: %d\n",getpid());while(1){sleep(1);}return 0;
}
当前进程pid
是10596
;
我们查看/proc
系统文件:
那这个文件中存储着哪些信息呢?
可以看到10596
这个文件中存储着非常多的文件
这里我们就重点看一下cwd
和exe
这两个文件:
可以看到
cwd
和exe
中存储着这样的信息;那这些信息是什么呢?
cwd
:存储当前可执行程序的绝对路径(指向进程的当前工作目录)exe
:指向进程启动时使用的可执行文件的完整路径(进程由哪一个可执行程序启动)。
cwd
在之前,我们使用C语言中的文件操作函数fopen
时,我们可以使用文件的绝对路径、也可以使用相对路径;
使用绝对路径我们可以理解,使用相对路径./test.txt
时,程序是如何知道我们文件所在的位置呢?
所以
cwd
存储的就是进程的当前工作目录,我们在进行文件操作时使用相对路径./test.txt
时,会基于cwd
进行解析路径。
这里就不过多演示了;
我们可以使用通过启动进程时指定工作目录、也可以通过chdir
在程序在修改工作目录
exe
exe
中存储的是进程由哪一个可执行程序启动(进程启动时使用的可执行程序的完整路径)
那现在我们有一个疑问,如果进程在运行时,我们将exe
指向的可执行程序删除了会怎么样?
到这里本篇文章大致内容就结束了
简单总结:
进程:内核的数据结构对象 + 自己的代码和数据
查看进程信息
top/ps
指令进程的标识符
pid
父子进程以及
fork
创建进程补充:系统文件
/proc
进程文件中的cwd
和exe
。
相关文章:
深度理解linux系统—— 进程概念
一、进程 进程,什么是进程? 在课本,教材中是这样描述的:程序的一个执行示例,正在执行的程序; 从内核角度来说,进程就是担当分配系统资源(CPU时间,内存)的实体…...
【如何使用solidwork编辑结构导入到simscope】
这里写自定义目录标题 欢迎使用Markdown编辑器 欢迎使用Markdown编辑器 To use Simscape Multibody Link, you must install MATLAB and the CAD applications on the same computer. To ensure the successful installation of Simscape Multibody Link, before launching yo…...
Flink 时态维度表 Join 与缓存机制实战
一、引言:为什么需要时态维度表? 在实时数仓建设中,维度表是不可或缺的一环,例如: 风控系统中,用户的风险等级在不同时间可能变化; 营销体系中,商品的促销标签会动态调整ÿ…...
Apache Tomcat 漏洞(CVE-2025-24813)导致服务器面临 RCE 风险
CVE-2025-24813Apache Tomcat 中发现了一个严重安全漏洞,标识为,该漏洞可能导致服务器面临远程代码执行 (RCE)、信息泄露和数据损坏的风险。 此缺陷影响以下版本: Apache Tomcat11.0.0-M1通过11.0.2Apache Tomcat10.1.0-M1通过10.1.34Apache Tomcat9.0.0-M1通过9.0.98了解 …...
来自B站-AI匠的“RAG的prompt设计指南“的部分截图
来自B站-AI匠的“RAG的prompt设计指南“的部分截图 0. 引言1. RAG提示词 - 部分视频截图2. 总结 - 部分视频截图3. 举例 - 部分视频截图 0. 引言 这个文章记录的是B站Up主AI匠关于RAG的prompt设计指南的视频截图。 1. RAG提示词 - 部分视频截图 笔记: Up主推荐Fa…...
【Linux】Centos7 在 Docker 上安装 Redis7.0(最新详细教程)
一、拉取 Redis 镜像 1. 从 阿里云加速器(docker hub)拉取 redis镜像,选择镜像标签为 7.2.4 docker pull redis:7.2.4 2. 准备 Redis 的配置文件(便于后期对配置文件进行修改) 3.在服务器上创建需要挂载的文件夹 mk…...
Java使用微信云服务HTTP API操作微信云开发数据库
可以直接用的工具类代码 package com.kstc.qgy.util;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.kstc.qgy.model.exception.WxException; import com.kstc.qgy.model.service.Limit; imp…...
Linux的权限
目录 1、用户分类 1.1 超级用户(root)和普通用户 1.2 普通<->超级 1.3 sudo 2、文件和目录的权限 2.1 chown&&chgrp 2.1.1 chown 2.1.2 chgrp 2.2 chmod 总结一下: 3、文件和目录的默认权限 4、共享文件 4.1 理解多用户隔离 4.2 /tmp/ 1…...
ACT游戏和MMORPG经济形态区别以及对经济循环的思考
对于原神的明日之后经济形态的不同解析 对于MMORPG游戏来说,如果采用开放市场经济的设计,以明日之后为例,系统产出端为采集、运营活动投放;玩家产出端为交易;消耗端为武器耐久的减少。但我好奇,在ACT游戏里…...
zynq7035的arm一秒钟最多可以支持触发多少次中断
一、概述 1.关于zynq7035的ARM处理器一秒能够支持多少次中断触发,需要综合来考虑。需要确定ARM处理器的参数,目前zynq7000系列,使用的双核Cortex-A9处理器。其中主频大概在500MHZ~1GHZ左右,不同的用户配置的主频可能稍微有差别。 …...
Spring MVC 拦截器教程
一、拦截器核心概念 1.1 拦截器 vs 过滤器 特性过滤器 (Filter)拦截器 (Interceptor)依赖关系Servlet容器Spring MVC框架作用范围所有Web请求Controller请求实现机制Java EE标准Java反射AOP生命周期服务器启动时初始化随Spring容器初始化功能场景字符编码、安全过滤权限校验、…...
【HPC存储性能测试】02-ior带宽性能测试
文章目录 一、前言二、软件安装1、安装依赖2、安装软件 三、参数说明1、mpirun参数2、ior参数 四、测试说明 一、前言 ior introduction | github hpc ior IOR 测试工具使用 POSIX、 MPIIO 或 HDF5接口对并行文件系统进行基准测试 通常使用IOR测试工具时,一般会配合…...
【RabbitMQ】保证消息不丢失
要确保 RabbitMQ 在消费者(Python 服务)重启或挂掉时消息不丢失,需结合 消息持久化、确认机制(ACK) 和 死信队列(DLX) 实现高可靠性: 1. 消息持久化(Durabilityÿ…...
算法效率的钥匙:从大O看复杂度计算 —— C语言数据结构第一讲
目录 1.数据结构与算法 1.1数据结构介绍 1.2算法介绍 2.算法效率 2.1复杂度 2.1.1时间复杂度 2.1.1.1时间复杂度计算示例1 2.1.1.2时间复杂度计算示例2 2.1.1.3时间复杂度计算示例3 2.1.1.4时间复杂度计算示例4 2.1.1.5时间复杂度计算示例5 2.1.1.6时间复杂度计算示例6…...
AI赋能守护行车安全新防线,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建驾驶车辆场景下驾驶员疲劳分心驾驶行为智能检测预警系统
在当今社会,随着科技生产力的飞速发展,汽车早已成为人们日常出行不可或缺的交通工具。它不仅极大地提高了人们的出行效率,也为生活带来了诸多便利。然而,随着汽车保有量的不断增加,交通安全问题也日益凸显。疲劳驾驶和…...
HNUST湖南科技大学-嵌入式考试选择题题库(109道纠正详解版)
HNUST嵌入式选择题题库 1.下面哪点不是嵌入式操作系统的特点。(B) A.内核精简 B.功能强大 C.专用性强 D.高实时性 解析: 嵌入式操作系统特点是内核精简、专用性强、高实时性,而"功能强大"通常指的是通用操作系统&#x…...
【音视频】SDL事件
SDL 事件 函数 SDL_WaitEvent(): 等待一个事件SDL_PushEvent(): 发送一个事件SDL_PumpEvents(): 将硬件设备产生的事件放入事件队列,用于读取事件,在调用该函数之前,必须调用SDL_PumpEvents搜集键盘等事件…...
[特殊字符]实战:使用 Canal + MQ + ES + Redis + XXL-Job 打造高性能地理抢单系统
📚目录 项目背景 技术栈总览 详细流程分析 3.1 Canal监听MySQL Binlog 3.2 MQ中转传递订单变化 3.3 Elasticsearch存储并查询附近订单 3.4 Redis高性能抢单Lua防止抢单冲突 3.5 XXL-Job定时任务处理 完整系统流程图 总结 一、项目背景 针对类似外卖、跑…...
FPGA基础之基础语法
一、基本模块结构 Verilog 代码以 模块(Module) 为单位,每个模块对应一个硬件功能单元(如逻辑门、寄存器等)。 基本格式: module 模块名 (// 输入输出端口声明input 端口1,input 端口2,output 端口3 );…...
影楼精修-皮肤瑕疵祛除算法解析
注意:本文样例图片为了避免侵权,均使用AIGC生成; 顾名思义,皮肤瑕疵祛除旨在祛除人像照片皮肤区域的痘痘/斑点/痣/胎记等瑕疵;当前主流算法方案可分为传统图像处理方法和基于深度学习的方法,本文重点介绍基…...
2025蓝桥杯省赛网络安全组wp
文章目录 黑客密室逃脱ezEvtxflowzipEnigma星际xml解析器EBC-TrainAES-CBC 黑客密室逃脱 提示猜文件名,猜几个常见的,app.py读到源码 这里也是脑抽了一下,把密钥看成1236了。。。卡了五分钟左右,解出来的时候已经降到300多分了&a…...
【数据结构】·励志大厂版(复习+刷题):二叉树
前引:哈喽小伙伴们!经过几个月的间隔,还是逃脱不了再次复习的命运!!!本篇文章没有冗杂的闲话,全是干货教学,带你横扫二叉树的几种遍历,怎么前序、、中序、后续࿱…...
Spark-Streaming2
一.有状态转化操作 1. UpdateStateByKey UpdateStateByKey 原语用于记录历史记录,有时,我们需要在 DStream 中跨批次维护状态(例如流计算中累加 wordcount)。针对这种情况,updateStateByKey()为我们提供了对一个状态变量的访问&…...
《深入浅出Git:从版本控制原理到高效协作实战》
Git的原理和使用 1、Git初识与安装2、Git基本操作2.1、创建Git本地仓库2.2、配置Git2.3、认识工作区、暂存区、版本库2.4、修改文件2.5、版本回退2.6、撤销修改2.7、删除文件 3、Git分支管理3.1、理解分支3.2、创建、切换、合并分支3.3、删除分支3.4、合并冲突3.5、合并模式3.6…...
内耗型选手如何能做到不内耗?
以下是针对「内耗型选手」的系统性解决方案,结合认知神经科学、行为心理学和效能管理理论,提供可落地的策略框架: 一、建立「内耗熵值」监测系统 1. 绘制内耗热力图 用时间轴记录每日内耗触发点: 时间段内耗场景能量损耗值&…...
pyspark将hive数据写入Excel文件中
不多解释直接上代码,少python包的自己直接下载 #!/usr/bin/env python # -*- encoding: utf-8 -*- from pyspark.sql import SparkSession import pandas as pd import os# 初始化 SparkSession 并启用 Hive 支持 spark SparkSession.builder \.appName("sel…...
Java大师成长计划之第5天:Java中的集合框架
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4o-mini模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 在 Java 编程中,集合框架…...
rt-linux下的D状态的堆栈抓取及TASK_RTLOCK_WAIT状态
一、背景 在之前的博客 缺页异常导致的iowait打印出相关文件的绝对路径-CSDN博客 里的 2.1 一节里的代码,我们已经有了一个比较强大的抓取D状态和等IO状态超过阈值的waker和wakee的堆栈状态的内核模块。在之前的博客 增加等IO状态的唤醒堆栈打印及缺页异常导致iowa…...
数据结构【堆和链式结构】
堆和链式结构 1.堆的概念和定义1.1堆1.2二叉树的性质 2.堆的实现3.实现链式二叉树3.1链式二叉树的概念3.2前中后遍历3.3遍历(举例) 1.堆的概念和定义 1.1堆 定义:是特殊的二叉树 #mermaid-svg-vWPNPMGSLe0nGNcd {font-family:"trebuch…...
聊一聊自动化测试
目录 一、自动化测试的定义与核心价值 (一)什么是自动化测试 (二)核心价值:从人工到智能的跨越 二、自动化测试的发展阶段 (一)萌芽阶段(早期) (二&…...
vue2 开发一个实习管理系统电脑端-前端静态网站练习
为了快速的掌握vue2的所学习到的知识点,最近又使用vue2和element-ui 做了一个实习管理系统来巩固自己的前端技术,我觉得对于新手来说,多写代码,多找一些项目练习,是提供自己编程能力的一个很好的办法,这也是…...
【Hive入门】Hive基础操作与SQL语法:DML操作全面解析
目录 1 Hive DML操作概述 2 数据加载操作 2.1 LOAD DATA语句 2.2 INSERT语句 3 数据导出操作 3.1 INSERT OVERWRITE DIRECTORY 3.2 使用HDFS命令导出 4 数据更新与删除 4.1 UPDATE语句 4.2 DELETE语句 5 MERGE操作(Hive 2.2) 6 性能优化建议…...
C++类和对象(上)
目录 类的定义类定义格式访问限定符类域 实例化实例化概念对象大小 this指针C和C语言实现Stack对比 类的定义 类定义格式 在下面的代码中,class为定义类的关键字,Stack为类的名字,{}中为类的主体, 注意类定义结束时后面分号不能省…...
LS2K0300龙芯开发板——智能车竞赛
开启 LS2K0300 调车之旅(自己写的自己慢慢更,可能写的不好欢迎指教) 欢迎大家一起讨论共同进步!逐飞科技针对 LS2K0300 MCU 开发的开源库,涵盖多种实用功能,助力竞赛与产品开发。以下是快速上手指南&#…...
电子病历高质量语料库构建方法与架构项目(智能质控体系建设篇)
引言 随着人工智能技术的迅猛发展,医疗信息化建设正经历着前所未有的变革。电子病历作为医疗机构的核心数据资产,其质量直接关系到临床决策的准确性和医疗安全。传统的病历质控工作主要依赖人工审核,存在效率低下、主观性强、覆盖面有限等问题。近年来,基于人工智能技术的…...
超级创新思路:基于CBAM-Transformer的强化学习时间序列预测模型(Python\matlab实现)
首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴!需要完整代码可私信或评论! 本方案可用于医疗、金融、交通、零售、光伏功率预测、估计预测、天气预测、流量预测、故障检测等领域! 目录 首先声明,该模型为原创!原创!原创!且该思…...
JVM——垃圾收集策略
GC的基本问题 什么是GC? GC 是 garbage collection 的缩写,意思是垃圾回收——把内存(特别是堆内存)中不再使用的空间释放掉;清理不再使用的对象。 为什么要GC? 堆内存是各个线程共享的空间,…...
从基础到实战的量化交易全流程学习:1.3 数学与统计学基础——概率与统计基础 | 数字特征
从基础到实战的量化交易全流程学习:1.3 数学与统计学基础——概率与统计基础 | 数字特征 第一部分:概率与统计基础 第2节:数字特征:期望值、方差、协方差与相关系数 一、期望值(Expected Value):…...
【MySQL】数据类型和表的操作
目录 一. 常用的数据类型 1.数值类型 1.1 整形类型 1.2 浮点型类型 2.字符串类型 char和varchar的区别 如何选择char和varchar 3.日期类型 4.二进制类型 二. 表的操作 1.查看所有表 2.表的创建 3.查看表的结构 4.表的修改 4.1 添加新的列 4.2 修改表中现有的列 4…...
Tauri打包时出现WixTools以及NSIS报错
前言 Tauri构建时会通过github下载Wix和NSIS,由于国内网络限制,所以这个过程基本都会失败,而且你无法使用挂代理的方式解决此问题,唯一的办法就是先下载对于的库,然后把库丢到对应的文件夹内来解决此问题。。。 文章目…...
Linux操作系统学习---进程地址空间
前言: 在学习c,c这些偏底层的语言时,我们常常会对一个变量取地址,一遍对他进行一系列的操作 . 可是 , 这真的是真实的物理地址吗 ? 其实并非如此 , 通过了解进程地址空间,我们就能解开这个困惑. 一、虚拟地址空间的概念: 同地址,不同值的代码示例: 下面通过创建子进程来看一个…...
docker compose -p的踩坑经验
刚才启动ragflow解析了几百个文件,再次启动登录时报错 没有这个账户,心疼token几秒。。。 再次回顾之前的启动方式和当前的启动方式,才发现有出入。 问题: 第一次启动sudo docker compose up -d 第二次启动sudo docker compose -…...
深入理解 Linux 用户管理:从基础到实践
在 Linux 操作系统中,用户管理是确保系统安全、合理分配资源的核心环节。无论是个人开发者搭建本地开发环境,还是运维人员管理企业级服务器集群,熟练掌握 Linux 用户管理都是一项必备技能。本文将从用户管理的基础概念出发,结合实…...
Go语言之路————指针、结构体、方法
Go语言之路————指针、结构体、方法 前言指针结构体声明初始化使用组合引用结构体和指针结构体的标签 方法例子结合结构体总结 前言 我是一名多年Java开发人员,因为工作需要现在要学习go语言,Go语言之路是一个系列,记录着我从0开始接触Go…...
【漫话机器学习系列】227.信息检索与数据挖掘中的常用加权技术(TF-IDF)
在自然语言处理(NLP)、信息检索(IR)和数据挖掘(DM)领域中,TF-IDF 是一种非常经典且常用的加权技术。 无论是搜索引擎排序、文本挖掘,还是特征工程,TF-IDF都扮演着重要角色…...
【音视频】FFmpeg过滤器框架分析
ffmpeg的filter⽤起来是和Gstreamer的plugin是⼀样的概念,通过avfilter_link,将各个创建好的filter按⾃⼰想要的次序链接到⼀起,然后avfilter_graph_config之后,就可以正常使⽤。 ⽐较常⽤的滤镜有:scale、trim、over…...
硬盘损坏数据恢复后对python程序的影响
最近硬盘突然间坏掉了,让数据商恢复了2个月今天终于拿到了恢复后的数据。 但是一测试问题就来了: PS E:\geosystem> python manage.py runserver 0.0.0.0:5000 Unhandled exception in thread started by <function check_errors.<locals>.…...
Azure Devops - 尝试一下在Pipeline中使用Self-hosted Windows agent
1.简单介绍 Azure Devops是微软提供的辅助软件的开发,测试,部署以及计划和进度跟踪的平台,通过Azure Devops可以使开发者,项目经理,运维人员在软件的整个生命周期中更紧密地合作,同时借助Continuous Integ…...
Linux红帽:RHCSA认证知识讲解(十 四)分区管理、交换分区,创建逻辑卷与调整逻辑卷的大小
Linux红帽:RHCSA认证知识讲解(十 四)分区管理、交换分区,创建逻辑卷与调整逻辑卷的大小 前言一、分区管理,使用fdisk管理分区1.1 找到硬盘1.2 使用fdisk分区1.3 格式化分区1.4 挂载分区 二、创建逻辑卷,调整…...
详解 Unreal Engine(虚幻引擎)
详解 Unreal Engine(虚幻引擎) Unreal Engine(简称 UE)是由 Epic Games 开发的一款全球领先的实时渲染引擎,自 1998 年随首款游戏《Unreal》问世以来,已发展成为覆盖 游戏开发、影视制作、建筑可视化、汽车…...