自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【算法基础】递归与递推

对于1-n中任意的数来说,考虑这个数时只会面临两种情况我们只需要枚举每个数的两个状态:选和不选,考虑完后递归到下一层考虑下一个数即可时间复杂度:2 × 2 .... × 2 = 2 ^ n题中n为15,2^15 = 32768 ,符合要求。

2025-03-30 19:54:03 673

原创 【Linux系统编程】基础IO--磁盘文件

由上图,我们看到,中间位置有一个像光盘一样的东西,这个东西也就是我们常说的盘片盘片的功能:存储数据,也就是我们平时的文件、游戏....都被保存在这个盘片上它既可以读,又可以写。也就是说我们可以随时擦除盘片上的数据,再向它写入数据它正反两面都可以用。注意:盘片在用于桌面级磁盘,也就是我们个人计算机使用时,一般都是一个盘片,但如今桌面级磁盘已经不是那么常用了,磁盘通常用于企业。

2025-02-28 18:59:30 585

原创 【Linux网络编程】高效I/O--select/poll服务器

poll的fds参数和nfds参数是配合使用的,fds相当于数据首元素地址,nfds是由用户确定的,换句话来说,只要用户想且内存允许,你的fd想要多少就有多少!我们可以看出,poll的fds参数虽然还是输入输出型的参数,但用户通知内核和内核通知用户所用的变量不再是同一个,这就是poll解决输入输出混合问题的方案。select完成的工作就是I/O等待这一步,即对多个文件描述符进行等待,若有一个或多个文件描述符读写条件就绪,select就会返回!select返回后,即进行多路复用的第二步拷贝。

2025-02-26 17:46:41 917

原创 【Linux网络编程】高效I/O--epoll

本文主要介绍的是epoll的原理与接口,并且附上一个简单的epoll代码加深对epoll接口的理解,为后面reactor的编写打下一个基础。

2025-02-20 16:17:51 653

原创 【Linux网络编程】数据链路层--以太网协议

ARP协议在网络协议栈的哪一层?ARP协议是在MAC协议之上,IP协议之下的一个链路层协议。ARP协议的功能ARP的主要功能是将一个IP地址转换为一个MAC地址,以便在同一局域网内进行数据帧的传输。由于网络层(如IP协议)和链路层(如以太网协议)使用不同的地址格式,ARP协议提供了这两者之间的桥梁。在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址。

2025-01-24 17:53:57 1602 1

原创 【Git版本控制器--3】Git的远程操作

突然某一天,你的同事开发了一个新的功能,此时你的同事的产品版本更新成了version1版,它把它的version1版的代码推送到了远程仓库中,远程仓库中产品的版本也变为了version1版,但你的仓库里面的版本是version0版,若你也需要拿到这个version1版,你就需要拉取远程仓库中的version1版本的代码!我们在日常开发中,肯定不会这样指定一个被忽略的文件,一般都是被忽略的文件和要上传的文件放到一起,那么此时git不会提示,而是自动把被忽略的文件不放到暂存区,未被忽略的文件放到暂存区中。

2025-01-24 17:52:03 1302

原创 C++11--智能指针

若没有了解过异常,请先看异常章节。

2025-01-20 22:44:03 864

原创 【Linux网络编程】高效I/O--I/O的五种类型

网络通信的本质网络通信的本质其实就是I/OI/O的本质我们所谈的I/O,都是站在内存的角度I/O的本质:I/O = 等 + 拷贝高效I/OI/O = 等 + 拷贝,所以I/O的时间是由等的时间和拷贝的时间决定的,什么叫做高效I/O呢?所以对于高效的I/O来说,就是尽可能的减少等待的时间, 即单位时间内,等的比重越低,那么I/O的效率越高!程序员进行编程时,什么叫做高效的代码?

2025-01-15 22:15:04 1342 1

原创 【Redis】Redis特性及其应用场景

Redis是一个在内存中存储数据的中间件,用于作为数据库、数据缓存。Redis在分布式系统中有着较为突出的特性(有点)在官方文档中,对Redis的特性给出了如下几点。

2025-01-15 22:14:18 997

原创 【Redis】初识Redis

如下是Redis官网中,对Redis的一段描述基于上述要点,我们接下来初步认识一下Redis。

2025-01-14 22:08:44 837 1

原创 【Git版本控制器--2】Git的分支管理

