自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++多态的认识与理解

多态其实就是同一操作在不同的对象上可以有不同的实现方式。

2025-01-18 00:37:37 987 1

原创 MySQL中的MVCC机制-事务

在 MySQL 中,事务是一组原子性的 SQL 操作,这些操作要么全部成功执行,要么全部不执行。就好像是一个不可分割的工作单元,保证了数据的一致性和完整性。也就是说MySQL服务同样会被多个客户端同时访问(MySQL内部采用多线程架构),所以此时多个执行流同时访问MySQL数据库中的内容,为了保障数据一致性与完整性就有了事务的概念。。

2025-01-04 17:16:59 763

原创 MySQL中的索引

MySQL是一种关系型开源数据库。其中的数据是以表格的形式进行存储,同时也支持CURD操作。早期是没有数据库产物的,数据都是以文件的形式进行存储与读取,而文件中对数据管理存在很大的局限性,效率也比较低下。而为了更好地对数据进行管理,后面才慢慢开始产生数据库,然后有了我们现在的MySQL。

2025-01-03 12:15:52 1005

原创 程序运行与动态库

当我们写好了一段代码然后编译运行后会生成可执行文件,该文件会存在磁盘的当前目录下,而当我们开始运行这段程序时,操作系统(加载器)需要将其从磁盘加载进内存然后执行相关操作。以下的讲解以Linux操作系统为例。

2024-12-02 21:05:06 1162

原创 高级IO之IO多路转接

高级I/O(Advanced I/O)是指在计算机系统中进行输入和输出操作时使用的一种更高级的接口和技术。也就是当我们进行输入输出的时候本质其实都要进行等待内核缓冲区中数据到来才能进行读取和写入到用户缓冲区。而往往在等待的阶段都是需要进行阻塞的。而高级I/O提供了比传统的基本I/O操作更丰富和灵活的功能。

2024-10-12 22:10:25 1213 2

原创 NAT技术+代理服务器+内网穿透

IPv4协议中,会存在IP地址数量不充足的问题,所以不同的子网中会存在相同IP地址的主机。那么就可以理解为私有网络的IP地址并不是唯一对应的,而公网中的IP地址都是唯一的,所以NAT(Network Address Translation,网络地址转换)技术是当前解决IP地址不够用的主要手段, 是路由器的一个重要功能。

2024-09-07 12:09:42 1314

原创 数据链路层以太网技术与DNS、ICMP协议

主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称,如:www.baidu.comcom: 一级域名. 表示这是一个企业域名. 同级的还有 "net"(网络提供商), "org"(非盈利组织) 等.baidu: 二级域名, 公司名.www: 只是一种习惯用法. 之前人们在使用域名时, 往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式, 来表示主机支持的协议.

2024-09-05 21:23:05 924

原创 网络层IP协议报头字段的认识

私有IP地址主要用于内部网络的互连和通信,而公网IP地址则用于设备在Internet上的唯一标识和通信。在实际应用中,通常会通过NAT等技术将内部网络的私有IP地址转换为公网IP地址,以实现内部设备与Internet的通信。

2024-08-09 20:50:16 1520

原创 传输层udp和tcp协议格式

服务端起初是LISTEN监听状态,当客户端向服务端建立连接时发送SYN标志位的报文时,就会将状态从CLOSED状态转变成为SYN_SENT而服务端接收到客户端的连接请求后就会设置当前状态为SYN_RESD,而此时客户端会返回SYN+ACK标志位字段的报文给客户端,所以此时客户端成功收到后就会设置为ESTABUSHED状态,最终客户端返回ACK被服务端接收后,服务端也会设置状态为ESTABUSHED状态,至此双方算是成功建立好连接。它通过确认报文(ACK)中的窗口大小字段告诉发送端它可以接收的数据空间大小。

2024-06-15 16:00:38 1257

原创 应用层协议HTTP与HTTPS

HTTP(Hypertext Transfer Protocol,超文本传输协议)和HTTPS(Hypertext Transfer Protocol Secure,超文本传输安全协议)都是用于在Web上传输数据的协议,但它们之间存在一些重要的差异,特别是在安全性和加密方面。HTTP:是不安全的,传输的数据都是未加密的明文。这意味着在传输过程中,任何在路径上的设备都可以读取或篡改数据。HTTPS:是安全的,通过传输加密和身份认证保证了传输过程的安全性。

2024-05-29 21:46:21 1373

原创 基于tcp实现自定义应用层协议

