Linux学习笔记之进程
进程
进程的定义
进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配的基本单位,也是操作系统结构的基础。
例如当QQ程序运行的时候,计算机会先从磁盘读取QQ程序到内存,然后OS管理这个程序,这就是进程。简单来说进程就是OS处理进程的数据结构加代码与数据。一般在Linux中这个数据结构就是task_struct结构体,本质就是单链表。如下代码就是一个进程结构体,里面有进程的状态,ID,分配的内存等。
struct task_struct {// 进程状态,例如:TASK_RUNNING, TASK_INTERRUPTIBLE 等volatile long state; // 进程的进程号(PID)pid_t pid; // 指向下个进程的 task_struct 指针struct task_struct *next; // 进程的进程组号pid_t tgid; // 进程的优先级int prio; // 进程的虚拟内存描述符struct mm_struct *mm; // 进程的内核栈指针void *stack; // 进程的可执行文件信息struct files_struct *files; // 进程的文件系统信息struct fs_struct *fs; // 进程的信号处理相关信息struct signal_struct *signal; // 进程的命名空间信息struct nsproxy *nsproxy; // 进程的调度信息struct sched_entity se; // 进程的运行时间统计u64 utime, stime; // 进程的启动时间unsigned long long start_time; // 进程的命令行参数char comm[TASK_COMM_LEN];
};
进程的目的与意义
一般在电脑,手机上,我们不止要运行一个程序,会同时运行qq,杀毒软件,浏览器等。如果我们不先描述进程的属性定义一个结构体,进程之间会产生干扰,那么OS就无法较好的管理内存。计算机就会是不是蓝屏,这对于用户来说十分的不友好。
进程采用单链表的原因
在使用QQ的时候,我们会打开他,不用的时候可以关闭它,或者让他保持后台运行,因此对于进程而言,就有大量的增删操作,如果我们采用数组的方式就会造成数据处理慢,也就是使用起来变卡了。
其次使用数组就必须提前分配一大段连续的地址空间,但可能OS不需要如此大的空间,就会造成资源浪费,其次在数组扩容的时候,计算机可能没有足够大的连续空间,就会造成内存不够。采用单链表的方式就更加的灵活,充分利用散落空间。
进程就是运行的程序,在Linux中被描述为task_struct结构体,用单链表进行管理。可以通过XShell来访问服务器.ps ajx命令来查看进程,如下图
1.进程相关的函数
1.1getpid()
man getpid
在Linux中可以用上述命令查询该函数。
在操作系统中有多个进程,为了区别他们,就引入了类似于身份证号的概念,每个进程都有自己唯一的pid(process Identification),当程序运行起来时就是一个进程,因此可以在程序中获取当前pid然后打印出来。
#include<stdio.h>2 #include<unistd.h>3 #include<sys/types.h>4 5 int main()6 {7 8 pid_t id=getpid();9 10 printf("我的ID是%d\n",id); 11 12 13 return 0;14 }
~
运行程序,便可以得到如下ID。
1.2getppid()
man getppid
在Linux中可以用上述命令查询该函数。如下图
在Linux中-bash就是命令行程序,我们输入的ls,mkdir命令在被bash解析后都会转化为一个进程,此时bash就是父进程,ls就是子进程,在子进程内调用getppid就可以得到父进程的pid。
当我们打开多个命令行时便会有多个bash,如下图。
我们可以通过如下例子证明任何进程(bash除外)是由父进程创造的,
ps ajx | head -1 && ps ajx | grep bash
上述命令可以分为两个命令,用&& 连接,ps ajx | head -1 ,表示显示ps ajx结果的第一行,也就是状态栏。
ps ajx | grep bash表示在进程信息中查询有关键词bash的,此时会有两个符合条件,第二个时命令行bash进程自然可以被检索到,而第一个仔细看其实是grep进程。grep是我们在命令行输入的指令,在经过bash解析后生成一个进程。此时grep的父进程ID就是32095,恰好就是bash的ID。
1.3 fork
既然进程是由父进程创造的,那我们平时写的test.c文件在编译运行后也是一个进程,就可以由这个进程在创造出子进程,Linux就提供了fork函数建立子进程。
在man介绍中返回值最重要,如下图
成功时,在父进程中会返回子进程的进程 ID(PID),而在子进程中会返回 0。失败时,在父进程中返回 -1,不会创建子进程,并且会适当地设置 errno。
于是我们便可以通过下属例子证明子进程是由父进程建立的。
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>int main()
{pid_t id=fork();if(id == -1){printf("子进程创建失败\n");}if(id == 0){//子进程while(1){printf("我是子进程,PID为%d,PPID为%d\n",getpid(),getppid());sleep(1);}}else {//父进程while(1){printf("我是父进程,PID为%d,子进程ID为%d\n",getpid(),id);sleep(1);}}return 0;
}
1.4结束进程
在Linux中可以使用ctrl+c结束进程,如下图。按下ctrl+c后进程就结束了
也可以使用kill -9 +ID结束进程。其中-9表示结束信号,
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
如下图使用kill -9在新开的命令行中结束父进程
2.进程属性
在Linux中为了方便管理进程,就设置了多种属性,有如下状态。
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};
Linux要管理进程就必须遵循一个原则先描述再组织,即将进程各种属性封装再结构体内部,在通过队列组织起来,这样对于进程的管理就转化为对于数据结构的管理。在Linux中通常以固定的时间片来刷新进程,即Linux为了保证每个进程公平,当一个进程运行固定的时间后就切换到下个进程,依次循环往复。对应于队列就是头删尾插。
2.1 R(运行状态)
运行状态实际上就是进程正在内存中的运行队列中,此时进程就在CPU中不断切换运行。
1 #include<stdio.h>2 3 int main()4 {5 while(1)6 { 9 }10 return 0;11 }
让上述进程进入到死循环中,就会一直运行,再查看进程就可以看到R(运行状态)。此时proc进程就一直在内存中的运行队列中。
2.2 S(休眠状态)
根据之前的冯诺依曼架构可以知道,CPU只与内存进行数据交换,由于磁盘等输出设备读取速度相对于内存过慢,CPU不会与输出设备例如显示器,磁盘,进行数据交换,而是要通过内存间接交换。
当进程要与外部设备输出时,这个消耗的时间对于CPU来说时巨大的,为了避免资源的浪费,进程在Linux中就是一个task_struct结构体,可以放在任何task_struct队列中,于是便将进程从内存的运行队列中取出换到设备的等待队列中等待数据交换完毕。。此时进程的属性就是休眠状态。如下例子
#include<stdio.h>2 3 int main()4 {5 while(1)6 {7 printf("我是一个进程\n");8 9 }10 return 0;11 }
在上述的代码中仅仅加入一条打印语句,进程就处于S休眠状态,说明此时进程被移动到显示器的等待队列中了。但这个程序是个死循环,一定会有再次加载到CPU中的时候,也就是R状态,但是由于CPU运行速度十分快,刚好查询到R状态概率十分小。
for i in $(seq 1 1000); do ps ajx | head -1 && ps ajx | grep ‘<proc>’ | grep -v grep; done
运行上述脚本,在尝试数分钟后终于也是找到了那一瞬间为R的状态。
2.3 D(深度休眠状态)
这个状态十分少见,仅在系统濒临崩溃的边缘才可以看见。假如现在进程A里存储了1000W人口信息资料,此时要保存到磁盘中,那么给他状态设置为S,此时OS(操作系统)在管理进程,内存严重的不足了,OS的使命是保护系统正常运行,他看见A进程是S状态,又占用大量的内存,就把A进程强制结束了(就像手机打开应用闪退一样)。此时如果磁盘正常存储结束也就没什么问题,但是D磁盘内存也可能不足,此时磁盘向进程A返回错误信息,发现A进程没了,直接人傻了。十分重要的数据就发生了丢失,这是决定不允许的。
于是便引入了D状态(磁盘休眠/深度休眠)。==系统可以崩溃,但是数据不可以丢失。==二者取其轻,选择相对可以接受的选择。
2.4 T(停止状态)
在Linux中可以使用kill向进程发送信号。如下图
其中19号信息就可以暂停进程。
kill -18 16394
可以再次启动进程
2.5 t(追踪停止状态)
在Linux中经常会使用gdb进行调试,虽然不怎么好用哈。当我们在程序中打断点,并且r运行到断点时,此时程序就是t状态。
gcc -g -o test test.c
gdb test
2.6 X(死亡状态)
死亡状态就是进程彻底结束,资源全部释放的时候,是一瞬间的状态,不能被检测到。
2.7 Z(僵尸状态)
僵尸状态就是进程没有完全释放的状态,但是进程不在运行了。进程可以理解为是内核数据结构(task_struct)+代码和数据,当子进程完成任务时,就会先释放代码加数据,但保留task_struct供父进程判断检测子进程是否完成任务。死亡状态也就是将最后的tast_struct也释放完毕的瞬间状态。
ls对于命令行解释器bash来说是其的子进程,当ls进程执行完时,返回的退出状态可以用==echo ¥?==显示出来,如下图。
ls执行错误时也会返回对应的错误码,然后bash根据错误码打印对应信息。
如果僵尸进程不被父进程管理回收那么他将永远是僵尸进程,如果父进程不管理僵尸进程的话,由此便有可能造成内存泄漏,也可以通过下面例子认识。
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>int main()
{pid_t id=fork();if(id == -1){printf("子进程创建失败\n");}if(id == 0){//子进程while(1){printf("我是子进程,PID为%d,PPID为%d\n",getpid(),getppid());sleep(1);}}else {//父进程while(1){printf("我是父进程,PID为%d,子进程ID为%d\n",getpid(),id);sleep(1);}}return 0;
}
运行上述程序并且使用kill结束子进程,但此时父进程没有做任何处理,那么子进程就是僵尸状态,如果父进程一直不处理那么就会造成内存泄漏。
刚才是父进程和子进程都存在的情况下,结束子进程那么子进程是僵尸进程。如果结束父进程的话那么子进程就会操作系统领养称之为孤儿进程。操作系统的pid为一。
3 进程优先级
3.1 进程优先级意义
CPU的资源具有稀缺性,进程优先级是进程获得CPU资源的一种先后顺序,即竞争力,就像我们下课时去食堂排队打饭一样,先到的他的优先级就越高就越先打到饭吃饭。
3.2 修改优先级
Linux优先级由两部分组成一部分是priority(默认优先级),一部分是nice(微调优先级),进程的真实优先级等于priority+nice。在Linux中修改进程的优先级只能修改nice不能修改默认优先级。
3.2.1 top修改优先级
按照以下步骤操作修改,top -> r ->pid -> nice值
需要注意的是普通用户禁止频繁修改优先级, 如果被系统弹出禁止,需要切换到超级用户或者用sudo执行top。
在这里需要注意的是nice的值的范围是从-20到19,输入超过这个范围的值会自动适配到这个范围内。并且这个priority优先级是最初的优先级加上修改后的nice,而不是上一次的priority加上nice值。
3.2.2 命令行修改优先级
renice <nice值> -p <进程ID>
也可以修改为负数。在原来八十的优先级上减十就得到了现在七十的优先级.
相关文章:
Linux学习笔记之进程
进程 进程的定义 进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配的基本单位,也是操作系统结构的基础。 例如当QQ程序运行的时候,计算机会先从磁盘读取QQ程序到内存,然后OS管理这个程序,…...
win11 终端乱码导致IDE 各种输出也乱码
因为 win11 终端乱码导致IDE 各种输出也乱码导致作者对此十分头大。所以研究了各种方法。 单独设置终端编码对 HKEY_CURRENT_USER\Console 注册表进行修改对 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processo 注册表进行修改使用命令[Console]::OutputEncoding [Syst…...
iOS主要知识点梳理回顾-5-运行时方法交换
方法交换可以放在 load 或 initialize 方法中,也可以自己根据时机来空,比如开启某个开关后才需要交换方法。如果是在load中调用,交换工作会在类加载时(程序启动)自动调用;如果是在initialize中调用…...
python后端调用Deep Seek API
python后端调用Deep Seek API 需要依次下载 ●Ollama ●Deepseek R1 LLM模型 ●嵌入模型nomic-embed-text / bge-m3 ●AnythingLLM 参考教程: Deepseek R1打造本地化RAG知识库:安装部署使用详细教程 手把手教你:deepseek R1基于 AnythingLLM API 调用本地…...
Unity开发播放视频
Unity开发播放视频 介绍VideoPlayer原理步骤VideoPlayer动态加载 总结 介绍 原生Unity播放视频VideoPlayer播放视频,这里我没有选择使用插件,还有一个播放视频的插件也可以AVPro Video,这里不过多介绍就说一下原生VideoPlayer的基础用法。 …...
【练习】图论
F. Friendly Group 图中选择一个点-1 边两端点都选择1 边一个端点选择-1 添加链接描述 #include<iostream> using namespace std; #include<vector> #include<cstring> const int N300010; int n,m; vector<int> G[N]; int temp1,temp2; bool vis[N…...
gis风场加载
https://gitee.com/openGPL json数据格式使用v1 “sakitam-gis/mapbox-wind”: “1.1.2” import { WindLayer } from "sakitam-gis/mapbox-wind"; windLayer new WindLayer("wind", res.data, {windOptions: {// colorScale: (m) > {// // consol…...
大疆无人机需要的kml文件如何制作kml导出(大疆KML文件)
大疆无人机需要的轨迹kml文件,是一种专门的格式,这个kml里面只有轨迹点,其它的属性信息都不需要。 BigemapPro提供了专门的大疆格式输出, 软件这里下载 www.bigemap.com 安装后,kml导入如下图: 然后选择…...
【CXX】2 CXX blobstore客户端说明
本示例演示了一个调用blobstore服务的C客户端的Rust应用程序。事实上,我们会看到两个方向的调用:Rust到C以及C到Rust。对于您自己的用例,您可能只需要其中一个方向。 示例中涉及的所有代码都显示在此页面上,但它也以可运行的形式提…...
图数据库neo4j进阶(一):csv文件导入节点及关系
CSV 一、load csv二、neo4j-admin import<一>、导入入口<二>、文件准备<三>、命令详解 一、load csv 在neo4j Browser中使用Cypher语句LOAD CSV,对于数据量比较大的情况,建议先运行create constraint语句来生成约束 create constraint for (s:Student) req…...
3.3 学习UVM中的uvm_driver 类分为几步?
文章目录 前言1. 定义2. 核心功能3. 适用场景4. 使用方法5. 完整代码示例5.1 事务类定义5.2 Driver 类定义5.3 Sequencer 类定义5.4 测试平台 6. 代码说明7. 总结 前言 以下是关于 UVM 中 uvm_driver 的详细解释、核心功能、适用场景、使用方法以及一个完整的代码示例ÿ…...
Docker 常用命令基础详解(一)
一、Docker 初相识 在当今数字化时代,软件开发和部署的效率与灵活性成为了关键因素。Docker,作为一款开源的应用容器引擎,犹如一颗璀璨的明星,照亮了软件开发与部署的道路,为开发者们带来了前所未有的便利。它就像是一…...
机器学习之AAE(Adversarial Autoencoder,对抗自编码器)生成数据样本
对抗自编码器(Adversarial Autoencoder,AAE)是一种结合了自编码器(Autoencoder)和生成对抗网络(GAN)的方法,用于生成新数据样本。它的目标是学习到数据的潜在分布,并通过生成对抗训练来优化潜在空间,使其接近一个已知的简单分布(例如,高斯分布)。 AAE的结构和训练…...
用大模型学大模型03-数学基础 概率论 最大似然估计(MLE)最大后验估计(MAP)
https://metaso.cn/s/r4kq4Ni 什么是最大似然估计(MLE)最大后验估计(MAP)?深度学习中如何应用,举例说明。 好的,我现在需要回答关于最大似然估计(MLE)和最大后验估计&…...
名词解释:npm,cnpm,yarn,vite,vue,electron
1. npm (Node Package Manager) 读音: “N-P-M” 或者直接读作 “npm”。 npm 是 Node.js 的官方包管理器,用于安装、发布和管理 JavaScript 软件包。它允许开发者轻松地共享代码,并且可以通过命令行工具来管理依赖关系。通过 npm init 命令可以交互式…...
ESXi安装【真机和虚拟机】(超详细)
项目简介: ESXi(Elastic Sky X Integrated)是VMware公司开发的一种裸机虚拟化管理程序,允许用户在单一物理服务器上运行多个虚拟机(VM)。它直接安装在服务器硬件上,而不是操作系统之上ÿ…...
每日一题——矩阵最长递增路径
矩阵最长递增路径问题 题目描述数据范围:进阶要求:示例示例 1示例 2 题解思路算法步骤:代码实现代码解释复杂度分析总结 题目描述 给定一个 n 行 m 列的矩阵 matrix,矩阵内所有数均为非负整数。你需要在矩阵中找到一条最长路径&a…...
设置ollama接口能外部访问
为了配置Ollama以允许外网访问,你可以按照以下步骤进行操作: 确认Ollama服务已正确安装并运行: 使用以下命令检查Ollama服务的状态: bash Copy Code systemctl status ollama如果服务未运行,使用以下命令启动它&…...
TOML介绍
0 Preface/Foreword TOML,一种配置文件格式。Toms Obvious Minimal Language. 1 介绍 TOML: Toms Obvious Minimal Language,“显而易见的最小化语言 ” JSON:不支持注释 YAML:过于复杂...
macOS部署DeepSeek-r1
好奇,跟着网友们的操作试了一下 网上方案很多,主要参考的是这篇 DeepSeek 接入 PyCharm,轻松助力编程_pycharm deepseek-CSDN博客 方案是:PyCharm CodeGPT插件 DeepSeek-r1:1.5b 假设已经安装好了PyCharm PyCharm: the Pyth…...
从云原生到 AI 原生,谈谈我经历的网关发展历程和趋势
作者:谢吉宝(唐三) 编者按: 云原生 API 网关系列教程即将推出,欢迎文末查看教程内容。本文整理自阿里云智能集团资深技术专家,云原生产品线中间件负责人谢吉宝(唐三) 在云栖大会的精…...
京东 旋转验证码 分析
声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向分析 使用的第三方接码平台识别…...
R18 XR L1 enhancement
这篇是R18 XR的最后一部分,主要是L1方面的增强。 这部分增强大概的背景如下。 一些 XR 应用(例如增强现实)不仅在 DL 方向需要高数据速率,在 UL 方向也需要高数据速率。如果应用需要在 UL 方向传输视频流量,则 UL 中支持的 XR 用户数量可能非常有限。因此,增加有限的时间…...
利用Java爬虫按图搜索1688商品(拍立淘):实战案例指南
在电商领域,按图搜索功能(如1688的“拍立淘”)为用户提供了更直观、便捷的购物体验。通过上传图片,用户可以快速找到与图片相似的商品。本文将详细介绍如何利用Java爬虫技术实现按图搜索1688商品,并获取其详情数据。 …...
算法-计算字符的最短距离
力扣题目:821. 字符的最短距离 - 力扣(LeetCode) 给你一个字符串 s 和一个字符 c ,且 c 是 s 中出现过的字符。 返回一个整数数组 answer ,其中 answer.length s.length 且 answer[i] 是 s 中从下标 i 到离它 最近 …...
sqlilabs--小实验
一、先盲注判断 ?id1 and sleep(2)-- 如果发现页面存在注点,使用时间盲注脚本进行注入 import requestsdef inject_database(url):name for i in range(1, 20): # 假设数据库名称长度不超过20low 48 # 0high 122 # zmiddle (low high) // 2while low &l…...
【JavaScript爬虫记录】记录一下使用JavaScript爬取m4s流视频过程(内含ffmpeg合并)
前言 前段时间发现了一个很喜欢的视频,可惜网站不让下载,简单看了一下视频是被切片成m4s格式的流文件,初步想法是将所有的流文件下载下来然后使用ffmpeg合并成一个完整的mp4,于是写了一段脚本来实现一下,电脑没有配python环境,所以使用JavaScript实现,合并功能需要安装ffmpeg,…...
腿足机器人之一- 机械与电子组件概览
腿足机器人之一机械与电子组件概览 引言机械组件骨架材料关节设计关节机械组件轴承(ings)连杆(Linkages)齿轮(Gears) 电气组件电机控制器传感器 四足机器人设计双足机器人设计波士顿Atlas机器人 引言 腿足…...
利用二分法+布尔盲注、时间盲注进行sql注入
一、布尔盲注: import requestsdef binary_search_character(url, query, index, low32, high127):while low < high:mid (low high 1) // 2payload f"1 AND ASCII(SUBSTRING(({query}),{index},1)) > {mid} -- "res {"id": payloa…...
本地部署DeepSeek Nodejs版
目录 1.下载 Ollama 2.下载DeepSeek模型 3.下载 ollama.js 1.下载 Ollama https://ollama.com/ 下载之后点击安装,等待安装成功后,打开cmd窗口,输入以下指令: ollama -v 如果显示了版本号,则代表已经下载成功了。…...
mapbox进阶,添加绘图扩展插件,绘制任意方向矩形
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️MapboxDraw 绘图控件二、🍀添加绘图扩…...
哈希槽算法与一致性哈希算法比较
Redis 集群模式使用的 哈希槽(Hash Slot) 算法与传统的 一致性哈希(Consistent Hashing) 算法在数据分布和节点管理上有显著的区别。以下是两者的详细比较: 1. Redis 哈希槽算法 1.1 基本原理 Redis 集群将整个数据集…...
DeepSeek+Excel 效率翻倍
2025年初,DeepSeek以惊人的效率突破技术壁垒,用极低的成本实现了与行业顶尖AI相媲美的性能,瞬间成为全球科技领域的热门话题。 那么AI工具的普及将如何改变我们的工作方式?Excel会被取代吗? 今天,珠珠带你…...
【个人开发】cuda12.6安装vllm安装实践【内含踩坑经验】
1. 背景 vLLM是一个快速且易于使用的LLM推理和服务库。企业级应用比较普遍,尝试安装相关环境,尝试使用。 2. 环境 模块版本python3.10CUDA12.6torch2.5.1xformers0.0.28.post3flash_attn2.7.4vllm0.6.4.post1 2.1 安装flash_attn 具体选择什么版本&…...
Prompt通用技巧
Prompt 的典型构成 角色:给 AI定义一个最匹配任务的角色,比如:「你是一位软件工程师」「你是一位小学老师」指示:对任务进行描述上下文: 给出与任务相关的其它背景信息(尤其在多轮交互中)。例子 : 必要时给出举例,学术中称为 one-shot learning,few-sho…...
【R语言】方差分析
一、基本术语 在R语言以及更广泛的统计学领域中,方差分析(ANOVA,即Analysis of Variance)是一种用于比较两个或更多组数据的均值是否存在显著差异的统计方法。可以使用aov()函数或其他相关函数(如anova())…...
XSS 常用标签及绕过姿势总结
XSS 常用标签及绕过姿势总结 一、xss 常见标签语句 0x01. 标签 <a href"javascript:alert(1)">test</a> <a href"x" onfocus"alert(xss);" autofocus"">xss</a> <a href"x" onclickeval(&quo…...
haproxy详解笔记
一、概述 HAProxy(High Availability Proxy)是一款开源的高性能 TCP/HTTP 负载均衡器和代理服务器,用于将大量并发连接分发到多个服务器上,从而提高系统的可用性和负载能力。它支持多种负载均衡算法,能够根据服务器的…...
「软件设计模式」工厂方法模式 vs 抽象工厂模式
前言 在软件工程领域,设计模式是解决常见问题的经典方案。本文将深入探讨两种创建型模式:工厂方法模式和抽象工厂模式,通过理论解析与实战代码示例,帮助开发者掌握这两种模式的精髓。 一、工厂方法模式(Factory Metho…...
Flutter_学习记录_数据更新的学习
Flutter 如果界面上有数据更新时,目前学习到的有3种: 第一种: 直接用 StatefulWidget组件,然后当数据更新时,调用setState的方法更新数据,页面上的数据会直接更新;第二种: 用 State…...
淘宝订单列表Fragment转场动画卡顿解决方案
如何应对产品形态与产品节奏相对确定情况下转变为『在业务需求与产品形态高度不确定性的情况下,如何实现业务交付时间与交付质量的确定性』。我们希望通过混合架构(Native 业务容器 Weex 2.0)作为未来交易终端架构的重要演进方向,…...
【状态空间方程】对于状态空间方程矩阵D≠0时的状态反馈与滑模控制
又到新的一年啦,2025新年快乐~。前几个月都没更新,主要还是因为不能把项目上的私密工作写进去,所以暂时没啥可写的。最近在山里实习,突然想起年前遗留了个问题一直没解决,没想到这两天在deepseek的加持下很快解决了&am…...
优雅的git log输出内容更加醒目
执行命令 git config --global alias.lg "log --graph --prettyformat:%C(red)%h%C(reset) - %C(yellow)%d%C(reset) %C(magenta)<%an>%C(reset) %C(cyan)(%ad)%C(reset) %C(green)%s%C(reset) (%cr) --abbrev-commit --dateformat:%Y-%m-%d %H:%M:%S"...
PySide(PyQT)使用场景(QGraphicsScene)进行动态标注的一个demo
用以标注图像的一个基本框架demo import sys from PySide6.QtWidgets import QApplication, QGraphicsView, QGraphicsScene, QMainWindow, QLabel, QGraphicsPixmapItem from PySide6.QtGui import QPixmap, QPainter, QTransform from PySide6.QtCore import Qt, QPointF, S…...
LeetCode每日精进:876.链表的中间结点
题目链接:876.链表的中间结点 题目描述: 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 1: 输入:head [1,2,3,4,5] 输出:[3,4,5…...
ollama实践笔记
目录 一、linux安装文件命令: 二、启动ollama 三、linux 如何把ollama serve做为服务方式启动 四、安装deepseek-r1 五、如何在网页中使用ollama? 5.1 安装Open WebUI【不推荐】 5.2 安装ollama-webui-lite 六、Ubuntu安装docker、只需要一句话…...
联想电脑如何进入BIOS?
打开设置 下滑找到更新与安全 点击恢复和立即重新启动 选择疑难解答 选择UEFI固件设置 然后如果有重启点击重启 重启开机时一直点击FNF10进入BIOS界面...
CentOS本机配置为时间源
CentOS本机配置为时间源 安装chrony,默认已安装修改配置文件 /etc/chrony.conf客户端配置 安装chrony,默认已安装 yum -y install chrony修改配置文件 /etc/chrony.conf # cat /etc/chrony.conf | grep -Ev "^$|#" server ceph00 iburst dri…...
使用 EDOT 监测由 OpenAI 提供支持的 Python、Node.js 和 Java 应用程序
作者:来自 Elastic Adrian Cole Elastic 很自豪地在我们的 Python、Node.js 和 Java EDOT SDK 中引入了 OpenAI 支持。它们为使用 OpenAI 兼容服务的应用程序添加日志、指标和跟踪,而无需任何代码更改。 介绍 去年,我们宣布了 OpenTelemetry…...
微信小程序网络请求封装
微信小程序的网络请求为什么要封装?封装使用有什么好处? 封装的目的是为了偷懒,试想一下每次都要wx.request,巴拉巴拉传一堆参数,是不是很麻烦,有些公共的参数例如header,baseUrl是不是可以封装…...