解决这个问题的⼀个好的建议就是:先把master分支的内容合并到dev分支下,此时虽然会发生合并冲突的情况,但我们也可以进行合并冲突,最关键的是dev分支是用于开发的,哪怕我们在这个分支下解决合并冲突出现问题,也能经过多次测试以后发现,还不会影响线上环境的运行!首先,我们需要达到的一种状态是,dev分支正在进行开发操作,我们需要先解决master中的bug,所以重新创建一个fix_bug分支,进行bug修复,修复完bug以后,让bug分支与master分支进行合并,完成bug修复工作!也就是如何合并分支!

2025-01-14 10:07:50 948

原创 【Redis】初识分布式系统

y本篇博文,将根据分布式系统的演进一步一步介绍每一种架构的形式,最后为大家总结了一些分布式中常用的名词解释。

2025-01-13 12:25:26 1028

原创 【Git版本控制器--1】Git的基本操作--本地仓库

以此往复,你对原文档进行了10多次的修改,而此时你的导师又改主意了,让你拿出第一次修改后的文档,你该怎么办呢?对于既在工作区,又在暂存区的文件,又或者在版本库中的文件,git中提供了rm方式删除文件,git中的rm和删除工作区的rm的区别在于git提供的rm既会删除工作区中该文件,又会删除暂存区中该文件,使用了git rm后,我们直接提交一次即可。git是用于管理我们的文件的一个版本控制器,如果文件被分散在电脑的各个角落,git是无法进行管理的,所以git管理文件要求我们的文件必须是放在git仓库中的。

2025-01-13 11:25:07 1014

原创 【Linux网络编程】网络层协议--IP协议

网络层主要完成的工作是主机定位+路由选择主机定位:IP地址是互联网中能够唯一标识一台主机(暂时这么理解),网络层封装了IP地址,所以它发送完数据以后能知道,我的目的地在哪里,也就能够进行主机定位路由选择:IP地址标识了数据转发的目的地,网络层可以根据目的地进行路径选择网络层提供了一种能力,即可以把数据从主机B送到主机C的能力所谓的能力,表示大概率能完成这个工作,但也有小概率可能完不成这个工作网络层协议主要是IP协议网络层与传输层之间的关系。

2024-12-19 10:13:29 847

原创 【算法】图论——单源最短路问题

邻接矩阵存储图判断一个顶点是否已经确定最短路的数组从起点到第i个点的距离数组。距离数组中可能暂时存储的不是最短路,具体看上面的判断数组题目链接:邻接表边的权值表距离表判断表,用于判断该顶点是否遍历过堆,使用STL中的priority_queueedges[M]:用于存储所有边,M为边的数量dis[N]:用于存储经过一次松弛操作后的顶点距离backup[N]:dis的拷贝为什么要有backup?

2024-12-09 15:02:49 1553

原创 【算法】图论——树的重心

题目解析给定一颗树,树中包含n个结点(编号)和n-1条无向边。请找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。什么是重心?重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中节点的数量的最大值最小,那么这个节点被称为树的重心。补充:树和图的关系树本质上是一种特殊的图,它对应的是无环连通图。也就是说,在树中任意两个节点之间都存在路径(连通性),并且不存在回路(无环)。

2024-12-04 15:55:49 1501

原创 c++11--可变参数模板、lambda表达式、包装器、bind

...Args表示定义的是一个参数包,参数包可以接收多个参数,参数可以是不同类型 Args是参数包名,包名由用户自定义设置 "..."是定义参数包时的固定语法 Args...是参数包的类型,用于生成对象时的类型可变参数的使用 在使用时,参数包可以接收任意个数/类型的参数,非常方便 运用sizeof可以计算出参数包中参数的个数,格式如上参数包本质上是一个模板参数,模板的实例化是在编译时的,所以参数包的解析采用的是编译时递归的方式以代码中fun

2024-11-27 10:58:30 946

原创 【Linux系统编程】System V进程间通信---共享内存与System V内核数据结构

System V是人为规定出的用于操作系统本地进程间通信的一套标准,而System V中的进程间通信方式主要分为3种1、共享内存2、消息队列3、信号量其中,共享内存这篇博文会详细介绍。

2024-11-27 10:49:16 1080

原创 【Linux网络编程】套接字使用--TCP echo server的实现

