自定义博客皮肤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)
  • 收藏
  • 关注

原创 高性能网络模式-Reactor

Reactor 模式主要由 **Reactor部分**和**处理事件部分**这两个核⼼部分组成,它俩负责的事情如下: - Reactor部分负责监听和分发事件,事件类型包含连接事件、读写事件; - 处理事件部分负责处理事件,如 read -> 业务逻辑 -> send

2023-08-24 11:21:48 1176 4

原创 Nagle算法思想+伪代码

💡注意,如果接收⽅不能满⾜「不通告⼩窗⼝给发送⽅」,那么即使开了 Nagle 算法,也⽆法避免糊涂窗⼝综合症,因为如果对端 ACK 回复很快的话(达到 Nagle 算法的条件⼆),Nagle 算法就不会拼接太多的数据包,这种情况下依然会有⼩数据包的传输,⽹络总体的利⽤率依然很低。只要上⾯两个条件都不满⾜,发送⽅⼀直在囤积数据,直到满⾜上⾯的发送条件。:要等到窗⼝⼤⼩ >= MSS 并且 数据⼤⼩ >= MSS;使⽤ Nagle 算法,该算法的思路是。,只有满⾜下⾯两个条件中的。

2023-08-14 11:28:15 282

原创 redis的Key的过期策略是如何实现的?

一个redis中可能同时存在很多很多key,这些key可能有很大一部分都有过期时间,此时,redis服务器咋知道哪些key已经过期要被删除,哪些key还没有过期?如果直接遍历所有的key,显然是行不通的,效率极低!

2023-08-13 12:06:02 631 3

原创 死锁的发生与避免

死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。

2023-07-02 08:00:00 631 1

原创 I/O多路复用之epoll

每一个epoll对象都有一个独立的eventpoll结构体,用于存放通过epoll_ctl方法向epoll对象中添加进来的事件。这个回调方法在内核中叫ep_poll_callback,它会将发生的事件添加到rdlist双链表中。如果rdlist不为空,则把发生的事件复制到用户态,同时将事件数量返回给用户. 这个操作的时间复杂度。红黑树的根节点,这颗树中存储着所有添加到epoll中的需要监控的事件。(红黑树的插入时间效率是log(n),其中n为树的高度)。在epoll中,对于每一个事件,都会建立一个。

2023-06-28 08:00:00 804 4

原创 Centos7离线安装sar工具

1 执行unzip sysstat-master.zip命令解压。 2. 执行cd sysstat-master命令,进入到sysstat-master文件夹。 3. 执行./configure命令生成Makefile。 4. 执行make命令开始编译。 5. 执行make install命令进行安装。至此安装结束。可以使用sar --help命令确认是否安装成功。

2023-06-25 20:24:30 1256 1

原创 IO多路复用之poll

我们从struct polled结构体可以看出,该结构体包含三个成员,

2023-06-25 14:00:09 436 3

原创 I/O多路转接之select

系统提供select函数来实现多路复用输入/输出模型: - select系统调用是用来让我们的程序监视多个文件描述符的状态变化的; - 程序会停在select这里等待,直到被监视的文件描述符有一个或多个发生了状态改变;

2023-06-21 15:35:46 379 4

原创 【IO模型】阻塞,非阻塞,多路复用

非阻塞IO往往需要程序员循环的方式反复尝试读写文件描述符, 这个过程称为。这对CPU来说是较大的浪费, 一般只有特定场景下才使用。

2023-06-20 20:01:28 195

原创 经典同步问题之哲学家就餐

五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替的进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到左右两只筷子时才能进餐,进餐完毕,放下筷子继续思考。上述程序中互斥量的作用在于,只要有一个哲学家进入了临界区,也就是准备拿叉子时,其他哲学家是互斥不可访问临界区的,这又当这个哲学家吃完了退出临界区后,其他哲学家才可以拿叉子进餐。上面的程序,在P操作时,根据哲学家的编号不同,拿起左右两边叉子的顺序不同。

2023-06-18 19:25:54 1486 4

原创 内存池技术

