【Linux系统】systemV共享内存
system V共享内存
在Linux系统中,共享内存是一种高效的进程间通信(IPC)机制,它允许两个或者多个进程共享同一块物理内存区域,这些进程可以将这块区域映射到自己的虚拟地址空间中。
共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说进程不再通过执行进入内核的系统调用来传递彼此的数据。
1.共享内存示意图
2.共享内存数据结构
struct shmid_ds {struct ipc_perm shm_perm; /* operation perms */int shm_segsz; /* size of segment (bytes) */__kernel_time_t shm_atime; /* last attach time */__kernel_time_t shm_dtime; /* last detach time */__kernel_time_t shm_ctime; /* last change time */__kernel_ipc_pid_t shm_cpid; /* pid of creator */__kernel_ipc_pid_t shm_lpid; /* pid of last operator */unsigned short shm_nattch; /* no. of current attaches */unsigned short shm_nattch; /* no. of current attaches */unsigned short shm_unused; /* compatibility */void shm_unused2; /* ditto - used by DIPC */void shm_unused3; /* unused */
};
3.共享内存函数
shmget函数
- 功能: 用来创建共享内存,在共享内存中起着关键的初始作用,负责在系统中分配一块共享内存区域或者获取已有的共享内存的表示符
- 原型
#include <sys/ipc.h>
#include <sys/shm.h>int shmget(key_t key, size_t size, int shmflg);
- 参数
- key: 共享内存段名字(要用户传入),
key
是一个键值,用于唯一标识一块共享内存段。(这个键值可以用ftok
函数生成),若key值为IPC_PRIVATE
,则创建一个新的私有共享内存段,这个段只能通过子进程继承的方式被其他进程访问,通常用于父子进程之间的通信 - size: 共享内存大小
- shmflg: 由九个权限标志构成,还包括权限位(用法和创建文件时使用的mode模式标志是一样的)
- 取值为
IPC_CREAT
: 共享内存不存在,创建并返回;共享内存已存在,获取并返回。 - 取值为
IPC_CREAT | IPC_EXCL
: 共享内存不存在,创建并返回;共享内存已存在,出错返回一个非负整数,即该共享内存段的标识码;失败返回-1(只要成功,所创建的共享内存一定是新的)
- 取值为
- key: 共享内存段名字(要用户传入),
- 返回值: 成功返回一个非负整数,即该共享内存段的标识码;失败返回-1
ftok函数
ftok
函数是在Linux系统里用于生成System V IPC(Inter-Process Communication,进程间通信)键值的函数。这个函数能够把一个路径名与一个项目ID转换为一个系统V IPC键值,该键值可用于标识共享内存段、消息队列和信号量集等。
- 函数原型
#include <sys/types.h>
#include <sys/ipc.h>key_t ftok(const char *pathname, int proj_id);
- 参数说明
pathname
:一个存在且可访问的文件或目录的路径名。该文件或目录必须真实存在,因为ftok
会使用它的索引节点号(inode number)。proj_id
:一个项目ID,它是一个1 - 255之间的非零整数。这个ID会和pathname
的索引节点号结合起来生成IPC键值。
- 返回值
- 若成功,返回一个有效的IPC键值。
- 若失败,返回 -1,并设置
errno
以指示错误类型。
- 示例代码
以下是一个使用ftok
函数的简单示例:
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>int main() {const char *pathname = "/tmp";int proj_id = 'A';key_t key = ftok(pathname, proj_id);if (key == -1) {perror("ftok");return 1;}printf("Generated key: %d\n", (int)key);return 0;
}
在这个示例中,使用 /tmp
作为 pathname
,'A'
作为 proj_id
来生成一个IPC键值。若生成成功,就会把该键值打印出来;若失败,则会输出错误信息。
- 注意事项
- 要保证
pathname
对应的文件或目录在使用期间不会被删除或替换,不然生成的键值可能会改变。 - 不同的
pathname
和proj_id
组合应该能生成不同的键值,但也不能完全排除生成相同键值的可能性。 proj_id
的取值范围是1 - 255,若超出这个范围,可能会导致未定义行为。
shmat函数
- 功能: 将共享内存段连接到进程地址空间
- 原型
void *shmat(int shmid, const void *shmaddr, int shmflg);
- 参数
shmid
: 共享内存标识shmaddr
: 指定共享内存连接到进程空间的起始地址,通常设置为NULL,让系统自动选择一个合适地址自行链接shmflg
: 用于控制共享内存与进程地址空间之间的联系方式和访问权限等SHM_RDONLY
:表示一只读方式连接共享内存段,若不指定该标志,则默认是读写方式连接SHM_REMAP
:若设置该标志,当shmaddr
部位NULL
时,系统会将指定地址处已经存在的映射替换新的共享内存映射
- 返回值: 成功返回一个指针,指向共享内存所连接的进程地址空间的起始位置;失败返回-1
说明:
shmaddr
为NULL
,核心自动选择一个地址shmaddr
不为NULL
且shmflg无SHM_RND
标记,则以shmaddr为连接地址。shmaddr
不为NULL
且shmflg设置了SHM_RND
标记,则连接的地址会自动向下调整为SHMLBA(指定共享内存段在进程地址空间中的最低地址边界)的整数倍。公式: shmaddr - (shmaddr % SHMLBA)
shmflg
=SHM_RDONLY
,表示连接操作用来只读共享内存
shmdt函数
- 功能: 将共享内存段与当前进程脱离,但不删除共享内存段
- 原型
int shmdt(const void *shmaddr);
- 参数
- shmaddr: 由
shmat
所返回的指针
- shmaddr: 由
- 返回值: 成功返回0;失败返回-1
- 注意: 将共享内存段与当前进程脱离不等于删除共享内存段
shmctl函数
- 功能: 用于控制共享内存
- 原型
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
- 参数
- shmid: 由shmget返回的共享内存标识码
- cmd: 将要采取的动作 (有三个可取值)
- buf: 指向一个保存着共享内存的模式状态和访问权限的数据结构
- 返回值: 成功返回0;失败返回-1
命令 | 说明 |
---|---|
IPC_STAT | 把shmid_ds 结构中的数据设置为共享内存的当前关联值 |
IPC_SET | 在进程有足够权限的前提下,把共享内存的当前关联值设置为shmid_ds数据结构中给出的值 |
IPC_RMID | 删除共享内存段 |
4.共享内存的生命周期
测试代码结构
示例1
server.c
#include <iostream>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>const char* PATH = ".";
const int PROJ_ID = 'a';
const int SHM_SIZE = 1024;int main() {// 生成唯一键值key_t key = ftok(PATH, PROJ_ID);if (key == -1) {perror("ftok");return 1;}// 获取共享内存int shmid = shmget(key, SHM_SIZE, 0666);if (shmid == -1) {perror("shmget");return 1;}// 将共享内存附加到进程地址空间char* shm_addr = static_cast<char*>(shmat(shmid, nullptr, 0));if (shm_addr == reinterpret_cast<char*>(-1)) {perror("shmat");return 1;}// 从共享内存读取数据std::cout << "Reader: Data read from shared memory: " << shm_addr << std::endl;// 将共享内存从进程地址空间分离if (shmdt(shm_addr) == -1) {perror("shmdt");return 1;}// 删除共享内存if (shmctl(shmid, IPC_RMID, nullptr) == -1) {perror("shmctl");return 1;}return 0;
}
client.c
#include <iostream>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <cstring>const char* PATH = ".";
const int PROJ_ID = 'a';
const int SHM_SIZE = 1024;int main() {// 生成唯一键值key_t key = ftok(PATH, PROJ_ID);if (key == -1) {perror("ftok");return 1;}// 创建共享内存int shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666);if (shmid == -1) {perror("shmget");return 1;}// 将共享内存附加到进程地址空间char* shm_addr = static_cast<char*>(shmat(shmid, nullptr, 0));if (shm_addr == reinterpret_cast<char*>(-1)) {perror("shmat");return 1;}// 向共享内存写入数据const char* message = "Hello, shared memory!";strcpy(shm_addr, message);std::cout << "Writer: Data written to shared memory." << std::endl;// 将共享内存从进程地址空间分离if (shmdt(shm_addr) == -1) {perror("shmdt");return 1;}return 0;
}
注意: 共享内存没有进行同步与互斥! 共享内存缺乏访问控制! 会带来并发问题。
实例2.借助管道实现访问控制版的共享内存
Comm.hpp
#pragma once
#include <fcntl.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <cassert>
#include <cstdio>
#include <ctime>
#include <cstring>
#include <iostream>using namespace std;#define Debug 0
#define Notice 1
#define Warning 2
#define Error 3
const std::string msg[] = {"Debug","Notice","Warning","Error"
};
std::ostream &Log(std::string message, int level) {std::cout << " | " << (unsigned)time(nullptr) << " | " << msg[level] << " | " << message;return std::cout;
}
#define PATH_NAME "/home/hyb"
#define PROJ_ID 0x66
#define SHM_SIZE 4096 // 共享内存的大小,最好是页(PAGE: 4096)的整数倍
#define FIFO_NAME "./fifo"
class Init {
public:Init() {int n = mkfifo(FIFO_NAME, 0666);assert(n == 0);(void)n;Log("create fifo success", Notice) << "\n";}~Init() {unlink(FIFO_NAME);Log("remove fifo success", Notice) << "\n";}
};
#define READ O_RDONLY
#define WRITE O_WRONLY
int OpenFIFO(std::string pathname, int flags) {int fd = open(pathname.c_str(), flags);assert(fd >= 0);return fd;
}
void CloseFifo(int fd) {close(fd);
}
void Wait(int fd) {Log("等待中...", Notice) << "\n";uint32_t temp = 0;ssize_t s = read(fd, &temp, sizeof(uint32_t));assert(s == sizeof(uint32_t));(void)s;
}
void Signal(int fd) {uint32_t temp = 1;ssize_t s = write(fd, &temp, sizeof(uint32_t));assert(s == sizeof(uint32_t));(void)s;Log("唤醒中...", Notice) << "\n";
}
string TransToHex(key_t k) {char buffer[32];snprintf(buffer, sizeof buffer, "0x%x", k);return buffer;
}
ShmServer.cc
#include "Comm.hpp"
Init init;
int main() {// 1. 创建公共的Key值key_t k = ftok(PATH_NAME, PROJ_ID);assert(k != -1);Log("create key done", Debug) << " server key : " << TransToHex(k) << endl;// 2. 创建共享内存 -- 建议要创建一个全新的共享内存 -- 通信的发起者int shmid = shmget(k, SHM_SIZE, IPC_CREAT | IPC_EXCL | 0666);if (shmid == -1) {perror("shmget");exit(1);}Log("create shm done", Debug) << " shmid : " << shmid << endl;// 3. 将指定的共享内存,挂接到自己的地址空间char* shmaddr = (char*)shmat(shmid, nullptr, 0);Log("attach shm done", Debug) << " shmid : " << shmid << endl;// 4. 访问控制int fd = OpenFIFO(FIFO_NAME, O_RDONLY);while (true) {// 阻塞Wait(fd);// 临界区printf("%s\n", shmaddr);if (strcmp(shmaddr, "quit") == 0)break;}CloseFifo(fd);// 5. 将指定的共享内存,从自己的地址空间中去关联int n = shmdt(shmaddr);assert(n != -1);(void)n;Log("detach shm done", Debug) << " shmid : " << shmid << endl;// 6. 删除共享内存,IPC_RMID, 即便是有进程和当下的shm挂接,依旧删除共享内存n = shmctl(shmid, IPC_RMID, nullptr);assert(n != -1);(void)n;Log("delete shm done", Debug) << " shmid : " << shmid << endl;return 0;
}
ShmClient.cc
#include "Comm.hpp"
int main() {// 1. 创建公共的Key值key_t k = ftok(PATH_NAME, PROJ_ID);if (k < 0) {Log("create key failed", Error) << " client key : " << TransToHex(k) << endl;exit(1);}Log("create key done", Debug) << " client key : " << TransToHex(k) << endl;// 2. 获取共享内存int shmid = shmget(k, SHM_SIZE, 0);if (shmid < 0) {Log("create key failed", Error) << " client key : " << TransToHex(k) << endl;exit(2);}Log("create shm success", Error) << " client key : " << TransToHex(k) << endl;// 3. 挂接共享内存char* shmaddr = (char*)shmat(shmid, nullptr, 0);if (shmaddr == (char*)-1) {Log("attach shm failed", Error) << " client key : " << TransToHex(k) << endl;exit(3);}Log("attach shm success", Error) << " client key : " << TransToHex(k) << endl;// 4. 写int fd = OpenFIFO(FIFO_NAME, O_WRONLY);while (true) {ssize_t s = read(0, shmaddr, SHM_SIZE - 1);if (s > 0) {shmaddr[s - 1] = 0;Signal(fd);if (strcmp(shmaddr, "quit") == 0)break;}}CloseFifo(fd);// 5. 去关联int n = shmdt(shmaddr);assert(n != -1);Log("detach shm success", Error) << " client key : " << TransToHex(k) << endl;return 0;
}
5.共享内存系统级管理指令
1. ipcs
该指令用于显示系统中的进程间通信(IPC)资源信息,其中就包含共享内存段。
- 显示所有共享内存段
ipcs -m
- 显示指定用户的共享内存段
ipcs -m -u username
2. ipcrm
此指令用于删除系统中的IPC资源,能够删除指定的共享内存段。
- 通过ID删除共享内存段
ipcrm -m shmid
其中shmid
是共享内存段的ID,可以通过ipcs -m
命令获取。
相关文章:
【Linux系统】systemV共享内存
system V共享内存 在Linux系统中,共享内存是一种高效的进程间通信(IPC)机制,它允许两个或者多个进程共享同一块物理内存区域,这些进程可以将这块区域映射到自己的虚拟地址空间中。 共享内存区是最快的IPC形式。一旦这…...
【计算机网络】DHCP——动态配置ip地址
DHCP 是什么? DHCP(Dynamic Host Configuration Protocol,动态主机配置协议) 是一种网络协议,用于自动分配 IP 地址和其他网络配置参数(如子网掩码、默认网关、DNS 服务器等)给网络中的设备&…...
TDengine 订阅不到数据问题排查
简介 TDengine 在实际生产应用中,经常会遇到订阅程序订阅不到数据的问题,总结大部分都为使用不当或状态不正确等问题,需手工解决。 查看服务端状态 通过 sql 命令查看有问题的 topic 和consumer_group 组订阅是否正常。 select * from inf…...
低版的spring boot 1.X接入knife4j
低版的spring boot 1.X接入knife4j 老的项目是用spring boot 1.5.10.RELEASE 不好升级 ,原来接口文档一直用的是老的swagger样式,不是很好看,网上查了下,发现有个knife4j挺好看的,用一下他们的样式,下面是…...
outlook for mac本地邮件存放在哪儿?
尽管 PST 格式通常与 Microsoft Outlook 联系在一起,但认为它也在 Mac OS 上存储邮箱数据是一种误解。实际上,Outlook for Mac 不会将邮件存储为 PST 文件。无法在 Outlook for Mac 中找到 PST 文件位置,因为它不使用 PST 文件来存储邮箱数据…...
javascript<——>进阶
一、作用域:变量可以被访问的范围 1.局部作用域 1.1函数作用域 在函数内部声明的变量,在函数内部被访问的,外部无法直接访问。 总结:1、函数内部声明的变量,在函数外部无法直接访问 2、函数的参数也是函数内部的局…...
Java练习8
一.题目 二.源码 package TestRuMen;import java.util.Random; import java.util.Scanner;public class Test11 {public static void main(String[] args){// 调用 createNumber 方法生成一组随机的中奖号码int[] arrcreateNumber();// 调用 userInputNumber 方法获取用户输入…...
C语言按位操作符
在C语言中,按位操作符直接对整数的二进制位(bit)进行操作,常用于底层编程、硬件控制或性能优化场景。以下是按位操作符的详细说明和用法: 1. 按位操作符列表 操作符名称功能描述示例&按位与对应位均为1时结果为1&…...
Linux(权限管理)
权限概述 基本概念 定义:Linux权限是操作系统对用户和进程访问资源进行精细化管控,通过读(r4)、写(w2)、执行(x1)三种基础权限组合实现。 其中在运维的角度看它们所对应的操作权限…...
Redis入门到实战——基础篇
一、初识Redis 1. 认识NoSQL 2. 认识Redis Redis诞生于2009年,全称Remote Dictionary Server,远程词典服务器,是一个基于内存的键值型NoSQL数据库。 特征: 键值型(key-value),value支持多种…...
ctf.show 卷王杯 pwn签到
pwn签到 64位 ret2libc pwn签到 (1) motalymotaly-VMware-Virtual-Platform:~/桌面$ file pwn pwn: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]0953abcf1dd6…...
Dali 1.1.4 | 使用尖端技术将描述转换成独特艺术品、照片和图像,发挥无限创意
Dali是一款先进的AI图像生成器应用程序,能够根据用户的描述生成不同风格的独特图像。无论是迷人的数字艺术、创新的纹身设计还是独一无二的标志,甚至是超写实的照片,Dali都能轻松应对。这款解锁版为用户提供了更多的创作自由度和无限可能&…...
LeetCode 2906 统计最大元素出现至少K次的子数组(滑动窗口)
给出一个示例: 输入:nums [1,3,2,3,3], k 2 输出:6 解释:包含元素 3 至少 2 次的子数组为:[1,3,2,3]、[1,3,2,3,3]、[3,2,3]、[3,2,3,3]、[2,3,3] 和 [3,3] 。该题也是一个比较简单的滑动窗口的题目,但是…...
文献阅读(三)基于干旱强度和恢复时间的生态系统恢复力评估|《Agricultural and Forest Meteorology》
傅伯杰院士团队发表在《Agricultural and Forest Meteorology》上的一篇文章,定义了一个新的恢复力指标,通过指数拟合曲线表征干旱强度和相应恢复时间的关系,用曲线面积量化恢复力;耦合干旱强度和恢复时间来评估生态系统对干旱的恢…...
32、Server.Transfer和Response.Redirect的区别是什么?
Server.Transfer 和 Response.Redirect 是 ASP.NET 中用于页面跳转的两种方法,但它们在实现机制、性能、URL 显示等方面存在显著区别。以下是两者的核心差异: 1. 实现机制 Server.Transfer 服务器端跳转:直接在服务器内部将请求从当前页面…...
iOS—仿tableView自定义闹钟列表
自定义View实现闹钟列表,左滑删除,滑动列表时收起删除按钮。用代理的方法实现ListView的创建,删除以及开关回调,并实现动画效果。 ClockViewCell使用block通知ListView,ListView通过代理通知上层ClockView 1、文件组…...
Spark,集群搭建-Standalone
集群搭建-Standalone 一、解压 在之前的学习中我们有了一个软件包 spark.3.1.2-bin-hadoop3.2.tgz (eg我的在 /opt/software目录下)把这个软件包解压到 /opt/module 下(也可以自己决定解压到哪里)。对应的命令是: t…...
【C++11】新的类功能、lambda
📝前言: 这篇文章我们来讲讲C11——新的类功能、lambda、包装器 🎬个人简介:努力学习ing 📋个人专栏:C学习笔记 🎀CSDN主页 愚润求学 🌄其他专栏:C语言入门基础…...
stm32 g031g8 flash擦除函数被坑
先记录一下在擦除的时候由于调用了这个FLASH_PageErase(FLASH_BANK_1, secpos); 导致擦除不成功,写入失败。 下面的擦除有问题// 使用 FLASH_PageErase 擦除该页while ((FLASH->SR & FLASH_SR_BSY1) ! 0); // 等待空闲FLASH_PageErase(FLASH_BANK_1, secpo…...
SQL实战:04之SQL中的分组问题求解
文章目录 概述题目:分组问题求解题解第一步:求解差值步骤二:窗口分组累加完整SQL 总结 概述 最近刷题时遇到一些比较有意思的题目,乍一遇上时还不知道怎么求解,在灵光一闪时找到了问题的求解答案,感觉还比…...
基于DrissionPage的实习信息爬虫改造与解析
目录 编辑 一、DrissionPage技术优势分析 二、代码改造实现 2.1 环境配置 2.2 爬虫类定义 2.3 核心爬取逻辑 一级页面解析优化 二级页面解析优化 2.4 分页控制机制 三、关键技术解析 3.1 智能元素定位 3.2 请求管理优化 3.3 反爬对抗策略 四、改造前后对比测试…...
react-native打包报错:缺少build文件夹
在React Native项目中,如果你遇到了提示“没有build文件夹”的问题,这通常是因为项目的某些部分没有正确初始化或者配置。以下是一些解决步骤。如果缺少build文件,这会导致你使用gradlew assembleRealease失败,进而无法打包APK。下…...
【无需安装额外软件,JavaScript脚本】B站批量取消关注
步骤 注意: 提前选好需要批量取消关注的分组!!!脚本过程中会提示要求输入B站账号的手机号码作为验证,不是封号,只是验证!!! 打开B站关注页面 进入个人关注网页࿰…...
【Linux】第十五章 调度未来任务
1.如何调度延迟的用户任务? at 软件包包含 atd守护进程,和一组命令(at、atq等)。在默认的 RHEL 安装过程中,将自动安装并启用 atd守护进程。root 及普通用户可以使用 at 命令创建计划任务,atd守护进程提供…...
JVM GC垃圾回收算法
垃圾回收算法(GC Algorithms) JVM 根据对象生命周期特性(分代假设)采用不同的回收算法,核心算法包括: 标记-清除(Mark-Sweep) 此算法执行分两阶段。第一阶段从引用根节点开始标记…...
计算机毕业设计--基于深度学习(U-Net与多尺度ViT)的车牌模糊图像修复算法设计与实现(含Github代码+Web端在线体验界面)
基于深度学习的U-Net架构下多尺度Transformer车牌图像去模糊算法设计与实现 如果想对旧照片进行模糊去除,划痕修复、清晰化,请参考这篇CSDN作品👇 计算机毕业设计–基于深度学习的图像修复(清晰化划痕修复色彩增强)算…...
塑料材料工程师简历模板
模板信息 简历范文名称:塑料材料工程师简历模板,所属行业:其他 | 职位,模板编号:DEEBPX 专业的个人简历模板,逻辑清晰,排版简洁美观,让你的个人简历显得更专业,找到好工…...
Nginx核心功能与LNMP部署
目录 一、引言 二、Nginx 简介 2.1 Nginx 的起源与发展 2.2 Nginx 的特点 三、Nginx 核心功能详解 3.1 HTTP 服务器功能 3.1.1 静态资源处理 3.1.2 HTTP 协议支持 3.2 反向代理功能 3.2.1 反向代理的原理 3.2.2 Nginx 反向代理配置 3.3 负载均衡功能 3.3.1 负载均…...
爬虫学习笔记(五)---数据解析之re
数据提取 前面的爬虫笔记学习的都是如何爬取整个页面的内容,服务器渲染中,数据是直接放在源代码html里面的,大多数情况下整个页面的内容真正需要的只是一小部分,那把这一小部分提取出来的过程就叫做数据提取 数据解析方式 re解…...
ESP32- 开发笔记- 软件开发 4 - GPIO 口
1 背景介绍 GPIO(General Purpose Input/Output) ——通用输入输出口,就是能由软件自由控制输入(接收外界信号)或输出(发出电平信号)的引脚。 ESP32 最核心的功能之一,能被用来控制…...
大前端开发——前端知识渐变分层讲解 利用金字塔原理简化前端知识体系
Web开发基础 核心概念 HTML、CSS和JavaScript:Web开发的三大基石,分别负责结构、样式和行为。 代码管理:随着项目规模扩大,需要将代码拆分成小块,便于维护。 作用域污染:早期所有代码共享全局作用域&…...
面向网络安全的开源 大模型-Foundation-Sec-8B
1. Foundation-Sec-8B 整体介绍 Foundation-Sec-8B 是一个专注于网络安全领域的大型语言模型 (LLM),由思科的基础人工智能团队 (Foundation AI) 开发 。它基于 Llama 3.1-8B 架构构建,并通过在一个精心策划和整理的网络安全专业语料库上进行持续预训练而得到增强 。该模型旨在…...
长效住宅IP是什么?如何获取长效住宅IP?
在当今的互联网世界里,IP地址作为连接用户与网站之间的桥梁,其重要性不言而喻。对于跨境电商、社交媒体运营以及数据采集等领域的专业人士而言,普通的IP地址已无法满足日益复杂的需求。他们更需要一种稳定、安全且持久的长效住宅IP来完成各类…...
零基础实现把知识库接到聆思CSK6大模型开发板上
前言 大模型作为一个语言模型,实际上没有真正的记忆功能。所谓的对话记忆只是开发者将对话历史向GPT发送消息时将最近的对话历史通过提示工程组发送给ChatGPT。换句话说,如果对话历史超过了大模型的最大上下文,GPT会忘记之前的部分࿰…...
docker 部署前、后端分离项目详细步骤(从打包到部署)
在平常的开发工作中,一个项目经历需求、开发、测试、上线等步骤。在开发测试完成后,我们需要部署测试环境、生产环境等,那么我们用 docker 方式应该怎么部署呢?前后端分离的项目又该如何部署呢?那么,今天我…...
【深度学习的灵魂】图片布局生成模型LayoutPrompt(1)
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀《深度学习理论直觉三十讲》_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目…...
BG开发者日志429:故事模式的思路
1、故事模式已有的一关试验关中,直接揭示了一些重要真相,白给了。 /原设计思路是玩家可以直接玩故事模式,很快就能通关本模式的所有关卡,知道所有真相。 /原表现方式是步行模拟,到地点看对话。 (现在看来…...
Linux批量管理:Ansible自动化运维指南
引言 在服务器规模化的时代,Ansible就像一位"自动化指挥官"🎖️,让你轻松管理成百上千台Linux主机!本文将带你全面掌握Ansible的核心用法,从基础架构到高级Playbook,从主机管理到应用部署。无论…...
【AI提示词】第一性原理
提示说明 擅长运用第一性原理思维进行深度问题分析与创新解决方案构建的专家。 提示词 # Role: 第一性原理思考导师## Profile - language: 中文 - description: 擅长运用第一性原理思维进行深度问题分析与创新解决方案构建的专家 - background: 具备理论物理学与哲学复合背…...
【LeetCode】螺旋矩阵
题目 题目链接 请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素,示例如下: 思路 整体思路为模拟。具体地,可以采用“减而治之”的思想,将整个遍历过程拆分为一次次对每一行和每一列的遍历,每次只考虑一行/…...
给 BBRv2/3 火上浇油的 drain-to-target
最近彻底跟 BBR 杠上了,再读一篇落实性论文 Promises and Potential of BBRv3,结论依然是 BBRv3 并未如声称的那般优化公平性,反而可能更糟糕,不得不说又是任重而道远。 说一个我遇到的,讲理之外顺带吐槽。 BBRv1 在…...
后端id类型为long类型时,返回给前端浏览器四舍五入,导致id精度缺失问题
背景 今天在代码里,掉了别人写的接口,有个id的字段是long类型的,我这边加点参数返回给前端,然后前端根据id修改,结果修改的数据记录有,但是没起作用,后来发现根据他传给我的id在后台数据库查不…...
《云原生》核心内容梳理和分阶段学习计划
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息文章目录 云原生核心内容梳理和分阶段学习计划一、云原生核心技术栈(2025年重点方向)二、分阶段学习计划(6-12个月系统性进阶)**阶段1:基础入…...
跟我学C++中级篇——控制死锁
一、同步和死锁 在前面学习多线程和网络编程时,都对线程中数据的同步和数据结构多线程访问的安全问题进行了分析和说明。其实,多线程编程之所以难,难点之一就在这里,数据同步意味着效率和安全的平衡,而这里的安全有一…...
「Mac畅玩AIGC与多模态08」开发篇04 - 基于 OpenAPI Schema 开发专用 Agent 插件
一、概述 本篇介绍如何在 macOS 环境下,通过编写 OpenAPI Schema,开发自定义的专用插件,让智能体可以调用外部 API,扩展功能至任意在线服务。实践内容基于 Dify 平台,适配 macOS 开发环境。 二、环境准备 1. 确认本地开发环境 macOS 系统Dify 平台已完成部署并可访问本…...
“兴火·燎原”总冠军诞生,云宏信息《金融高算力轻量云平台》登顶
“兴火燎原”创新马拉松公开赛2024年度全国总决赛于4月18日在福州举办,云宏科技股份有限公司(以下简称:云宏)的《金融高算力轻量云平台》项目脱颖而出,夺得全国总冠军。 作为数字中国创新大赛金融领域的核心赛事&…...
MySQL 索引与事务详解
MySQL 索引与事务详解 一、索引(Index) 1. 索引的作用与原理 索引是数据库的"目录",能够大幅提高查询速度,但会增加写入开销。MySQL 使用 BTree 作为主要索引结构。 2. 索引类型 (1) 普通索引 CREATE INDEX idx_n…...
洛谷题解 | CF111C Petya and Spiders
目录 题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1 输入输出样例 #2输入 #2输出 #2 说明/提示题目简化题目思路AC 代码 题目描述 Little Petya loves training spiders. Petya has a board $ nm $ in size. Each cell of the board initially has a spider sitting…...
【深度对比】Google Play与IOS 马甲包处理差异分析
在移动应用发布与推广过程中,马甲包(Cloned App / Alternate Version) 曾被广泛用于流量测试、风险隔离、多品牌运营等场景中。随着 Google Play 与 Apple App Store 审核政策不断收紧,开发者们越来越关注两个平台对“马甲包”的态…...
【C++】C++11新特性(二)
目录 完美转发 引用折叠: lambda表达式 完美转发 引用折叠: 引用折叠是 C的类型系统规则,用于处理“引用的引用”(如 T& &)。 在推导过程中,必须折叠成有效的单一引用类型。直接声明引用的引用…...