自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【网络】协议定制+序列化/反序列化

这样就完成了请求对象的构建。客户端发起请求就是serialize+enLength(序列化+自描述),服务端在接收到这个报文后首先去掉报头得到正文,将正文反序列化得到一个包含正文元素的对象(请求对象),此时再创建一个要返回结果的对象(响应对象),将这请求对象和相应对象传入到计算函数中,计算函数将计算的结果和计算的退出码保存到相应对象中,再将相应对象序列化+添加报头组成一个大的“字符串”通过网络发送到客户端,客户端接收后先去报头再反序列化构建出一个对象,这个对象中就保存着计算的结果和计算的退出码。

2023-06-08 18:36:19 1086 10

原创 【Linux】线程池

一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着 监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利 用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。我们去处理任务时,一个任务对应一个创建一个线程进行处理,效率是比较低的。

2023-06-04 23:32:24 1144 4

原创 【网络】UDP网络服务器

​作为一款服务器:要有自己的服务端口号uint16_t_port,同时网络服务器需要有对应的string _ip地址,文件描述符_sockfd:进行各种各样的数据通信,在类内进行读写操作。对于ip地址的类型:字符串型只在我们用户层作为参数传递,传递的IP格式为" 127.0.0.1 "这种格式的IP称之为“点分十进制"IP,这样的IP是字符串,可读性高,但是仅仅在我们用户层使用,但是在网络通信的过程中IP是需要转换为 uint32_t 类型,这时候需要调用相关的接口转换为网络通信使用的的IP风格。

2023-06-04 23:01:12 2647 1

原创 【网络】socket套接字

地址:想发送到的那个主机的IP地址我们把数据从一台主机传递到另一台主机不是真正目的,真正通信的不是这两个机器,通信的主体是两个主机上的进程。但是一个主机上有很多的进程,公网IP虽然标识了一台唯一的主机,那么数据就可以由一台主机传递到另一台主机,但是两个主机上的进程有很多,怎么保证主机A上的进程a和主机B上的进程b通信呢?网络通信的本质就是进程间通信,进程间通信的本质是看到同一份资源,现在这个资源就是网络,通信的本质就是IO,因为我们上网的行为就两种情况:接收数据和发送数据。报头中就会包含源IP和目的IP。

2023-06-04 17:56:25 658

原创 【c++】位图与布隆过滤器

但是如果一个字符串的位图结构是被标记为1的,此时这个被标记的位图结构可能就是这个字符串,当然也有可能是别的字符串和这个字符串共用的一个位图结构,此时查找在的结果就是不准确的!位图只能针对整型,字符串通过哈希转化成整型,再去映射,对于整型没有冲突,因为整型是有限的,映射唯一的位置,但是对于字符串来说,字符串的数量是是无限的但是整形是有限的,就会发生冲突,会发生误判。首先还是确定数据对应的位图结构中的位置,将1左移到对应位置,然后与上_bits[ i ] 如果数据是存在的那最终就返回的是1,否则就返回的是0。

2023-05-18 21:08:50 458

原创 【c++】模拟实现unordered_set和unordered_map

使用哈希桶来进一步模拟实现unordered系列的两个容器:unordered_set和unordered_map.1. 节点模板是 K 模型的容器 unordered_map 是 KV 模型的容器,所以需要对结点的参数进行改造使这两个容器都能使用。对于unordered_set 来说_data 中存的是K,对于unordered_map来说_data中存的是一个由K和V组成的键值对。

2023-05-18 19:08:00 484

原创 【c++】哈希---unordered容器+闭散列+开散列

在有限的空间内,随着我们插入的数据越来越多,冲突的概率也越来越大,查找效率越来越低,所以闭散列的冲突表不可能让它满了,所以引入了负载因子:负载因子/载荷因子:等于表中的有效数据个数/表的大小,衡量表的满程度,在闭散列中负载因子不可能超过1(1代表满了)。理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。由于桶的个数是一定的,随着元素的不断插入,每个桶中元素的个数不断增多,极端情况下,可能会导致一个桶中链表节点非常多,会影响的哈希表的性能,因此在一定条件下需要对哈希表进行增容。

2023-05-16 21:31:56 413 2

原创 【数据结构】红黑树

是一种,但。通过对,因而是的。1.2.3.4.5.为什么以上的性质就可以保证红黑树的最长路径不超过最短路径的两倍?最重要的是要保证每条路径中黑色节点的个数相同,并且红色节点不能连续出现,所以就保证了最长路径不超过最短路径的二倍。

2023-04-28 20:42:30 924

原创 【数据结构】AVLTree

二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数G.M.Adelson-Velskii 和E.M.Landis在1962年 发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。

2023-04-24 19:08:36 571

原创 【Linux】线程

在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列 ”。一切进程至少都有一个执行线程;线程在进程内部运行,本质是在进程地址空间内运行在Linux系统中CPU看到的PCB都要比传统的进程更加轻量化。透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。

