[杂学笔记]工厂模式、多态、内存空间区域划分、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.线程之间的通信

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[ComfyUI] 【AI】如何获得一张人物图片的优质描述

在使用ComfyUI时,获取一张人物图片的优质英文描述非常重要,尤其是在涉及图像生成、自动化标签和多模态AI任务时。以下是一个简单的流程,可以帮助你快速从一张人物图片中提取出精确且高质量的英文描述。 1. 打开 Hugging Face 网站 首先,您需要访问 Hugging Face 提供的 J…

DeepSeek-R1:通过强化学习激励大语言模型的推理能力

摘要 本文介绍了我们的第一代推理模型&#xff0c;DeepSeek-R1-Zero 和 DeepSeek-R1。DeepSeek-R1-Zero 是通过大规 模强化学习&#xff08;RL&#xff09;训练的模型&#xff0c;在没有使用监督微调&#xff08;SFT&#xff09;这个前置步骤的情况下&#xff0c;展示了卓越的推…

springboot004网页时装购物系统(源码+数据库+文档)

源码地址&#xff1a;网页时装购物系统 文章目录 1.项目简介2.部分数据库结构与测试用例3.系统功能结构4.包含的文件列表&#xff08;含论文&#xff09;前台运行截图后台运行截图 1.项目简介 ​ 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的…

C++ Primer 容器适配器

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

git上传gitee仓库---简单方便

安装完git以后 在资源管理器中右键&#xff1a; 选择Open Git Bash here 接着gitclone&#xff0c;从gitee上面复制链接: https://gitee.com/hekai666/python-deeplearning.git 粘贴过来&#xff1a; 回车&#xff1a; 然后在本地就会多出来一个文件&#xff1a; 打开文件夹以…

C语言(13)------------>do-while循环

1.do-while循环的语法 我们知道C语言有三大结构&#xff0c;顺序、选择、循环。我们可以使用while循环、for循环、do-while循环实现循环结构。之前的博客中提及到了前两者的技术实现。可以参考&#xff1a; C语言&#xff08;11&#xff09;-------------&#xff1e;while循…

浏览器JS打不上断点,一点就跳到其他文件里。浏览器控制台 js打断点,指定的位置打不上断点,一打就跳到其他地方了。

关闭JavaScript 源代码映射&#xff0c;F12开发者模式 设置->偏好设置->源代码/来源->JavaScript 源代码映射。 肯定不是这个原因导致的&#xff0c;但这个办法可以暂时解决问题&#xff0c;点完这个东西就隐藏了webpack&#xff0c;有懂的来讲讲。 又浪费一个小时…

C++ 编程语言简介

C 是一种通用编程语言&#xff0c;它是作为 C 语言的增强而开发的&#xff0c;以包含面向对象的范例。它是一种命令式和编译语言。 C 是一种高级的通用编程语言&#xff0c;专为系统和应用程序编程而设计。它由贝尔实验室的 Bjarne Stroustrup 于 1983 年开发&#xff0c;作为…

山东大学软件学院nosql实验三

实验题目&#xff1a; 用Java做简单查询(2学时) 实验内容 用API方式&#xff0c;做简单查询。 实验要求 在以下要求中选择至少2个&#xff0c;使用Java语言实现数据查询&#xff0c;最终把数据输出到前端界面。 &#xff08;1&#xff09;找出年龄小于20岁的所有学生 &…

【NLP 38、激活函数 ④ GELU激活函数】

别盲目&#xff0c;别着急&#xff0c;慢慢走&#xff0c;没事的 —— 25.2.24 一、定义与数学表达式 GELU&#xff08;Gaussian Error Linear Unit&#xff0c;高斯误差线性单元&#xff09;是一种结合概率分布的非线性激活函数&#xff0c;其核心思想是通过输入值服从标准正…

突破性能极限:DeepSeek开源FlashMLA解码内核技术解析

引言&#xff1a;大模型时代的推理加速革命 在生成式AI大行其道的今天&#xff0c;如何提升大语言模型的推理效率已成为行业焦点。DeepSeek团队最新开源的FlashMLA项目凭借其惊人的性能表现引发关注——在H800 GPU上实现580 TFLOPS计算性能&#xff0c;这正是大模型推理优化的…

touchgfx的工作机制

touchgfx的工作机制 一.MVP软件架构 MVP的全称为Model-View-Presenter Model: 就是数据部分,在整个touchgfx应用中,只有一个Model类实例对象,它为所有的Screen屏幕界面服务,可以理解成是一个全局变量区,同时它还负责和后端系统通信 View: 就是UI界面部分,对应于View类,在整…

网站搭建wp

前置准备工作 需要下载Git&#xff0c;note.js&#xff0c;在官网上可以搜索并安装 搭建过程 这里借助hexo工具 1. 本地博客搭建 首先创建本地文件夹&#xff0c;并在该文件夹里面创建一个叫做hexo的文件夹在该文件夹中选择Git Bash 进入hexo官网将五条指令用bash运行运行…

现场可以通过手机或者pad实时拍照上传到大屏幕的照片墙现场大屏电子照片墙功能

现场可以通过手机或者pad实时拍照上传到大屏幕的照片墙现场大屏电子照片墙功能&#xff0c;每个人都可以通过手机实时拍照上传到大屏幕上,同时还可以发布留言内容&#xff0c;屏幕上会同步滚动播放展示所有人的照片和留言。相比校传统的照片直播功能更加灵活方便&#xff0c;而…

MySQL 主从复制原理及其工作过程

一、MySQL主从复制原理 MySQL 主从复制是一种将数据从一个 MySQL 数据库服务器&#xff08;主服务器&#xff0c;Master&#xff09;复制到一个或多个 MySQL 数据库服务器&#xff08;从服务器&#xff0c;Slave&#xff09;的技术。以下简述其原理&#xff0c;主要包含三个核…

【蓝桥杯单片机】第十三届省赛第二场

一、真题 二、模块构建 1.编写初始化函数(init.c) void Cls_Peripheral(void); 关闭led led对应的锁存器由Y4C控制关闭蜂鸣器和继电器 2.编写LED函数&#xff08;led.c&#xff09; void Led_Disp(unsigned char ucLed); 将ucLed取反的值赋给P0 开启锁存器 关闭锁存…

Android Coil3缩略图、默认占位图placeholder、error加载错误显示,Kotlin(3)

Android Coil3缩略图、默认占位图placeholder、error加载错误显示&#xff0c;Kotlin&#xff08;3&#xff09; Android Coil3缩略图、默认占位图placeholder、error加载错误显示&#xff0c;Kotlin&#xff08;1&#xff09;-CSDN博客文章浏览阅读667次&#xff0c;点赞18次&…

MariaDB 历史版本下载地址 —— 筑梦之路

MariaDB 官方yum源里面只有目前在维护的版本&#xff0c;而有时候对于老项目来说还是需要老版本的rpm包&#xff0c;国内很多镜像站都是同步的官方仓库&#xff0c;因此下载老版本也不好找&#xff0c;这里主要记录下从哪里可以下载到历史版本的MariaDB rpm包。 1. 官方归档网…

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

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

20250212:https通信

1:防止DNS劫持:使用 https 进行通信。 因为是SDK授权开发,需要尽量压缩so库文件和三方依赖。所以第一想法是使用 head only 的 cpp-httplib 进行开发。 cpp-httplib 需要 SSL 版本是 3.0及以上。但本地已经在开发使用的是1.0.2a版本,不满足需求。 方案1:升级OpenSSL 将Op…