在《套接字接口》一文中,我们介绍了TCP通信时的接口这一期我们将基于接口的说明,自己手动编写一个基于TCP的echo服务什么是TCP Echo Server?TCP echo server 是一种网络服务,它接受来自客户端的 TCP 连接,并将收到的每一个数据包原封不动地返回给客户端。简单来说就是我们需要实现服务端与客户端客户端向服务器发送一个字符串数据,而服务器需要把客户端发送的数据重新发送回给客户端。

2024-11-19 13:44:00 1066

原创 c++11--列表初始化、decltype、右值引用

底层的角度:引用都是指针实现的,左值引用是存左值的地址,右值没有地址是临时存储的,所以右值引用是把临时存储的右值拷贝到栈上的一个临时空间,所以如果从底层的角度出发,右值引用并不是右值的别名,而是把右值拷贝到栈上后的空间的别名。而需要注意的是,如果是自定义类型的列表初始化,若没有显式写构造,它会按照成员声明顺序进行初始化,若显式写了构造且列表初始化的参数匹配,那么就会调用自定义类型的构造。在c++11之后,stl中的各种容器都添加了initializer_list的构造,所以我们支持如下使用。

2024-11-19 13:42:24 755

原创 【项目组件】第三方库——MySQL CAPI

注意:本文介绍不会涉及MySQL数据库,已经默认读者掌握了MySQL的增删查改SQL语句的基础上使用MySQL CAPI第三方库。

2024-11-18 09:31:33 1093

原创 【项目组件】第三方库——Jsoncpp

Json是⼀种数据交换格式,它采用完全独立于编程语⾔的⽂本格式来存储和表示数据。例如: 我们想表示⼀个同学的学⽣信息。

2024-11-18 08:06:40 1374

原创 【Linux网络编程】传输层协议(1)--TCP/UDP--原理

传输层主要负责数据能够从发送端传输接收端,在socket编程中我们写的套接字就是传输层中的协议UDP协议TCP协议UDP和TCP都需要通过IP地址和端口号标识互联网中的一个进程UDP和TCP在进行数据传输时,它们都是全双工的注意:全双工指的是通信过程中数据可以在两个方向上同时传输,即实现信号的双向同时传输(A→B且B→A)支持全双工的原因是内核的传输层中维护了两个缓冲区,发送缓冲区和接收缓冲区。这两个缓冲区互不影响!这一点在应用层中详细说明过。

2024-11-15 12:46:10 1301

原创 【MySQL】索引原理及操作

如果可以,则该列为1。至此,我们引入页目录以后,单个page内的数据查找效率已经得到了极大的提高,但MySQL可不仅仅只有一个page,我们只解决了page内部的数据查找问题,但一个数据在哪个page仍旧需要线性遍历的方式查找,而只要线性遍历,那么带来的就是效率问题,那么我们一定要对查找page的遍历方式进行优化!注意:尽管越靠近外侧,扇区的物理面积好像越大,但不管它多大,在数据存储方面始终都是只能存储512字节的数据,尽管在最新的磁盘技术中,为了更大的容量,外侧的扇区能存储的数据越多,但我们暂时不考虑!

2024-11-15 08:56:36 1240

原创 【项目组件】第三方库——websocketpp

为什么要有websocket?websocket协议是应用层协议之一,既然这种协议会出现,那么也就意味着它是在某些特殊场景下弥补了一些其他应用层协议的缺点。所以关于为什么要有websocket协议,我们首先要聊聊最常见的协议http/https,它们没有解决的一些问题!我们都知道,http协议是如何建立起连接的呢?http协议规定,首先由客户端向服务器发送一个http请求, 服务器收到后,根据客户端的http请求,返回给客户端一个http应答!

2024-11-14 06:37:44 2049 1

原创 【Linux系统编程】线程--基于单例模式的线程池

多线程下可能不止一个线程需要获取这个单例,刚开始时我们是根据单例指针为空判断是否是第一次调用的,当多个线程同时获取单例时可能会都判断指针为空的情况,出现多个实例对象的bug,单例对象本质是临界资源,解决这个问题需要加锁处理。线程池(Thread Pool)是一种管理线程的技术,旨在提高系统性能、减少资源消耗和优化线程的使用。而对于单例模式的分类实际上是根据生成这个实例化对象的时机进行分类的,分类如下。注意:单例模式在多线程场景下的作用相比而言比较大,可能出现多个线程需要访问同一个单例的场景。

2024-11-12 14:15:39 1113

原创 【Linux系统编程】生产消费者模型