2023-04-19 23:31:07 349

原创 【数据结构】二叉搜索树

思路:首先检查树是否为空,如果树为空就创建一个新的节点让_root指向这个节点,因为我们构建的树要符合二叉搜索树的特点所以如果要继续插入新的元素就和根节点进行比较,比根节点的值大就往根节点的右边走,如果比根节点的值小就往根节点的左边走。从根节点开始查找, 如果val大于根节点的键值, 去根的右边找;第二种情况:首先判断要删除的节点是父节点的左孩子还是右孩子,然后让对应的父节点的位置连接上自己的左孩子。第三种情况:首先判断要删除的节点是父节点的左孩子还是右孩子,然后让对应的父节点的位置连接上自己的右孩子。

2023-04-18 22:30:13 1375

原创 【Linux】进程信号

1.信号:能够识别并做出行为的一种指令2.信号来临的时候不一定能够立即对信号做出处理,但是并不影响信号的产生。3.信号来临------>-------时间窗口------>------>被处理,结果是要处理的但是需要时间。4.对待信号的处理方法:1.默认2.自定义3.忽略5.因为对于来的信号可能不能立即做出处理所以信号要保存查看系统定义的信号列表 kill -l 程序正在运行时我们可以通过键盘向对应的进程发送信号Ctrl + c //向进程发送二号信号,默认动作是结束该进程Ctrl + \

2023-04-03 20:53:54 806 5

原创 【Linux】共享内存

这里实现的通信大致的步骤就是首先我们创建两个文件,用来表示两个进程,这里可以将两个文件分别取名为:shm_server.cpp和shm_client.cpp,之后在shm_server.cpp中我们首先使用ftok函数创建一个证明共享内存唯一性的key,之后通过该key值和shmget函数创建一个shmid来标识共享内存,然后使用shmat函数将物理地址中开辟的共享内存和进程地址空间进行关联,之后我们让shm_server.cpp读数据,然后通过shmdt函数取消关联和shmctl函数来删除共享内存。

2023-03-27 13:16:16 1179 4

原创 【Linux】管道

父进程分别以读和写的方式打开同一个文件,父进程再创建子进程,子进程会继承父进程的进程控制块和文件描述符表,父进程打开的文件子进程也可以在子进程的文件描述符表中找到,此时父子进程看到了一份公共的文件,这才有了通信的前提。首先在磁盘当中通过mkfifo()函数创建一个管道文件,两个进程间通信是OS将管道文件加载到内存中这个管道文件就变成了内存级别的文件在内存中是struct file结构体,进程1向进程2发送信息时,通过向这个管道文件向文件中写入信息,进程2在这个管道文件中读取信息。

2023-03-24 20:06:50 484 3

原创 【Linux】动静态库

可执行程序使用到动态库中的实现方法,在可执行程序中记录了该实现方法在库中的偏移量,在运行时OS将动态库加载到内存,通过页表映射到虚拟内存中的共享区,此时库就有了地址,偏移量根据库的地址就能计算出要使用的函数等实现方法的地址,就可以找到所需要的方法。原因是编译时我们告诉了gcc编译器在哪里链接动态库和要连接的动态库的名称,但是运行可执行文件是操作系统将该文件加载到内存中变成一个进程,动态库是动态链接的,在程序运行时才去链接动态库,但是并没有告诉操作系统动态库在哪里所以报错。库的本质:一堆.o文件的集合。

2023-03-22 13:50:22 339 1

原创 【数据结构】排序合集

排序的概念:排序:使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

2023-03-20 22:28:35 186 1

原创 【数据结构】树

如果节点为空就返回空,如果该节点的值就是x那就返回该节点的指针,如果该节点的值不是要查找的值那就遍历它的左子树,用tmp1来接收左子树的查找结果,如果tmp1不是空说明在左子树中找到了所以返回tmp1。叶子节点就是该节点的左右子树==NULL ,如果节点为空返回0,如果该节点的左子树和右子树的=空那这个节点就是叶子节点 所以返回1。那最终的返回值就是左子树的叶子节点个数加右子树的叶子结点的个数。先求出左子树的高度,再求出右子树的高度,最终返回的高度就是该节点的左右子树的最大高度+1(自己)。

2023-03-14 22:19:43 904 1

原创 【数据结构】堆排序

堆是一种叫做的数据结构,可以分为大根堆,小根堆,而堆排序就是基于这种结构而产生的一种程序算法。大堆:每个节点的值都大于或者等于他的左右孩子节点的值小堆:每个结点的值都小于或等于其左孩子和右孩子结点的值不管是大堆还是小堆父节点的数组下标和其孩子节点的下标关系都为。

2023-03-10 22:07:37 524 2

原创 【数据结构】模拟实现 堆

