自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(88)
  • 收藏
  • 关注

原创 C++设计模式结构型模式———责任链模式

责链模式应用的一个请求可能有多个接收者(扮演处理者角色),但最后只有一个接收者会处理该请求。此时,请求的发送者和接收者之间是解耦的。换句话说,请求的发送者只需要将请求发送到链上,并不关心请求的处理细节以及请求的传递,也并不知道最终会被哪个接收者处理,这种灵活性可以更好地应对变化。

2024-11-11 03:45:00 787

原创 C++设计模式结构型模式———代理模式

代理模式的使用方式有很多,延迟初始化 (虚拟代理)。如果有一个偶尔使用的重量级服务对象, 一直保持该对象运行会消耗系统资源时, 可使用代理模式。无需在程序启动时就创建该对象, 可将对象的初始化延迟到真正有需要的时候。访问控制:如果你只希望特定客户端使用服务对象, 这里的对象可以是操作系统中非常重要的部分, 而客户端则是各种已启动的程序 (包括恶意程序), 此时可使用代理模式。代理可仅在客户端凭据满足要求时将请求传递给服务对象。代理模式和装饰模式有类似之处,但是这两个模式要解决的问题不同或者说立场不同。

2024-11-09 19:45:52 1150

原创 C++设计模式结构型模式———享元模式

享元对象最重要的就是对“内部状态”和“外部状态”做出了明确的区分,这是享元对象能够被共享的关键所在。内部状态:存储在享元对象内部的,一直不会发生改变的状态,这种状态可以被共享。例如,对于BlackPiece类对象,它的内部状态就是黑棋子,它一直代表黑棋子,不会发生改变。而对于WhitePiece类对象,它的内部状态就是白棋子,它一直代表白棋子,不会发生改变。内部状态一般可以作为享元类的成员变量而存在。外部状态:随着着外部环境和各种动作因素的改变而发生改变的状态,这种状态不可以被共享。

2024-11-04 16:04:10 1028

原创 C++设计模式结构型模式———外观模式

外观模式定义一组高层接口或者说提供子系统的一个到多个简化接口让子系统更容易使用以及让操作变得更直接,让客户端和子系统实现解耦。当子系统发生改变时,一般只需要修改外观类而基本不需要修改客户端代码(虽然这种修改有点违背开闭原则)。外观模式提供的接口给客户端调用带来了很大的方便,使客户端无须关心子系统的工作细节,但这些接口也许缺乏灵活性,当然,如果客户端认为有必要对子系统进行最灵活的控制,那么依然可以绕过外观模式类而直接使用子系统。

2024-11-04 08:45:00 1114

原创 C++设计模式结构型模式———装饰模式

装饰模式是一种结构型设计模式, 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。该模式展现出了运行时的一种扩展能力,以及比继承更强大和灵活的设计视角和设计能力,甚至在有些场合下,不使用该模式很难解决问题。

2024-11-02 18:40:34 1216

原创 C++设计模式结构型模式———组合模式

引人组合设计模式的定义:将一组对象(如文件和目录)组织成树形结构以表示“部分-整体”的层次结构(如目录中包含文件和子目录)。使得用户对单个对象(文件)和组合对象(目录)的操作/使用/处理(递归遍历并执行`ShowName`逻辑等)具有一致性。

2024-11-02 11:45:00 1031

原创 C++设计模式结构型模式———桥接模式

桥接(Bridge)模式也叫桥梁模式,简称桥模式,是一种结构型模式。该模式所解决的问题非常简单,即根据单一职责原则,在一个类中,不要做太多事,如果事情很多,尽量拆分到多个类中去,然后在一个类中包含指向另外一个类对象的指针,当需要执行另外一个类中的动作时,用指针直接去调用另外一个类的成员函数。

2024-10-31 19:10:04 1426

原创 C++设计模式结构型模式———适配器模式

适配器模式在软件开发中使用得比较广泛,但并不是总是最佳选择。过多地使用适配器模式可能会导致混淆,因为从外部看调用的是 A 接口,但内部却适配成了 B 接口。这种情况在项目后期重构时通常更常见,因此在可能的情况下,重构代码可能比使用适配器更好。然而,在软件开发中,发布新版本时常常会面临与旧版本的兼容性问题。完全抛弃旧版本并不现实,因此适配器模式可以帮助实现新旧版本的兼容。尤其在遗留代码的复用和类库迁移等方面,适配器模式发挥了重要作用。

2024-10-30 20:45:00 1508

原创 C++设计模式创建型模式———原型模式