为了学习池化技术以及后续自行实现一个仿tcmalloc的线程池,我们先浅浅的学习一下池化的概念,以及简单的实现一个定长的内存池。

2023-06-04 17:19:33 1970 6

原创 线程池的简单实现

线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。线程过多会带来调度开销,进而影响缓存局部性和整体性能。

2023-04-25 10:18:27 861 4

原创 【设计模式】单例模式

单例模式是一种“经典的,常用的,常考的设计模式。

2023-04-18 16:46:05 453 3

原创 【设计模式】生产者消费者模型

带你轻松理解生产者消费者模型!生产者消费者模型可以说是同步与互斥最典型的应用场景了!文末附有模型简单实现的代码,若有疑问可私信一起讨论。

2023-04-13 14:00:20 620 3

原创 【Linux】线程同步之POSIX信号量

带你轻松理解生产者消费者模型!生产者消费者模型可以说是同步与互斥最典型的应用场景了!文末附有模型简单实现的代码,若有疑问可私信一起讨论。

2023-04-10 16:38:27 495 3

原创 快快快速排序

快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序时间复杂度:O(N*logN)空间复杂度:O(logN)稳定性:不稳定。

2023-04-09 12:30:36 542 6

原创 【Linux】线程同步之条件变量

饥饿问题:一个执行流,长时间得不到某种资源。

2023-04-06 16:32:58 412 2

原创 【Linux】线程终止方式

⚠️注意:joinable和分离是冲突的,一个线程不能既是joinable又是分离的。返回值:无返回值,跟进程一样,线程结束的时候无法返回到它的调用者(自身)value_ptr:value_ptr不要指向一个局部变量。返回值:成功返回0;功能:取消一个执行中的线程。thread:线程ID。

2023-04-04 09:00:00 2140 1

原创 【Linux】进程和线程间的区别与联系

带你轻松理解进程与线程的区别与联系:进程的多个线程共享 同一地址空间,因此Text Segment(代码段)、Data Segment(数据段)都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:

2023-04-02 15:18:31 379 3

原创 Linux的mysql 数据库及开发包安装

直接按照下列步骤在命令行输入即可。:在相应的配置文件中添加对应命令。

2023-03-15 13:22:10 1086 8

原创 GCC/G++升级高版本

命令3是为了将source /opt/rh/devtoolset-7/enable追加到~/.bashrc配置文件中,为了自启动生效。⚠️ 若直接在命令行输入命令3,那么新版本只在本会话内有效,重启后又是老版本。查看当前版本,CenTOS-7默认4.8.5版本。(这是一个配置文件,里面的内容每次启动会自动执行)//安装新版本gcc。

2023-03-13 09:57:40 2640 8

原创 Linux多线程互斥量与原理剖析

如果在判断之前,线程A被切换走了,此时线程A带着寄存器上下文数据(1)一起被切换走,那么此时来的线程因申请不到锁而被挂起等待。凡是在寄存器中的数据,全部都是线程的上下文数据,在线程被切换时,会随着线程一起离开。返回值:成功返回0,失败返回错误号。mutex:要初始化的互斥量。mutex:内存中的一个变量。(3)互斥量加锁和解锁。

2022-12-29 10:15:20 863 15

原创 Linux中如何理解线程?线程ID到底是什么?

朋友们好,这里简要介绍了进程和线程的区别以及对LINUX中线程ID的理解,本人目前理解尚浅,若文中有表述不当的地方还望理解并指正,谢谢大家!上述中**独立栈结构和线程各自拥有一组寄存器**是理解线程的关键。进程的多个线程共享同一地址空间,因此代码段、数据段都是共享的,如果定义一个函数(在代码段),那么在各个线程中都可以调用,如果定义一个全局变量,那么在各个线程中都可以访问到。除此之外,各线程还共享以下进程资源和环境:pthread_t到底是什么类型?取决于实现。对于目前Linux实现的NPTL实现而言,

2022-12-27 11:54:17 810 18

原创 【浅学Linux】信号产生的4中方式

