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

【Linux系统编程十九】:(进程通信)--匿名管道/模拟实现进程池

【Linux系统编程十九】:匿名管道原理/模拟实现进程池

  • 一.进程通信理解
  • 二.通信实现原理
  • 三.系统接口
  • 四.五大特性与四种情况
  • 五.应用场景--进程池

一.进程通信理解

什么是通信?

通信其实就是一个进程想把数据给另一个进程,但因为进程具有独立性,想直接给是不行的。
所以就必须得要有通信的方案。

为什么要通信?
主要是要么是传数据,要么传指令,要么是我们进行多进程间的协同,要么是可能是一个进行想通知另一个地方某些事情发生了。
啊,不管什么原因,反正就是要通信。

怎么通信?
但通信的时候呢,那么对我们来讲呢,竞争具有独立性,那通信就有成本,那怎么办呢?
所以通信它的实现方案,那么这里呢本质就一定是先要要让不同的进程先看到同一份公共的资源。
这份公共资源不能属于我们通信的进程当中的任何一个。
啊,因为竞争具有独立性,如果属于任何一个的话,那这个资源就不应该让其他竞争看到。
所以这个资源呢就必须只能由操作系统提供。
一般而言必须只能由操作系统提供。
而我们对应的呃就是操作系统提供的资源呢,是不允许任何进程直接去访问的。
啊,所以就注定了我们一定要提供大量的我们关于就业通信的相关的系统调用接口。
所以从底层设计上呢,我们的操作系统既要给我们提供通信的方案,又要给我们提供那么进行通信让用户所调用的接口。
如果我们一个文件,它能够被多个进程打开并访问。
那么我们文件呢,这玩意儿就不就是一个公共资源了吗?
等一个进程往文件里写,另一个进程从文件里读。
只要你写完之后把数据直接刷新,刷新到磁盘上,另一个我们对应的这个进程再从文件里读,不就读到数据了吗?
好,同学们,那么这种呢那么思想呢其实对的吗?
那么所谓的管道呢,其实就是基于文件的一种通信方式。
他的思想呢其实跟我刚刚说的那个其实大差不差,只不过呢他并不把数据往磁盘当中做刷新。
谁规定数据一定要刷到磁盘上?
那么管道通信时,只要建立好双方的通信信道,往里写,你去读就可以。
不一定非得用我们对应的文磁盘呀,我们用内存也可以。
在这里插入图片描述

二.通信实现原理

我们每一个文件呢,它都天然的要提供一个属于自己对应的,叫做页缓冲区。全称叫做文件页缓区,我们叫做缓冲区。

从理论上来讲呢,如果这个文件就是一个普通文件,我们这个文件一定是曾经要么在在磁盘当中被新建的,要么在我们磁盘当中被打开的。
反正我们最终那么一个文件在磁盘当中,假设它也存在的话,它会在特定的分区,特定的分组,有自己的属性和数据块。在操作系统内核当中,它会存在非常非常多的内存级文件。
也就是这样的文件呢,我们并不需要在我们对应的磁盘当中真正的存在。
啊,那么而是呢最终只要能够在内存里让我们那么能够把它用起来就可以。我们只需要把我们曾经学到的知识里面不要做刷新,那么剩下的这不就是内存级文件吗

在这里插入图片描述
让进程打开一个文件时,再创建一个子进程。子进程会进程父进程的PCB,页表,地址空间。但文件不会继承。
这样父进程里的文件描述符表和子进程的文件描述符表都指向一样的文件。
刚刚新建的这个内存及文件。父子进程是不是都可以访问,都可以被父子进程看到。
还记得进程间通信的本质吗:让不同的进程看到同一份资源。这不就做到了吗。

进程先打开文件,在fok之后创建子进程进程。 此时如果我们有能力打开这种文件的话,那么此时它不就叫做父进程程和子进程看到了同一个文件吗?那么这个同一个文件它是内存级的。因为每个文件都存在自己对应的缓冲区。
双方就可以实现进程间通信了。

在系统当中父进程在打开我们对应的一个文件的时候呢。
它并不是只是单方面的去把一个文件以读写方式打开,或读或写都不是。他在创建这个管道时,把同一个文件既以读方式打开,又以写方式打开。
所以父进程打开文件的时候,以读写方式整体把管道文件打开。
那么接下来呢我们的父进程呢在fork创建出子进程后。
子进程它会拷贝父进程的文件描述符表,所以它们两个当中父进程和子进程都会有对应的读写端。指向同一个缓冲区
在这里插入图片描述

