学习记录——day26 进程间的通信 无名管道 无名管道 信号通信 特殊的信号处理
目录
一、进程间通信引入
二、无名管道
1、无名管道相关概念
2、无名管道的API接口函数 pipe(int pipefd[2]);
3、管道通信的特点
4、管道的读写特点
三、有名管道
1、有名管道:有名字的管道文件,其他进程可以调用
2、可以用于亲缘进程间的通信,也可以用于非亲缘进程间的通信
3、有名管道的API函数 mkfifo(const char *pathname, mode_t mode);
四、信号通信
1、信号通信相关概念
2、信号通信相关指令: kil - man 7 signal
3、将信号与信号处理方式连接函数
五、特殊的信号处理
1、SIGCHLD信号:以非阻塞的形式回收僵尸进程
2、SIGALRM:定时器信号
3、kill(pid_t pid, int sig) 信号的发送函数
使用有名管道实现两个进程间相互通信
使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上
一、进程间通信引入
1、对于多个线程间的通信,可以使用使用临界资源来完成,通过一个线程任务对临界资源进行修改,另一个线程也可以使用已经修改过的临界资源,但是要注意使用同步互斥机制完成对临界资源的保护
2、对于进程而言,用户空间是独立的,全局变量也是独立拥有的,更改一个进程的全局变量,其他进程的全局变量不受影响
3、可使用文件完成进程间的通信,但是要求写进程先完成向文件中写入数据,然后读进程才能读取数据,必须要加入进程的同步操作
4、对于进程而言,内核空间是共享的,可通过内核空间存取数据的方式,来完成两个进程之间信息的交流
5、进程间通信方式:
1)内核提供的原始通信方式
无名管道
有名管道
信号
2)system V提供三种方式
消息队列
共享内存
信号量集
二、无名管道
1、无名管道相关概念
1)无名管道:没有名字的管道文件,其他进程不能使用无名管道文件的文件描述符,但可以遗传,所以该方法仅适用于亲缘进程(父子进程)
2)原理:,通过内核,在内存中创建出一个管道文件,存放在内存空间,并不在文件系统中真实存在。当打开该文件时,会返回该文件的两个文件描述符,分别对应读端和写端。可以通过读端从管道中读取数据,从写端向管道中写入数据。当该文件的读写两端全部被关闭后,该管道文件会在内存中消失
3)注意:由于打开管道时返回的是文件描述符,所以,对该文件的操作,只能使用文件IO;
对于存入管道中的数据的读取是一次性的,当数据读取结束后,数据就不存在于管道文件中了
2、无名管道的API接口函数 pipe(int pipefd[2]);
#include <unistd.h>
int pipe(int pipefd[2]);
功能:在通过内核在内存中创建一个无名管道,并通过参数将该管道文件的两个文件描述符返回
参数:接收文件描述符的数组,pipefd[0]表示管道文件的读端,pipefd[1]表示管道的写端
返回值:成功返回0,失败返回-1并置位错误码
#include <myhead.h>int main(int argc, char const *argv[])
{// 成绩用于通讯的管道an文件,并返回文件对应的ean文件as描述符int pipefd[2];if (pipe(pipefd) == -1){perror("pipe error");return -1;}// 创建子进程pid_t pid = fork();if (pid < 0){perror("fork error");return -1;}else if (pid == 0){// 子进程char rbuf[128] = "";// 关闭写端close(pipefd[1]);while (1){bzero(rbuf, sizeof(rbuf));read(pipefd[0], rbuf, sizeof(rbuf));if (strcmp(rbuf, "quit") == 0){break;}printf("收到父进程的信息:%s\n", rbuf);}// 关闭读端close(pipefd[0]);// 退出exit(EXIT_SUCCESS);}// 父进程char sbuf[128] = "";// 关闭读端close(pipefd[0]);while (1){usleep(10);printf("父进程中输入:");fgets(sbuf, sizeof(sbuf), stdin); // 从终端获取数据sbuf[strlen(sbuf) - 1] = 0;// 发送数据给子进程:将数据通过写端写入管道 pipefd[1]write(pipefd[1], sbuf, strlen(sbuf));if (strcmp(sbuf, "quit") == 0){break;}}// 关闭写端close(pipefd[1]);// 回收子进程wait(NULL);return 0;
}
注:对于单个进程,读写端一般只保留其中之一
3、管道通信的特点
1)管道通信是半双工的通信方式
单工:任意时刻只能A向B发送消息,B不能向A发送消息
半双工:同一时刻,只能A向B发送消息或者B向A发消息
全双工:任意时刻,AB可以互相发送消息
2)无名管道只适用于亲缘进程间通信
3)无名管道也能完成自己跟自己的通信
4)无名管道文件的大小:64KB 2的16次方字节(65536)
4、管道的读写特点
1)当管道读端存在时,写管道有多少写多少,直到写满64K为止
2)当管道读端不存在时,写管道写入数据时,会出现管道破裂,此时内核空间会向用户空间发送一个SIGPIPE信号
3)当写端存在时,读管道有多少读多少,没有数据会在read处阻塞
4)当写端不存在时,读管道有多少读多少,没有数据也不会在read处阻塞
三、有名管道
1、有名管道:有名字的管道文件,其他进程可以调用
2、可以用于亲缘进程间的通信,也可以用于非亲缘进程间的通信
3、有名管道的API函数 mkfifo(const char *pathname, mode_t mode);
#include <sys/types.h>
#include <sys/stat.h>int mkfifo(const char *pathname, mode_t mode);
功能:在文件系统中创建一个有名管道,但是并没有打开该文件
参数1:有名管道的名称
参数2:管道文件的权限
返回值:成功返回0,失败返回-1并置位错误码
四、信号通信
1、信号通信相关概念
1)信号通信原理图:两个异步通信的进程之间,通过发送相关信号,完成任务间的通信
2) 信号是linux中软件模拟硬件的“中断”的一种方式
4)对于信号的处理方式有三种:默认、捕获、忽略
6)信号的发送者可以是内核、其他进程、用户自己
有两个信号既不能被捕获,也不能被忽略:SIGKILL、SIGSTOP(只要放入signal函数中就会报错:参数不合法)
2、信号通信相关指令: kil - man 7 signal
1)能够发送的信号可以通过指令:kil - 进行查看
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) 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
2)上面的信号触发条件以及默认处理方式可以通过指令 man 7 signal 进行查看
Signal Value Action Comment
──────────────────────────────────────────────────────── SIGHUP 1 Term Hangup detected on controlling terminal
or death of controlling process
SIGINT 2 Term Interrupt from keyboard
SIGQUIT 3 Core Quit from keyboard
SIGILL 4 Core Illegal Instruction
SIGABRT 6 Core Abort signal from abort(3)
SIGFPE 8 Core Floating-point exception
SIGKILL 9 Term Kill signal
SIGSEGV 11 Core Invalid memory reference
SIGPIPE 13 Term Broken pipe: write to pipe with no
readers; see pipe(7)
SIGALRM 14 Term Timer signal from alarm(2)
SIGTERM 15 Term Termination signal
SIGUSR1 30,10,16 Term User-defined signal 1
SIGUSR2 31,12,17 Term User-defined signal 2
SIGCHLD 20,17,18 Ign Child stopped or terminated
SIGCONT 19,18,25 Cont Continue if stopped
SIGSTOP 17,19,23 Stop Stop process
SIGTSTP 18,20,24 Stop Stop typed at terminal
SIGTTIN 21,21,26 Stop Terminal input for background process
SIGTTOU 22,22,27 Stop Terminal output for background process
3、将信号与信号处理方式连接函数
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
功能:将信号与信号处理函数绑定到一起
参数1:要绑定的信号
参数2:信号处理函数
SIG_IGN:表示忽略信号
SIG_DFL:表示默认处理
填自定义函数的入口地址
返回值:成功返回处理方式的起始地址,失败返回 SIG_ERR
五、特殊的信号处理
1、SIGCHLD信号:以非阻塞的形式回收僵尸进程
#include <myhead.h>
void handler(int signo)
{if (signo == SIGCHLD){while(waitpid(-1,NULL,WNOHANG));}}
int main(int argc, char const *argv[])
{if (signal(SIGCHLD,handler) == SIG_ERR){perror("signal error");return -1;}for (int i = 0; i < 10; i++){if (fork() == 0){exit(EXIT_SUCCESS);return -1;}}for(;;); //此处不使用while,是因为while对cpu的占用是100%,导致handler函数没有执行return 0;
}
2、SIGALRM:定时器信号
程序允许启动一个定时器,当所定的时间到位后,会发送一个SIGALRM信号,将该信号绑定到对应的信号处理函数中,给定时间,到时间自动处理自定义函数
该信号需要使用一个函数来发送超时信号:alarm闹钟函数
#include <unistd.h>
unsigned alarm(unsigned seconds);
功能:给进程设置一个定时器,以秒为单位,当定时器到位后,后向该进程发送一个SIGALRM的信号
参数:秒数,如果参数设置成0,表示删除定时器
返回值:>0:表示返回的上一个定时器剩余的秒数,并且重置上一个定时器
0:表示之前没有设置定时器
3、kill(pid_t pid, int sig) 信号的发送函数
#include <signal.h>
int kill(pid_t pid, int sig);
功能:向指定的进程发送指定的信号
参数1:要发送的进程号
>0:表示向指定的进程发送信号
=0:表示向某个进程组(当前进程所在的进程组)中发送信号
=-1:向所有进程发送信号
<-1:表示向其他进程组(组id为给定pid的绝对值)发送信号
参数2:要发送的信号号
返回值: 成功返回0,失败返回-1并置位错误码
#include <signal.h>int raise(int sig);
功能:向自己所在的进程发送指定的信号
参数:要发送的信号
返回值:成功返回0,失败返回非0数字
使用有名管道实现两个进程间相互通信
00.create.c
#include <myhead.h>
int main(int argc, char const *argv[])
{// 创建一个有名管道文件if (mkfifo("./linux", 0664) == -1){perror("mkfifo error");return -1;}// 创建一个有名管道文件if (mkfifo("./linux1", 0664) == -1){perror("mkfifo error");return -1;}getchar();system("rm linux");system("rm linux1");return 0;
}
01snd.c
#include <myhead.h>
int main(int argc, char const *argv[])
{//创建子程序pid_t pid = fork();if (pid < 0){perror("fork error");return -1;}else if (pid == 0){// 以读的形式打开管道文件int rfd = open("./linux1", O_RDONLY);if (rfd == -1){perror("ropen error");return -1;}printf("./linux1 read open\n");// 接收数据char rbuf[128] = "";while (1){// 清空容器bzero(rbuf, sizeof(rbuf));// 读取数据read(rfd, rbuf, sizeof(rbuf));if (strcmp(rbuf, "quit") == 0){break;}printf("接收到:%s\n", rbuf);sleep(1);}// 关闭文件描述符close(rfd);exit(EXIT_SUCCESS);}// 以写的形式打开管道文件int wfd = open("./linux", O_WRONLY);if (wfd == -1){perror("wopen error");return -1;}printf("./linux write open\n");// 发送数据char wbuf[128] = "";while (1){printf("输入:");fgets(wbuf, sizeof(wbuf), stdin);wbuf[strlen(wbuf)-1] = 0;// 发送数据write(wfd, wbuf, strlen(wbuf));if (strcmp(wbuf, "quit") == 0){break;}}// 关闭文件描述符close(wfd);wait(NULL);return 0;
}
03recv.c
#include <myhead.h>
int main(int argc, char const *argv[])
{// 创建子程序pid_t pid = fork();if (pid < 0){perror("fork error");return -1;}else if (pid == 0){// 以写的形式打开管道文件int wfd = open("./linux1", O_WRONLY);if (wfd == -1){perror("open error");return -1;}printf("./linux1 write open\n");// 发送数据char wbuf[128] = "";while (1){printf("输入:");fgets(wbuf, sizeof(wbuf), stdin);wbuf[strlen(wbuf) - 1] = 0;// 发送数据write(wfd, wbuf, strlen(wbuf));if (strcmp(wbuf, "quit") == 0){break;}}// 关闭文件描述符close(wfd);exit(EXIT_SUCCESS);}usleep(10);// 以读的形式打开管道e文件int rfd = open("./linux", O_RDONLY);if (rfd == -1){perror("open error");return -1;}printf("./linux read open\n");// 接收数据char rbuf[128] = "";while (1){// 清空容器bzero(rbuf, sizeof(rbuf));// 读取数据read(rfd, rbuf, sizeof(rbuf));if (strcmp(rbuf, "quit") == 0){break;}printf("接收到:%s\n", rbuf);sleep(1);}// 关闭文件描述符close(rfd);wait(NULL);return 0;
}
使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上
00.create.c
#include <myhead.h>
int main()
{// 创建一个有名管道文件if (mkfifo("./file", 0664) == -1){perror("mkfifo error");return -1;}getchar();system("rm linux");return 0;
}
01.send.c
#include<myhead.h>int main()
{int wfd=open("./file",O_WRONLY);if(wfd==-1){perror("open error");return -1;}char buf[128]="";while(1){printf("请输入>>>");//从终端读取数据fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]=0; //末位置空('\0')//写入通道write(wfd,buf,strlen(buf));if(strcmp(buf,"quit")==0){break;}}//关闭文件操作符close(wfd);return 0;
}
02rece.c
#include<myhead.h>int main()
{int wfd=open("./lz",O_RDONLY);if(wfd==-1){perror("open error");return -1;}int pt=-1;if((pt=open("./text.txt",O_WRONLY|O_CREAT|O_TRUNC,0664))==-1){perror("open error");return -1;}char buf[128]="";while(1){//清空bzero(buf, sizeof(buf));//从通道读取数据read(wfd, buf, sizeof(buf));//判断离开if(strcmp(buf,"quit")==0){break;}printf("收到%s\n",buf);//写入文件write(pt,buf,strlen(buf));}//关闭文件指针close(pt);//关闭通道读写close(wfd);return 0;
}
相关文章:

学习记录——day26 进程间的通信 无名管道 无名管道 信号通信 特殊的信号处理
目录 一、进程间通信引入 二、无名管道 1、无名管道相关概念 2、无名管道的API接口函数 pipe(int pipefd[2]); 3、管道通信的特点 4、管道的读写特点 三、有名管道 1、有名管道:有名字的管道文件,其他进程可以调用 2、可以用于亲缘进程间的通信&…...
WHAT - xmlhttprequest vs fetch vs wretch
目录 前言1. XMLHttpRequest (XHR)2. fetch3. wretch总结 fetch1. 简洁性和易用性2. 错误处理3. 默认行为和功能扩展4. 请求和响应的处理5. 跨域请求和 CORS6. 现代 Web 开发需求 fetch vs xhr 代码示例使用 XMLHttpRequest使用 fetch代码对比 前言 根据标题我们可以知道今天主…...

吴恩达老师机器学习作业-ex7(聚类)
导入库,读取数据,查看数据类型等进行分析,可视化数据 import matplotlib.pyplot as plt import numpy as np import scipy.io as sio#读取数据 path "./ex7data2.mat" data sio.loadmat(path) # print(type(data)) # print(data…...
lombok 驼峰命名缺陷,导致后台获取参数为null的解决办法
1.问题: 下面是我定义一个请求类的属性,采用Lombok注解,自动构建get和set方法。 Schema(description "父组织编码", requiredMode Schema.RequiredMode.REQUIRED) private String pOrgCode; 遇到这种命名,你会发现在…...

【dockerpython】亲测有效!适合新手!docker创建conda镜像+容器使用(挂载、端口映射、gpu使用)+云镜像仓库教程
文章目录 docker基本概念简介配置镜像加速源创建conda镜像1. 写 Dockerfile文件2. 创建镜像3. 创建容器并测试 容器的使用1. wsl挂载2. 端口映射3. 补充-gpu 云镜像仓库使用1. 登录2. 将本地镜像上传至云镜像仓库3. 从云镜像仓库下载镜像到本地 docker基本概念简介 简单来讲&a…...
矩阵,求矩阵秩、逆矩阵
求矩阵秩的方法: 高斯消元法:通过行变换将矩阵化为行阶梯形矩阵,然后数非零行的数量。LU分解:通过分解矩阵成上下三角矩阵,计算非零对角元素的数量。SVD分解:通过奇异值分解,计算非零奇异值的数…...
指针和const
const int* ptr,int* const ptr,const int* const ptr 这三种指针定义有什么区别?用法有什么不同? 指向的地址是否可变指向的地址上存储的内容是否可变const属性const int* ptr可改变不可改*ptr具有const属性int* const pts不可改…...

基于C#调用文心一言大模型制作桌面软件(可改装接口)
目录 开发前的准备账号注册应用创建应用接入 开始开发创建项目设计界面使用 AK,SK 生成鉴权签名窗体代码 百度智能云千帆大模型平台什么是百度智能云千帆大模型平台模型更新记录 开发前的准备 账号注册 访问百度智能云平台,通过百度账号登录或手机号验证…...

VScode插件安装
一、常用插件 Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code vscode 中文插件 Auto Rename Tag 闭合标签 Path Intellisense 一个非常实用的工具,它提供了文件路径的自动补全功能,可以极大地提高开发效率。路径自动补全、…...

《Milvus Cloud向量数据库指南》——高可用黄金标准:深入解析与业务策略考量
高可用黄金标准:深入解析与业务策略考量 在信息技术飞速发展的今天,高可用性(High Availability, HA)已成为衡量企业IT系统性能与稳定性的关键指标之一。它不仅仅关乎技术层面的优化与配置,更是企业保障业务连续性、提升客户体验、增强市场竞争力的重要基石。尽管高可用性…...

sqli-labs注入练习1,2关
sqli-labs第一关 判断是否存在sql注入 可见,根据输入数字的不同,结果也不同 判断sql语句是否是拼接,且是字符型还是数字型 由上可见,这关指定是字符型且存在sql注入漏洞 使用联合注入 第一步:首先知道表格有几列&…...

B站宋红康JAVA基础视频教程个人笔记chapter04
文章目录 1.IDEA安装好后的一些设置和学习1.1关于IDEA内部jdk版本的设置1.2 一些样式以及快捷键的常用设置(强烈推荐) 2.工程与模块管理3.如何彻底的卸载IDEA 1.IDEA安装好后的一些设置和学习 1.1关于IDEA内部jdk版本的设置 1.File—>Project Struc…...
关于java枚举为什么可以拿来当单例实现这件事看看ikun怎么说
为什么枚举可以保证单例 枚举可以保证单例的原因主要可以归结为以下几个方面: 1. 枚举的实例化过程 线程安全:枚举的实例化过程是由JVM控制的,在类加载时就完成了枚举常量的初始化。由于这个初始化过程是线程安全的(JVM在加载枚…...
Hugging Face下载模型
1、安装 huggingface-cli pip install -U huggingface_hub 2、设置环境变量(如果你打算使用 HF_ENDPOINT 环境变量来指定下载镜像站点): export HF_ENDPOINThttps://hf-mirror.com 3、使用 huggingface-cli 下载模型: 使用下面的命令来下…...

JVM-垃圾回收
什么是JVM的垃圾回收? 垃圾回收(Garbage Collection, GC)是Java虚拟机(JVM)自动管理内存的一种机制,其目的是自动回收不再使用的对象所占用的内存空间,以防止内存泄漏和提升内存利用效率。 运…...

8.C基础_指针基础
指针概述 1、定义与初始化 形式:<数据类型>* <变量名> <地址>; int a 10; int *p &a; 指针的类型不同,p时的偏移地址量不同,偏移地址 sizeof(类型)Byte 注意点: 指针的类型要与数据的类型保持一…...

安泰功率放大器使用注意事项有哪些内容和要求
功率放大器是一种广泛应用于音频系统、通信系统和实验室等领域的设备,其作用是将输入信号放大到足够大的功率输出。为了安全使用功率放大器并保证其性能和寿命,以下是一些使用功率放大器时需要注意的事项和要求。 一、选择适当的功率放大器: …...

windows下,使用vs code远程连接云服务器【以CentOS7为例】
windows下,使用vs code远程连接云服务器 1. 下载VS code并准备相关插件2. 使用Remote - SSH远程控制Linux 1. 下载VS code并准备相关插件 1. VS code官网: 下载地址:https://code.visualstudio.com/Download下载合适版本的vs code。 2. 推荐…...

x264 中像素扩边算法源码分析
介绍 在视频编码中,特别是在使用x264这样的H.264/MPEG-4 AVC编码器时,像素扩边(或称为边缘扩展)是一项重要的预处理步骤。像素扩边的目的是在帧的边缘添加额外的像素,这样在编码过程中可以应用滤波器,如去块滤波器(deblocking filter)和水平/垂直滤波器,而不会受到帧…...

数据结构——双链表详解(超详细)
前言: 小编在之前已经写过单链表的创建了,接下来要开始双链表的讲解了,双链表比单链表要复杂一些,不过确实要比单链表更好进行实现!下面紧跟小编的步伐,开启今天的双链表之旅! 目录 1.概念和结构…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...