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

嵌入式八股RTOS与Linux---进程间的通信与同步篇

前言

  1. 同步异步、阻塞/非阻塞是什么?
  • 同步:在执行某个操作时,调用者必须等待该操作完成并返回结果后,才能继续执行后续的操作
  • 异步:在执行某个操作时,调用者发起操作后不必等待其完成,可以立即继续执行后续的操作。操作完成后,通常通过回调函数、事件或通知的方式告知调用者
    同步异步通常是是两个进程/线程之间的关系
  • 阻塞: 在执行某个操作时,调用者会被挂起(暂停执行),直到该操作完成并返回结果
  • 非阻塞: 在执行某个操作时,调用者不会被挂起,无论操作是否立即完成,调用者都可以立即获得一个结果(可能是部分结果或状态信息),并继续执行后续的任务。
    阻塞和非阻塞更是强调线程当前的状态
    同步不一定阻塞,阻塞也不一定同步,四种状态
  1. 线程的同步与互斥是什么?
  • 线程同步:是指在多线程编程中,协调多个线程对共享资源的访问。从而保证线程的执行顺序,才能让线程协作去完成大事.
  • 线程互斥: 是指若干线程访问同一块资源时, 规定同一时间只有一个线程可以得到访问权

FreeRTOS的IPC

  1. 事件标志组
  2. 信号量与互斥信号量
    • 信号量(二值/计数)与互斥信号量的区别?

      • 一个是释放的问题 二值可以是A线程获取 B线程释放 但是互斥不行
      • 二值不存在优先级继承问题
      • 二值信号量支持排队,互斥不会排队的
      • 互斥 != 二值 + 优先级继承
        在这里插入图片描述
    • 优先级翻转问题
      高优先级的任务想要某个资源,但是低优先级的任务先在使用,此时高优先级就得等了
      在这里插入图片描述

      假设Thread1和Thread3需要相同的资源,Thread3被Thread2抢占了结果Thead3还没释放资源,Thread1就算抢占了Thread2也咩用,就必须等

      • 解决方案
        当Thread3想要访问资源时,暂时把Thread1的优先级提升到和3相同
    • 为什么FreeRTOS里的互斥信号量是中断不安全的?

      • FreeRTOS里的信号量不支持递归调用,要是中断正好是在在获得了互斥锁的当前线程运行时发生,就死锁了
      • 在中断中是不能阻塞的
      • 互斥信号量的特点就是优先级继承, 那中断的优先级咋被继承呢?
      • 对于中断 要用也是二值信号量这种
    • 互斥信号量和递归互斥信号量的区别?
      递归互斥信号量是支持本任务多次获得该信号量
      但是就算递归互斥信号量也是中断不安全的!

  3. 消息队列
    就是利用队列的先入先出机制,进行消息的传递
  4. 任务通知
    • 任务通知和消息队列的区别,各自的优缺点
      • 任务通知是点对点的,比如A任务对B任务,但是消息队列不是,谁都可以往消息队列加消息,同样谁也都可以取出来
      • 任务通知发送的信息格式固定(unit32_t),消息队列更加灵活可以自定义
      • 任务通知不会存储未处理的消息 会直接覆盖
      • 任务通知开销小, 消息队列开销大
  5. 死锁的概念与解决
      就是逻辑上获取一个已经被占用且逻辑上不可能被释放的锁而阻塞,永久阻塞。
  • 避免死锁需要遵循的规则:
    对共享资源操作前一定要获得锁;
    完成操作后一定要释放锁;
    尽量短时间占用锁;
    如果有多锁, 如获得顺序是ABC连环扣, 释放顺序也应该是ABC
  1. 大概实现原理
      我们首先定义一个tEvent作为父类,剩下的都可以通过这个父类去实现
  • tEvent的结构