日常生活中的生产消费者模型在购买的过程中主要存在着三种角色:厂商:提供商品的角色,通常对应的生产消费模型中的生产者顾客:购买商品的角色,通常对应的生产消费模型中的消费者超市:临时保存商品的地方,供生产者和消费者使用的交易场所一家超市,可以由多个厂商供货,也可以有多个顾客来购物,这也就是所谓的多生产者和多消费者计算机中的生产消费者模型日常生活中有生产消费者模型,那么计算机世界当中的生产消费者模型是什么样的呢?商品:计算机当中的"商品"实际上是数据生产者:负责生产数据的线程。

2024-11-12 08:40:56 988

原创 【Linux系统编程】线程--同步与互斥

实际上,上述也能说明在C/C++语言中对一个变量的--操作不是原子的,因为对变量的--操作经历了三步,第一步是把内存中的值拷贝到CPU当中,第二步是CPU进行算术运算,第三步是把CPU的值拷贝回内存当中,而在执行1、2、3步的前后CPU都可以把这个线程切换掉,所以对一个变量的--操作有正在进行的状态,比如在执行第二步完了以后CPU就把这个线程切换掉了,所以它就不是原子的。实际上,最简单的一个判断方式是一条语句转化为汇编之后如果只有一条汇编,那么它就是原子的,反之如果有多条汇编,则它不是原子的。

2024-11-11 08:19:23 871

原创 【Linux系统编程】线程--控制

那么如果此时有10个线程,每一个都有自己的临时变量,它们定义的临时变量可能随时都入栈,每一个都变量都要压栈,那么此时就会出问题,你定义了一个栈,我甚至都不知道你是哪个函数内部定义的,也就是说我甚至不知道你这个变量是哪个线程定义的,那么显然就是不合理的。实际上每一个线程都是属于进程内部的,那么一个线程异常了也就说明整个进程出现了异常,所以不论是主线程还是新线程只要有一个异常退出了,那么进程也就终止了,进程终止就意味着所有资源都被释放了,所以一般多线程代码的健壮性较差。是否需要知道线程的id和线程的优先级呢?

2024-11-11 08:15:53 1014

原创 【Linux系统编程】线程--概念

CPU在调度的时候,调用的是task_struct,这个task_struct可能代表的是一个进程,也就是一个进程中只有一个线程的情况,也可能是一个进程中多个线程其中的一个,但CPU调度的时候不需要区分这两种情况,因为每一个线程都有它所对应的虚拟地址空间,都有页表等等内核数据结构,所以对线程的调用就复用了之前的进程PCB调度的算法。实际上我们之前所说的线程是进程内部的一个执行分支,是CPU调度的基本单位,这是操作系统中的概念,这不涉及具体的方法论,换句话来说只要你满足这个条件,那么你就可以是一个线程!

2024-11-10 14:04:40 1040 1

原创 【Linux系统编程】基础IO--内存文件

stdin&& stdout && stderr详解、文件系统调用:为什么要提供文件操作系统调用?、如何打开文件?、如何关闭文件?、如何写入文件?、如何读取文件?打开文件原理写入文件原理文件描述符:为什么文件描述符fd是从3开始的?文件描述符的本质、C语言中的FILE结构体的本质、文件描述符的本质为什么是数组下标?哪个数组的下标?使用文件操作系统调用为什么要传入文件描述符fd呢?Linux实现一切皆文件的原理fd的分配规则与输入输出重定向原理、各角度理解用户级缓冲区!

2024-11-10 13:47:50 1071

原创 【Linux系统编程】进程控制(创建、退出、等待、替换)

关于进程创建,这里只会说结论,在上面这篇文章中对进程创建进行了比较详细的阐述,而接下来要介绍的,都是基于上文说过的来展开的一些较为重要的结论:1、进程创建使用fork函数fork无参数哪个进程调用的fork,那么fork创建的就是哪个进程的子进程fork的返回值如果fork创建子进程成功,对于父进程来说就返回它创建的子进程的pid,对于子进程来说就返回0如果fork创建子进程失败,对于父进程来说返回-1,子进程没有被创建,并且错误码被设置2、fork之后父子进程代码共享。

2024-06-28 01:11:02 961

原创 【Linux系统编程】进程地址空间

