[杂学笔记]工厂模式、多态、内存空间区域划分、cp指令破坏软连接问题、UDP如何实现可靠传输、滑动窗口的原理、进程与线程、线程之间的通信
目录
1.工厂模式
2.多态
3.内存空间区域划分
4.cp指令破坏软连接问题
5.UDP实现可靠传输
6.滑动窗口的原理
7.进程与线程
8.线程之间的通信
1.工厂模式
工厂模式是一种创建对象的设计模式。它提供了一种创建对象的方式,将对象的创建和使用分离,通过一个工厂类来负责创建对象。这样可以将对象创建的逻辑封装在工厂类中,而不是在使用对象的代码中直接通过new操作符来创建对象。
优势:工厂类接口会直接返回对象,不需要关心对象如何创建的。那么在创建对象的时候,如果想改变对象的创建方式,直接在工厂类代码中改变即可,不需要再依次的修改创建对象的new代码了。配合多态体系的话,还可以降低mian函数与具体产品类的耦合度。例如:有A、B两个类,再创建的时候就需要A* a = new A(); B* b = new B();而使用多态和工厂模式的话就直接这样就好了 Product* a = CarFactory::createCar("A");Product* b = CarFactory::createCar("B");产品再多的话,也是使用同一个父类,调用同一个工厂类函数。
缺点:如果产品种类过多的话,会导致工厂的代码变得复杂,难以维护。
#include <iostream>// 汽车抽象类
class Car {
public:virtual void drive() = 0;
};// 轿车类
class Sedan : public Car {
public:void drive() override {std::cout << "Driving a sedan." << std::endl;}
};// SUV类
class SUV : public Car {
public:void drive() override {std::cout << "Driving an SUV." << std::endl;}
};// 汽车工厂类
class CarFactory {
public:static Car* createCar(std::string carType) {if (carType == "sedan") {return new Sedan();} else if (carType == "suv") {return new SUV();}return nullptr;}
};int main() {// 通过工厂类创建轿车对象Car* sedan = CarFactory::createCar("sedan");if (sedan) {sedan->drive();delete sedan;}// 通过工厂类创建SUV对象Car* suv = CarFactory::createCar("suv");if (suv) {suv->drive();delete suv;}return 0;
}
2.多态
- 静态多态:也称为编译时多态,体现在函数重载和运算符重载方面,在编译阶段就已经去确定了函数调用的具体版本了。他底层会对同名函数,根据函数的参数列表的个数、顺序以及类型生成新的函数名称,就可以确定调用哪个函数了。静态多态的执行效率高。
- 多态多态:也称为运行时多态,体现在继承和虚函数体系下。在父类中声明虚函数,子类重写虚函数。当通过父类的指针或者引用调用虚函数的时候,程序会在运行的时候根据指针或者引用所指向的实际对象的类型来决定调用哪一个版本的虚函数。但是在底层实际上是,在创建子类的时候,子类重写的虚函数会覆盖虚函数表中的地址,那么父类指针指向子类对象的时候,访问虚函数表地址访问的就是子类覆盖后的地址,实现了指向子类的话就会调用子类的函数。
3.内存空间区域划分
从低到高分别为:代码区、字符常量区、静态存储区(已初始化全局数据区、未初始化全局数据区)、堆区、共享区、栈区、命令行参数与环境变量区、内核空间区域。其中共享区会存放一些共享内存、消息队列、动态库等等的映射。
4.cp指令破坏软连接问题
cp默认复制一个软连接的时候,会对软连接进行解引用,来访问到软连接指向的文件,从而拷贝文件的内容,拷贝后的内容是一个普通文件,而不是拷贝一个软连接。
那么如何拷贝软连接呢?使用-a、-d或者-P选项,在遇到软连接的时候,会直接复制符号连接本身。
5.UDP实现可靠传输
因为UDP是传输层属于系统层面,我们无法去更改传输层的执行操作,只能在用户层进行编程来实现UDP的可靠传输。通过增加用户层自定义协议的报头字段,把UDP中没有的报头字段在应用层添加就好了。
- 确认应答机制与超时重传机制:可以在发送的数据报内部带有TCP类似的确认序号字段。发送方在发送数据之后设置定时器,并保存发送的数据,如果一段时间内没有收到确认序号的话,就重新发送该数据报
- 32位序号:在用户层中定义一个类似于TCP的接收缓冲区,将接收的数据放到缓冲区中,根据报头的序号进行排序,排序之后就知道有没有丢包了,之后再进行数据的处理。
6.滑动窗口的原理
TCP的发送缓冲区内部被划分为了三个区域,分别是已发送已确认区域,已发送未确认区域以及待发送区域。当发送方接收到了ACK应答报文,会根据确认序号移动指针来改变区域的划分。如果说丢包了,会收到连续相同序号的ACK应答报文,会将待发送区域的指针移动到ACK报文的确认序号位置,重新发送数据。如果说没有任何问题的话,就会将确认的数据划分到已发送已确认的区域了。
通过滑动窗口的区域划分实现了将没有收到确认序号的报文保存起来的作用,当收到后也不需要释放这部分数据,而是等待其他数据到来将其覆盖即可。同时实现了流量控制,接收方可以通过调整窗口的大小来控制发送方发送数据的速率。
7.进程与线程
进程是CPU执行调度的基本单位,每个进程都拥有自己独立的地址空间,不同进程之间是无法直接进行互相访问数据资源的。线程是进程内部的一个执行流。一个进程可以包括多个线程,这些线程共享一个进程地址空间,那么也使得线程之间可以执行进行数据的相互访问操作。
进程的创建开销相对来说较大,每一个线程都需要创建内存空间、进行页表映射、创建文件描述符表等等操作。而线程只需要创建一个PCB结构就可以,内部的很多内容都是共享一个进程的,所以不需要单独创建了。
通信上来看,进行之间的通信相对复杂一下,管道需要创建文件、消息队列和共享内存需要申请内存空间并建立页表映射、信号量也不例外。进程间的通信首先就是需要让进程之间都能访问到同一个资源,那么必定会麻烦一些。而线程是直接共享进程内的变量,没有通信会方便一些,那么同时也缺乏独立性,一个线程崩溃了会导致整个进程奔溃。
8.线程之间的通信
- 共享内存(变量):线程是共享进程的地址空间的,所以可以随意访问进程内的变量。
- 条件变量:通常和互斥锁一起使用,用于实现线程之间的同步。一个线程会等待某一个条件的就绪,另一个线程会再条件满足的时候通知等待的线程。那么这个线程就可以继续向下执行了。
- 信号量:本质上是一个计数器,通常也是配合锁用于实现线程之间的同步。在线程访问资源之前需要先申请信号量,如果没有的话就需要等待了。
相关文章:
[杂学笔记]工厂模式、多态、内存空间区域划分、cp指令破坏软连接问题、UDP如何实现可靠传输、滑动窗口的原理、进程与线程、线程之间的通信
目录 1.工厂模式 2.多态 3.内存空间区域划分 4.cp指令破坏软连接问题 5.UDP实现可靠传输 6.滑动窗口的原理 7.进程与线程 8.线程之间的通信 1.工厂模式 工厂模式是一种创建对象的设计模式。它提供了一种创建对象的方式,将对象的创建和使用分离,通…...
【IEEE出版,往届会后3个月EI检索 | 西华大学主办 | 中英文期刊、SCI期刊推荐】第四届能源、电力与电气国际学术会议(ICEPET 2025)
第四届能源、电力与电气国际学术会议(ICEPET 2025)由西华大学主办,西华大学能源与动力工程学院、西华大学电气与电子信息学院、西华大学航空航天学院、流体及动力机械教育部重点实验室、流体机械及工程四川省重点实验室、四川省水电能源动力装…...
【AI+智造】DeepSeek价值重构:当采购与物控遇上数字化转型的化学反应
作者:Odoo技术开发/资深信息化负责人 日期:2025年2月24日 引言:从事企业信息化工作16年,我见证过无数企业从手工台账到ERP系统的跨越。但真正让采购和物控部门脱胎换骨的,是融合了Deepseek AI的Odoo数字化解决方案——…...
1.适配器模式
概述 适配器模式:将一个类的接口转换成客户希望的另一个接口,使得原本不兼容的类可以一起工作。 适配器模式在业务场景中非常有用,尤其是在系统集成、接口兼容性处理以及代码复用等场景。以下是一个实际的业务场景示例: 业务场景…...
选择排序(详解)c++
选择排序(Selection Sort)是⼀种特别直观的排序算法。每次找出未排序序列中最⼩的元素,然后放进有序序列的后⾯ 算法思想: 每次找出未排序序列中最小的元素,然后放进有序序列的后面 在数组中完成选择排序 落实到代码的时候就两步:找最小交换 …...
[java基础-JVM篇]1_JVM自动内存管理
JVM内存管理涉及但不限于类加载、对象分配、垃圾回收等,本篇主要记录运行时数据区域与对象相关内容。 内容主要来源《深入理解Java虚拟机:JVM高级特性与最佳实践》与官方文档,理解与表述错漏之处恳请各位大佬指正。 目录 运行时数据区域 栈 栈…...
python-leetcode 42.验证二叉搜索树
题目: 给定二叉树的根节点root,判断是否是一个有效二叉搜索树 有效二叉搜索树: 1.节点的左子树只包含小于当前节点的树 2.节点的右子树只包含大于当前节点的树 3.所有左子树和右子树自身必须也是二叉搜索树 方法一:递归 如果该二叉树的…...
Unity Shader 学习13:屏幕后处理 - 使用高斯模糊的Bloom辉光效果
目录 一、基本的后处理流程 - 以将画面转化为灰度图为例 1. C#调用shader 2. Shader实现效果 二、Bloom辉光效果 1. 主要变量 2. Shader效果 (1)提取较亮区域 - pass1 (2)高斯模糊 - pass2&3 (3ÿ…...
【Bluedroid】AVRCP 连接源码分析(三)
接着上一篇【Bluedroid】AVRCP 连接源码分析(一)-CSDN博客,继续AVRCP连接的源码分析。 AVRC_OpenBrowse /packages/modules/Bluetooth/system/stack/avrc/avrc_api.cc /******************************************************************************** Function …...
图数据库Neo4j面试内容整理-约束(Constraint)
约束(Constraint) 是数据库中用于确保数据一致性和完整性的一种机制。它限制了数据的某些方面,确保特定条件得到满足。在 Neo4j 中,约束主要用于确保图数据的一致性,防止插入不符合规则的数据。约束通常与索引一起使用,但它们的功能和目的有所不同。 1. Neo4j 中的约束类…...
QUdpSocket的readyRead信号只触发一次
问题 QUdpSocket的readyRead信号只触发一次。 原因 on_readyRead槽函数里必须读出现有数据后,才能触发新的事件。 解决办法 在on_readyRead槽函数里取出数据。 void MainWindow::on_readyRead() {qDebug() << "on_readyRead in";while (m_udp…...
使用Windbg调试目标进程排查C++软件异常的一般步骤与要点分享
目录 1、概述 2、将Windbg附加到已经启动起来的目标进程上,或者用Windbg启动目标程序 2.1、将Windbg附加到已经启动起来的目标进程上 2.2、用Windbg启动目标程序 2.3、Windbg关联到目标进程上会中断下来,输入g命令将该中断跳过去 3、分析实例说明 …...
深度解析:大模型在多显卡服务器下的通信机制与分布式训练——以DeepSeek、Ollama和vLLM为例
一、引言:大模型与多显卡的必然结合 随着大模型参数规模突破千亿级(如GPT-4、DeepSeek),单显卡的显存容量与算力已无法满足需求。多显卡并行计算成为训练与推理的核心技术,其核心挑战在于高效通信与负载均衡。本文以国…...
爬虫基础入门之爬取豆瓣电影Top250-Re正则的使用
网址:豆瓣电影 Top 250 本案例所需要的模块 requests (用于发送HTTP请求)re (用于字符串匹配和操作) 确定需要爬取的数据 : 电影的名称电影的年份电影的评分电影评论人数 一. 发送请求 模拟浏览器向服务器发送请求 准备工作 -分析页面: F12 or 右击点击检查 查看…...
【R安装包报错】在conda环境下用R语言命令安装R包报错
报错如下: gnu/include/c/11.2.0/ctime:80:11: error: ‘timespec_get’ has not been declared in ‘::’ 80 | using ::timespec_get; | ^~~~~~~~~~~~ 修改 报错原因:如果使用的是conda安装的g,可能与系统库不兼容。尝试 切换到系统默认编…...
基于STM32单片机设计的宠物喂食监控系统
1. 项目开发背景 随着宠物数量的增加,尤其是人们对宠物的养护需求日益增多,传统的人工喂养和管理方式难以满足现代养宠生活的需求。人们越来越希望通过智能化手段提高宠物养护的质量和效率,特别是对于宠物喂食、饮水、温湿度控制等方面的智能…...
Minio分布式多节点多驱动器集群部署
Minio分布式多节点多驱动器集群部署 Minio分布式多节点多驱动器集群部署节点规划先决条件开放防火墙端口设置主机名更新域名映射文件时间同步存储要求内存要求 增加虚拟机磁盘(所有机器都要执行)部署分布式 MinIO测试上传与预览测试高可用MinIO 配置限制模拟单节点磁盘故障模拟…...
Web前端开发——HTML基础
本系列博客声明,根据本人所学书籍和网上的一些资料共同磨合,写下web前端系列的博客 HTML基础 一、HTML基本概述[^1]二、HTML大体认知1.HTML基本结构2.HTML 语法格式 三、THML常用标记[^2]1.文本标记(1)标题(2…...
《计算机视觉》——图像拼接
图像拼接 图像拼接是将多幅有重叠区域的图像合并成一幅全景或更大视角图像的技术,以下为你详细介绍: 原理:图像拼接的核心原理是基于图像之间的特征匹配。首先,从每幅图像中提取独特的特征点,如角点、边缘点等&#x…...
zookeeper从入门到精通
一、入门基础 1.1 什么是 ZooKeeper ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,后成为 Apache 的顶级项目。它为分布式应用提供了高效、可靠的协调服务,例如统一命名服务、配置管理、分布式锁、集群管理等。ZooKeeper 的数据模型类…...
2.2 添加注释
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 注释是为了方便理解代码含义而添加的简短的解释性说明。在编译时,编辑器不会将注释加入最终生成的文件中,不…...
具有快慢思考的语言调节机器人操作
24年1月来自华东师范大学、美的集团和上海大学的论文“Language-Conditioned Robotic Manipulation with Fast and Slow Thinking”。 语言调节机器人操作,旨在将自然语言指令转化为可执行动作,从简单的“拾取和放置”到需要意图识别和视觉推理的任务。…...
美颜相机1.0
项目开发步骤 1 界面开发 美颜相机界面构成: 标题 尺寸 关闭方式 位置 可视化 2 创建主函数调用界面方法 3 添加两个面板 一个是按钮面板一个是图片面板 用JPanel 4 添加按钮到按钮面吧【注意:此时要用初始化按钮面板的方法initBtnPanel 并且将按钮添…...
Css3重点知识讲解
选择器 优先级: id 选择器 > 类选择器 > 标签选择器 类选择器: .myClass {color: blue; }id 选择器(全局唯一): #myId {color: green; }标签选择器: p {color: red; }层次选择器: /…...
[Web 安全] Web 安全攻防 - 学习手册
关联专栏:[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01:Web 安全攻防 —— 信息收集篇 Web 信息收集 — 手动收集域名信息 Web 信息收集 — 手动收集 IP 信息 Web 信息收集 — 端口服务信息收集 Web 信息收集 — 自动化信息收集 — ShuiZe 水泽 We…...
nextjs的记录一些小东西
1. 格式化时间:使用date-fns库 npm install date-fns 在组建中创建date.js import { parseISO, format } from date-fnsexport default function Date({ dateString }) {const date parseISO(dateString)return <time dateTime{dateString}>{format(date,…...
故障诊断 | PID搜索算法优化CatBoost故障诊断(MatlabPython)
目录 效果一览文章概述故障诊断 | PID搜索算法优化CatBoost故障诊断(Matlab&Python)PID搜索算法优化CatBoost故障诊断PID搜索算法优化CatBoost故障诊断一、引言1.1、研究背景与意义1.2、研究现状1.3、研究目的与内容二、CatBoost算法概述2.1、CatBoost算法原理2.2、CatBo…...
探索关键领域的AI工具:机器学习、深度学习、计算机视觉与自然语言处理
引言 在人工智能(AI)迅猛发展的今天,机器学习(ML)、深度学习(DL)、计算机视觉(CV)和自然语言处理(NLP)已经成为解决复杂问题的关键技术。无论是自动驾驶车辆的视觉识别,还是智能助手的对话理解,这些技术都在改变着世界。本文将介绍在各个领域…...
使用 DeepSeek 生成流程图、甘特图与思维导图:结合 Typora 和 XMind 的高效工作流
在现代工作与学习中,可视化工具如流程图、甘特图和思维导图能够极大地提升信息整理与表达的效率。本文将详细介绍如何使用 DeepSeek 生成 Mermaid 文本,结合 Typora 快速生成流程图和甘特图,并通过 Markdown 格式生成思维导图,最终…...
11、集合框架
一、简介 Java集合框架位于java.util包中 Collection是Set和List的父类,Collections是工具类,提供了对集合进行排序、遍历等多种算法的实现。 ArrayList: 有序(放进去顺序和拿出来顺序一致),可重复 HashSet: 无序(放进去顺序和拿出来顺序不…...
从入门到精通Rust:资源库整理
今天给大家分享一些优质的Rust语言学习资源,适合不同水平的学习者。前三个官方资源是我Rust语言的启蒙老师,非常平易近人。 官方资源 The Rust Programming Language (The Book) 链接: https://doc.rust-lang.org/book/ 简介: 官方权威指南,…...
Spring Boot 项目启动命令大全:参数详解与高阶用法
Spring Boot 项目启动命令大全:参数详解与高阶用法 一、基础启动命令 默认启动命令 java -jar xxx.jar适用场景:开发环境快速启动,使用默认配置(端口 8080,内存由 JVM 自动分配)。 指定 JVM 内存参数 java…...
c++day4
作业 #include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> #include <sstream> #include <vector> #include <memory>using namespace std; class S{ private:int a;int b; public:S(i…...
应对LLM应用中的AI幻觉,如何通过Token对数概率预测LLM的可靠性
应对LLM应用中的AI幻觉 如何通过Token对数概率预测LLM的可靠性 内容: 1. 相关机器学习(ML)概念回顾(精准度/召回率,LLM直觉) 2. 使用序列对数概率度量作为LLM信心 3. 通过案例研究结果过滤低质量LLM输出…...
Openwrt路由器操作系统
一、什么是 OpenWrt? OpenWrt 是一个基于 Linux 的开源操作系统,主要设计用于嵌入式设备,尤其是路由器。与其说是传统的路由器固件,不如说它是一个路由器操作系统。 传统的路由器固件通常由路由器厂商开发,功能相对固…...
基于SpringBoot的“流浪动物救助系统”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“流浪动物救助系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 局部E-R图 系统首页界面 系统…...
Ansible 学习笔记
这里写自定义目录标题 基本架构文件结构安装查看版本 Ansible 配置相关文件主机清单写法 基本架构 Ansible 是基于Python实现的,默认使用22端口, 文件结构 安装 查看用什么语言写的用一下命令 查看版本 Ansible 配置相关文件 主机清单写法...
(六)趣学设计模式 之 代理模式!
目录 一、啥是代理模式?二、为什么要用代理模式?三、代理模式的实现方式1. 静态代理2. JDK动态代理3. CGLIB动态代理 四、三种代理的对比五、代理模式的优缺点六、代理模式的应用场景七、总结 🌟我的其他文章也讲解的比较有趣😁&a…...
【CSS】HTML元素布局基础总结
HTML默认布局和元素显示 CSS 元素显示 { HTML 默认布局: 流式布局 { 从左到右,从上到下 随页面宽度变化动态排列元素 文档流:整个 H T M L 文档的流式布局 HTML 元素分为 { 块级元素 :默认占满一行 行内元素 :在行内最…...
【JavaScript】什么是JavaScript?以及常见的概念
作为 JavaScript 初学者,想要更好地理解这门语言,需要从核心概念、实践练习和项目实战三个方面入手。下面是详细的学习路线和方法,帮助你系统性地掌握 JavaScript。 一、理解 JavaScript 的核心概念 JavaScript 是一门动态、弱类型的编程语言…...
为什么要将PDF转换为CSV?CSV是Excel吗?
在企业和数据管理的日常工作中,PDF文件和CSV文件承担着各自的任务。PDF通常用于传输和展示静态的文档,而CSV因其简洁、易操作的特性,广泛应用于数据存储和交换。如果需要从PDF中提取、分析或处理数据,转换为CSV格式可能是一个高效…...
P1038 [NOIP 2003 提高组] 神经网络
题目描述 在兰兰的模型中,神经网络就是一张有向图,图中的节点称为神经元,而且两个神经元之间至多有一条边相连,下图是一个神经元的例子: 神经元(编号为 i) 图中,X1∼X3 是信息…...
TypeScript 类型断言的适用场景及代码示例
类型断言的适用场景及代码示例 适用场景 类型断言就像是你很确定某个东西是什么,然后直接告诉 TypeScript 编译器“相信我,它就是这个类型”。以下是几种常见的适用场景: 从 any 类型恢复具体类型:当你使用 any 类型时…...
Docker 容器
Docker 是一种开源的容器化平台,可以让开发人员将应用程序及其依赖项打包到一个可移植的容器中,然后部署到任何支持 Docker 的环境中。Docker 的基本概念包括以下几点: 1. **容器(Container)**:容器是一个独立、轻量级的运行环境…...
Spark(3)vi的基本使用
一.打开与创建文件 二.三种模式 三. 光标操作 四.复制粘贴 一.打开与创建文件 它是linux的内置命令,所以还是以命令的方式来运行。 命令的格式是:Vi /路径/文件名。要注意如下两种情况: 1.如果这个文件不存在,此时就是新建文…...
element-ui的组件使用
1. 安装 Element UI(在文件夹最上面输入cmd进入dos窗口,然后输入安装指令 npm install element-ui --save) 2.在main.js文件全局引入(main.js文件负责 全局注册 ),在该文件注册的所有组件在其他文件都能直接调用,一般…...
Starlink卫星动力学系统仿真建模第九讲-滑模(SMC)控制算法原理简介及卫星控制应用
滑模控制(Sliding Mode Control)算法详解 一、基本原理 滑模控制(Sliding Mode Control, SMC)是一种变结构控制方法,通过设计一个滑模面(Sliding Surface),迫使系统状态在有限时间内…...
《深度剖析Linux 系统 Shell 核心用法与原理_666》
1. 管道符的用法 查找当前目录下所有txt文件并统计行数 # 使用管道符将ls命令的结果传递给wc命令进行行数统计 ls *.txt | wc -l 在/etc目录下查找包含"network"的文件并统计数量 # 使用find命令查找文件,并通过grep查找包含特定字符串的文件…...
51单片机学习之旅——定时器
打开软件 1与其它等于其它,0与其它等于0 1或其它等于1,0或其它等于其它 TMODTMOD&0xF0;//0xF01111 0000进行与操作,高四位保持,低四位清零,高四位定时器1,低四位定时器0 TMODTMOD|0x01;//0x010000 0…...
超详细介绍map(multimap)的使用
map类的介绍 map的声明如下,Key是map底层关键字的类型,T是map底层value的类型。set默认要求Key支持小于比较,如果不支持或者需要的情况下我们可以自行传入仿函数,map底层存储数据的内存是从空间申请来的。一般情况下,我…...