好,这就是我们的管道啊。
至于父进程是读,子进程写,还是父进程是写,子进程是读,需要用户来决定?
只要让父进程和子进程它们各自要关闭对应的读写端,来形成一个叫做单向通信的信道。比如说图当中呢它是想要父进程进行写入。子进程读取,只要将父进程就把曾经自己的读端这个关掉。对应的子进程呢,它想对我们对应的管道来进行读取读取,所以他就把自己的写入关掉。
关掉了这次我们的父子进程就可以使用,父进程剩下一个写端,子进程剩下一个读端,那么建立了这样的一种通信信道。
在这里插入图片描述
这种基于文件级别的通信方式,那么正是因为它只能进行单向通信。所以我们命名为叫做管道。

以上所做的工作叫做建立通信信道。现在父子进程还没进行通信。

三.系统接口

在这里插入图片描述
这个系统调用接口很简单,它的参数是一个数组,数组只有两个参数。而这个参数是作为输出型参数的。将文件的读写描述符带出来。默认pipefd[0]是读端,pipefd[1]是写端。
而这个系统调用所做的工作就是我们上面所讲的实现原理做的工作即建立信道。这个信道是由固定大小的,一般为64KB.
创建完信道后,我们还有件事情,就是要形成单向信道,这件事需要让父子进程共同完成,父进程需要读,就要手动将写端关闭。
子进程需要写,就要手动将读端关闭。
最基本的一个叫做我们建立单向信道的过程。建立完单向信道后,就可以往信道里写入信息了。写入信息时要注意管道本质上是文件。而文件本质上是内核资源。操作系统允不允许你的父进程和子进程直接去访问这个文件资源呢?只能通过系统调用接口去访问,所以只能使用write和read系统调用接口进行。

四.五大特性与四种情况

在这里插入图片描述
管道的特性有五个:
一:只有具有血缘关系的进程才可以进行通信。在这里插入图片描述

二:管道只能单向通信。
三:父子进程是会进行协同的。
四:管道是面向字节流的。
五:管道本质就是文件,属于内核资源,进程结束就会自动释放。

管道还会出现四种情况:
1.(写段写的速度比读端要慢)读写端都正常,管道如果为空,那么读端就要阻塞。
2.(写端写的速度比读端要快)读写端正常,管道如果被写满,写段就要阻塞。
3.(写端关闭)读端正常,写端关闭,读端就会读到0,表面读到了管道的结尾处,读端对应的进程并不会阻塞。
4.(读端关闭)写端正常,读端关闭,操作系统就要杀死正在写入的进程,因为没有意义。利用信号杀死。

五.应用场景–进程池

在shell里就存在管道,竖画线它就表示管道。
第一,当我用管道集连起对应的这若干个命令时。
那么其中每一个对应的命令最终都会被直接启动成一个进程。
也就是他们这些进程是同时被起来的啊,也就就是你在跑的同时我也在跑,只不过我在等你啊。这表面它们之间都是子进程。谁的子进程呢?bash的子进程,它们都是bash的子进程,所以可以利用管道。
两个竖画线分割三个命令。创建两个管道之后,然后连续再创建三个子进程,然后每个进程程序计划执行不同的命令。在执行之前呢,我们需要对每一个进程的标准输出啊标准输入进行一下重定向。每一个管道它都有自己的读端和写端。勾连起这几个命令,然后呢让他们直接互相通信起来。
第一个进程的标准输出重定向到我们管道的写端,中间进程的标准输入重定向到上一个管道的读端。表示我本来往显示器上进行打印,现在呢把显示器上打印改成向管道里去进行我们对应的写入。
中间有个进程呢,它呢本来读的时候是从我们对应的键盘读取,今天读的时候,我就不要让它从键盘读,而是从我们对应的管道文件里读,显示的时候就不用再写了,不用向显示器写了,而是继续向后面的管道再继续写入啊,所以做一堆的重定向。
最后一个进程的话,做一下输入重定向。这就是shell中的重定向实现原理。

管道还有一个应用场景:进程池。