堆数据结构是一种数组对象,它可以被看作一颗完全二叉树的结构(数组是完全二叉树),堆是一种静态结构。堆分为最大堆和最小堆。最大堆:每个父结点都大于孩子结点。最小堆:每个父结点都小于孩子结点。堆的优势:效率高,可以找最大数最小数,增删的时间复杂度为lgN怎么找最后一个叶子结点?找到最后一个叶子结点(左孩子为空就是叶子结点),由于堆是静态结构,所以我们要通过计算下标的方法找,计算它的孩子是否超出了数组范围。

2023-03-07 23:08:07 604 2

原创 【c++】多态

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态有两个条件:1. 必须通过基类的指针或者引用调用虚函数2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写public:cout

2023-03-06 20:19:55 409

原创 【c++】继承

继承的概念:继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。//学生idprotected:int _jobid;//工号。

2023-03-02 22:54:47 325

原创 【Linux】软硬链接

新创建一个文件的硬链接数为1而创建一个目录的硬链接数量为2,原因是:创建目录后在当前目录下使用ls -a可以看到有两个隐藏的目录 . 和 . . 表示当前目录和上级目录,一个点就是当前目录的硬链接。硬链接没有独立的inode,所以建立硬链接就是创建新的文件用的是源文件的inode,没有自己属性集合和内容集合,删除源文件后对于其他有相同inode的文件没有影响。软链接:软连接的文件会一直闪烁,表示找不到原来的文件,因为软链接文件中存的是原文件的路径,原文件被删除该软链接就变为了死链接。

2023-02-27 21:09:06 579

原创 【c++】模拟实现list

在插入一些数据之后进行查看,这里迭代器的实现和以往的不同,之前在vector的模拟实现中采用的就是原生指针typedef 来的,那是因为vector在空间上是连续的,原生指针可以进行++和*等操作,但是list的节点在空间上是不连续的,每一个节点之间的位置关系没有必然的联系,只是在逻辑上认为是连续的,认为连续的原因是因为每一个节点都可以找到这个节点的前一个和后一个节点的位置。new一个新节点存储数据x,然后找到pos位置,将新节点与原来的节点进行连接,最后返回该节点的迭代器。附用任意位置插入元素的函数。

2023-02-05 21:47:33 427

原创 【c++】模拟实现vector

一.vector的成员变量与迭代器vector里面可以存各种数据类型,所以必定会用到模板,假设vector的模板参数为T,那么T*这个指针封装后就是vector的迭代器和string的迭代器很像,只不过string确定存的是字符,所以迭代器直接是char的指针,而vector存的数据类型不确定,就使用T的指针而vector的3个成员变量_start,_finish,_endofstorage也就是3个迭代器,分别指向vector的开头,vector有效数据的结尾,vector容量的结尾。

2023-01-30 23:46:03 416 5

原创 【Linux】程序地址空间

目录地址空间是什么写时拷贝地址空间存在的意义如何管理进程地址空间这是我们常说的c/c++程序地址空间,但是这里的空间具体指的是哪里的空间,举一个例子方便理解: 运行结果: 代码运行十秒后子进程修改了全局变量global_value的值但是父进程打印全局变量的值却不受影响,关键是两个进程打印的两个值的地址是相同的,这就很难理解,读取同一个地址的值为什么会有不同的结果。如果是物理地址打印出来的值就是同一个,说明我们这里打印出来的地址不是真实的物理地址而是虚拟地址,Linux中有时也称为逻辑地址。操作系统会给每

2022-12-07 13:01:11 577

原创 【Linux】进程的状态

Linux中几种常见的进程状态

2022-12-04 20:26:23 444

原创 【Linux】进程的理解

进程的初步理解

2022-11-12 16:21:34 309 4

原创 【c++】模拟实现string

c++模拟实现string

2022-11-08 22:43:18 268 10

原创 【c++】string

【c++】string类

2022-11-07 21:05:59 384 4

原创 【c++】函数模板和类模板

c++函数模板和类模板

2022-11-05 14:58:04 132 7

原创 【c++】日期类

c++日期类的实现

2022-11-01 23:41:09 150 5

原创 【Linux】make和makefile详解

make和makefile详解

2022-10-26 20:31:11 3052 3

原创 【c++】内存管理

c++内存管理

2022-10-23 20:01:06 327 1

原创 【Linux】动态链接和静态链接

动态链接和静态链接

2022-10-22 21:52:54 710 1

原创 【c++】初始化列表详解

初始化列表详解

2022-10-16 19:52:55 127

原创 c语言实现队列

c语言实现队列

2022-10-05 20:37:14 5331 5

原创 c语言实现栈

c语言实现栈

2022-10-05 17:47:58 1385 1

原创 【linux】查看文件

Linux显示文件内容

2022-10-03 13:05:04 9207

原创 【Linux】常用指令

常用命令

2022-10-03 12:26:00 60

原创 【c++】类和对象----默认成员函数

默认成员函数

2022-09-30 00:43:15 122

空空如也

空空如也

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

TA关注的人

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