[杂学笔记]工厂模式、多态、内存空间区域划分、cp指令破坏软连接问题、UDP如何实现可靠传输、滑动窗口的原理、进程与线程、线程之间的通信

news2025/2/26 18:03:10

目录

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.线程之间的通信

  • 共享内存(变量):线程是共享进程的地址空间的,所以可以随意访问进程内的变量。
  • 条件变量:通常和互斥锁一起使用,用于实现线程之间的同步。一个线程会等待某一个条件的就绪,另一个线程会再条件满足的时候通知等待的线程。那么这个线程就可以继续向下执行了。
  • 信号量:本质上是一个计数器,通常也是配合锁用于实现线程之间的同步。在线程访问资源之前需要先申请信号量,如果没有的话就需要等待了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2306506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Android】用 chrome://inspect/#devices 调试H5页面

通常做Android开发的过程中&#xff0c;不可避免的需要遇到去与H5交互&#xff0c;甚至有时候需要去调试H5的信息。 这里分享一下Android工程里如何调试H5页面信息&#xff1a; 直接在浏览器地址栏输入 &#xff1a; chrome://inspect/#devices 直接连接手机usb,打开开发者模式…

贪心算法精品题

1.找钱问题 本题的贪心策略在于我们希望就可能的保留作用大的5元 class Solution { public:bool lemonadeChange(vector<int>& bills) {std::map<int ,int> _map;for(auto ch:bills){if(ch 5) _map[ch];else if(ch 10){if(_map[5] 0) return false;else{_m…

WEB1~6通杀

##解题思路 这六道题&#xff0c;通杀了&#xff0c;只因为是PHP的特性 来&#xff0c;看web6&#xff0c;过滤最复杂的正则&#xff0c;而且不能解析成大于999的值&#xff0c;但是&#xff0c;php是弱类型的语言&#xff0c;我只要输入任意字符数字&#xff0c;最终值就为0&…

孜然单授权系统V2.0PHP授权系统

孜然单授权V1.0系统&#xff0c;延续了2022年开发的孜然多应用授权系统V2.0 变更&#xff1a;多应用变单系统&#xff0c;去除没用的垃圾代码&#xff0c;从0开发&#xff0c;去除了一些没用的功能 完善了开发文档&#xff0c;之前那套是我写着玩的屎山代码&#xff0c;V1.0将展…

Apache SeaTunnel 构建实时数据同步管道(最新版)

文章作者 王海林 白鲸开源 数据集成引擎研发 Apache SeaTunnel Committer & PMC Member&#xff0c;Apache SkyWalking Committer&#xff0c;多年平台研发经验&#xff0c;目前专注于数据集成领域。 导读 在当今数字化快速发展的时代&#xff0c;数据已然成为企业决策…

服务器离线部署DeepSeek

目标 本次部署的目标是在本地服务器上部署DeepSeek。但是该服务不能连接外网&#xff0c;因此只能使用离线部署的方式。为了一次完成部署。现在云服务器上进行尝试。 云服务器部署尝试 云服务器配置 CentOS72080Ti 11GB 安装准备 1、上传iso并配置为本地yum源 安装前先将…

ComfyUI:Stable Diffusion 及 LoRA、VAE 、ControlNet模型解析

目录 Stable Diffusion流程 扩散过程 去噪过程 checkpoints LoRA LoRA 位置与结构 LoRA 层与原层的关系 LoRA 层的参数拆解 VAE 训练特定 VAE 时更新的参数部分 ControlNet ControlNet 位置与结构 ControlNet 的训练过程 ControlNet 的参数处理与信息融合 Contr…

微信小程序:多菜单栏设计效果

一、实现效果 二、代码 wxml 编辑前端界面,步骤 菜单逻辑: 逐步取出数组中的项,首先取出顶部菜单项,然后选中后取出选中的底部数据(左侧菜单+右侧内容),然后点击左侧菜单取出选中的左侧菜单对应的右侧内容 ①这里我的数据是全部封装到一个数组对象的,首先我的循环…

【Linux Oracle】time命令+oracle exp压缩

Linux && Oracle相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 1.说明 Linux中的time命令&#xff1a;主要用于测量命令的执行时间&#xff0c;并显示该命令在执行过程中所使用的系统资源情况&#xff0c;如CPU时间、内存和…

20分钟 Bash 上手指南

文章目录 bash 概念与学习目的第一个 bash 脚本bash 语法变量的使用位置参数管道符号&#xff08;过滤条件&#xff09;重定向符号条件测试命令条件语句case 条件分支Arrayfor 循环函数exit 关键字 bash 脚本记录历史命令查询文件分发内容 bash 概念与学习目的 bash&#xff0…

【虚拟仪器技术】labview操作指南和虚拟仪器技术习题答案(一)

今天是2025年2月24日&#xff0c;画的是fate/Grand Order里面的阿尔托莉雅.卡斯特&#xff0c;武内老师的画。 目录 第1章 第2章 第3章 第4章 第5章 关注作者了解更多 我的其他CSDN专栏 毕业设计 求职面试 大学英语 过程控制系统 工程测试技术 虚拟仪器技术 可编程…

LabVIEW电能质量分析软件

随着电力系统的复杂性增加&#xff0c;电能质量问题日益突出&#xff0c;传统的电能质量检测装置多采用DSP技术&#xff0c;不仅开发周期长、功能单一&#xff0c;而且在多功能集成方面存在局限性。基于LabVIEW虚拟仪器开发平台的电能质量分析软件利用FFT、STFT、WT、HHT等多种…

视频裂变加群推广分享引流源码

源码介绍 视频裂变加群推广分享引流源码 最近网上很火&#xff0c;很多人都在用&#xff0c;适合引流裂变推广 测试环境&#xff1a;PHP7.4(PHP版本不限制) 第一次访问送五次观看次数&#xff0c;用户达到观看次数后需要分享给好友或者群,好友必须点击推广链接后才会增加观看次…

项目一 - 任务3:搭建Java集成开发环境IntelliJ IDEA

通过本次实战&#xff0c;我们成功搭建了Java集成开发环境IntelliJ IDEA&#xff0c;并完成了多个任务。首先&#xff0c;安装了IntelliJ IDEA并进行了个性化设置&#xff0c;如选择主题、调整字体和编码等。接着&#xff0c;创建了Java项目、包和类&#xff0c;编写并运行了简…

RoCBert:具有多模态对比预训练的健壮中文BERT

摘要 大规模预训练语言模型在自然语言处理&#xff08;NLP&#xff09;任务上取得了最新的最优结果&#xff08;SOTA&#xff09;。然而&#xff0c;这些模型容易受到对抗攻击的影响&#xff0c;尤其是对于表意文字语言&#xff08;如中文&#xff09;。 在本研究中&#xff0…

DeepSeek开源周Day2:DeepEP - 专为 MoE 模型设计的超高效 GPU 通信库

项目地址&#xff1a;https://github.com/deepseek-ai/DeepEP 开源日历&#xff1a;2025-02-24起 每日9AM(北京时间)更新&#xff0c;持续五天 (2/5)&#xff01; ​ ​ 引言 在大模型训练中&#xff0c;混合专家模型&#xff08;Mixture-of-Experts, MoE&#xff09;因其动…

六十天前端强化训练之第二天CSS选择器与盒模型深度解析

欢迎来到编程星辰海的博客讲解 目录 一、CSS 核心概念 1. 三种引入方式 2. CSS 注释 3. 常见单位系统 二、CSS选择器核心知识 1. 基础选择器类型 2. 组合选择器 3. 伪类选择器&#xff08;部分示例&#xff09; 4. 优先级计算规则 三、盒模型深度解析 1. 标准盒模型图…

分享httprunner 结合django实现平台接口自动化方案

说明&#xff0c;可以直接在某个视图集定义自定义接口来验证。 调试1&#xff1a;前端界面直接编写yaml文件. 新增要实现存数据到mysql&#xff0c;同时存文件到testcase下, 如test.yaml 更新yaml数据&#xff0c;同时做到更新 testcase下的文件&#xff0c;如test.yaml acti…

本地大模型编程实战(22)用langchain实现基于SQL数据构建问答系统(1)

使 LLM(大语言模型) 系统能够查询结构化数据与非结构化文本数据在性质上可能不同。后者通常生成可在向量数据库中搜索的文本&#xff0c;而结构化数据的方法通常是让 LLM 编写和执行 DSL&#xff08;例如 SQL&#xff09;中的查询。 我们将演练在使用基于 langchain 链 &#x…

速通HTML

目录 HTML基础 1.快捷键 2.标签 HTML进阶 1.列表 a.无序列表 b.有序列表 c.定义列表 2.表格 a.内容 b.合并单元格 3.表单 a.input标签 b.单选框 c.上传文件 4.下拉菜单 5.文本域标签 6.label标签 7.按钮标签 8.无语义的布局标签div与span 9.字符实体 HTML…