在自定义协议时必须让客户端与服务器都能够看到同一份协议字段,这样才能在接收数据的时候按照规定的格式进行准确无误的接收。对于序列化的字段格式采用空格作为分隔符。而反序列化的时候就可以通过空格分隔符将数据提取出来。// 模拟定协议// 添加报头数据和解报头mes = ret;// 先判断收到的数据是否完整// 指向第一个换行符// 指向第二个换行符// 解包后的数据// 去掉被读走的数据public:"

2024-05-26 17:43:39 1217

原创 网络编程套接字和传输层tcp,udp协议

我们知道在网络数据传输的时候,在IP数据包头部有两个IP地址,分别叫做源IP地址和目的IP地址。IP地址是帮助我们在网络中确定最终发送的主机,但是实际上数据应该发送到主机上指定的进程上的,所以我们不仅要确定主机,还要确定主机上的指定进程。而标识该进程的就是通过端口号。所以IP+端口号port就能标识互联网中唯一的一个进程。

2024-05-09 15:30:08 1478 1

原创 计算机网络基础

网络通常指的是用一个巨大的虚拟画面将所有东西连接起来。在计算机领域中,网络是通过物理链路将各个孤立的工作站或主机相连在一起,组成数据链路,从而达到资源共享和通信的目的。网络通信特指终端设备之间通过计算机网络进行的通信。

2024-05-05 21:03:55 1346 1

原创 线程池+日志(纯代码)

【代码】线程池+日志(纯代码)

2024-04-06 20:51:10 334

原创 C++11与thread相关使用(纯代码)

【代码】C++11与thread相关使用(纯代码)

2024-03-26 21:15:27 347

原创 Linux下对线程的认识+生产消费者模型+信号量

所以当我们的多线程竞争锁时,竞争成功的线程首先进来将数字0 move到al寄存器中,然后将al寄存器内的数据和mutex进行交换(而mutext的默认值都是1),所以此时al寄存器的内容就是1,而mutex数据的值就等于0,则进入if语句线程上锁成功,其他线程进来后也会从头执行相应的汇编代码,但是此时mutex的值还是0所以最终就会在else中挂起等待。所以我们的线程切换是。因为线程中对每种信号的处理方式都是共享的,也就是handler表共享,所以一个线程崩溃的话,其他线程就会执行相同的处理方法。

2024-03-22 20:19:05 1155

原创 页表认识:虚拟地址->物理地址映射

地址空间的大小取决于系统的架构和操作系统的实现。在32位系统中,地址空间大小为2的32次方(约为4GB)。而在64位系统中,地址空间大小为2的64次方。进程地址空间的划分使得不同的数据和代码可以在不同的区域中进行管理和保护。不同的区域具有不同的访问权限和特性,例如代码段是只读的,堆和栈是可读写的。进程地址空间也是更加便于操作系统进行管理,如虚拟内存管理、内存映射和安全性等功能。

2024-03-18 21:37:20 437

原创 linux中对信号的认识

但是一些信号,如9号信号不能被自定义捕捉修改。

2024-03-04 15:02:26 881

原创 使用管道和system V进行进程间通信

然后分别在父子进程中关闭关闭其不需要的操作文件方式,此时关闭并不会直接将文件给关闭,因为我们文件的指向是采用引用计数的方式的,所以关闭进程的文件,只会使引用计数--,只有减到0才会真正的关闭文件。我们首先创建管道(实质就是打开同一个文件两次,形成两个文件描述符),然后再fork创建子进程,那么子进程会拷贝文件描述符表中的内容,此时,父子进程文件描述符表中的文件指针所指向的就是同一个文件,继续fork继续拷贝...但是我们发现,我们的结果是按照顺序读写的,也就是子进程写完一份内容,父进程才会读取一份内容。

2024-02-26 15:30:32 924

原创 动态库和静态库的理解 Linux

其实库文件里面的内容就是函数的实现方法,向我们包含的头文件其实就是函数的生命,而我们编译链接程序时会自动加载库文件,最终形成可执行程序。其实我们在编译链接时不仅仅会将文件的库文件加载进来,其实头文件也是需要加载进来的,只不过也是自动加载的。

2024-01-24 16:44:00 1082 1

原创 磁盘的分区与文件系统的认识

