当前位置: 首页 > news >正文

linux——进程间通信及管道的应用场景

linux进程的控制-CSDN博客

liunx——进程间通信(管道通信)-CSDN博客


文章目录

文章目录

前言

二、管道的应用

1.创建子进程

1、描述:

2.创建进程及管理

3、子进程接受任务

4、控制子进程

总结


前言

 上篇博客我们学习了进程间通信,并且我们还写了一个简单的进程间的通信,实现了子进程写数据父进程读数据。


管道的特征:

1、具有血缘关系的进程进行进程间通信;

2、管道只能单向通信;

3、父子进程是会进程协同的,同步与互斥的——保护管道文件的数据安全

4、管道是面向字节流的;

5、管道是基于文件的,而文件的生命周期吃随进程的!

一、进程间通信的四种情况

a:读写端正常,管道如果为空,读端就堵塞;

模拟:

void Write(int rfd)
{char buff[1024];//string s="hello word!!";int count=0;while(true){   //snprintf(buff,sizeof(buff),"%s - %d - %d ",s.c_str(),getpid(),count);//write(rfd,buff,sizeof(buff));count++;sleep(1);if(count==5){break;}}}
void Read(int rfd)
{int count=0;char buff[1024]={0};while(true){int n = read(rfd,buff,sizeof(buff));count++;sleep(1);if(count==10){printf("father read file done!\n");break;}cout << "father get a message[" << getpid() << "]# " << buff << endl;}
}

读数据10秒,写数据为空,不想管道写入数据那么管道就是空的,此时读端阻塞,等写端关闭,父进程继续;

 

b:读写端正常,管道如果被写满了,写端就会堵塞;

void Write(int rfd)
{char buff[1024];char bu[1]={'c'};string s="hello word!!";int count=0;int size=0;int t=0;while(true){   cout<<size<<endl;//snprintf(buff,sizeof(buff),"%s - %d - %d ",s.c_str(),getpid(),count);//int n =write(rfd,buff,sizeof(buff));int n =write(rfd,bu,sizeof(bu));size+=n;//count++;//sleep(1);if(n==0){sleep(5);cout<<"写文件最大内容size "<<size<<endl;t=size;break;//写满了不退}}}
void Read(int rfd)
{int count=0;char buff[1024000]={0};while(true){//int n = read(rfd,buff,sizeof(buff));count++;sleep(1);if(count==5){int n = read(rfd,buff,sizeof(buff));cout << "father get a message[" << getpid() << "]# " << buff << endl;cout<<n<<endl;printf("father read file done!\n");break;}// cout << "father get a message[" << getpid() << "]# " << buff << endl;}
}

因为读端一直不读,写端写满了就阻塞在了write那里,所以在写端打印的计数只能到65536处就阻塞了,打印不出来65536,而读端一次可以把管道的全读完。

而65569是读端将管道读完以后,管道空了,写端又开始写了。

c:读端正常读,写端关闭,读端就会读到0,表面读到了文件结尾,不会被阻塞;

void Write(int rfd)
{char buff[1024];string s="hello word!!";int count=0;int size=0;int t=0;while(true){   snprintf(buff,sizeof(buff),"%s - %d - %d ",s.c_str(),getpid(),count);int n =write(rfd,buff,sizeof(buff));count++;sleep(1);if(count==5){break;//写满了不退}}}
void Read(int rfd)
{int count=0;char buff[1024];while(true){buff[0]=0;int n = read(rfd,buff,sizeof(buff));if(n>0)buff[n]='\0';count++;sleep(1);if(count==10){printf("father read file done!\n");break;}cout << "father get a message[" << getpid() << "]# " << buff << endl;}
}

d:写端正常写,读端关闭;操作系统就要就要杀掉正在写入的进程。

void Write(int rfd)
{char buff[1024];string s="hello word!!";int count=0;int size=0;int t=0;while(true){   snprintf(buff,sizeof(buff),"%s - %d - %d ",s.c_str(),getpid(),count);int n =write(rfd,buff,sizeof(buff));count++;sleep(1);if(n==0){break;//写满了不退}}}
void Read(int rfd)
{int count=0;char buff[1024];while(true){buff[0]=0;int n = read(rfd,buff,sizeof(buff));if(n>0)buff[n]='\0';count++;sleep(1);if(count==5){printf("father read file done!\n");break;}cout << "father get a message[" << getpid() << "]# " << buff << endl;}
}

二、管道的应用

实现一个向多个进程发送指令;

1.创建子进程

我们在前面的学习过程中,我们知道了操作系统在管理进程的时候是对我们的进程,还有文件等等都是先描述在组织;

那么我们就创建一批进程将他们管理起来。

1、描述:

class channel
{
public:channel(int cmdfd, int slaverid, const std::string &processname):_cmdfd(cmdfd), _slaverid(slaverid), _processname(processname){}
public:int _cmdfd;               // 发送任务的文件描述符pid_t _slaverid;          // 子进程的PIDstd::string _processname; // 子进程的名字 -- 方便我们打印日志// int _cmdcnt;
};

2.创建进程及管理

void InitProcessPool(std::vector<channel> *channels)
{for(int i=0;i<processnum;i++){int pipefd[2]={0};int n=pipe(pipefd);assert(!n); (void)n;    pid_t id=fork();if(id<0){perror("fork\0");return ;}if(id==0){//子进程读close(pipefd[1]);dup2(0,pipefd[0]);//将写文件重载到键盘位slaver();//子进程接受指令close(0);}//父进程将文件组织起来close(pipefd[0]);//给子进程命名string name="process-" + std::to_string(i);channels->push_back(channel(pipefd[1],id,name));sleep(1);}
}

这段初始化就是创建一批进程将这批进程管理起来,而这些进程也都是一些管道和父进程连接在一起的;

3、子进程接受任务

void slaver()
{// read(0)while(true){int cmdcode = 0;int n = read(0, &cmdcode, sizeof(int)); // 如果父进程不给子进程发送数据呢??阻塞等待!if(n == sizeof(int)){//执行cmdcode对应的任务列表std::cout <<"slaver say@ get a command: "<< getpid() << " : cmdcode: " <<  cmdcode << std::endl;if(cmdcode >= 0 && cmdcode < tasks.size()) tasks[cmdcode]();}if(n == 0) break;}
}

我们知道我们管道传输的数据越大,那么效率越低,那么我就传输一个整数,然后通过这个整数去调取函数数组的函数;

我们进程子进程通过管道读取到父进程发送的指令,然后将我们的整数当下标去调用函数。

4、控制子进程

给出目录

void Menu()
{std::cout << "################################################" << std::endl;std::cout << "# 1. 刷新日志             2. 刷新出来野怪        #" << std::endl;std::cout << "# 3. 检测软件是否更新      4. 更新用的血量和蓝量  #" << std::endl;std::cout << "#                         0. 退出               #" << std::endl;std::cout << "#################################################" << std::endl;
}
void ctrlSlaver(const std::vector<channel> &channels)
{int which = 0;//用来选择进程while(true){int select = 0;//用来选择执行什么指令Menu();std::cout << "Please Enter@ ";std::cin >> select;if(select <= 0 || select >= 5) break;//不在指令内就退出// select > 0&& select < 5// 1. 选择任务int cmdcode = select - 1;//我们的进程的cmdfd从channels的0号下标开始存储,选项是1// 2. 选择进程std::cout << "father say: " << " cmdcode: " <<cmdcode << " already sendto " << channels[which]._slaverid << " process name: " << channels[which]._processname << std::endl;// 3. 发送任务write(channels[which]._cmdfd, &cmdcode, sizeof(cmdcode));which++;which %= channels.size();}
}

 我们只需要向子进程通过管道传输我们目录中给出的选项就可以选择让子进程执行什么了。

5、清理收尾

void QuitProcess(const std::vector<channel> &channels)
{for(const auto &c : channels){close(c._cmdfd);waitpid(c._slaverid, nullptr, 0);}
}

将我们的连接管道端关闭,然后让父进程将自己一个一个回收掉;


总结

管道的特征:

1、具有血缘关系的进程进行进程间通信;

2、管道只能单向通信;

3、父子进程是会进程协同的,同步与互斥的——保护管道文件的数据安全

4、管道是面向字节流的;

5、管道是基于文件的,而文件的生命周期吃随进程的!

相关文章:

linux——进程间通信及管道的应用场景

linux进程的控制-CSDN博客 liunx——进程间通信&#xff08;管道通信&#xff09;-CSDN博客 文章目录 文章目录 前言 二、管道的应用 1.创建子进程 1、描述&#xff1a; 2.创建进程及管理 3、子进程接受任务 4、控制子进程 总结 前言 上篇博客我们学习了进程间通信&…...

深度学习基础3

目录 1.过拟合与欠拟合 1.1 过拟合 1.2 欠拟合 1.2 解决欠拟合 1.2.1 L2正则化 1.2.2 L1正则化 1.2.3 Dropout 1.2.4 简化模型 1.2.5 数据增强 1.2.6 早停 1.2.7 模型集成 1.2.8 交叉验证 2.批量标准化 2.1 实现过程 2.1.1 计算均值和方差 2.1.2 标准化 2.1.3…...

靶机dpwwn-01

靶机下载地址&#xff1a;https://download.vulnhub.com/dpwwn/dpwwn-01.zip 信息收集 扫描靶机的IP地址 arp-scan -l 获得靶机的IP地址&#xff1a;192.168.200.130 查看靶机的服务类型&#xff0c;端口信息 nmap -sS -sV -T4 -A -p- 192.168.200.130 开启了22&#xf…...

Python毕业设计选题:基于django+vue的智慧社区可视化平台的设计与实现+spider

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 养老机构管理 业主管理 社区安防管理 社区设施管理 车位…...

大语言模型微调与 XTuner 微调实战

1 大语言模型微调 1.1 什么是微调 大语言模型微调&#xff08;Fine-tuning of Large Language Models&#xff09;是指在预训练的大型语言模型基础上&#xff0c;使用特定任务的数据进一步训练模型&#xff0c;以使其更好地适应和执行特定任务的过程&#xff0c;用于使LLM&am…...

数据结构-查找(四)总结与对比

查找算法总结 文章目录 查找算法总结一、查找的基本概念二、顺序查找法适用场景 三、分块查找法适用场景 四、折半查找法&#xff08;Binary Search&#xff09;适用场景 五、树型查找1. 二叉搜索树&#xff08;BST&#xff09;2. 平衡二叉树&#xff08;AVL&#xff09;3. 红黑…...

c++总复习

一、什么是 C 中的函数对象&#xff1f;它有什么特点&#xff1f; 在 C 中&#xff0c;函数对象&#xff08;Function Object&#xff09;也称为仿函数&#xff08;Functor&#xff09;&#xff0c;它是一个类的实例&#xff0c;该类重载了函数调用运算符()&#xff0c;使得这个…...

AJAX一、axios使用,url组成(协议,域名,资源路径)查询参数和化简,错误处理,请求/响应报文,状态码,接口文档,

一、AJAX是什么 概念 &#xff1a; AJAX是一种与服务器&#xff08;后端&#xff09;通信的技术 二、请求库axios的基本用法 1导包 2使用 // 1. 发请求 axios({ url: 请求地址 }).then(res > { // 2.接收并使用数据 }) <body><p class"province"…...

Python学习笔记

MJ大神的Python课&#xff0c;课堂笔记 int 和float运算结果是 float除法&#xff08;/&#xff09;的结果是float整除&#xff08;//&#xff09;&#xff0c;向下取整(floor)int 和 int 进行整除&#xff08;//&#xff09;,得到的结果是int 绘制一个填充色边框色 import …...

开源 - Ideal库 - Excel帮助类,TableHelper实现(三)

书接上回&#xff0c;我们今天继续讲解实现对象集合与DataTable的相互转换。 01、把表格转换为对象集合 该方法是将表格的列名称作为类的属性名&#xff0c;将表格的行数据转为类的对象。从而实现表格转换为对象集合。同时我们约定如果类的属性设置了DescriptionAttribute特性…...

ceph手动部署

ceph手动部署 一、 节点规划 主机名IP地址角色ceph01.example.com172.18.0.10/24mon、mgr、osd、mds、rgwceph02.example.com172.18.0.20/24mon、mgr、osd、mds、rgwceph03.example.com172.18.0.30/24mon、mgr、osd、mds、rgw 操作系统版本&#xff1a; Rocky Linux release …...

macOS 开发环境配置与应用开发指南

macOS 开发环境配置与应用开发指南 macOS作为苹果公司推出的操作系统&#xff0c;因其稳定性、优雅的用户界面和强大的开发支持&#xff0c;已成为开发者和创意专业人士的首选平台之一。无论是开发iOS、macOS桌面应用&#xff0c;还是Web应用、跨平台程序&#xff0c;macOS都提…...

自动化是语法,智能化是语义与语用

自动化与智能化可以从语言学的角度来进行类比和探讨。 1. 自动化是语法 自动化可以类比为“语法”的部分&#xff0c;因为它关注的是操作过程的规则、结构和执行方式。语法是语言中关于词汇、句子结构和规则的系统&#xff0c;它提供了语言运作的框架和规范。类似地&#xff0c…...

基于DHCP,ACL的通信

该问题为华为的学习资料 1.首先把所有的PC机全部设置为DHCP 2.配置地址 3.ospf 4.dhcp 5.acl AR1 dhcp en interface GigabitEthernet0/0/0ip address 192.168.1.254 255.255.255.0 dhcp select global interface GigabitEthernet0/0/1ip address 10.1.12.1 255.255.255.…...

Unity跨平台基本原理

Unity跨平台基本原理 Unity跨平台基本原理微软的.Net是什么微软做 .Net平台的目的如何实现的.Net跨语言&#xff1f;总结 .Net Framework.Net Framework的体系结构CLR总结 如何实现的跨平台&#xff1f;.Net Core.Net FrameWork 到 .Net CoreMonoMono如何实现跨平台总结如何实现…...

基于 Python、OpenCV 和 PyQt5 的人脸识别上课打卡系统

大家好&#xff0c;我是Java徐师兄&#xff0c;今天为大家带来的是基于 Python、OpenCV 和 PyQt5 的人脸识别上课签到系统。该系统采用 Python 语言开发&#xff0c;开发过程中采用了OpenCV框架&#xff0c;Sqlite db 作为数据库&#xff0c;系统功能完善 &#xff0c;实用性强…...

IDEA的简易安装思路

IDEA(本身就是Java开发的)&#xff1a;是目前为止开发Java效率最高的工具&#xff0c;但正版收费……&#xff08;eclipse的话不好说&#xff0c;反正还是随主流吧&#xff09; 使用IDEA的前提&#xff1a;必须先安装JDK【否则直接使用IDEA工具来运行程序是无效的&#xff0c;它…...

【实战】在Koa.js中实现文件上传的接口 (本地存储)

目录 环境准备 使用 koa-body 中间件获取上传的文件 使用 Postman 测试 使用 koa-static 中间件生成图片链接 编写前端页面上传文件 文件上传是一个基本的功能&#xff0c;每个系统几乎都会有&#xff0c;比如上传图片、上传Excel等。那么在Node Koa应用中如何实现一个支持…...

flink学习(10)——allowedLateness/测道输出

allowedLateness(lateness: Time) 水印&#xff1a;短期延迟&#xff0c;达到条件后触发计算并且关闭窗口&#xff08;触发关闭同时进行&#xff09; 水印allowedLateness : 短期延迟 等待长期延迟效果 1、达到水印条件后&#xff0c;会触发窗口计算&#xff0c;但是不关闭窗口…...

微信小程序按字母顺序渲染城市 功能实现详细讲解

在微信小程序功能搭建中&#xff0c;按字母渲染城市会用到多个ES6的方法&#xff0c;如reduce&#xff0c;map&#xff0c;Object.entries()&#xff0c;Object.keys() &#xff0c;需要组合熟练掌握&#xff0c;才能优雅的处理数据完成渲染。 目录 一、数据分析 二、数据处理 …...

openjdk17 jvm 对象 内存溢出 在C++源码体现

##java大对象类 public class MiBigObject {private String f1;private String f2;private String f3;private String f4;private String f5;private String f6;private String f7;private String f8;private String f9;private String f10;private String f11;private String…...

【软考速通笔记】系统架构设计师⑧——系统质量属性与架构评估

文章目录 一、前言二、软件系统质量属性2.1 开发期质量属性2.2 运行期质量属性 三、质量属性场景描述四、系统架构评估方法4.1 方法分类4.2 软件架构分析方法4.3 架构权衡分析法4.4 成本效益分析法 一、前言 笔记目录大纲请查阅&#xff1a;【软考速通笔记】系统架构设计师——…...

YOLO系列论文综述(从YOLOv1到YOLOv11)【第5篇:YOLOv3——多尺度预测】

YOLOv3 1 摘要2 YOLOv32.1 相对于v2的改进2.2 网络架构2.3 多尺度预测2.4 YOLOv3结果 YOLO系列博文&#xff1a; 【第1篇&#xff1a;概述物体检测算法发展史、YOLO应用领域、评价指标和NMS】【第2篇&#xff1a;YOLO系列论文、代码和主要优缺点汇总】【第3篇&#xff1a;YOLOv…...

HarmonyOS4+NEXT星河版入门与项目实战(25)------UIAbility启动模式(文档编辑案例)

文章目录 1、启动模式2、Specified启动模式实现步骤3、文档编辑案例1、文件创建2代码实现3、Statge 创建4、添加配置1、启动模式 Singleton启动模式: 每个 UIAbility 只存在一个实例,是默认的启动模式,任务列表中只会存在一个相同的 UIAbilityStandard启动模式: 每次启动 U…...

PyTorch张量运算与自动微分

PyTorch张量运算与自动微分 PyTorch由Facebook人工智能研究院于2017年推出&#xff0c;具有强大的GPU加速张量计算功能&#xff0c;并且能够自动进行微分计算&#xff0c;从而可以使用基于梯度的方法对模型参数进行优化&#xff0c;大部分研究人员、公司机构、数据比赛都使用P…...

在 Ubuntu 20.04 上使用 Lux 下载 Bilibili 视频的详细教程

在 Ubuntu 20.04 上使用 Lux 下载 Bilibili 视频的详细教程 在 Ubuntu 20.04 上使用 Lux 下载 Bilibili&#xff08;哔哩哔哩&#xff09;视频的完整和详细步骤如下&#xff0c;包括使用预编译二进制文件的安装方法&#xff1a; 1. 安装依赖 确保你的系统已安装 FFmpeg&…...

1.1 数据结构的基本概念

1.1.1 基本概念和术语 一、数据、数据对象、数据元素和数据项的概念和关系 数据&#xff1a;是客观事物的符号表示&#xff0c;是所有能输入到计算机中并被计算机程序处理的符号的总称。 数据是计算机程序加工的原料。 数据对象&#xff1a;是具有相同性质的数据元素的集合&…...

【NebulaGraph】深入了解查询语句(二)

【NebulaGraph】深入了解查询语句 1. NebulaGraph 查询语句概述 1. NebulaGraph 查询语句概述 文档&#xff1a;https://docs.nebula-graph.com.cn/3.8.0/3.ngql-guide/7.general-query-statements/1.general-query-statements-overview/ NebulaGraph 的数据以点和边的形式存…...

Oracle—系统包使用

文章目录 系统包dbms_redefinition 系统包 dbms_redefinition 功能介绍&#xff1a;该包体可以实现将Oracle库下的表在线改为分区结构或者重新定义&#xff1b; 说明&#xff1a;在检查表是否可以重定义和开始重定义的过程中&#xff0c;按照表是否存在主键&#xff0c;参数 o…...

org.apache.commons.lang3包下的StringUtils工具类的使用

前言 相信平时在写项目的时候&#xff0c;一定使用到StringUtils.isEmpty()&#xff1b;StringUtils.isBlank();但是你真的了解他们吗&#xff1f; 也许你两个都不知道&#xff0c;也许你除了isEmpty/isNotEmpty/isNotBlank/isBlank外&#xff0c;并不知道还有isAnyEmpty/isNon…...

详细介绍Node.js的中间件及使用方法

在Node.js的生态中&#xff0c;中间件&#xff08;Middleware&#xff09;是一个不可或缺的概念&#xff0c;它为构建灵活而高效的应用程序提供了强大的支持。以下是对Node.js中间件的详细介绍&#xff1a; 中间件的概念与定义 中间件是一种软件架构的设计模式&#xff0c;用…...

VPC9527同步整流控制器,相对最大电压检测与强力自供电,与MP6908完全PIN TO PIN

VPC9527 是一款高性能的同步整流控制器,它兼容 CCM 和 DCM 两种模式,最大工作频率高达 700kHz;可 通过 SEL 引脚的逻辑电压来选择 400nS 或 800nS 两个关断检测的屏蔽时间;可通过 VLC 引脚来调整限压导通的 参数,以便与所选同步整流管的参数相匹配,获得适应的最优性能;它…...

【聚类】主成分分析 和 t-SNE 降维

1 主成分分析PCA PCA 是一种线性降维技术&#xff0c;旨在通过选择具有最大方差的特征方向&#xff08;称为主成分&#xff09;来压缩数据&#xff0c;同时尽可能减少信息损失。 1.1 原理 1.2 优缺点 from sklearn.decomposition import PCA import matplotlib.pyplot as plt…...

MyBatis框架-日志配置

MyBatis框架的日志配置 MyBatis作为一个封装好的ORM框架&#xff0c;其运行过程我们没有办法跟踪&#xff0c;为了让开发者MyBatis执行流程及执行步骤所完成的工作&#xff0c;MyBatis框架本身支持log4j日志框架&#xff0c;对运行的过程进行跟踪记录。我们只需对MyBatis进行相…...

【数据结构】哈希 ---万字详解

unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到log_2 N&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好 的查询是&#xff0c…...

Python Web 框架

Python 有多个强大的 Web 框架&#xff0c;每个框架都具有不同的特点和应用场景。根据开发者的需求&#xff08;如开发速度、灵活性、功能等&#xff09;&#xff0c;可以选择适合的框架。以下是一些常见的 Python Web 框架&#xff1a; 1. Django 简介&#xff1a;Django 是一…...

大模型翻译能力评测

1. 背景介绍 随着自然语言处理技术的飞速发展&#xff0c;机器翻译已经成为一个重要的研究领域。近年来&#xff0c;基于大模型的语言模型在机器翻译任务上取得了显著的进展。这些大模型通常具有数亿甚至数千亿的参数&#xff0c;能够更好地理解和生成自然语言。 但是&#xf…...

深度学习中的前向传播与损失函数

目录 ​编辑 前向传播&#xff1a;神经网络的推理过程 什么是前向传播&#xff1f; 前向传播的步骤 数学表达 代码示例&#xff1a;前向传播 损失函数&#xff1a;衡量预测与真实值的差异 损失函数的定义 损失函数的作用 常见的损失函数 代码示例&#xff1a;损失函…...

MySQL 复合查询

实际开发中往往数据来自不同的表&#xff0c;所以需要多表查询。本节我们用一个简单的公司管理系统&#xff0c;有三张表EMP,DEPT,SALGRADE 来演示如何进行多表查询。表结构的代码以及插入的数据如下&#xff1a; DROP database IF EXISTS scott; CREATE database IF NOT EXIST…...

Java程序调kubernetes(k8s1.30.7)core API简单示例,并解决403权限验证问题,即何进行进行权限授权以及验证

简单记录问题 一、问题描述 希望通过Java程序使用Kubernetes提供的工具包实现对Kubernetes集群core API的调用&#xff0c;但是在高版本上遇见权限验证问题4xx。 <dependency><groupId>io.kubernetes</groupId><artifactId>client-java</artifact…...

Java安全—原生反序列化重写方法链条分析触发类

前言 在Java安全中反序列化是一个非常重要点&#xff0c;有原生态的反序列化&#xff0c;还有一些特定漏洞情况下的。今天主要讲一下原生态的反序列化&#xff0c;这部分内容对于没Java基础的来说可能有点难&#xff0c;包括我。 序列化与反序列化 序列化&#xff1a;将内存…...

火鸟地方门户系统V8.5系统源码+搭建环境教程

一.介绍 火鸟地方门户系统V8.5源码 系统包含4端&#xff1a; PCH5小程序APP 二.搭建环境 系统环境&#xff1a;CentOS、 运行环境&#xff1a;宝塔 Linux 网站环境&#xff1a;Nginx 1.2.22 MySQL 5.6 PHP-7.4 常见插件&#xff1a;fileinfo &#xff1b; redis 三.测…...

深度学习:梯度下降法

损失函数 L&#xff1a;衡量单一训练样例的效果。 成本函数 J&#xff1a;用于衡量 w 和 b 的效果。 如何使用梯度下降法来训练或学习训练集上的参数w和b &#xff1f; 成本函数J是参数w和b的函数&#xff0c;它被定义为平均值&#xff1b; 损失函数L可以衡量你的算法效果&a…...

Git常用命令

Git是一个优秀的代码版本管理工具&#xff0c;其常用命令包括但不限于以下这些&#xff1a; 一、初始化与配置 git init&#xff1a;在当前目录初始化一个新的Git仓库。git clone [url]&#xff1a;克隆远程仓库到本地。git config&#xff1a;配置Git的各种选项和变量&#…...

css预处理器scss/sass

一、css预处理器sass的诞生 众所周知css并不能算是一们真正意义上的“编程”语言&#xff0c;它本身无法未完成像其它编程语言一样的嵌套、继承、设置变量等工作&#xff0c;仅仅只能用来编写网站样式&#xff0c;如此一来代码就会百年的臃肿难以维护。为了解决css的不足&#…...

磁盘/系统空间占满导致黑屏死机无法开机的解决办法

文章目录 起因具体操作1.重启虚拟机&#xff0c;一直按CtrlShitf进入GRUP界面2.选“Ubuntu高级选项”并回车选择第二个&#xff0c;recovery mode![请添加图片描述](https://i-blog.csdnimg.cn/direct/201f9784c203406d802d24b39dc2d4a3.png)3.4.命令查看磁盘情况5.查找和删除文…...

API 与 SDK 之间的区别

API 与 SDK 之间的区别 很多人在软件开发中经常会分不清 SDK 与 API &#xff0c;今天就来浅谈一下两者之间的区别。 直白地说&#xff0c;SDK 包含了 API &#xff0c;是一套完整的&#xff0c;能完成更多功能的工具包&#xff0c;无论你想获取什么样的信息&#xff0c;SDK …...

Lua的环境与热更

一、global_State,lua_State与G表 Lua支持多线程环境&#xff0c;使用 lua_State 结构来表示一个独立的 Lua 线程&#xff08;或协程&#xff09;。每个线程都需要一个独立的全局环境。而lua_State 中的l_G指针&#xff0c;指向一个global_State结构&#xff0c;这个就是我们常…...

java八股-分布式服务的接口幂等性如何设计?

文章目录 接口幂等token Redis分布式锁 原文视频链接&#xff1a;讲解的流程特别清晰&#xff0c;易懂&#xff0c;收获巨大 【新版Java面试专题视频教程&#xff0c;java八股文面试全套真题深度详解&#xff08;含大厂高频面试真题&#xff09;】 https://www.bilibili.com/…...

鸿蒙学习使用模拟器运行应用(开发篇)

文章目录 1、系统类型和运行环境要求2、创建模拟器3、启动和关闭模拟器4、安装应用程序包和上传文件QA:在Windows电脑上启动模拟器&#xff0c;提示未开启Hyper-V 1、系统类型和运行环境要求 Windows 10 企业版、专业版或教育版及以上&#xff0c;且操作系统版本不低于10.0.18…...