上面所说的信号的产生,最终都是要操作系统来执行,因为OS是进程的管理者。信号的处理是在合适的时候处理的!(下篇博客详细讲)信号如果不是被立即处理的,需要记录在进程控制块中。

2022-12-21 17:11:04 1337 10

原创 理解Linux32位机器下虚拟地址到物理地址的转化

在32位机器下,IO的基本单位是块(块:4kb),在程序编译成可执行程序时也划分好了以4kb为单位加载到内存中,32位机器下物理内存4GB,4GB以4KB为单位划分,一共2的20次方个,每个单位4kb称为页框,也即一个page

2022-11-19 00:53:42 935 16

原创 【浅学Linux】动态库与静态库的封装与使用

朋友们好,这里简单介绍一下LINUX学习中关于动态库与静态库的理解,以及站在封装和使用的角度去介绍是如何封装的?如何使用的?我们先来理解几个问题:1️⃣:库里面需不需要main函数?不需要!2️⃣:什么是链接?就是把所有的.o文件链接形成一个可执行程序。3️⃣:将我的所有.O文件给别人,别人可以使用吗?可以!4️⃣:你在使用库的时候,需要用到什么?库文件和头文件。gcc 或者g++ 只认识系统库,不认识其他第三方库,所以我们想要使用对应的静态库的话,怎么做呢?方式一:库的安装! 也就是将对应

2022-11-13 11:20:21 1377 15

原创 【浅学Linux】进程控制之进程程序替换

用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支)子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行

2022-10-16 08:00:00 710 14

原创 【C++11智能指针】定制删除器解决智能指针管理不是new出的资源!!!

默认情况下,智能指针使用delete释放其管理的资源,有时候,可能要修改默认使用delete释放资源的行为。但如果不是new出来的资源,如何通过智能指针管理呢?

2022-10-06 21:26:55 501 6

原创 【海量数据处理】布隆过滤器BloomFilter

布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入和查询,可以用来告诉你“**某样东西一定不存在或者可能存在**”,它是用**多个哈希函数**,将**一个数据映射到位图结构**中。此种方式不仅可以提升查询效率,也可以节省大量的内存空间。

2022-10-06 11:39:38 924 16

原创 【C++11新增知识点】右值引用、移动语义、完美转发

左值是一个表*数据的表达式(如对象名,或者正在解引用的指针),我们可以对它取地址并赋值,左值可以出现在赋值符号的左边,右值不可以出现在赋值符号的左边。特例:经const修饰的左值不可以对它赋值,但可以取地址。左值引用就是给左值的引用,给左值取别名!字面常量,表达式返回值,函数的返回值(注意这个两个返回值都是指传值返回中产生的那个临时对象是右值),右值不能取地址。右值引用就是对右值的引用, 给右值取别名。//以下几个常见右值 //10;//x + y;

2022-10-03 11:36:29 932 26

原创 【聚类算法】带你轻松搞懂K-means聚类(含代码以及详细解释)

K-means算法是典型的基于距离(欧式距离、曼哈顿距离)的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。k均值聚类是最著名的划分聚类算法,由于简洁和效率使得他成为所有聚类算法中最广泛使用的。给定一个数据点集合和需要的聚类数目k,k由用户指定,k均值算法根据某个距离函数反复把数据分入k个聚类中。有以下6个点,初始随机选取两个点作为两个簇的簇中心(这里假设选取的是A3,A4),求最后的簇所属情况。2️⃣:将红色对应的点和绿色对应的每个点分别求X,Y平均值,最为新的簇心。

2022-09-12 10:38:52 17054

原创 【浅显易懂KMP算法】带着问题思考,带你彻底搞懂KMP算法中难以理解的点!

1:为什么主串不回溯,模式串回溯到对应Next数组值下标处? 2:为什么会有Next[ 0 ] = -1 这个初始化? 3:Next数组最接地气的理解,如何求Next[j + 1]呢?

2022-08-19 15:42:55 631 21

原创 【堆的应用】细说Top-K问题