我们能不能提前把一批任务先建立好,当有任务到来时,然后我直接指派给其中一个进程呢?。
其中我们一次把对应的一批进程直接创建好,那么这个工作我们就叫做我们先进行一次,叫做进程池的储备。
也就是把一个一个的进程呢当做一一份一份儿一份的资源,提前储备好,提前做个好。 当我们需要的时候再去指派,让他去帮我们去完成任务。

在这里插入图片描述

首先对应的父进程。在正式接受新需求,接受新任务之前。
啊,我先一次性同时创建出若干个子进程。然后呢为了后面呢更好的去控制上面的所有的子进程。
我呢想做这样的工作,为我的父进程想和其中我所创建的每一个子进程。都建立一条叫做管道的信道。
一个进程建立一个管道和第二个进程建立一个管道和第三个建立管道,第四个建立管道和第五个建立管道和第六个建立管道……,以此类推。
然后我们让每一个子进程只从管道当中进行读取。父进程呢它把控这批管道。那么父进程想那往哪个管道里写内容,他就可以直接向哪个管道里写内容。
那么其中我们对应的父进程,如果没有像第一个管道里写任何内容,请问这个子进程在干什么?
这个子进程它在读取等待我们管道流数据。
那么也就是说子进程当前就阻塞在这个管道当中,他就在等这个父进程给他任务呢。
那么父进程呢,不给你写,子进程就等着呗。
然后父进程一旦向管道当中写了,写了之后,那么这个进程会读到对应的数据,然后这个子进程会继续向后执行。向后我就提前可以让这个进场。那么结合他读进来的数据以及他向后执行这个动作,然后我们就可以让这个子进程上去执行对应的任务了。
好,换句话说,从此往后我的父进程,我们规定父进程向子进程当中管道里写的,我们把它都叫做一个一个的任务。(父子通信时,那么父进程每次写入时只能有写四个字节)
我们对应的父进程呢,他想布置任务的时候,他无非就是做两件事情。第一个叫做选择任务。第二个叫做选择进程。
好,也就是他把任务确定好了。第二他把进程确定好了,他就可以把这个任务指派给其中的某一个子进程去运行。