了解磁盘的结构:1、盘片硬盘首先会有多个盘片构成,类似很多个独立的光盘合并在一起,每个盘片都有2个面,每个盘片都有一个对应的磁头,我们的磁头横移和盘面的旋转就可以读写到盘面的每一个位置,而我们的磁盘数据实际上就是在盘面上保存的。2、扇区和磁道每个盘片会分成若干个相同同心圆的磁道,磁道从外围开始编号,从0开始,每个磁道又会划分成若干个扇区,扇区是硬盘的最小存储单元,一般是存储512字节。3、磁头和柱面磁头用于读取盘面中磁道内的扇区中存储的数据。

2024-01-21 23:04:37 1315

原创 C++中特殊类的设计与单例模式的简易实现

对于这种特殊类的设计我们一般都是优先考虑私有构造函数。然后对于一些特殊要求就直接通过静态成员函数的实现来完成。这里选择禁掉拷贝构造函数和拷贝函数是为了防止将已创建的对象去拷贝构造新的对象。

2024-01-18 20:10:14 1128

原创 用Linux的视角来理解缓冲区概念

缓冲区(buffer)是存储数据的临时存储区域。当我们用C语言向文件中写入数据时,数据并不会直接的写到文件中,中途还经过了缓冲区,而我们需要对缓冲区的数据进行刷新,那么数据才算写到文件当中。而缓冲区通常是一块内存区域,可以是数组、队列、链表等数据结构。

2024-01-10 20:07:20 1106

原创 异常和智能指针

智能指针是一种C++语言中用于管理动态内存的工具,,从而。智能指针可以跟踪指向的对象的,并在需要时被引用的内存,这极大地提高了内存管理的安全性和便利性。:独占型智能指针,表示它所指向的对象只能被一个指针拥有(即不能进行赋值),一旦该指针销毁,它所指向的对象也会被销毁。:共享型智能指针,允许多个指针共同管理同一个对象,通过引用计数来跟踪对象的引用次数,当引用计数为0时自动释放对象内存。

2023-12-25 22:47:29 1041

原创 Linux操作系统下对文件的管理

(如果不想要最后的回车键就直接将 buf[sz-1]=0;进行设置)

2023-12-07 20:44:43 1040 1

原创 右值引用和移动语义(C++11)

左值是表示数据的表达式(如变量名或解引用的指针),也可能在赋值符号右边,具有地址的、可寻址的表达式才是左值。右值是一个表达式,如:字面常量、表达式返回值,函数返回值等等,且右值不能出现在赋值符号左边不能进行取地址才是右值。

2023-12-03 12:10:00 876 1

原创 位图和布隆过滤器

在学习过哈希之后,我们对于哈希其实理解哈希可以通过与计数排序联系起来。哈希的本质其实就是将数据与下标位置对应起来,所以我们就有了unordered_map和unordered_set的出现。但是当我们如果是对数以万计的数据进行统计的话呢,那么还是用hash来辅助嘛。其实哈希的缺陷型就是空间换时间,哈希本身的消耗其实就是相当大的,因为哈希底层实际就是顺序表+单链表的存储结构。所以我们可以借助哈希的思路另寻路径。也就是我们要谈到的位图以及布隆过滤器。

2023-11-29 15:02:16 457

原创 哈希表的认识与实现

可以不经过任何比较,一次直接从表中得到要搜索的元素。如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。所以当我们设置这种数据结构时主要就是要找好与建立好关系。但是我们插入数据的映射关系可能并不是一一对应的,也可能是多对一的关系也称为。所以说我们就要想办法解决这些多个插入数据对应一个插入位置的数据(哈希冲突)的问题,因此我们就有对应的。哈希函数可以帮助我们将插入数据与插入位置关联起来,

2023-11-24 21:13:56 520 1

原创 进程程序替换与exec系统调用

进程程序替换是指将一个正在运行的进程替换为另一个可执行程序。它的本质是调用了Linux操作系统中的exec系统调用。而exec系统调用是一个家族函数,例如execlexecvexecleexecve等。它们的共同特点是当当前进程执行到该函数时,就会直接跳转到新的程序并开始执行新的可执行文件。

2023-11-18 19:01:38 495 1

原创 map和set的简易封装(纯代码)

【代码】map和set的简易封装(纯代码)

2023-11-17 10:38:27 155

原创 对红黑树的理解与实现(C++实现)

每个节点要么是红色,要么是黑色。根节点是黑色。叶子节点(NIL节点)是黑色的。(此叶子结点指的是空节点)如果一个节点是红色的,则它的两个子节点都是黑色的。(不能有连续的两个红节点)对于每个节点,从该节点到其后代叶子节点的所有路径上,包含相同数量的黑色节点。