原型模式与工厂方法模式在创建对象时的主要区别在于它们如何处理对象的创建过程和状态复制。原型模式通过复制现有对象(原型)来创建新对象,新对象的初始状态与原型对象相同,这避免了复杂的设置过程。当对象的内部数据复杂且多变时,原型模式比工厂方法模式更合适,因为它可以直接克隆当前状态,无需额外的设置代码。例如,在游戏中创建一个具有特定状态的怪物分身,使用原型模式可以快速复制这些状态。工厂方法模式和原型模式在创建对象时都不需要知道具体的类名,但它们的工作方式不同。

2024-10-30 14:48:23 918

原创 C++设计模式创建型模式———生成器模式

相较于工厂模式,生成器模式同样用于对象的生成,但更侧重于构造细节,增加了额外的构建流程,以便处理复杂对象的构建需求。生成器模式也是一种创建型设计模式, 使我们能够分步骤创建复杂对象。 该模式允许使用相同的创建代码生成不同类型和形式的对象。 也就是说,生成器模式就是为了生成一个复杂的对象。

2024-10-29 17:37:55 1219

原创 C++设计模式创建型模式———简单工厂模式、工厂方法模式、抽象工厂模式

简单工厂、工厂方法和抽象工厂是三种常见的创建型设计模式,它们各自有不同的特点和应用场景。代码实现复杂度上,简单工厂模式最简单,工厂方法模式次之,抽象工厂模式最复杂。简单工厂模式中的代码修改得符合开闭原则,就变成了工厂方法模式,修改工厂方法模式的代码使一个工厂支持对多个具体产品的生产,就变成了抽象工厂模式。从需要的工厂数量上。

2024-10-28 21:30:00 996 1

原创 C++设计模式创建型模式———单例模式

懒汉式单例适用于需要延迟加载实例的场景,但在多线程环境下需要加锁。饿汉式单例简单且不需要考虑线程安全,但在不需要时也会占用内存。C++11静态局部变量单例实现方式最为简洁,并且在多线程环境下是安全的,是推荐使用的方法。懒汉模式的缺点是在创建实例对象的时候有安全问题,但这样可以减少内存的浪费(如果用不到就不去申请内存了)。饿汉模式则相反,在我们不需要这个实例对象的时候,它已经被创建出来,占用了一块内存。对于现在的计算机而言,内存容量都是足够大的,这个缺陷可以被无视。

2024-10-28 10:07:58 1090

原创 Git 完整教程:版本管理、分支操作与远程仓库解析

Git 是当今软件开发中不可或缺的版本控制工具,无论是个人项目还是团队协作,它都能够帮助开发者轻松地管理代码变更,追踪历史记录,提升开发效率。本篇博客将带你深入了解 Git 的核心原理,从 .git 目录的内部结构到常见的版本回退和修改撤销操作。此外,还会详细介绍如何与远程仓库进行交互,包含克隆、推送、拉取操作,以及标签的管理方法。分支操作也是 Git 的重要部分,本博客也将对其进行详细剖析,帮助你掌握分支管理策略以及如何在实际开发中高效利用分支来处理 bug 修复和功能开发。

2024-10-22 19:34:13 975

原创 【计算机网络】数据链路层理解

即把第一次通过ARP获取到的MAC地址作为IP对MAC的映射关系记忆到一个ARP缓存表中,下一次再向这个IP地址发送数据报时不需再重新发送ARP请求,而是直接使用这个缓存表当中的MAC地址进行数据报的发送。也就是说,这个ARP请求包包括了主机B的IP地址。:若UDP携带的数据超过1472(1500-20(IP首部)-8(UDP首部)),那么就会在网络层分成多个IP数据报,任何一个IP数据报丢失,都会引起接收端网络重组失败,那么就意味着,如果 UDP 数据报在网络层被分片,整个数据被丢失的概率就大大增加了。

2024-09-29 21:27:53 1493

原创 【计算机网络】网络层详解

当某个IP包到达路由器时,路由器首先查找其目标地址(IP包被转发到途中的某个路由器时,实际上是装入数据链路层的数据帧以后再被送出),从而再决定下一步应该这个数据包到达哪个路由器,然后再把包发送过去。因此,IP 层进行分片传输是很没有效率的。在进行 NAT 转换时,路由器会将源 IP 地址和端口号替换为它自己的公网 IP 地址+端口号,并在其 NAPT 转换表中记录转换信息,以便在接收到响应数据包时,能够将目标 IP 地址从公网 IP 地址转换为对应的私有 IP 地址,并将响应数据包发送回相应的局域网主机。

2024-09-26 20:02:34 1495

原创 【计算机网络】TCP的可靠传输机制、标记位以及编程结构