堆顶元素一定是堆中的最小元素(小顶堆为例),若后面有大于堆顶的数据,理所当然与堆顶元素交换,交换之后再调整堆。循环往复堆中的元素就是前K个最大的元素。将剩余的 n-k 个元素依次与堆顶元素比较完之后,堆中剩余的k个元素就是所求的前k个最小或者最大元素。3️⃣:用剩余的N-K个元素依次与堆顶元素比较,不满足就替换堆顶元素,并相应向下调整。剩余n-k个元素依次比较完以后,堆中剩余的K个元素就是所求的前K个最大的元素。2️⃣:对数组的前K个元素采用向下调整算法建小堆。⭐️⭐️⭐️Top-K问题,也就是求。...

2022-08-14 16:32:56 404 16

原创 【平衡二叉搜索树】细撕AVL树的插入操作

朋友们好,这篇博客我们学习非常重要的一个数据结构——AVL树,针对AVL树的插入进行了详细的分析,并整理出来一篇博客供我们一起学习和后续的复习,如果文章中有理解不当的地方,还希望朋友们在评论区指出,我们相互学习,共同进步!...

2022-08-08 17:57:52 458 30

原创 【C++进阶知识继承】继承的赋值转换,菱形虚拟继承

朋友们好,这篇博客我们进入C++的进阶学习,最近我学习了C++中的继承相关知识,继承是面向对象编程的三大特征之一,十分重要。所以特意整理出来一篇博客供我们一起复习和学习,如果文章中有理解不当的地方,还希望朋友们在评论区指出,我们相互学习,共同进步!......

2022-08-02 09:48:14 369 23

原创 【C++优先级队列priority_queue基础】基本使用,模拟实现,堆

朋友们好,这篇博客我们继续C++的初阶学习,最近我学习了C++中的STL库中的优先级队列(priority_queue)容器适配器,对于优先级队列,我们不仅要会使用常用的函数接口,我们还有明白这些接口在其底层是如何实现的。所以特意整理出来一篇博客供我们学习和,如果文章中有理解不当的地方,还希望朋友们在评论区指出,我们相互学习,共同进步!......

2022-07-30 16:21:05 976 14

原创 【C++List容器底层剖析】完成了List容器的一些常用函数接口

*朋友们好,这篇博客我们继续C++的初阶学习,最近我学习了C++中的STL库中的list容器,对于常用容器,我们不仅要会使用其常用的函数接口,我们还有明白这些接口在其底层是如何实现的。所以特意整理出来一篇博客供我们学习和,如果文章中有理解不当的地方,还希望朋友们在评论区指出,我们相互学习,共同进步!...

2022-07-27 10:20:46 417 17

原创 【C++Vector容器底层剖析】完成了Vector容器的一些常用函数接口

朋友们好,这篇博客我们继续C++的初阶学习,最近我学习了C++中的STL库中的vector容器,对于常用容器,我们不仅要会使用其常用的函数接口,我们还有明白这些接口在其底层是如何实现的。所以特意整理出来一篇博客供我们学习和,如果文章中有理解不当的地方,还希望朋友们在评论区指出,我们相互学习,共同进步!...

2022-07-20 15:09:09 358 21

原创 【C++模板基础知识】模板的特化

**朋友们好,这篇播客我们继续C++的初阶学习,最近我学习了C++中的模板相关知识,模板是泛型编程的基础,十分重要。所以特意整理出来一篇博客供我们一起复习和学习,如果文章中有理解不当的地方,还希望朋友们在评论区指出,我们相互学习,共同进步!**.........

2022-07-19 10:47:40 590 18

原创 【C++中Vector迭代器失效】迭代器失效真的太难搞啦!

朋友们好,这篇播客我们继续C++的初阶学习,最近我学习了C++中的迭代器失效问题,迭代器失效问题是非常非常重要的,所以特意整理出来一篇博客供我们一起复习和学习,如果文章中有理解不当的地方,还希望朋友们在评论区指出,我们相互学习,共同进步!主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装。比如:vector的迭代器就是原生态指针T*。因此迭代器失效,实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果继续使用已经失

2022-07-12 15:43:06 1819 23

空空如也

空空如也

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

TA关注的人

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