Linux的进程概念
目录
1、冯诺依曼体系结构
2、操作系统(Operating System)
2.1 基本概念
编辑
2.2 目的
3、Linux的进程
3.1 基本概念
3.1.1 PCB
3.1.2 struct task_struct
3.1.3 进程的定义
3.2 基本操作
3.2.1 查看进程
3.2.2 初识fork
3.3 进程状态
3.3.1 操作系统的进程状态
3.3.2 Linux的进程状态
3.4 进程优先级
3.4.1 基本概念
3.4.2 PRI&&NI
3.4.3 竞争&&独立&&并行&&并发
3.5 进程切换
3.6 Linux2.6内核进程O(1)调度队列
4、Linux的环境变量
4.1 基本概念
4.2 常见的环境变量
4.3 环境变量的相关命令
4.3.1 查看环境变量
4.3.2 修改环境变量
4.3.3 删除环境变量
4.4 环境变量的特点
5、Linux的进程虚拟地址空间
5.1 程序地址空间
5.2 问题抛出
5.3 进程虚拟地址空间和分页机制
5.4 虚拟地址空间和分页机制的作用
5.5 拓展
1、冯诺依曼体系结构
- 输入设备:键盘,鼠标,网卡,磁盘等。
- 输入设备:显示器,网卡,磁盘等。
- 存储器:即内存。
- CPU:简单来说,是中央处理器(运算器+控制器)。
注意:
- 因为输入输出设备的传输效率低,但是,让输入输出的设备的传输效率变高,成本太高,所以出现内存,即效率与成本之间的平衡,才普及了电脑。
- 程序的运行需要CPU,而CPU只能访问内存,所以程序必须加载到内存中。
- 数据流动的本质:多台冯诺依曼体系结构的交互。
2、操作系统(Operating System)
2.1 基本概念
操作系统包括:
- 内核(进程管理,内存管理,文件管理,驱动管理)
- 其他程序(例如函数库,shell程序等等)
2.2 目的
操作系统,是一款进行 软硬件 管理 的软件。管理:先描述(类),再组织(数据结构)。
sysrem call(系统调用),驱动程序,都是为了屏蔽底层细节,外部实现统一。安全且方便。
-
系统调用封装内核 → 对应用程序统一。
-
驱动程序封装硬件 → 对操作系统统一。
3、Linux的进程
3.1 基本概念
3.1.1 PCB
PCB(Process Control Block),进程控制块,一种类型,Linux中的PCB为:struct task_struct。
3.1.2 struct task_struct
内容分类(后续会详细介绍)
- 标识符(PID):描述本进程的唯一标识符,用于区分其他进程。
- 状态:任务状态,包括退出代码、退出信号等。
- 优先级:相对于其他进程的优先级。
- 程序计数器:程序中即将被执行的下一条指令的地址。
- 内存指针:包括程序代码和进程相关数据的指针,以及与其他进程共享的内存块指针。
- 上下文数据:进程执行时处理器的寄存器中的数据(例如:CPU 寄存器状态,需附图说明)。
- I/O 状态信息:包括未完成的 I/O 请求、分配给进程的 I/O 设备,以及进程使用的文件列表。
- 记账信息:可能包括处理器占用时间、时钟周期总和、时间限制、计账号等。
- 其他信息:与进程相关的其他数据。
在 Linux 内核中,所有进程均通过 struct task_struct 结构体描述,并以双向链表的形式(即队列)组织和管理。
3.1.3 进程的定义
进程 = 内核数据结构对象(PCB)+代码和数据
对进程的管理,就是对数据结构的增删改查。
3.2 基本操作
3.2.1 查看进程
1. 通过 /proc 文件系统查看进程信息
-
/proc 是一个虚拟文件系统,提供内核和进程信息的实时访问。
-
每个进程的信息存储在 /proc/[PID]/ 目录下,例如:
ls /proc/1/ # 查看 PID=1 的进程信息(通常是 init/systemd)
2. top:动态查看进程状态(CPU、内存占用等)
top # 默认动态显示所有进程(按 CPU 占用排序)
top -p PID1,PID2,PID3 # 只监控指定 PID 的进程
top -u username # 只显示某用户的进程
交互命令(在 top 运行时使用)
-
k → 结束指定 PID 的进程(输入 PID 后回车)。
-
M → 按内存占用排序。
-
P → 按 CPU 占用排序(默认)。
-
q → 退出 top 。
3. ps:静态查看进程列表
ps aux # 适用于查看所有进程的资源占用,进程状态等
ps -l PID # 适用于查看进程的父子关系,进程优先级等
注意:
- 可以配合grep进行搜索。
- ;和&&可以同时执行多条命令。
- 命令本身也是进程。
4. 通过系统调用,获取进程标识符(PID & PPID)
-
getpid():获取当前进程的 PID。
-
getppid():获取当前进程的父进程 PPID。
如:
#include <stdio.h>
#include <unistd.h>int main() {printf("PID: %d\n", getpid()); // 当前进程 IDprintf("PPID: %d\n", getppid()); // 父进程 IDreturn 0;
}
3.2.2 初识fork
通过fork(系统调用),创建子进程。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{int ret = fork();printf("hello proc : %d!, ret: %d\n", getpid(), ret);sleep(1);return 0;
}
- 两个返回值,对父进程返回子进程的PID,对子进程返回0。因为父:子 = 1:N,父进程需要区分子进程,而子进程能通过PPID找到父进程。所以可以if,让父子进程执行不同的语句。
-
fork() 创建子进程后,父子进程从 fork() 返回处继续执行。注意:子进程不会执行fork()之前的代码。
-
当父子进程尝试修改数据,会发生写时拷贝,重新拷贝一份数据。所以父子进程独立运行。
3.3 进程状态
3.3.1 操作系统的进程状态
以上可以分为三类:
- 运行:PCB对象在调度队列中,正在运行(运行)或准备运行(创建+就绪)。
- 阻塞:等待某种设备或资源就绪,PCB对象进入设备队列或资源队列。
- 挂起:内存不足,将进程的代码和数据放到磁盘中,进程是运行状态就是就绪挂起,进程是阻塞状态就是阻塞挂起。
注意:
- 一个CPU,一个调度队列
- PCB对象,可以同时在不同的数据结构中,即可以在不同的队列中。
- 进程的状态,就是PCB对象在不同队列之间的流动,本质是数据结构的增删改查。
3.3.2 Linux的进程状态
/** The task state array is a "bitmap" of reasons to sleep.* "Running" is 0, other states can be combined via bit tests.*/
static const char *const task_state_array[] = {"R (running)", /* 0 - 运行中或就绪 */"S (sleeping)", /* 1 - 可中断睡眠(等待事件)*/"D (disk sleep)", /* 2 - 不可中断睡眠(通常等待I/O)*/"T (stopped)", /* 4 - 被信号暂停(如SIGSTOP)*/"t (tracing stop)", /* 8 - 被调试器跟踪暂停 */"X (dead)", /* 16 - 完全终止(不会出现在任务列表)*/"Z (zombie)", /* 32 - 僵尸进程(已终止但未回收)*/
};
- R:运行中或就绪(进程一创建,就进入就绪状态)。
- S:可中断休眠(浅睡眠,一种阻塞),能被操作系统杀死。
- D:不可中断休眠(深睡眠,一种阻塞),不能被操作系统杀死。
- T:暂停,如:Ctrl+z。
- t:暂停,如:debug的断点。
- X:死亡,进程结束。
- Z:僵尸,子进程退出,父进程需要获取子进程退出前的信息(即子进程PCB对象里面的信息,其指向的代码和数据已被释放),并释放子进程的PCB对象,如果父进程没有获取子进程退出前的信息,那么子进程被称为"僵尸进程",其PCB对象将会一直存在,造成内存泄漏。如果父进程先结束,其子进程称为"孤儿进程",会被1号进程"领养",不会成为"僵尸进程"。
注意:
阻塞是进程的 正常状态(因等待资源主动暂停),而 饥饿是 异常现象(可能是一直阻塞,或进程可能无需等待资源,但因调度问题无法运行等)
3.4 进程优先级
3.4.1 基本概念
进程得到CPU资源的先后顺序。
注意:
- 优先级是一种数字,值越低,优先级越高。
- 优先级,能得到某种资源(只是先后问题),权限,能否得到某种资源。
- Linux,基于时间片的分时操作系统,要考虑公平性,所以优先级变化不大。
3.4.2 PRI&&NI
- PRI:进程的优先级,默认80。
- NI:nice值,进程优先级的修正数据,默认0。范围是[-20,19]。
注意:
- 进程真实的优先级PRI = 80 + NI。所以优先级的范围是[60,99]。保证公平性。
-
NI 的存在 是为了在 灵活性(用户态调整)和 稳定性(内核控制)之间取得平衡。
3.4.3 竞争&&独立&&并行&&并发
- 竞争:系统中进程数量远多于 CPU 资源(如单核 CPU 只能同时运行 1 个进程),因此进程之间需要竞争 CPU 时间片、内存、I/O 等资源。通过 优先级(Priority) 或 调度算法(如时间片轮转)来合理分配资源,确保高优先级或关键任务能优先执行。
- 独立:每个进程拥有独立的地址空间、文件描述符、寄存器状态等资源,一个进程崩溃不会直接影响其他进程。
- 并行:多个进程在 多个 CPU/核心上真正同时运行(物理层面的同时执行)。
- 并发:多个进程在 单个 CPU 上通过快速切换(时间片轮转) 模拟“同时运行”的效果(逻辑层面的交替执行)。
3.5 进程切换
CPU上下文切换(Context Switch),实际上是任务切换,或CPU寄存器的切换。
流程:
-
保存现场:
当多任务操作系统决定切换到另一个任务时,首先将当前运行任务的CPU寄存器状态完整保存到该任务的私有堆栈中。 -
恢复现场:
从待运行任务的堆栈中加载其之前保存的寄存器状态到CPU。 -
切换执行:
CPU开始执行新任务的指令流。
注意:
- 进程在一个时间片内占用CPU,不会一直占用。
- 进程切换的本质:保存和恢复 进程硬件上下文的数据(即CPU寄存器的状态)。
3.6 Linux2.6内核进程O(1)调度队列
- 对于active队列,先看nr_active,有没有进程,再通过bitmap[5],按照优先级,快速定位队列,最后挑队首的进程,执行。
- 进程执行完一个时间片,进入expired队列(防止高优先级进程执行完一个时间片,又插队)。当active队列为空时,swap(&active,&expired),交换两个指针,继续调度active队列。
- 新来一个进程,如果放到expired队列,就是就绪状态,如果放到active队列,也是就绪状态,但是"插队"了。
- 如果active中的进程,更改NI(nice值),即更改优先级,因为麻烦,所以执行完一个时间片后,进入过期队列时,再更新优先级。
4、Linux的环境变量
4.1 基本概念
环境变量是操作系统中用于指定运行环境参数的键值对(KEY=VALUE)。
KEY是环境变量的名字,VALUE是环境变量的内容。
4.2 常见的环境变量
4.3 环境变量的相关命令
4.3.1 查看环境变量
命令行:
- env:显示当前进程 所有的环境变量。
- echo $环境变量名字:显示环境变量的内容。
- set:显示当前进程 所有的变量。如:直接i=10或i,定义本地变量i。
系统调用:
- int main(int argc,char* argv[ ],char* env[ ]){ return 0;},argv是命令行输入的命令字符串数组(以空格为分隔符,将命令分成若干个字符串,数组以NULL结尾),argc是argv数组元素的个数,env是该进程 环境变量的字符串数组(环境变量放在字符串里,数组以NULL结尾)。
- getenv(),在当前进程,根据环境变量的名字,获取环境变量的内容。
- 全局变量environ(环境变量字符串数组,数组以NULL结尾),必须先extern char** environ;声明,再使用。
4.3.2 修改环境变量
- 环境变量名=$环境变量名:内容,给环境变量加内容。如:PATH=$PATH:/home/Lzc/test。
- export 变量名=“值”,新增环境变量。
注意:
以上关闭终端,重新登录,就会失效。想要永久生效,就要更改配置文件(~/.bashrc或~/.bash_profile),因为bash每次都是拷贝配置文件的内容。
4.3.3 删除环境变量
- unset 变量名:清除变量,本地变量和环境变量都可以。
4.4 环境变量的特点
- 新创建的子进程会继承父进程的环境变量(全局性)。进程相互独立,所以环境变量也独立,互不影响。
- 本地变量不会被新创建的子进程继承。
5、Linux的进程虚拟地址空间
5.1 程序地址空间
以32位机器为例:
5.2 问题抛出
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int g_val = 0; // 全局变量,初始化为0int main() {pid_t id = fork(); // 创建子进程if (id < 0) { // fork失败perror("fork");return 0;}else if (id == 0) { // 子进程分支g_val = 100; // 子进程修改全局变量printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);} else { // 父进程分支sleep(3); // 父进程休眠3秒,确保子进程先执行printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);}sleep(1); // 防止父进程或子进程提前终止return 0;
}
为什么地址一样,内容却不一样?
说明:
- 该地址绝对不是物理地址!
- 在Linux系统下,这种地址称为**虚拟地址**。
- 我们用C/C++语言看到的地址都是虚拟地址,物理地址对用户完全不可见,由操作系统统一管理。
5.3 进程虚拟地址空间和分页机制
所以,程序地址空间,准确来说是,进程虚拟地址空间。
首先,一个进程,一个虚拟地址空间。
struct task_struct {/*...*/struct mm_struct *mm; // 指向进程用户空间虚拟地址空间描述符// - 对普通用户进程:指向其虚拟地址空间的用户空间部分// - 对内核线程:NULL(因内核线程无独立用户空间)struct mm_struct *active_mm; // 内核线程使用的替代mm字段// - 内核线程的mm为NULL时,可借用其他进程的地址空间// - 所有进程的内核空间映射相同,故内核线程可复用/*...*/
};struct mm_struct {/*...*/struct vm_area_struct *mmap; // 虚拟内存区域(VMA)链表头struct rb_root mm_rb; // VMA红黑树根节点(加速查找)unsigned long task_size; // 用户虚拟地址空间大小/* 各段地址边界 */unsigned long start_code, end_code; // 代码段起止unsigned long start_data, end_data; // 数据段起止unsigned long start_brk, brk; // 堆段起止unsigned long start_stack; // 栈起始地址unsigned long arg_start, arg_end; // 命令行参数段unsigned long env_start, env_end; // 环境变量段/*...*/
};// 1.当虚拟区较少时采取单链表,由mmap指针指向这个链表;
// 2.当虚拟区间多时采取红⿊树进⾏管理,由mm_rb指向这棵树。
struct vm_area_struct {unsigned long vm_start; // 虚拟内存区域起始地址unsigned long vm_end; // 虚拟内存区域结束地址/* 链表与树结构 */struct vm_area_struct *vm_next, *vm_prev; // 双向链表指针struct rb_node vm_rb; // 红黑树节点unsigned long rb_subtree_gap;/* 关联的地址空间 */struct mm_struct *vm_mm; // 所属的mm_struct/* 权限与标志 */pgprot_t vm_page_prot; // 访问权限(读/写/执行)unsigned long vm_flags; // 区域标志(如VM_READ|VM_WRITE)/* 共享与反向映射 */struct {struct rb_node rb;unsigned long rb_subtree_last;} shared;struct list_head anon_vma_chain;struct anon_vma *anon_vma;/* 操作方法与文件映射 */const struct vm_operations_struct *vm_ops; // 区域操作函数集unsigned long vm_pgoff; // 文件映射偏移量(以页为单位)struct file *vm_file; // 映射的文件指针(若为文件映射)void *vm_private_data; // 驱动私有数据/* 其他配置 */atomic_long_t swap_readahead_info;
#ifdef CONFIG_NUMAstruct mempolicy *vm_policy; // NUMA内存策略
#endifstruct vm_userfaultfd_ctx vm_userfaultfd_ctx;
} __randomize_layout;
如图所示:
一个进程,一个页表,进行虚拟地址和物理地址的映射。
将物理地址转化为虚拟地址,提供给用户使用。
5.4 虚拟地址空间和分页机制的作用
- 将地址,"无序"变"有序"。
- 地址转化的过程中,可以对操作进行合法判定,进而保护物理内存(根据权限)。
- 让进程管理和内存管理在一定程度上解耦合。
5.5 拓展
- 可以不加载代码和数据到物理内存,只有struct task_struct,struct mm_struct,页表,需要访问时,“缺页中断”,再加载。所以创建进程,先有struct task_struct,struct mm_struct等,再有代码和数据。
- 当物理内存不足时,对于阻塞的进程,通过页表换出物理地址(释放内存),变为阻塞挂起,腾出内存空间。
相关文章:
Linux的进程概念
目录 1、冯诺依曼体系结构 2、操作系统(Operating System) 2.1 基本概念 编辑 2.2 目的 3、Linux的进程 3.1 基本概念 3.1.1 PCB 3.1.2 struct task_struct 3.1.3 进程的定义 3.2 基本操作 3.2.1 查看进程 3.2.2 初识fork 3.3 进程状态 3.3.1 操作系统的进程状…...
(10)python开发经验
文章目录 1 cp35 cp36什么意思2 找不到pip3 subprocess编码错误4 导出依赖文件包含路径5 使用自己编译的python并且pyinstall打包程序 更多精彩内容👉内容导航 👈👉Qt开发 👈👉python开发 👈 1 cp35 cp36什…...
什么是时间戳?怎么获取?有什么用
时间戳的定义 时间戳(Timestamp)是指记录某个事件发生的具体时间点,通常以特定的格式表示。它可以精确到秒、毫秒甚至更小的单位,用于标识某个时刻在时间轴上的位置。 获取时间戳的方法 在不同的编程语言中,获取时间…...
Zookeeper 入门(二)
4. Zookeeper 的 ACL 权限控制( Access Control List ) Zookeeper 的ACL 权限控制,可以控制节点的读写操作,保证数据的安全性,Zookeeper ACL 权 限设置分为 3 部分组成,分别是:权限模式(Scheme)、授权对象(…...
[创业之路-361]:企业战略管理案例分析-2-战略制定-使命、愿景、价值观的失败案例
一、失败案例 1、使命方面的失败案例 真功夫创业者内乱:真功夫在创业过程中,由于股权结构不合理,共同创始人及公司大股东潘宇海与实际控制人、董事长蔡达标产生管理权矛盾。双方在公司发展方向、管理改革等方面无法达成一致,导致…...
dijkstra算法加训上 之 分层图最短路
来几个分层图的题练习下哈 P4568 [JLOI2011] 飞行路线 P4568 [JLOI2011] 飞行路线 - 洛谷https://www.luogu.com.cn/problem/P4568 题目描述 Alice 和 Bob 现在要乘飞机旅行,他们选择了一家相对便宜的航空公司。该航空公司一共在 n 个城市设有业务,设这…...
赋予AI更强的“思考”能力
刚刚!北大校友、OpenAI前安全副总裁Lilian Weng最新博客来了:Why We Think 原文链接:Why We Think by Lilian Weng 这篇文章关注:如何让AI不仅仅是“知道”答案,更能“理解”问题并推导出答案。通过赋予AI更强的“思…...
微服务项目->在线oj系统(Java版 - 1)
相信自己,终会成功 目录 C/S架构与B/S架构 C/S架构(Client/Server,客户端/服务器架构) 特点: 优点: 缺点: 典型应用: B/S架构(Browser/Server,浏览器/服务器架构&a…...
【深度学习】使用块的网络(VGG)
虽然 AlexNet 证明深层神经网络卓有成效,但它没有提供一个通用的模板来指导后续的研究人员设计新的网络。 也就是说尽管我知道了更深更大的网络更有效,但是不清楚怎么让它更深更大,从而起到一个更好的效果。 于是,研究人员开始从单…...
Python数据可视化 - Pyecharts绘图示例
文章目录 一、Pyecharts简介及安装1. Pyecharts简介2. 安装Pyecharts 二、准备数据三、饼图示例1. 初始化选项配置2. 饼图相关设置3. 全局配置项3.1 标题配置项3.2 图例配置项3.3 提示框配置项3.4 工具箱配置项3.5 视觉映射配置项 4. 系列配置项4.1 标签选项配置4.2 图元样式配…...
Day29
复习日 知识点回顾 类的装饰器装饰器思想的进一步理解:外部修改、动态类方法的定义:内部定义和外部定义 作业:复习类和函数的知识点,写下自己过去29天的学习心得,如对函数和类的理解,对python这门工具的理…...
Python列表全面解析:从入门到精通
文章目录 Python列表全面解析:从入门到精通一、列表基础1. 什么是列表?2. 列表特性总结表 二、列表的基本操作(基础)1. 访问元素2. 修改列表 三、列表的常用方法(基础)1. 添加元素的方法2. 删除元素的方法3. 查找和统计方法4. 排序和反转 四、列表的高级…...
Nacos数据写入流程
在 3 节点的 Nacos 集群中,数据写入流程和主节点(Leader)的角色基于 Nacos 的分布式一致性协议(通常使用 Raft 协议)来实现。以下以 Markdown 格式详细说明 3 节点 Nacos 集群的数据写入流程以及主节点的角色和确定方式…...
《P4551 最长异或路径》
题目描述 给定一棵 n 个点的带权树,结点下标从 1 开始到 n。寻找树中找两个结点,求最长的异或路径。 异或路径指的是指两个结点之间唯一路径上的所有边权的异或。 输入格式 第一行一个整数 n,表示点数。 接下来 n−1 行,给出…...
Ansible模块——文件属性查看,文件或目录创建和属性修改
ansible.builtin.stat 可以查看文件信息。 选项 类型 默认值 描述 pathstrnull 要检查的文件或目录的完整路径(必需)。 followboolfalse 如果是符号链接,是否跟随到目标路径上获取其状态。 get_attributesbooltrue 是否返回扩展属性&#…...
【图像生成大模型】Wan2.1:下一代开源大规模视频生成模型
Wan2.1:下一代开源大规模视频生成模型 引言Wan2.1 项目概述核心技术1. 3D 变分自编码器(Wan-VAE)2. 视频扩散 Transformer(Video Diffusion DiT)3. 数据处理与清洗 项目运行方式与执行步骤1. 环境准备2. 安装依赖3. 模…...
AGI大模型(25):LangChain提示词模版
我们也可以创建prompt template, 并引入一些变量到prompt template中,这样在应用的时候更加灵活。 1 代码实现 # 我们也可以创建prompt template, 并引入一些变量到prompt template中,这样在应用的时候更加灵活 from langchain_core.prompts import ChatPromptTemplate from…...
mybatis中的resultMap的association及collectio的使用
目录 1.reusltmap的说明 2.association的使用 3.collection的使用 4.总结 1.reusltmap的说明 resultmap定义了数据库的结果映射到java对象的规则,resultmap包含4个属性: id: ResultMap 的唯一标识 type: 映射到的 Java 类型(全限定类名或…...
静态网站部署:如何通过GitHub免费部署一个静态网站
GitHub提供的免费静态网站托管服务可以无需担心昂贵的服务器费用和复杂的设置步骤,本篇文章中将一步步解如何通过GitHub免费部署一个静态网站,帮助大家将创意和作品快速展现给世界。 目录 了解基础情况 创建基础站点 在线调试站点 前端项目部署 部署…...
Android 手写签名功能详解:从原理到实践
Android 手写签名功能详解 1. 引言2. 手写签名核心实现:SignatureView 类3. 交互层实现:MainActivity 类4. 布局与配置5. 性能优化与扩展方向 1. 引言 在电子政务、金融服务等移动应用场景中,手写签名功能已成为提升用户体验与业务合规性的关…...
【iOS(swift)笔记-9】WKWebView无法访问网络
对于iOS 在info中添加App Transport Security Settings,然后在App Transport Security Settings里添加Allow Arbitrary Loadstrue 对于macOS 除了上面的操作,还需在项目信息的App Sandbox里有个Network打钩选项...
Adapter适配器模式
Adapter适配器模式是一种结构设计模式,用于解决接口不兼容的问题,通过适配器类,可以将一个类的接口转换为客户渴望的另一个接口,从而使原来无法协作的对象能够一起工作。 角色和职责: 目标接口(Target&…...
七、xlib窗口渲染
文章目录 1.渲染图片2.双缓冲3.混合图片4.渐变窗口 1.渲染图片 在上篇文章中的最后,我们使用libpng加载了一个png图片,并显示到窗口上,但是我们可以看到显示到窗口的图片周边有黑色的背景。原因是在我测试的操作系统下使用xlib创建的窗口默认…...
python中http.cookiejar和http.cookie的区别
在Python中,http.cookiejar和http.cookie(通常指http.cookies模块)是两个不同的模块,它们的主要区别如下: 1. 功能定位 http.cookiejar 用于管理HTTP客户端的Cookie,提供自动化的Cookie存储、发送和接收功…...
架构设计模式:构建健壮、可扩展的 Serverless 应用
架构设计模式:构建健壮、可扩展的 Serverless 应用 到目前为止,我们已经掌握了 Serverless 的基本概念,了解了 FaaS 和 BaaS 如何协同工作,学会了使用框架进行开发部署,并知道了如何监控和排查问题。现在,是时候从“能用”向“好用”迈进了。 仅仅将代码部署到 Lambda 函…...
2- PyTorch
文章目录 1. Overview2. 线性模型 1. Overview 在人的智能中,最经常做的事情是推理和预测,在机器学习中也是如此。我们在以往的算法课中,所接触的穷举、贪心、分治和动规等算法都是由人设计的,而在机器学习中,算法是由…...
MinIO:从入门到精通,解锁云原生存储的奥秘
一、引言:为什么 MinIO 正在重塑存储世界? 在云计算和大数据时代,传统存储系统面临扩展性差、成本高、兼容性不足等挑战。MinIO 凭借其 S3 兼容性、分布式架构、高性能存储 等特性,成为企业构建现代化存储基础设施的首选。 本文…...
【LeetCode 热题100】739:每日温度(详细解析)(Go语言版)
🌡️ LeetCode 739:每日温度(详解 单调栈 多种思路对比) 📌 题目描述 给定一个整数数组 temperatures,表示每天的温度,返回一个数组 answer,其中 answer[i] 是指在第 i 天之后&am…...
Linux学习笔记|GCC编译指令基础|静动态库|makefile
一、GCC 编译指令基础 基本编译命令 gcc -o code code.c和gcc code.c -o code:这两条命令功能相同,都是使用 GCC 编译器将code.c源文件编译成名为code的可执行文件。-o选项用于指定输出文件名,选项位置在源文件前后不影响最终结果。 编译过程…...
【LeetCode 热题100】17:电话号码的字母组合(详细解析)(Go语言版)
☎️ LeetCode 17. 电话号码的字母组合(回溯 DFS 详解) 📌 题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。 数字到字母的映射如下(与电话按键相同)…...
C++学习:六个月从基础到就业——C++17:std::optional/variant/any
C学习:六个月从基础到就业——C17:std::optional/variant/any 本文是我C学习之旅系列的第四十七篇技术文章,也是第三阶段"现代C特性"的第九篇,主要介绍C17引入的三个重要工具类型:std::optional、std::varia…...
Go语言中函数 vs 方法
函数(Function):不属于任何类型,是全局可调用的。 方法(Method):绑定在某个类型上的函数,调用时依赖于这个类型的值或指针。 一、函数(Function) func 函数…...
代码随想录算法训练营第六十五天| 图论10—卡码网94. 城市间货物运输 I,95. 城市间货物运输 II
被学校课程轰炸了一周,回过头发现训练营已经要结束了,抓紧时间补完。不过算法这边也很难,感觉每天都是勉强理解在干什么的状态。 94. 城市间货物运输 I 94. 城市间货物运输 I SPFA算法,也是Bellman_ford 队列优化算法 优化原理…...
TDengine 在新能源领域的价值
能源数据的定义 能源数据是指记录和描述能源产业各个方面的信息,包括能源生产、供应、消费、储备、价格、排放以及相关政策和技术的数据。这些数据可以通过各种途径收集和整理,如能源企业的统计报表、政府部门的调查和监测、国际组织的发布数据等。 能…...
浅谈Frida 检测与绕过
目录 ptrace 占位与进程名检测端口检测与 D-Bus 协议通信扫描 /proc 目录(maps、task、fd)定位 so 中的 SVC syscall内存动态释放代码 1. ptrace 占位与进程名检测 检测方式 遍历运行进程列表,检查是否存在 frida-server 或相关进程名&…...
WaterStamp —— 一个实用的网页水印生成器开发记
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 最近,我和 CodeBuddy 一起完成了一个名为 WaterStamp 的网页水印生成器项目。这个小工具主要用于给…...
【MySQL】存储过程,存储函数,触发器
目录 准备工作 一. 存储过程 1.1.什么是存储过程 1.2.创建存储过程 1.3.创建只显示大于等于指定值的记录的存储过程 1.4.显示,删除存储过程 二. 存储函数 2.1.什么是存储函数 2.2.使用存储函数 2.2.1.使用存储函数之前 2.2.2.使用存储函数计算标准体重 …...
python打卡第29天
知识点回顾 类的装饰器装饰器思想的进一步理解:外部修改、动态类方法的定义:内部定义和外部定义 作业:复习类和函数的知识点,写下自己过去29天的学习心得,如对函数和类的理解,对python这门工具的理解等&…...
vim - v
在 Vim 中,使用 可视模式(Visual Mode) 可以选中文本并进行复制、剪切、粘贴等操作。以下是详细的使用方法: 1. 进入可视模式 命令功能v字符可视模式(按字符选择)V(大写)行可视模式…...
Linux 线程(上)
前言:大家早上中午晚上好!!今天来学习一下linux系统下所谓的线程吧!!! 一、重新理解进程,什么是进程? 1.1 图解 其中黑色虚线部分一整块就是进程,注意:一整…...
# 终端执行 java -jar example.jar 时(example.jar为项目jar包)报错:“没有主清单属性” 的解决方法
终端执行 java -jar example.jar 时(example.jar为项目jar包)报错:“没有主清单属性” 的解决方法 在Java中,一个JAR文件必须包含一个主清单属性(Main-Class属性)才能在命令行中直接运行。如果你在尝试运行…...
4:OpenCV—保存图像
将图像和视频保存到文件 在许多现实世界的计算机视觉应用中,需要保留图像和视频以供将来参考。最常见的持久化方法是将图像或视频保存到文件中。因此,本教程准备解释如何使用 OpenCV C将图像和视频保存到文件中。 将图像保存到文件 可以学习如何保存从…...
[C++面试] const相关面试题
1、非 const 的引用必须指向一个已存在的变量 int main() {int &a 20; // 错误const int &b 30; } 字面量 20 是临时值(右值),没有明确的内存地址。非常量引用(左值引用)不能直接绑定到右值(如…...
#Redis黑马点评#(六)Redis当中的消息队列
目录 Redis当中的消息队列 一 基于List 二 基于PubSub 三 基于Stream 单消费模式 消费者组 Redis当中的消息队列 消息队列,字面意思就是存放消息的队列。最简单的消息队列模型包括3个角色: 消息队列:存储和管理消息,也称为…...
Git基础原理和使用
Git 初识 一、版本管理痛点 在日常工作和学习中,我们经常遇到以下问题: - 通过不断复制文件来保存历史版本(如报告-v1、报告-最终版等) - 版本数量增多后无法清晰记住每个版本的修改内容 - 项目代码管理存在同样问题 二、版本控…...
Java程序员学AI(一)
一、前言 最近刷技术圈,满眼都是 GPT、DeepSeek、QWen 这些 AI 名词。看着同行们在群里聊 AI 写代码、做数据分析,我这个摸了 Java 老程序员突然慌了 —— 再不出手,怕是真要被时代落下了! 作为一个 Java 死忠粉,学 …...
《Python星球日记》 第91天:端到端 LLM 应用(综合项目:医疗文档助手)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、项目概述与需求分析1. 项目背景2. 项目目标3. 技术栈概览二、数据准备与处理1. 文档收集策略2. 文本预处理流程3. 向量化与知识库构建三、模…...
目前主流的AI测试工具推荐
以下是目前备受关注的AI测试工具及平台,涵盖功能测试、视觉测试、性能测试及国产化解决方案等多个领域,结合其核心特性与适用场景进行综合推荐: 一、主流AI测试工具推荐 Testim 核心功能:基于AI的动态元素定位技术,…...
vscode优化使用体验篇(快捷键)
本文章持续更新中 最新更新时间为2025-5-18 1、方法查看方法 1.1当前标签跳到新标签页查看方法实现 按住ctrl 鼠标左键点击方法。 1.2使用分屏查看方法实现(左右分屏) 按住ctrl alt 鼠标左键点击方法。...
uniprot中PTM数据的下载
首先是PTM的介绍: 参考:https://en.wikipedia.org/wiki/Post-translational_modification 蛋白质的翻译后修饰(PTM)通过改变氨基酸残基的化学结构,显著影响其带电性质,从而调控蛋白质的功能、定位和相互作…...