首先,在我们学习C语言的时候一定会见过如下这张图。(没见过也没关系,接下来会介绍)对于上述这张图,内核部分我们先不管,先介绍其他命令行参数环境变量:在我上一期博客中已经详细说明了,有兴趣可以看看命令行参数/环境变量栈:用于存储临时变量或者局部对象这种出了作用域就销毁的数据堆:这里的空间一般是通过申请来获得的,比较常用的地方是一些常见的数据结构、有些算法需要动态开辟空间,并且这个空间用完是要手动释放(c语言中)。数据段:存储的是一些整个程序运行期间都要存在的数据,例如全局数据和静态数据。

2024-06-08 23:57:35 661

原创 【Linux系统编程】命令行参数与环境变量

在讲内容之前,我先问一个简单的问题,我们编写C/C++代码时,main函数是否可以添加参数?实际上,是可以的,如下demo代码首先,对于main函数参数的含义是固定的第一个参数,也就是上述argc,指的是argv中的元素个数第二个参数,也就是上述argv,是一个数组,而这个数组的元素实际上是char*的,并且这个char*是指向字符串的我们可以试着打印一下argv的内容,如下运行结果:可以发现,我们运行代码时好像argv当中只有一个元素,这个元素就是我们输入到命令行上的字符串接下来再运行几次。

2024-05-30 16:54:14 1667

原创 【Linux系统编程】进程概念、进程排队、进程标识符、进程创建、进程状态

如果要了解进程是什么,我们得从程序开始说起!程序就是我们写的源代码进行编译和链接后形成的可执行程序,在Windows下就是以.exe为后缀的文件到这里,我们了解了什么是程序,而接下来要讨论的内容就是程序是如何运行的首先,从硬件的角度,也就是冯诺依曼体系结构我们可以了解到,一个数据从输入设备进入被运到CPU再到输出设备,在这个中间为了效率考虑所以才会有了一个设备,叫做内存,这些我在往期博客进行详细说过,感兴趣的可以看看:冯诺依曼体系结构。

2024-05-25 19:53:17 1100

原创 c++多态

在看多态之前,建议先看看往期关于继承的讲解,因为多态这里需要用到继承,而继承也是实现多态的基础所谓多态,就是在不同继承关系的类对象,去调用同一个函数,产生了不同的行为。例如学生继承了人,人买票全价,学生买票半价如下代码实现的就是多态public:std::cout

2024-04-24 02:47:22 884

原创 【Linux基础】Linux基础概念

这一篇文章主要介绍的是一些概念性的东西,指令不会在这里太多涉及,如果指令不熟悉的小伙伴,可以看看其他博主的常见指令总结!这一篇是我们学习Linux的基石,主要涉及原理多一点!如果我们新建了一个空文件 ,那么这个文件是否要占据磁盘的存储空间?答案是肯定的,虽然一个文件的大小记录了该文件是0,但它指的0是文件内容为0,但文件除了文件内容以外,还具备有文件的属性,例如文件的修改时间,文件名,文件路径....,这些也是数据,既然是数据那么肯定就被计算机记录了下来!

2024-04-22 16:00:19 791

原创 c++继承

大家好,这一篇博文主要是详细介绍c++中继承的概念,其中在菱形继承之前的内容都是比较重点的,关于菱形虚继承部分的原理其实有些东西比较复杂,可以简单了解一下,不用过多纠结。首先,面向对象编程的三大特性是封装、继承、多态,而今天我们要学习的就是继承继承是代码复用的一种手段,为什么这么说呢?先看看下面这个案例有一天学校给张三布置了一个作业,就是完成一个图书管理系统,而在写的过程中,张三先考虑的是图书管理系统中存储的对象,这些对象有学生、有教师、有保安等。

2024-04-22 15:57:03 1857

原创 STL之string模拟实现

如果要实现简易版的string 无需涉及增容问题,成员变量可以不用存储容量和元素个数。

2024-04-07 20:42:24 891 2

原创 【高等数学】向量代数

向量代数1、向量的概念及其线性运算1.1、向量的概念1.2、向量的线性运算1.2.1、向量的加法1.2.2、向量的减法1.2.3、向量与数的乘法1.3、空间直角坐标系1.3.1、空间直角坐标系的基本概念1.3.2、向量的坐标表示1.4、利用坐标作向量的线性运算1.5、向量的模、方向角、投影1.5.1、向量的模与两点间距离公式1.5.2、方向角与方向余弦1.5.3、向量在轴上的投影2、数量积、向量积、混合积2.1、两向量的数量积2.1.1、引例2.1.2、定义2.1.3、性质2.1.4、运算律2.1.5、数量

2024-04-07 13:52:50 2796

空空如也

空空如也

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

TA关注的人

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