#include "TASK.hpp"
#include <iostream>
#include <string>
#include <unistd.h>
#include <vector>
#include <sys/wait.h>
#include <sys/stat.h>
#include <time.h>
#define N 5std::vector<task_t> tasks;
//master----[]---slaver,master通过信道控制子进程
//先描述,再组织:这个信道是由管道和子进程的pid构成class channel
{
public:channel(int cmdfd,pid_t slaverid,const std::string &processname):_cmdfd(cmdfd),_slaverid(slaverid),_processname(processname){}public:int _cmdfd;//发送任务的文件描述符pid_t _slaverid;//子进程的pidstd::string _processname;//子进程的名字
};
std::vector<channel> channels;
//在创建子进程之前创建管道,然后让父子进程分别关闭一端
void slaver()
{//子进程直接从标准输入里就可以获取到任务码,就没有管道的概念了while(1){int cmdcode=0;//将任务码带出来int n=read(0,&cmdcode,sizeof(int));if(n==sizeof(int)){//根据任务码的不同执行不同的函数std::cout<<"slaver say@ get a command:"<<getpid()<<": code--> "<<cmdcode<<std::endl;    tasks[cmdcode]();}if(n==0)//说明读取完 ,没有可读的了,子进程就可以退出了break;}sleep(3);
}
void InitProcesspoll(std::vector<channel>* channels)//输出型参数用指针
{for(int i=0;i<N;i++){int pipefd[2];pipe(pipefd);//创建管道pid_t id=fork();if(id==0){close(pipefd[1]);//子进程,读,关闭写dup2(pipefd[0],0);//--重定向到标准输入slaver();//子进程执行任务,从信道里读取任务码,封装成一个函数,但这里我们可以重定向,向标准输入里读取exit(0);}close(pipefd[0]);//父进程写,关闭读//管道和子进程都创建好了,可以初始化信道了std::string name="process-"+std::to_string(i);channels->push_back(channel(pipefd[1],id,name));     }
}
void ctrlSlaver(std::vector<channel>& channels)//输入输出型参数用引用
{//接下来就是父进程控制子进程发送任务给子进程int cnt=5;while(cnt--){//1.选择任务int cmdcode=rand()%tasks.size();//2.选择进程int processpos=rand()%channels.size();//可以通过这个位置找到信道,找到子进程std::cout<<"father say comcode:"<<cmdcode<<" have send to"<<channels[processpos]._slaverid<<"->"<<channels[processpos]._processname<<std::endl;//3.发送任务//选好子进程后,就可以往这个信道里发送任务write(channels[processpos]._cmdfd,&cmdcode,sizeof(int));sleep(2);}
}
void QuitProcess(const std::vector<channel>& channels)
{//如何关闭子进程?只要让写端关闭,读端读到0就自然会跳出循环for(auto& e: channels){close(e._cmdfd);}sleep(5);//子进程跳出循环后就会退出,父进程等待子进程即可for(auto& e:channels){waitpid(e._slaverid,nullptr,0);}
}
int main()
{srand(time(nullptr));//生成随机数LoadTask(&tasks);//1.把任务加载进来InitProcesspoll(&channels);//2.初始化-->创建管道,创建子进程,初始化信道。ctrlSlaver(channels); //3.开始控制子进程QuitProcess(channels);//4.清理收尾}

相关文章:

【Linux系统编程十九】:(进程通信)--匿名管道/模拟实现进程池

【Linux系统编程十九】&#xff1a;匿名管道原理/模拟实现进程池 一.进程通信理解二.通信实现原理三.系统接口四.五大特性与四种情况五.应用场景--进程池 一.进程通信理解 什么是通信&#xff1f; 通信其实就是一个进程想把数据给另一个进程&#xff0c;但因为进程具有独立性…...

【全网首发】2023年NOIP真题

目录 前言 真题 结尾 前言 NOIP题目了解一下&#xff0c;后续有可能会出讲解&#xff0c;题目全部来自于洛谷 真题 第一题&#xff1a;词典 第二题&#xff1a;三值逻辑 第三题&#xff1a;双序列扩展 第四题&#xff1a; 天天爱打卡 结尾 大家可以把你的预期分数打在评论…...

【Linux网络】从原理到实操,感受PXE无人值守自动化高效批量网络安装系统

一、PXE网络批量装机的介绍 1、常见的三种系统安装方式 2、回顾系统安装的过程&#xff0c;了解系统安装的必要条件 3、什么是pxe 4、搭建pxe的原理 5、Linux的光盘镜像中的isolinux中的相关文件学习 二、关于实现PXE无人值守装机的四大文件与五个软件的对应关系详解 5个…...

Pandas+Matplotlib 数据分析

利用可视化探索图表 一、数据可视化与探索图 数据可视化是指用图形或表格的方式来呈现数据。图表能够清楚地呈现数据性质&#xff0c; 以及数据间或属性间的关系&#xff0c;可以轻易地让人看图释义。用户通过探索图&#xff08;Exploratory Graph&#xff09;可以了解数据的…...

k8s ingress高级用法一

前面的文章中&#xff0c;我们讲述了ingress的基础应用&#xff0c;接下来继续讲解ingress的一些高级用法 一、ingress限流 在实际的生产环境中&#xff0c;有时间我们需要对服务进行限流&#xff0c;避免单位时间内访问次数过多&#xff0c;常用的一些限流的参数如下&#x…...

C语言--从键盘输入10个数字放在数组中,并输出

用scanf读取数字的时候要注意&#xff0c;可以输入一个数字&#xff0c;按一下回车&#xff0c;输入一个数字&#xff0c;按一下回车&#xff0c;也可以一次性输入完10个数据。&#xff08;中间可以用空格隔开&#xff0c;系统会自动识别&#xff09; 输出一:每按下一个数字&am…...

SSL加密

小王学习录 今日摘录前言HTTP + SSL = HTTPSSSL加密1. 对称加密2. 非对称加密 + 对称加密3. 证书今日摘录 但愿四海无尘沙,有人卖酒仍卖花。 前言 SSL表示安全套接层,是一个用于保护计算机网络中数据传输安全的协议。SSL通过加密来防止第三方恶意截取并篡改数据。在实际应用…...

一个美观且功能丰富的 .NET 控制台应用程序开源库

推荐一个美观且功能丰富的 .NET 控制台应用程序开源库&#xff0c;从此告别黑漆漆的界面。 01 项目简介 Spectre.Console 是一个开源的 .NET 库&#xff0c;用于创建美观、功能丰富的控制台&#xff08;命令行&#xff09;应用程序。它提供了一组易于使用的 API&#xff0c;…...

DispatcherSynchronizationContext and Dispatcher

https://www.cnblogs.com/liangouyang/archive/2008/11/20/1337907.html SynchronizationContext提供一个自由线程的同步上下文&#xff0c;一个常用的用法是把UI线程的同步上下文保存起来&#xff0c;传给另一个线程&#xff0c;因为UI只能再UI线程中操作&#xff0c;在另外一…...

java类型属性set方法无法被赋值

前言 遇到一个基础的问题 方法设置属性值 失败 问题代码 有个内部类的User对象 分别使用 方式一和 方式二 设置User的属性值 发现方式一的属性并不能被设置成功 可以自行测试下 public class Test{public static void main(String[] args) {#方式一 User user new User();u…...

【2】SM2验签工具和RSA验签工具

0X01 前言 最近看了好多验签工具&#xff0c;感觉不是很好用&#xff0c;就自己造了个。 0x02 工具功能介绍 对SM2算法进行验签和RSA算分进行验签&#xff0c;签名值可以是base64&#xff0c;也可以是十六进制。 兼容各种输入。 0x03 工具使用 RSA 验签 SM2 验签 0x04 工具…...

Python (十一) 迭代器与生成器

迭代器 迭代器是访问集合元素的一种方式&#xff0c;可以记住遍历的位置的对象 迭代器有两个基本的方法&#xff1a;iter() 和 next() 字符串&#xff0c;列表或元组对象都可用于创建迭代器 字符串迭代 str1 Python str_iter iter(str1) print(next(str_iter)) print(next(st…...

通过maven命令手动上传jar私服Nexus

Nexus3在界面上传组件时报&#xff1a; Ext.JSON.decode(): Youre trying to decode an invalid JSON String: 查找了很多资料&#xff0c;都没有解决。有哪位大佬知道的评论告诉一下&#xff0c;万分感谢。 于是换成maven命令上传&#xff1a; mvn deploy:deploy-file -Dgr…...

记一次用jlink调试正常,不进入调试就不能运行的情况

一、概述 我开机会闪烁所有指示灯&#xff0c;但是重新上电时&#xff0c;指示灯并没有闪烁&#xff0c;就像"卡死"了一样。 使用jlink的swd接口进行调试&#xff0c;需要多点几次运行才能跳转到main函数里面。 调试模式第一次点击运行&#xff0c;暂停查看函数堆栈…...

搞科研、写论文,如何正确使用GPT?AIGC技术解析、提示词工程高级技巧、AI绘图、ChatGPT/GPT4应用

目录 专题一 OpenAI开发者大会最新技术发展及最新功能应用 专题二 AIGC技术解析 专题三 提示词工程高级技巧 专题四 ChatGPT/GPT4的实用案例 专题五 让ChatGPT/GPT4成为你的论文助手 专题六 让ChatGPT/GPT4成为你的编程助手 专题七 让ChatGPT/GPT4进行数据处理 专题八 …...

Java实现的插件化策略模式

Java实现的插件化策略模式 目录结构实现BaseDealAnno.java(注解)BasePluginEnum.java(枚举)BaseDealFactory.javaContextBaseDealListener.java(核心类)BaseDealHandler.java(接口)BaseAudioService.java(可扩展多个)验证目录结构 com.demo.mytest ├── strategy │ ├──…...

【jvm】MinorGC、MajorGC和FullGC

目录 一、说明二、年轻代GC(Minor GC)触发机制三、老年代GC (Major GC/Full GC)触发机制四、Full GC触发机制 一、说明 1.jvm调优的主要目的是GC的时间少一些&#xff0c;用户线程执行的时间多一些 2.主要侧重于MajorGC和FullGC&#xff0c;这两块的GC产生的暂停时间比MinorGC产…...

Redis:java和SpringBoot中使用Redis

目录 Jedis操作Redis6SpringBoot整合Redis Jedis操作Redis6 Jedis是java开发的操作redis的工具包。 引入maven依赖&#xff1a; <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.2.1</ve…...

Java的XWPFTemplate word生成列表

Java的XWPFTemplate工具类导出word.docx的使用_xwpftemplate 语法_youmdt的博客-CSDN博客 如果是表格的列表参考上面这篇文章即可&#xff0c;比较复杂的列表遍历暂时还没找到方法&#xff0c;只能手动创建表格了 上面是模板&#xff0c;非常简单&#xff0c;以为我们是要自己创…...

基于RFID的自动化仓储设备研发项目可行性研究报告

一、项目概况 基于RFID的自动化仓储设备研发项目&#xff0c;是深圳市飞鸟国际供应链股份有限公司在公司有色金属供应链一站式服务的基础上&#xff0c;针对有色金属供应链的仓储环节进行的研发。 多年来&#xff0c;公司一直坚持以“科技金融”为核心的未来发展战略&#xf…...

ajax异步传值以及后端接收参数的几种方式

异步传值 第一种呢&#xff0c;也是最简单的一种&#xff0c;通过get提交方式&#xff0c;将参数在链接中以问号的形式进行传递 // 前台传值方法 // 触发该方法调用ajaxfunction testAjax(yourData) {$.ajax({type: "get", // 以get方式发起请求url: "/yo…...

千年TGS服务器日志报错如何解决

大家在修改sdb文件&#xff0c;建议使用sdb修改器。注意&#xff1a;每个文件&#xff0c;每个逗号都很重要&#xff1b;只要其中哪部分少一个逗号或多一个逗号&#xff0c;都很容易发生错误。 一常见 TGS1000.LOG 错误类型&#xff0c;因不同的错误&#xff0c;错误中括号“&…...

读取Json BugFix

遇到的错误如下所示&#xff1a; 遇到的错误如下所示&#xff1a;File ~/miniconda3/lib/python3.9/json/decoder.py:353, in JSONDecoder.raw_decode(self, s, idx)344 """Decode a JSON document from s (a str beginning with345 a JSON document) and retu…...

【Gradle构件工具深度学习】

Gradle构件工具深度学习 1. 课程大纲1.1 Gradle入门1.2 与Idea整合1.3 Gradle进阶 2. 常见项目构建工具3. 安装gradle 1. 课程大纲 1.1 Gradle入门 基本介绍、常用指令、项目目录、项目应用 1.2 与Idea整合 Groovy语法、整合IDEA、搭建web工程、项目部署 1.3 Gradle进阶 生命周…...

Attention Transformer

来源老师课件&#xff0c;方便以后复习。 课参考链接&#xff1a; http://jalammar.github.io/illustrated-transformer/ 之前的知识链接&#xff1a; 【知识链接】WGAN Transformer Vit Swin-Transformer Swin-Unet Res-Vit TransUNet MAE Bra ADDA 打分函数&#xff1a; 多头…...

[最新榜单] 智能手机数据恢复的 10 款最佳应用

当手机上的数据消失时&#xff0c;这让您感到非常难过。 由于事故而突然丢失重要的聊天记忆、照片和其他您想保留的东西的悲伤。 如果它没有被淹没&#xff0c;您可以使用数据恢复应用程序修复它。 在本文中&#xff0c;我们将解释一些有用的数据恢复应用程序。 数据恢复应用…...

修改CentOS默认mail发件名称

修改CentOS默认的邮件发件名称 要修改CentOS默认的邮件发件名称&#xff0c;可以按照以下步骤进行操作&#xff1a; 打开终端或SSH连接到CentOS服务器。使用root或具有管理员权限的用户登录。编辑postfix配置文件。在终端中输入以下命令&#xff1a; vi /etc/postfix/main.cf…...

Lesson 03 C/C++内存管理

C&#xff1a;渴望力量吗&#xff0c;少年&#xff1f; 文章目录 一、C内存管理方式1. new/delete操作内置类型2. new和delete操作自定义类型 二、operator new与operator delete函数三、new和delete的实现原理1. 内置类型2. 自定义类型 四、内存泄漏1. 什么是内存泄漏2. 内存泄…...

【SA8295P 源码分析】127 - 摄像头 GMSL1、GMSL2 加串-解串器 常用寄存器配置整理(正在更新中......)

【SA8295P 源码分析】127 - 摄像头 GMSL1、GMSL2 加串-解串器 常用寄存器配置整理 一、MAX96712 解串器基础配置1.1 配置链路 GMSL 协议 及 传输速率1.1.1 配置GMSL1、GMSL2协议 及 配置使能 Link A/B/C/D [0x6]:GMSL2_A、LINK_EN_A1.1.2 配置GMSL2 传输速率 3 Gbps / 6 Gbps …...

Docker与Kubernetes结合的难题与技术解决方案

文章目录 1. **版本兼容性**技术解决方案 2. **网络通信**技术解决方案 3. **存储卷的管理**技术解决方案 4. **安全性**技术解决方案 5. **监控和日志**技术解决方案 6. **扩展性与自动化**技术解决方案 7. **多集群管理**技术解决方案 结语 &#x1f388;个人主页&#xff1a…...

CVE-2021-42287CVE-2021-42278 域内提权

倘见玉皇先跪奏&#xff1a;他生永不落红尘 本文首发于先知社区&#xff0c;原创作者即是本人 前言 网络安全技术学习&#xff0c;承认⾃⼰的弱点不是丑事。只有对原理了然于⼼&#xff0c;才能突破更多的限制。拥有快速学习能力的白帽子&#xff0c;是不能有短板的&#xf…...

springcloud整合nacos实现服务注册

Nacos是一个开源的分布式系统服务和基础设施解决方案&#xff0c;用于实现动态服务发现、配置管理和服务治理。它可以帮助开发人员和运维团队更好地管理微服务架构中的服务实例、配置信息和服务调用。 Nacos提供了服务注册与发现、动态配置管理、服务路由和负载均衡等功能&…...

redis实现布隆过滤器

思路&#xff1a; 用于快速检查一个元素是否属于某个集合中。它可以快速判断一个元素是否在一个大型集合中&#xff0c;且判断速度很快且不占用太 多内存空间。原理是使用一组哈希函数&#xff0c;将元素【映射】成数组中的【索引位置】&#xff0c;就是将元素转成他在索引中的…...

山西电力市场日前价格预测【2023-11-19】

1.日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-11-19&#xff09;山西电力市场全天平均日前电价为591.63元/MWh。其中&#xff0c;最高日前电价为1500.00元/MWh&#xff0c;预计出现在16:45~20:45。最低日前电价为268.57元/MWh&#x…...

深眸科技革新升级OCR技术,与AI视觉实现有效融合赋能各行业应用

OCR即光学字符识别&#xff0c;是通过扫描仪或工业相机等电子设备检查打印的字符&#xff0c;并通过检测暗、亮的模式确定其形状&#xff0c;然后用字符识别方法将形状翻译成计算机文字的过程。 目前&#xff0c;随着机器视觉和人工智能技术的进一步升级&#xff0c;OCR技术实…...

性能测试知多少---系统架构分析

之前有对性能需求进行过分析&#xff0c;那篇主要从项目业务、背景等角度如何抽丝剥茧的将项目的需求抽离出来。在我们进行需求的时候也需要对被测项目的架构有一定的认识&#xff0c;如果不了解被测系统的架构&#xff0c;那么在后期的性能分析与调优阶段将无从下手。 简单系…...

【观察】华为:数智世界“一触即达”,应对数智化转型“千变万化”

毫无疑问&#xff0c;数智化既是这个时代前进所趋&#xff0c;也是国家战略所指&#xff0c;更是所有企业未来发展进程中达成的高度共识。 但也要看到&#xff0c;由于大量新兴技术的出现&#xff0c;技术热点不停的轮转&#xff0c;加上市场环境的快速变化&#xff0c;让数智化…...

我的 2023 秋招总结,拿到了大厂offer

2023秋招小结 前言 & 介绍 作为2024年毕业的学生&#xff0c;在2023年也就是今年秋招。 现在秋招快结束了&#xff0c;人生可能没有几次秋招的机会&#xff08;应该就一次&#xff0c;最多两次吧哈哈&#xff09;&#xff0c;也有一点感悟&#xff0c;所以小小总结一下。…...

力扣labuladong——一刷day36

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣230. 二叉搜索树中第K小的元素二、力扣538. 把二叉搜索树转换为累加树三、力扣1038. 从二叉搜索树到更大和树 前言 首先&#xff0c;BST 的特性大家应该…...

解锁编程潜能:探索亚马逊CodeWhisperer,打造编程世界的声音引导者

文章目录 前言一、什么是 Amazon CodeWhisperer&#xff1f;二、如何使用CodeWhisperer&#xff1f;安装CodeWhisperer插件配置CodeWhisperer生成注释和文档 总结 前言 随着CHATGPT的一声巨响&#xff0c;大语言模型已经成为了一个备受瞩目的创新应用。亚马逊云科技作为全球领…...

01_面向对象高级_static

Static static 的中文意思是"静态"&#xff0c;它可以修饰成员变量、成员方法 1. Static 修饰成员变量 static 修饰的成员变量&#xff0c;也称之为"类变量"类变量它是属于类的&#xff0c;与类一起加载&#xff0c;在内存中只有一份&#xff0c;会被类…...

双写绕过 [极客大挑战 2019]BabySQL 1

打开题目 随便输入账号密码 根据报错信息可知这是单引号的字符型注入 那我们试试万能密码 1 or 11 页面报错 1 or 11 页面报错 而且根据报错内容显示是没有我们注入上去的or的 那我们就试试 1 order by 3 # 页面报错&#xff0c;根据报错显示页面过滤掉了or和by 那我们…...

uni.app 使用 mixins 技术统一注入小程序页面分享到好友,分享朋友圈功能

uni.app 使用 mixins 技术统一注入小程序页面分享到好友,分享朋友圈功能 1. 在utils文件夹下创建share.js2. 为所有页面挂载3.单独页面使用 1. 在utils文件夹下创建share.js export default{data(){return {// 默认全局分享内容mixinsShare:{title:首页, //分享标题path:/pag…...

贝叶斯AB测试

AB测试是用来评估变更效果的有效方法&#xff0c;但很多时候会运行大量AB测试&#xff0c;如果能够在测试中复用之前测试的结果&#xff0c;将有效提升AB测试的效率和有效性。原文: Bayesian AB Testing[1] 随机实验&#xff0c;又称AB测试&#xff0c;是行业中评估因果效应的既…...

信息检索与数据挖掘 | 【实验】检索评价指标MAP、MRR、NDCG

文章目录 &#x1f4da;实验内容&#x1f4da;知识梳理&#x1f4da;实验步骤&#x1f407;前情提要&#x1f407;MAP评价指标函数&#x1f407;MRR 评价指标函数&#x1f407;NDCG评价指标函数&#x1f407;调试结果 &#x1f4da;实验内容 实现以下指标评价&#xff0c;并对…...

读书笔记:彼得·德鲁克《认识管理》第24章 管理岗位的设计与内容

一、章节内容概述 管理岗位应该始终基于必要的任务&#xff0c;应该是一份实实在在的工作&#xff0c;为企业的整体目标做出可见的(如果不是可衡量的话)贡献&#xff0c;还应该具有尽可能广泛的权威和范围。管理者应该接受绩效目标而不是上级领导 的指导和控制。在设计管理岗位…...

某60区块链安全之51%攻击实战学习记录

区块链安全 文章目录 区块链安全51%攻击实战实验目的实验环境实验工具实验原理攻击过程 51%攻击实战 实验目的 1.理解并掌握区块链基本概念及区块链原理 2.理解区块链分又问题 3.理解掌握区块链51%算力攻击原理与利用 4.找到题目漏洞进行分析并形成利用 实验环境 1.Ubuntu1…...

为什么原生IP可以降低Google play账号关联风险?企业号解决8.3/10.3账号关联问题?

在Google paly应用上架的过程中&#xff0c;相信大多数开发者都遇到过开发者账号因为关联问题&#xff0c;导致应用包被拒审和封号的情况。 而众所周知&#xff0c;开发者账号注册或登录的IP地址及设备是造成账号关联的重要因素之一。酷鸟云最新上线的原生IP能有效降低账号因I…...

排列组合C(n,m)和A(n,m)理解及代码实现

排列组合C(n,m)和A(n,m)理解及代码实现-CSDN博客...

EasyExcel导入从第几行开始

//获得工作簿 read EasyExcel.read(inputStream, Student.class, listener); //获得工作表 又两种形形式可以通过下标也可以通过名字2003Excel不支持名字 ExcelReaderSheetBuilder sheet read.sheet(); sheet.headRowNumber(2);...