2023-11-13 21:22:00 156

原创 什么是进程等待?

当一个进程正常退出或者被终止时,其所占用的系统资源会被操作系统及时回收释放,而其退出状态(退出码)会被传递给其父进程。然而,如果父进程没有合理处理该状态,那么子进程将会变成一个僵尸进程。僵尸进程会占据系统资源,也就是僵尸进程的退出信息等资源,避免僵尸进程的产生:父进程通过调用 wait() 或 waitpid() 系统调用来处理已经终止的子进程,也就是处理僵尸进程所占据的资源信息。

2023-11-10 23:53:18 272

原创 AVL树的插入详解

_kv(kv)//pair内部有实现自己的拷贝构造函数,_bf(0){}int _bf;//每个节点的平衡因子(right-left)class AVLpublic:AVL(){}private:首先我们要知道AVL树的数据类型一般都是K-V型,具体说也就是pair类型,而且AVL树和一般的树据关联是不同的,属于三叉连,也就是不仅仅要有左右指针还要有父指针,而父指针的目的就是在插入数据的时候可以更方便的处理祖宗节点的平衡因子。平衡因子的计算:右子树的高度—左子树的高度。

2023-11-09 19:33:19 378 1

原创 Linux下进程地址空间初步理解

我们的每一个进程地址空间都是经过区域分区的,每个区域的数据种类不同,而为了对进程地址空间做管理则必然是有一个类似于PCB(进程控制块)的的结构体,而这个结构体的名称就是mm_struct,而这个结构体里用long long类型的变量存放了有关进程地址空间的所有区域地址划分(也就是每个区域(例如栈区)的起始位置),而区域之间的地址可以被我们直接用来使用,也正是虚拟地址。而进程PCB中也有一个指针指向这个结构体。所以此时对进程地址空间就有了一个全新的理解,

2023-10-27 18:58:48 391

原创 Linux下的命令行参数和环境变量

所以说我们自己的可执行程序要带上路径才能执行就是因为我们的程序不在PATH环境变量下的路径当中。其实linux下的指令是有默认搜索路径的,也就是当你使用该指令时,linux会自动在默认路径里面去找而该默认路径是什么呢?其实这是一个全局的二级字符指针,指向的正是环境变量表中的内容(也就是指向char*[]的类型)所以无论哪里我们都可以通过该指针去访问环境变量列表里的内容。用于指定可执行程序的搜索路径,当输入一个不带路径的命令时,系统会默认在PATH的内容中按照顺序在路径列表中查找可执行程序的所在路径。

2023-10-20 09:29:42 2815 1

原创 C++中的菱形继承问题

学到C++时我们知道了继承但是一般都是使用单继承为主,单继承就是一个子类只能继承一个父类而多继承是指一个子类可以同时继承多个父类。

2023-10-18 19:31:25 288 1

原创 C++容器适配器的使用以及优先队列的实现

所以说一般对于类的实现时如果新旧的版本中部分旧接口还在被使用。需要保留旧的接口,改变少许不同的接口的底层实现的这种情况时就可以考虑到容器适配器。

2023-10-14 10:19:47 187 1

原创 Linux操作系统下进程状态的理解

我们知道进程会有属于自己的PCB,便于操作系统的管理,而PCB结构体里面还有进程状态参数,类似于用一个变量标识对应的进程状态,就相当于将每个进程状态编号,而PCB中有一个变量存储当前进程状态所对应的编号,也就表明当前进程对应的具体状态,好让操作系统看到具体的状态,并对其更好地进行操作。

2023-10-08 20:13:24 177

原创 对进程的初步认识以及fork()函数的理解

进程是什么呢?其实解释的通俗浅显一点就是我们运行到内存的程序。我们知道运行一个磁盘里的程序时,会将该程序先加载(将磁盘的数据拷贝)到内存当中,因此该程序就可以称为一个进程。首先我们以Windows操作系统为例, 可以快捷键查看当前正在运行的进程:Ctrl+shift+Esc。

2023-10-03 10:16:08 233 1

原创 Linux下进度条程序实现以及自动化构建工具makefile的实现和对回车键的理解

在实现进度条之前我们要了解一些有关实现进度条的知识。例如回车与换行和makefile的使用。

2023-09-18 21:27:39 475 3

空空如也

空空如也

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

TA关注的人

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