TCP 旨在构建在 IP 层之上的一种稳定的数据传输服务。IP层虽然能够将数据包从一端传输到另一端,但其服务性质是尽力而为,不保证数据的可靠到达。TCP的设计目标是在这样的基础上,提供一种确保数据完整性和顺序性的传输机制。也就是说,TCP 提供可靠数据传输服务保证接收方进程从缓冲区读出的字节数与发送方发出的字节流完全一样。TCP 使用了校验、序号、确认和重传等机制来达到这一目的。

2024-09-18 20:33:35 1363

原创 【计算机网络】TCP 协议——详解三次握手与四次挥手

TCP与UDP的区别相当大。它充分地实现了数据传输时各种控制功能,可以进行丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。而这些在UDP中都没有。此外,TCP作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费(由于UDP没有连接控制,所以即使对端从一开始就不存在或中途退出网络,数据包还是能够发送出去。(当ICMP错误返回时,有时也实现了不再发送的机制。)) 。根据TCP的这些机制,在IP这种无连接的网络上也能够实现高可靠性的通信。

2024-09-16 20:26:44 1455

原创 【计算机网络】UDP 协议详解及其网络编程应用

在使用UDP的情况下,虽然可以确保发送消息的大小(例如,发送端应用程序发送一个100字节的消息,那么接收端应用程序也会以100字节为长度接收数据。这样,在进程能够读该套接字中任何已排好队的数据报之前,如果有多个数据到达该套接字,那么相继到达的数据报仅仅加到该套接字的接收缓冲区中。在UDP中,每个数据报文(数据报)都是独立的,不依赖于前后的数据报。:由UDP给某个特定套接字排队的UDP数据报的数目受限于该套接字接收缓冲区的大小,但是这个缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致。

2024-09-12 19:12:57 1989

原创 【计算机网络】网络通信中的端口号

在TCP/IP协议中,传输层有两个重要的协议:TCP和UDP。TCP用于提供可靠的数据传输,而UDP则适合用于广播或对细节控制要求不高的应用传输。为了确保传输层协议能够正确地将接收到的数据交给相应的应用程序,TCP和UDP都引入了的概念,用来识别目标应用。

2024-09-11 19:48:37 1503

原创 期末速成复习资料——操作系统

hrbnu操作系统复习大纲

2024-08-17 16:01:57 523

原创 力扣刷题记录——滑动窗口

滑动窗口的核心思想是通过维护一个窗口(即数组或序列的连续子集)在数据结构上滑动,以动态调整子集的范围,从而解决各种问题,如寻找最大/最小子数组、满足某些条件的子数组、最长无重复字符子串等。在暴力解法中,是一个for循环滑动窗口的起始位置,一个for循环为滑动窗口的终止位置,用两个for循环 完成了一个不断搜索区间的过程。我们可以发现,滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。:在一个数组中查找固定大小的子数组,使其和最大或最小。结尾的、满足条件的子数组的数量。

2024-08-17 15:48:52 1028

原创 深入理解HTTPS协议:CA证书的安全机制

本文探讨了CA(证书颁发机构)证书在HTTPS加密通信中的重要作用及其工作机制。HTTPS通过结合对称加密和非对称加密技术来确保数据传输的安全性。非对称加密用于安全地交换对称密钥,而对称加密则用于实际的数据加密。CA证书在这一过程中扮演了关键角色,它通过数字签名验证公钥的真实性,从而确认通信双方的身份,防止中间人攻击。文章还讨论了预下载的CA证书如何提高验证效率,避免了每次通信时重新下载证书带来的延迟,确保了通信的顺畅与安全。对CA证书和HTTPS的深入分析 。

2024-08-13 10:45:00 1298

原创 MySQL架构与数据库基础

本文详细探讨了数据库的基本概念及其与文件系统的关系,深入分析了SQL语言的四个主要组成部分:DDL、DML、DQL和DCL,并解释了它们在数据库管理中的作用。文章还对MySQL的架构进行了详尽解析,介绍了MySQL的客户端-服务器模型,重点阐述了各个核心组件的功能,包括客户端连接器、连接池、SQL接口、解析器、优化器、缓存、可插拔存储引擎、索引以及文件系统和日志。

2024-08-12 13:30:00 1242

原创 HTTP:从基础概念到协议机制,详解请求响应与状态保持

HTTP协议是目前应用最广泛的应用层网络协议。应用层协议HTTP协议是Web的核心。HTTP协议在Web客户端(浏览器)和服务器程序中得以实现。运行在不同系统上的客户程序和服务器程序,通过交换HTTP消息彼此交流。HTTP定义了请求和响应的消息格式,使得客户端和服务器能够进行有效的通信。Web页面(web page,也称为文档)是通过HTTP协议在客户端和服务器之间传输的基本内容,它通常由一个HTML文件和多个引用的对象组成。

2024-08-04 16:51:19 1565 1

原创 【计算机网络】TCP/IP四层模型

网络接口层的传输单位是帧(frame),IP 层的传输单位是包(packet),TCP 层的传输单位是段(segment),HTTP 的传输单位则是消息或报文(message)。对于同一台设备上的进程间通信,有很多种方式,比如有管道、消息队列、共享内存、信号等方式,而对于不同设备上的进程间通信,就需要网络通信,而设备是多样性的,所以要兼容多种多样的设备,就协商出了一套。IP 头部中的接收方 IP 地址表示网络包的目的地,通过这个地址我们就可以判断要将包发到哪里,但在以太网的世界中,这个思路是行不通的。

2024-08-01 15:00:00 4595 1

原创 期末速成复习资料——计算机系统基础

本人整理的机组期末复习资料

2024-07-30 21:11:38 999 10

原创 深入解析网络编程:Socket基础与操作详解

这是因为在网络传输中,需要保证数据的一致性。因此,当数据在网络中传输时,必须按照大端序排列。为了确保数据在网络中正确传输,需要将主机字节顺序(Host Byte Order)转换为网络字节顺序。我们通常使用的有两种数据类型:短型(两个字节)和长型(四个字节)。

2024-07-30 20:50:47 1468 2

原创 深入理解Linux系统:进程组、会话、作业、控制终端与守护进程的关系解析

本文探讨了进程组、会话、控制终端和作业的基本概念及其相互关系。首先,介绍了进程组的定义和作用,接着解释了会话、控制终端和作业的概念,并分析了它们之间的联系。文章最后讨论了守护进程的功能及其在系统中的重要性。通过对这些概念的系统性讲解,读者可以更清晰地理解进程管理的机制和各组件的协作方式。

2024-07-29 16:20:13 1025 2

原创 计算机网络基础:局域网、广域网及OSI七层模型解析

在OSI的七层模型结构中,从纵向即单个主机的角度来看,每一层与本层的上下两层从逻辑上是分开的,即A的网络层和数据链路层是分开的。这种方式使得每层为上一层提供服务,依赖于下层的数据并为上一层提供接口。同时各层之间的规则是相互独立的,例如数据的格式、通信的方式,这成为本层的协议。

2024-07-18 10:43:40 2285 1

原创 线程池的设计与实现:C++代码实现

在多线程编程中,线程池是一种管理和复用线程的机制。它包含了一个线程集合,用于执行提交给它的任务,而不需要每次任务到来时都创建新的线程。线程池通常由以下几个关键组件组成:任务队列、线程管理模块和线程池管理模块。

2024-06-17 10:15:00 924 7

原创 生产者消费者模型的同步与互斥:C++代码实现

在多线程编程中,生产者消费者模型是一种经典的设计模式,用于解决生产者和消费者之间的协作与资源共享问题。本文将深入探讨生产者消费者模型的基本概念和核心思想,以及其在实际应用中的优点和使用场景。特别地,我们将聚焦于消费者和生产者之间的同步与互斥控制策略,比较常见的两种实现方式:环形队列和阻塞队列。首先,我们会介绍生产者消费者模型的基础概念,探讨其背后的核心设计思想和关键组成部分。随后,详细分析不同实现方式中的同步和互斥机制,比较使用信号量与互斥锁的环形队列

2024-06-16 15:09:43 1332 4

原创 Linux多线程编程中的同步与互斥

本文介绍了线程同步等诸多概念,探讨了如何确保多个线程在共享资源上的正确协作。其次,深入剖析了互斥的概念,以及如何通过互斥锁来实现对临界区的保护,确保线程安全性和数据的一致性。在互斥锁部分,读者将了解互斥锁在Linux环境下的定义、使用方法以及实现原理,并通过示例代码演示了互斥锁的基本用法。随后,文章介绍了条件变量和信号量等其他重要的同步机制,以及可重入性和线程安全性的概念。最后,深入探讨了死锁问题,包括其产生的原因及如何预防和解决。

2024-06-14 09:18:18 1283 2

原创 深入理解 C++ 智能指针

智能指针和RAII(资源获取即初始化)是两个重要的概念,用于管理动态内存和其他资源。智能指针是一种自动管理内存的工具,通过引用计数或其他机制来确保资源的正确释放,从而避免内存泄漏和悬空指针的问题。RAII则是一种编程范式,利用对象的生命周期来管理资源的获取和释放,通过对象的构造函数获取资源,而在对象销毁时自动释放资源,从而确保资源的正确管理。本文介绍了C++中常见的智能指针类型,包括std::unique_ptr和std::shared_ptr,以及如何使用它们来避免内存泄漏和提高程序的安全性。

2024-06-10 18:55:07 1001 5

原创 Linux线程:管理与控制

线程是操作系统能够进行调度的最小单位,是进程内的一个执行单元。它负责在程序里独立执行一个控制流(线程流),拥有独立的执行栈和程序计数器(PC),用于保存线程上下文信息。线程本身不拥有系统级的独立资源(如独立的内存空间、文件描述符表等),而是与同属一个进程的其他线程共享进程所拥有的全部资源。线程拥有一些运行中必不可少的资源,如程序计数器、一组寄存器和栈,以支持其独立的执行路径。在Linux中,线程是通过在相同的地址空间内创建多个结构体来实现的,这些结构体表示了线程的状态和相关信息。

2024-05-28 21:25:51 1296 3

原创 操作系统中内存的管理方式

Linux操作系统通过复杂的内存管理系统来管理物理内存和虚拟内存。在这个系统中,物理内存被抽象为struct page结构体,这是Linux内核中表示物理内存页的基本数据结构。内存管理的一个关键组成部分是内存页(memory page)。物理内存被划分为固定大小的页(通常是4KB),每个页都由一个`struct page`来表示。这个结构体包含了关于内存页的各种信息,如页是否在使用、页的内容是否在磁盘上(即交换出去)、页被哪个进程或哪些进程使用等。

2024-05-21 21:01:25 1060 6

原创 Linux信号机制

Linux信号是操作系统中用于进程间通信、处理异常等情况的一种机制。它是由操作系统向一个进程或者线程发送的一种异步通知,用于通知该进程或线程某种事件已经发生,需要做出相应的处理。每个信号都有一个名字。这些名字都以三个字符SIG开头。在头文件中,这些信号都被定义为正整数(信号编号)。没有一个信号其编号为 0。POSIX 标准信号(Standard Signals):这些是传统的 Unix 信号,包括SIGINT(通常由 Ctrl+C 产生)、SIGTERM(请求终止)、SIGKILL。

2024-05-17 21:20:07 1293 3

原创 System V IPC(进程间通信)机制详解

在共享内存模型中,进程A和进程B都可以直接访问同一块物理内存区域(即“共享区”)。这意味着数据不需要通过系统调用或其他中间层进行复制或传输,从而减少了数据传输的开销。共享内存通过允许进程直接访问同一块物理内存区域,减少了数据传输和I/O操作的开销,降低了延迟,从而提高了进程间通信的效率。当A进程需要与B进程通信时,只需要把共享区的虚拟地址与物理地址的映射写入两进程的页表中。因此,进程A可以对该物理地址直接进行写入;而B进程则是通过页表的映射关系,从该物理地址直接进行读取。

2024-05-14 21:28:38 1325 17

原创 Linux进程间通信——匿名管道和命名管道

Linux中的“万物皆文件”原则使得管道也被抽象为一个文件对象。这意味着进程可以通过标准的文件I/O操作(如read、write等)来访问管道,从而实现进程间的通信。因此我们可以说管道是基于文件的,让不同进程看到同一份资源的通信方式。对于管道而言,它允许一个进程的输出直接作为另一个进程的输入,而无需使用临时文件或其他中间存储机制。具体来说,管道在内存中创建了一个缓冲区,用于存储从写入端流向读取端的数据。这个缓冲区对于进程来说是透明的,进程只需要通过标准的文件I/O操作(如readwrite等)来访问它。

2024-05-13 08:00:00 744 6

原创 Linux动态库与静态库解析

在Linux系统开发中,库文件扮演着至关重要的角色。它们提供了程序运行所需的各种功能,使得开发者能够高效地复用代码,减少重复劳动。库文件通常分为动态库(也称为共享库)和静态库两种类型,它们在程序链接和运行阶段扮演着不同的角色。

2024-05-07 16:43:17 1309 3

原创 理解Linux文件系统

传统的磁盘与文件系统之应用中,一个分区就是只能够被格式化成为一个文件系统,所以我们可以说一个 filesystem 就是一个 partition。但是由于新技术的利用,例如我们常听到的LVM与软件磁盘阵列(software raid), 这些技术可以将一个分区格式化为多个文件系统(例如LVM),也能够将多个分区合成一个文件系统(LVM, RAID)! 所以说,目前我们在格式化时已经不再说成针对 partition 来格式化了, 通常我们可以称呼一个可被挂载的数据为一个文件系统而不是一个分区。

2024-05-01 22:04:05 4230 5

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除