typedef struct _tEvent {tEventType type;tList waitList;   // 双向列表 记录了所有在等待该事件的任务}tEvent;
  • tEventWait()
    当我们的任务需要被挂起的时候,通过这个函数将任务挂起
//同一时间某个任务只能进入一种等待状态--要么等事件1 要么等事件2
void tEventWait (tEvent * event, tTask * task, void * msg, uint32_t state, uint32_t timeout)
{// 进入临界区uint32_t status = tTaskEnterCritical();//1. 更新task的一些信息--注意低16位不能被用 被我们占用了只能用高16位task->state |= state << 16;task->waitEvent = event;	// 设置任务等待的事件结构task->eventMsg = msg;	// 设置任务等待事件的消息存储位置(不一定用的上)tTaskSchedUnRdy(task);	//此时任务处于等待状态--只要等待一个就被调走了tListAddLast(&event->waitList,&task->linkNode);if(timeout)tTimeTaskWait(task, timeout); //如果有延时还要加入延时队列中 在sysTickHandler会处理好的// 退出临界区tTaskExitCritical(status);
}
  • tEventWakeUp()
    唤醒的方式有很多种–延时时间到了/等待的事件发生了
tTask * tEventWakeUp (tEvent * event, void * msg, uint32_t result)
{tNode  * node;tTask 	*task = (tTask * )0;// 进入临界区uint32_t status = tTaskEnterCritical();// 取出等待队列中的第一个结点if((node = tListRemoveFirst(&event->waitList)) != (tNode *)0){      task = (tTask*) tNodeParent(node, tTask, linkNode);// 设置收到的消息、结构,清除相应的等待标志位task->waitEvent = (tEvent *)0;task->eventMsg = msg;task->waitEventResult = result;task->state &= ~TINYOS_TASK_WAIT_MASK;}	// 任务申请了超时等待,这里检查下,将其从延时队列中移除if (task->delayTicks != 0){ tTimeTaskWakeUp(task);}		// 将任务加入就绪队列tTaskSchedRdy(task);  // 退出临界区tTaskExitCritical(status); return task;
}
  1. tSem和tMutex的区别
  • tMutex

        // 互斥信号量类型typedef struct  _tMutex{// 事件控制块tEvent event;// 已被锁定的次数uint32_t lockedCount;// 拥有者tTask * owner;// 拥有者原始的优先级uint32_t ownerOriginalPrio;}tMutex;
    
    • 获得/释放互斥量过程
    uint32_t tMutexWait (tMutex * mutex, uint32_t waitTicks)
    {uint32_t status = tTaskEnterCritical();//为啥有01数值信号量不信还得有互斥信号量的点就体现在这里了// 第一就是允许递归调用 第二就是拥有者是谁是知道的if (mutex->lockedCount <= 0){// 如果没有锁定,则使用当前任务锁定mutex->owner = currentTask;mutex->ownerOriginalPrio = currentTask->prio;mutex->lockedCount++;tTaskExitCritical(status);return tErrorNoError;		}else{// 允许多次递归调用if(mutex->owner == currentTask){mutex->lockedCount++;tTaskExitCritical(status);return tErrorNoError;}//在有人用的情况下 那就得等咯// 等的时候分优先级继承与否else{if(currentTask->prio < mutex->owner->prio){tTask * owner = mutex->owner;// 如果当前正在调度的话就得先改一下//提升原拥有者的优先if (owner->state == TINYOS_TASK_STATE_RDY){// 任务处于就绪状态时,更改任务在就绪表中的位置tTaskSchedUnRdy(owner);owner->prio = currentTask->prio;tTaskSchedRdy(owner);}else{// 其它状态,只需要修改优先级owner->prio = currentTask->prio;}}// 当前任务进入等待队列中tEventWait(&mutex->event, currentTask, (void *)0, tEventTypeMutex, waitTicks);tTaskExitCritical(status);// 执行调度, 切换至其它任务 return不会被调用tTaskSched();//切换回来的时候就会return了 注意这里是被另一个修改的结果return currentTask->waitEventResult;				}}
    }
    // 唤醒方式1--正常唤醒
    uint32_t tMutexNotify (tMutex * mutex)
    {uint32_t status = tTaskEnterCritical();//这是互斥 mutex->lockedCount理论只有0 1if (mutex->lockedCount <= 0){// 锁定计数为0,信号量未被锁定,直接退出tTaskExitCritical(status);return tErrorNoError;}// 和 二值信号量不同的地方了if (mutex->owner != currentTask){// 不是拥有者释放,认为是非法tTaskExitCritical(status);return tErrorOwner;}if (--mutex->lockedCount > 0){// 减1后计数仍不为0, 直接退出,不需要唤醒等待的任务tTaskExitCritical(status);return tErrorNoError;}//能到这里肯定就是自己释放了//那就得看自己是不是被人优先级继承了if (mutex->ownerOriginalPrio != mutex->owner->prio){// 有发生优先级继承,恢复拥有者的优先级if (mutex->owner->state == TINYOS_TASK_STATE_RDY){// 任务处于就绪状态时,更改任务在就绪表中的位置//这么干的原因是很有可能原本该低优先级,不配被调度的// 但是咱们这么想 虽然优先级改回来了,但是假设此时原来等着的高优先级因为时间放弃了// 那岂不是这个任务还会"假装"高优先级 直到下个systickHandler被触发 才会任务切换tTaskSchedUnRdy(mutex->owner);currentTask->prio = mutex->ownerOriginalPrio;//会切换到更好的任务tTaskSchedRdy(mutex->owner);}else{// 其它状态,只需要修改优先级currentTask->prio = mutex->ownerOriginalPrio;}}// 检查是否有其他任务被阻塞了在等待互斥锁if (tEventWaitCount(&mutex->event) > 0){// 如果有的话,则直接唤醒位于队列首部(最先等待)的任务tTask * task = tEventWakeUp(&mutex->event, (void *)0, tErrorNoError);mutex->owner = task;mutex->ownerOriginalPrio = task->prio;mutex->lockedCount++;// 如果这个任务的优先级更高,就执行调度,切换过去if (task->prio < currentTask->prio)  //这里就和改回原来优先级对应上了{tTaskSched();}}tTaskExitCritical(status);return tErrorNoError;}
    

    // 唤醒方式2—等待超时了 在sysTickHadnler中唤醒

  • tSem 比较简单 如果得不到就等待 如果得到了那就返回

uint32_t tSemWait (tSem * sem, uint32_t waitTicks)
{uint32_t status = tTaskEnterCritical();if(sem->count > 0){--sem->count;tTaskExitCritical(status);return tErrorNoError;}else{// 得不到就加入等待列表tEventWait(&sem->event,currentTask,(void*)0, tEventTypeSem, waitTicks);        tTaskExitCritical(status);tTaskSched();// 因为sched了哥们所以这里不会返回 而是直接切换到下一个任务的栈和堆里面了// 直到再切换到本任务的时候发现这句话还没执行完接着执行// 当由于等待超时或者计数可用时,执行会返回到这里,然后取出等待结构return currentTask->waitEventResult;}
}
void tSemNotify (tSem * sem)
{uint32_t status = tTaskEnterCritical();if(tEventWaitCount(&sem->event) > 0){tTask * task = tEventWakeUp(&sem->event, (void *)0, tErrorNoError );// 如果这个任务的优先级更高,就执行调度,切换过去if (task->prio < currentTask->prio){tTaskSched(); }}else{// 如果没有任务等待的话,增加计数++sem->count;// 如果这个计数超过了最大允许的计数,则递减if ((sem->maxCount != 0) && (sem->count > sem->maxCount)) {	sem->count = sem->maxCount;}}tTaskExitCritical(status);}

Linux的IPC

  1. 管道
    无名管道(匿名管道):主要用于有亲缘关系的进程之间的通信(例如,父子进程)。数据是单向流动的。
    命名管道(FIFO):允许无亲缘关系的进程之间通信,它在文件系统中有一个名字。
  2. 信号
  3. 信号量
  4. 共享内存–最快的方案
  5. Scoket
  6. 消息队列

线程同步与互斥的方法–用户态

  用户态的并发通常由线程或进程实现,线程之间的同步主要通过操作系统提供的同步原语

  1. 自旋锁
  2. 信号量
  • 自旋锁与信号量 为什么有了信号量还需要自旋锁?
    上下文切换也是需要开销的,所以有的时候自旋也许是性能损失更小的组合
  1. 条件变量
  2. 互斥锁
  3. 读写锁
  4. 内存屏障
  • 内存屏障与cache一致性
      内存屏障解决的只是顺序一致性的问题,不解决Cache一致性的问题
      Cache一致性协议只是保证了Cache一致性,但是不关注顺序一致性的问题
    • 缓存一致性问题
      来源: 每个CPU核心都有自己的Cache 当多个CPU核心访问内存同一变量且都想做修改的时候就有问题了
      在这里插入图片描述

      • 基本思路:那假如我CPU A改了 就广播给所有人更新就行 但是这远远不够 假设CPU A/B 同时广播 那其他CPU的值会怎么变式不知道的–事件串行化
        在这里插入图片描述

      • MESI协议: 通过有限状态机来实现–硬件
        定义 M(已修改) /E(独占) / S(已共享) / I(已失效) 四个状态 发生不同的事件会导致状态的切换 从而保证缓存一致性
        在这里插入图片描述

      • DMA与CPU一致性问题
        比如CPU把某块区域读到缓存cache中了 此时DMA修改了这块内存,但是CPU不知道啊,CPU接着用cache里的数据就出问题了
        解决方案:一致性DMA映射 或者流式DMA映射

    • 顺序一致性问题
      来源: 编译器可能会对指令的顺序做调整 CPU也可能乱序执行 从而导致了结果和预期结果不一致。
      比如
      线程A {
      a = 1;
      b = 2; //从人类的角度 b = 2的时候 a肯定等于1了
      }
      线程B {
      while(b != 2) continue;
      assert(a == 1); //你觉得有缓存一致性,讲道理assert不该被触发
      }
      但是你的编译器想优化,可能先执行了 b = 2这个操作 或者CPU先执行 b = 2了 那缓存一致性也不顶用
      解决方案:写内存屏障
      线程 A{
      a = 1;
      smp_mb(); // 这意味着 如果想执行 b = 1 就得等a = 1这个操作执行完了(所有CPU都看见了)才能执行b = 1;
      b = 1;
      }

      • 核心应用就是Linux中的KFIFO–无锁的环形缓冲区

内核同步的方法–内核态

  内核态的并发不仅包括线程,还包括中断处理程序、软中断、工作队列等,甚至还有多核等复杂的环境

  • 原子操作
  • 自旋锁
  • 信号量
  • 互斥体
  • 完成变量
  • BLK:大内核锁
  • 顺序锁
  • 禁止抢占
  • 顺序和屏障

相关文章:

嵌入式八股RTOS与Linux---进程间的通信与同步篇

前言 同步异步、阻塞/非阻塞是什么? 同步:在执行某个操作时&#xff0c;调用者必须等待该操作完成并返回结果后&#xff0c;才能继续执行后续的操作异步:在执行某个操作时&#xff0c;调用者发起操作后不必等待其完成&#xff0c;可以立即继续执行后续的操作。操作完成后&am…...

this.centerDialogVisible = true this.$nextTick(()=>{ this.resetForm(); })

这段代码的作用是 打开一个对话框&#xff0c;并在对话框打开后 重置表单。下面是对这段代码的详细解析&#xff1a; 1. 代码作用 this.centerDialogVisible true&#xff1a;控制对话框的显示。this.$nextTick(() > { ... })&#xff1a;在 DOM 更新后执行回调函数&#…...

datawhale组队学习--大语言模型—task4:Transformer架构及详细配置

第五章 模型架构 在前述章节中已经对预训练数据的准备流程&#xff08;第 4 章&#xff09;进行了介绍。本章主 要讨论大语言模型的模型架构选择&#xff0c;主要围绕 Transformer 模型&#xff08;第 5.1 节&#xff09;、详细 配置&#xff08;第 5.2 节&#xff09;、主流架…...

专业级 AI 提示生成工具清单

1. 引言 近年来&#xff0c;随着 GPT-3、GPT-4 等大规模预训练语言模型的广泛应用&#xff0c;提示&#xff08;Prompt&#xff09;工程作为驱动模型输出质量的重要环节&#xff0c;受到了各界的高度关注。精心设计、管理与优化提示&#xff0c;不仅能够大幅提高生成文本的准确…...

Web前端考核 JavaScript知识点详解

一、JavaScript 基础语法 1.1 变量声明 关键字作用域提升重复声明暂时性死区var函数级✅✅❌let块级❌❌✅const块级❌❌✅ 1.1.1变量提升的例子 在 JavaScript 中&#xff0c;var 声明的变量会存在变量提升的现象&#xff0c;而 let 和 const 则不会。变量提升是指变量的声…...

23种设计模式-生成器(Builder)设计模式

工厂方法设计模式 &#x1f6a9;什么是生成器设计模式&#xff1f;&#x1f6a9;生成器设计模式的特点&#x1f6a9;生成器设计模式的结构&#x1f6a9;生成器设计模式的优缺点&#x1f6a9;生成器设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么…...

Thinkphp(TP)框架漏洞攻略

1.环境搭建 vulhub/thinkphp/5-rce docker-compose up -d 2.访问靶场 远程命令执行&#xff1a; ? sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]system&vars[1] []whoami 远程代码执行&#xff1a; ? s/Index/\think\app/invokefunc…...

HTTP/HTTPS 中 GET 请求和 POST 请求的区别与联系

一、基础概念 HTTP (HyperText Transfer Protocol, 超文本传输协议) 是一种用于浏览器与服务器之间进行数据交互的协议。HTTPS (加密的 HTTP) 则通过 SSL/TLS 协议实现通信加密与数据安全性。 二、GET 和 POST 概述 GET 请求: 用于从服务器获取资源。 POST 请求: 用于将数据…...

2021年蓝桥杯第十二届CC++大学B组真题及代码

目录 1A&#xff1a;空间&#xff08;填空5分_单位转换&#xff09; 2B&#xff1a;卡片&#xff08;填空5分_模拟&#xff09; 3C&#xff1a;直线&#xff08;填空10分_数学排序&#xff09; 4D&#xff1a;货物摆放&#xff08;填空10分_质因数&#xff09; 5E&#xf…...

解锁 AWX+Ansible 自动化运维新体验:快速部署实战

Ansible 和 AWX 是自动化运维领域的强大工具组合。Ansible 是一个简单高效的 IT 自动化工具&#xff0c;而 AWX 则是 Ansible 的开源 Web 管理平台&#xff0c;提供图形化界面来管理 Ansible 任务。本指南将带你一步步在 Ubuntu 22.04 上安装 Ansible 和 AWX&#xff0c;使用 M…...

简洁、实用、无插件和更安全为特点的WordPress主题

简站WordPress主题是一款以简洁、实用、无插件和更安全为特点的WordPress主题&#xff0c;自2013年创立以来&#xff0c;凭借其设计理念和功能优势&#xff0c;深受用户喜爱。以下是对简站WordPress主题的详细介绍&#xff1a; 1. 设计理念 简站WordPress主题的核心理念是“崇…...

区块链学习总结

Hardhat 是一个用于 Ethereum 智能合约开发 的开发环境&#xff0c;专为 Solidity 语言编写的智能合约提供工具支持。它能够帮助开发者 编译、部署、测试和调试 智能合约&#xff0c;并提供一个本地的以太坊测试网络。 Hardhat 的核心功能 本地开发网络&#xff08;Hardhat Ne…...

可发1区的超级创新思路(python\matlab实现):基于周期注意力机制的TCN-Informer时间序列预测模型

首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴! 一、应用场景 该模型主要用于时间序列数据预测问题,包含功率预测、电池寿命预测、电机故障检测等等 二、模型整体介绍(本文以光伏功率预测为例) 1.1 核心创新点 本模型通过三阶段…...

案例4:鸢尾花分类(pytorch)

一、引言 鸢尾花分类是机器学习领域的经典案例&#xff0c;常用于演示分类算法的基本原理和应用。本案例使用 PyTorch 构建一个简单的神经网络模型&#xff0c;对鸢尾花进行分类。通过该案例&#xff0c;我们可以学习如何使用 PyTorch 进行数据处理、模型构建、训练和评估&…...

本地部署Stable Diffusion生成爆火的AI图片

直接上代码 Mapping("/send") Post public Object send(Body String promptBody) { JSONObject postSend new JSONObject(); System.out.println(promptBody); JSONObject body JSONObject.parseObject(promptBody); List<S…...

CCF-CSP历年真题答案1,2

本文代码主要来自up主圣斗士-DS-ALGO对历年真题的讲解&#xff0c;在此特别感谢。 侵权则删。 10.1_分蛋糕_2017_03 #include <iostream> using namespace std;int main() {int a[1000], n, k; // 定义数组a用于存储蛋糕的重量&#xff0c;整数n表示蛋糕的数量&#xf…...

【MySQL】一篇讲懂什么是聚簇索引和非聚簇索引(二级索引)以及什么是回表?

1.聚簇索引&#xff1a; 叶子节点直接存储了完整的数据行。 每个表只能有一个聚簇索引&#xff0c;通常是主键(Primary Key)。如果没有定义主键&#xff0c;则MySQL会选择一个唯一且非空索引作为聚簇索引。 特点&#xff1a; 数据存储&#xff1a;叶子结点存储完整的数据行…...

炫酷的HTML5粒子动画特效实现详解

炫酷的HTML5粒子动画特效实现详解 这里写目录标题 炫酷的HTML5粒子动画特效实现详解项目介绍技术栈项目架构1. HTML结构2. 样式设计 核心实现1. 粒子类设计2. 动画效果实现星空效果烟花效果雨滴效果 3. 鼠标交互 性能优化效果展示总结 项目介绍 本文将详细介绍如何使用HTML5 C…...

go-zero学习笔记

内容不多&#xff0c;只有部分笔记&#xff0c;剩下的没有继续学下去&#xff0c;包括路由与处理器、日志中间件、请求上下文 文章目录 1、go-zero核心库1.1 路由与处理器1.2 日志中间件1.3 请求上下文 1、go-zero核心库 1.1 路由与处理器 package mainimport ("github…...

QuecPython 网络协议之TCP/UDP协议最祥解析

概述 IP 地址与域名 IP 地址是网络中的主机地址&#xff0c;用于两台网络主机能够互相找到彼此&#xff0c;这也是网络通信能够成功进行的基础。IP 地址一般以点分十进制的字符串来表示&#xff0c;如192.168.1.1。 ​ 我们日常访问的网站&#xff0c;其所在的服务器主机都有…...

FPGA_YOLO(二)

上述对cnn卷积神经网络进行介绍,接下来对YOLO进行总结,并研究下怎么在FPGA怎么实现的方案。 对于一个7*7*30的输出 拥有49个cell 每一个cell都有两个bbox两个框,并且两个框所包含的信息拥有30个 4个坐标信息和一个置信度5个,剩下就是20个类别。 FPGA关于YOLO的部署 1…...

Camera2 与 CameraX 闲谈

目录 &#x1f4c2; 前言 1. &#x1f531; Camera2 2. &#x1f531; CameraX 3. &#x1f531; Camera2 与 CameraX 1&#xff09;使用复杂度与开发效率 2&#xff09;控制能力与应用场景 3&#xff09;设备兼容性与稳定性 4&#xff09;更新与维护 4. &#x1f4a0…...

【零基础入门unity游戏开发——2D篇】2D物理系统 —— 2D刚体组件(Rigidbody 2d)

考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…...

【论文#目标检测】YOLO9000: Better, Faster, Stronger

目录 摘要1.引言2.更好&#xff08;Better&#xff09;3.更快&#xff08;Faster&#xff09;4.更健壮&#xff08;Stronger&#xff09;使用 WordTree 组合数据集联合分类和检测评估 YOLO9000 5.结论 Author: Joseph Redmon; Ali Farhadi Published in: 2017 IEEE Conference …...

C++异常处理时的异常类型抛出选择

在 C 中选择抛出哪种异常类型&#xff0c;主要取决于错误的性质以及希望传达的语义信息。以下是一些指导原则&#xff0c;帮助在可能发生异常的地方选择合适的异常类型进行抛出&#xff1a; 1. std::exception 适用场景&#xff1a;作为所有标准异常的基类&#xff0c;std::e…...

centos 7 搭建FTP user-list用户列表

在 CentOS 7 上搭建基于 user_list 的 FTP 用户列表&#xff0c;你可以按以下步骤操作&#xff1a; 1. 安装 vsftpd 服务 若还未安装 vsftpd&#xff0c;可以使用以下命令进行安装&#xff1a; bash yum install -y vsftpd2. 启动并设置开机自启 vsftpd 服务 bash systemctl…...

vulnhub-Tr0ll ssh爆破、wireshark流量分析,exp、寻找flag。思维导图带你清晰拿到所以flag

vulnhub-Tr0ll ssh爆破、wireshark流量分析&#xff0c;exp、寻找flag。思维导图带你清晰拿到所以flag 1、主机发现 arp-scan -l 2、端口扫描 nmap -sS -sV 192.168.66.185 nmap -sS -A -T4 -p- 192.168.66.185 nmap --scriptvuln 192.168.66.185经典扫描三件套&#xff0c;…...

k8s中service概述(二)NodePort

NodePort 是 Kubernetes 中一种用于对外暴露服务的 Service 类型。它通过在集群的每个节点上开放一个静态端口&#xff08;NodePort&#xff09;&#xff0c;使得外部用户可以通过节点的 IP 地址和该端口访问集群内部的服务。以下是关于 NodePort Service 的详细说明&#xff1…...

搭建Redis哨兵集群

停掉现有的redis集群 因为这篇文章我是在 搭建完redis主从集群之后写的&#xff0c;如果要是没有搭建过这些&#xff0c;可以直接略过。要是从我上一篇 搭建redis主从集群过来的&#xff0c;可以执行下。 docker compose down 查找下redis相关进程 ps -ef | grep redis 可以看…...

.Net SSO 单点登录方式

SSO单点登录目的 之前一般来讲系统简单&#xff0c;登录后 本地 cookie 加服务器 session 存储用户身份信息&#xff0c;以此为依据来判断用户再次登录时免验证 但随着互联网发展&#xff0c;很多应用 部署在不同的服务器上&#xff0c;而用户体系是一套&#xff0c;那么按照原…...

SQL 基础 BETWEEN 的常见用法

在SQL中&#xff0c;BETWEEN是一个操作符&#xff0c;用于选取介于两个值之间的数据。 它包含这两个边界值。BETWEEN操作符常用于WHERE子句中&#xff0c;以便选取某个范围内的值。 以下是BETWEEN的一些常见用法&#xff1a; 选取介于两个值之间的值&#xff1a; 使用 BETWE…...

ngx_http_add_location

声明在 src\http\ngx_http_core_module.c ngx_int_t ngx_http_add_location(ngx_conf_t *cf, ngx_queue_t **locations,ngx_http_core_loc_conf_t *clcf); 定义在 src\http\ngx_http.c ngx_int_t ngx_http_add_location(ngx_conf_t *cf, ngx_queue_t **locations,ngx_http…...

深入探索ArkUI中的@LocalBuilder装饰器:构建高效可维护的UI组件

在ArkUI框架中&#xff0c;组件化开发是提升代码复用性和维护性的关键手段。随着项目复杂度的增加&#xff0c;开发者常常面临如何在保持组件封装性的同时&#xff0c;灵活处理组件内部逻辑的问题。传统的Builder装饰器虽然提供了强大的自定义构建能力&#xff0c;但在某些场景…...

视频知识库初步设想

将视频字幕提取出来作为知识库来源定位,下一步设想:把视频上的图片信息也精简出来作为定位。 下面是测试例子: 入参: {"model":"deepseek-ai/DeepSeek-R1-Distill-Llama-8B","messages":[{"role":"system","cont…...

微信小程序中使用Less样式方法

在微信小程序中使用Less样式&#xff0c;可以通过以下步骤实现。主要原理是借助Visual Studio Code&#xff08;VSCode&#xff09;的插件将Less文件自动编译为小程序支持的.wxss文件&#xff0c;或通过微信开发者工具的扩展功能直接集成Less编译环境。以下是具体方法&#xff…...

2024年MathorCup数学建模A题移动通信网络中PCI规划问题解题全过程文档加程序

2024年第十四届MathorCup高校数学建模挑战赛 A题 移动通信网络中PCI规划问题 原题再现&#xff1a; 物理小区识别码(PCI)规划是移动通信网络中下行链路层上&#xff0c;对各覆盖小区编号进行合理配置&#xff0c;以避免PCI冲突、PCI混淆以及PCI模3干扰等现象。PCI规划对于减少…...

本周安全速报(2025.3.18~3.24)

合规速递 01 2025欧洲网络安全报告&#xff1a;DDoS攻击同比增长137%&#xff0c;企业应如何应对&#xff1f; 原文: https://hackread.com/european-cyber-report-2025-137-more-ddos-attacks/ 最新的Link11《欧洲网络安全报告》揭示了一个令人担忧的趋势&#xff1a;DDo…...

力扣刷题-热题100题-第23题(c++、python)

206. 反转链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/reverse-linked-list/solutions/551596/fan-zhuan-lian-biao-by-leetcode-solution-d1k2/?envTypestudy-plan-v2&envIdtop-100-liked 常规法 记录前一个指针&#xff0c;当前指针&am…...

YAML是什么?

YAML&#xff08;YAML Ain’t Markup Language&#xff09;是一种以数据为中心、高度可读的序列化语言&#xff0c;广泛应用于配置文件、数据交换和自动化工具中。以下从多个维度对其进行全面解析&#xff1a; 1. 定义与历史演变 全称与定位&#xff1a; YAML的全称最初为“Yet…...

期权交易投资怎么操作?新手期权操作指南

期权就是股票&#xff0c;唯一区别标的物上证指数&#xff0c;会看大盘吧&#xff0c;新手做期权交易两个方向认购做多&#xff0c;认沽做空&#xff0c;双向t0交易没了&#xff0c;跟期货一样&#xff0c;对的&#xff0c;玩的也是合约&#xff0c;唯一区别没有保证金不会爆仓…...

音视频学习(三十):fmp4

FMP4&#xff08;Fragmented MP4&#xff09;是 MP4&#xff08;MPEG-4 Part 14&#xff09;的扩展版本&#xff0c;它支持流式传输&#xff0c;并被广泛应用于DASH&#xff08;Dynamic Adaptive Streaming over HTTP&#xff09;和HLS&#xff08;HTTP Live Streaming&#xf…...

破局AI落地困局 亚信科技“四位一体手术刀“切开产业智能三重枷锁

当全球进入以AI为核心竞争力的新经济周期&#xff0c;政企机构的数字化转型正面临关键转折点&#xff1a;IDC数据显示&#xff0c;2023年超过67%的中国企业在AI落地环节遭遇"技术断层"&#xff0c;高昂的试错成本与碎片化解决方案让智能转型陷入僵局。在此背景下&…...

android 去掉状态栏的方法汇总

在 Android 开发中&#xff0c;隐藏或去除状态栏&#xff08;Status Bar&#xff09;有多种方法&#xff0c;具体实现方式取决于应用场景和目标 Android 版本。以下是常用的 ​6 种方法及其代码示例&#xff1a; 在 Android 开发中&#xff0c;隐藏或去除状态栏&#xff08;Sta…...

jenkins+1panel面板java运行环境自动化部署java项目

本文章不包含1panel面板安装、jenkins部署、jenkins连接git服务器等操作教程&#xff0c;如有需要可以抽空后期补上 jenkins安装插件Publish Over SSH 在系统配置添加服务器 查看项目的工作空间 项目Configure->构Post Steps选择Send files or execute commands over SSH…...

VLAN综合实验报告

一、实验拓扑 网络拓扑结构包括三台交换机&#xff08;LSW1、LSW2、LSW3&#xff09;、一台路由器&#xff08;AR1&#xff09;以及六台PC&#xff08;PC1-PC6&#xff09;。交换机之间通过Trunk链路相连&#xff0c;交换机与PC、路由器通过Access或Hybrid链路连接。 二、实验…...

雷军从 6 楼扔涂有防弹涂层西瓜,西瓜完好无损,这种防弹涂层是什么材质?用在车上效果怎么样?

雷军展示的“防弹涂层”是一种基于第四代高分子材料聚脲&#xff08;Polyurea&#xff09;的升级技术&#xff0c;其核心特性是通过纳米级交联结构形成弹性防护层&#xff0c;兼具柔韧性与刚性&#xff0c;能够有效吸收冲击能量并抵御尖锐物体的穿刺。以下是关于该涂层材质及在…...

信奥赛CSP-J复赛集训(模拟算法专题)(31):P2692 覆盖

信奥赛CSP-J复赛集训&#xff08;模拟算法专题&#xff09;&#xff08;31&#xff09;&#xff1a;P2692 覆盖 题目背景 WSR 的学校有 B B B 个男生和 G G G 个女生都来到一个巨大的操场上扫地。 题目描述 操场可以看成是 N N N 行 M M M 列的方格矩阵&#xff0c;如下…...

数据库联表Sql语句建一个新表(MySQL,Postgresql,SQL server)

数据库联表Sql语句建一个新表(MySQL,Postgresql,SQL server) 如果你想基于 SELECT USERS.ID,USERS.NAME,USERS.EMAIL,USERS.ID_CARD,USERS.V_CARD,USERS.ADDRESS,v_card.type,v_card.amount FROM USERS JOIN v_card on USERS.V_CARDv_card.v_card 这个查询结果创建一个新表&am…...

【Go】结构体的基本使用

go语言不是面向对象的语言 但是结构体类似于面向对象 结构体的定义 package mainimport "fmt"type Student struct {id intname stringage intschool string }func main() {s : Student{1, "luobozi", 18, "znl"}fmt.Println(s) }结构…...

统计可重复列表中的TOP N

文章目录 方案1&#xff1a;HashMap统计 全排序实现步骤&#xff1a;代码实现&#xff1a;优缺点&#xff1a; 方案2&#xff1a;HashMap统计 最小堆&#xff08;优先队列&#xff09;实现步骤&#xff1a;代码实现&#xff1a;优缺点&#xff1a; 方案3&#xff1a;Java Str…...