自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

不知道起啥名称的博客

记录自己的学习编程的过程 嘿嘿嘿嘿

  • 博客(46)
  • 收藏
  • 关注

原创 消息队列-kafka入门详解

本文适用于初学者,学习kafka之前 应该都知道它是消息队列,但是和我们印象中数据结构的队列不同的是,它持久化到磁盘上。1、我们首先从定义来看Kafka 一个分布式的、分区化、可复制提交的日志服务,我们先来想想什么是分区,好比图书馆的书,会分成好几个区。那么kafka也是这样的,他会把消息分成几个区,0-100寸到A区,100-200 存到B区。这个专有名词就叫做partition。可复制说的就是主从节点之前的复制了。2、那么此时你会不会有疑问,我们为什么需要中间件,为什么会用到kafka呢?...

2021-05-25 15:05:37 477

原创 Kafka消费者重复消费

碎碎念:两年没有更新博客了,今天是新的开始,想记录下自己工作之后的成长。写在前面:前段时间开周会的时候,其他组同步一个问题,就是在压测的时候出现了kafka的消费者重复消费的问题。我比较好奇为什么会出现这种问题,知道问题肯定不是出在kafka,每秒几十万的吞吐量,怎么可能是消息队列本身的问题呢我们代码里kafka配置<!--定义consumer的参数 --> <bean id="consumerProperties" class="java.util.HashMap"&g.

2021-05-25 10:55:10 442

原创 I/O模型之poll模型

1.poll与select,epoll比较poll主要是解决select的最大文件描述符限制提出的,与select一样都是轮询文件描述符,所以效率方便也无法与epoll相比,另外poll不具备移植性,只有在linux系统上有实现,在windows系统没有poll模型的实现2.poll模型效率poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备...

2019-02-25 20:10:36 408

原创 I/O复用之epoll模型

 epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。epoll除了提供select/poll那种IO事件...

2019-02-25 19:35:43 222

原创 I/O复用模型之select模型

 我们先来理解一下五种IO模型的区别1.阻塞I/O模型老李去火车站买票,排队三天买到一张退票。耗费:在车站吃喝拉撒睡 3天,其他事一件没干。2.非阻塞I/O模型老李去火车站买票,隔12小时去火车站问有没有退票,三天后买到一张票。耗费:往返车站6次,路上6小时,其他时间做了好多事。3.I/O复用模型1.select/poll老李去火车站买票,委托黄牛,然后每隔6小时电话...

2019-02-25 15:36:51 230

转载 进程通信——消息对列

Linux下进程间通信方式:1. 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系2. 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。3. 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常...

2018-11-09 19:34:20 195

原创 堆排序

大根堆排序算法的基本操作:①建堆,建堆是不断调整堆的过程,从len/2处开始调整,一直到第一个节点,此处len是堆中元素的个数。建堆的过程是线性的过程,从len/2到0处一直调用调整堆的过程,相当于o(h1)+o(h2)…+o(hlen/2) 其中h表示节点的深度,len/2表示节点的个数,这是一个求和的过程,结果是线性的O(n)。②调整堆:调整堆在构建堆的过程中会用到,而且在堆排序过程中...

2018-08-13 16:42:47 151

原创 希尔排序(ShellSort)

希尔排序是插入排序的一种即我们要将一个数组分割成多个组,然后我们在这个区间内使用插入排序,插入排序我们在这里就不做过多的介绍了首先我们要知道这个组是怎么划分的,我们划分区间首先就要定步长第一次的步长gap=length/2第二次步长  gap=gap/2直到gap&lt;1时结束所以我们将一个数组分成了gap个组,然后我们在这个组中排序注意:我们划分的各中的元素是通过原...

2018-08-11 16:28:29 150

原创 快速排序———挖坑填补法

快排的基本思路:首先将数组的第一个数字作为标准值;然后我们只需要找到该数组在排好序后的数组中的位置,在此位置之前的数字都比该数字小,在此位置之后的数字都比还数字大。下面介绍一下怎么找到标准值的位置:1 先将标准值保存,腾出标准值的位置,出坑(注 坑不是实际意义上的空间,而是我们假象的,只需要保存标准时即可)2 从后面向前找到比标准值小的数字,放在坑里,这样又腾出一个位置3 再从...

2018-08-11 16:02:14 1099

原创 计数排序

计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。 当然这是一种牺牲空间换取时间的做法,计数排序的思想是:重新申请一个数组,新数组的大小是由原数组中最大值减去最小值加一得到的,然后将原数组中出现的数字次数存在新数组里,最后通过新数组进行排...

2018-08-09 13:17:34 108

原创 插入排序

有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法 这里我们实现的是最简单的直接插入:也就是将待排序的数组分成两部分,一部分是有序...

2018-08-09 12:58:56 148

原创 选择排序

算法描述:每次都查找选择最大的数或者最小的数,找到之后放在最前面或者最后面注意:通过数组下标进行比较,以便交换数的位置这是在网上找到的图示:附代码如下:#include&lt;stdio.h&gt;//选择排序:每次都找最小值,找到之后从前往后放,或者找最大值按照要求放置void SelectSort(int arr[],int nLength){ if(arr ==...

2018-08-09 12:47:12 102

原创 图的创建以及遍历

首先图分为有向图和无向图。我们先来介绍无向图:无向图定义:若图中所有的边均满足的两个顶点没有次序关系和方向性,即(v1,v2)和(v2,v1)代表同一条边,则称为无向图。图所示无向图就是由结点V={1,2,3,4,5},和边E={(1,2),(1,4),(2,3),(3.4),(3,5),(2,5)},构成的。我们也不难观察到该图是沿着对角线对称的,即如果图的邻接矩阵是沿对角线对...

2018-08-08 17:04:47 11393 2

原创 浅谈Linux 信号(Signal)

1.在linux用命令 kill -l 查看系统信号2.前32个信号是unix经典信号,后32为实时信号(自定义信号)3.前台进程永远只有一个,后台进程可以有n个4 用用命令ctl+c 可以结束唯一一个后台进程5.产生信号的几种方式     1)终端组合按键产生信号 (ctl+c (15  SIGTERM)  ctl+\(3  SIGQUIT)  ctl+z(20  SIGTSTP))     2...

2018-06-19 16:36:24 1248

原创 进程间通信之有名管道

通过命令mkfifo +管道名 (创建有名管道文件)有名管道的使用1.同时具备读与写的两端都需要打开管道文件才使用有名管道,如只有一方,则打开时阻塞2.所有有名管道内保存的数据都与管道文件无关,管道文件只提供操作管道的方式有名管道的几种情况:读管道:1.默认情况下操作都是阻塞的(以下几条的前提)2.写端打开管道,管道无数据,读端读阻塞3.造成阻塞的两种原因:            1.管道内有数据...

2018-06-18 18:42:16 224

原创 进程间通信之匿名管道

进程间通信的5中方式:有名管道,匿名管道,systemv,posix消息队列,信号量,文件共享映射,注意,5种进程间通信均操作的内核空间首先我们来浅谈下匿名管道pipe匿名管道是通过环形队列实现的,可实现节省空间和避免溢出等问题。匿名管道有两个特点,一个是方向性,另一个是具有流向匿名管道只能解决父子进程之间的通信,一般使用pipe时在fork之前进行匿名管道一共四个文件描述符,两个读,两个写,分别...

2018-06-18 17:49:13 209

原创 wait(),waitpid()函数

首先我们来了解一下所谓的僵尸进程,僵尸进程就是两个进程,其子进程终止后,0-3G的用户内存被回收,而3-4G的部分内存被回收,但是3-4G内存中的PCB等待父进程回收,若PCB未被父进程回收,我们称这个进程为僵尸进程,注,之所以保留PCB,是因为其中保存着子进程的终止状态父进程回收子进程的资源所用到的函数就是我们今天所要说的wait()和waitpid()函数那么我们先来了解一下wait函数wai...

2018-06-02 21:15:56 1092 1

原创 浅谈Linux中的fork()函数

函数原型pid_t fork( void);(pid_t 是一个宏定义,其实质是int 被定义在#include&lt;sys/types.h&gt;中)返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1函数说明一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。而这个现有进程是所谓的父进程。当...

2018-06-01 16:38:27 428

原创 浅谈WinSock I/O模型之异步选择(WSAAsyncSelect)

异步选择,顾名思义就是WSAAsyncSelect模型是Select模型的异步版本,在调用select()函数时,会发生阻塞现象。可以通过select()函数timeout参数,设置函数调用的阻塞时间。在设定的时间内,线程保持等待,直到其中一个或多个套接字满足可读可写的条件时,该函数返回。首先我们将异步选择与select模型进行比较:相同点:他们都可以对Windows套接字应用程序所使用的多个套接...

2018-05-29 10:28:18 1446 1

原创 浅谈WinSock异步I/O模型之select模型

Windows操作系统提供了五种I/O模型,分别是:1.选择(select)2.异步选择(WSAAsyncSelect)3.事件选择(WSAEventSelect)4.重叠I/O(Overlapped I/O)5.完成端口(Completion Port)下面我们来谈一谈最简单的选择模型:选择(select)模型是Winsock中最常见的 I/O模型。用途:如果我们想接受多个SOCKET的数据,该...

2018-05-29 10:03:49 1843

原创 堆排序(大堆)

前言:堆排序可分为大堆和小堆。      其实堆的空间结构实际上就是一棵完全二叉树,不过堆有它自己的限定条件。大堆就是树中每个父亲节点都要比孩子节点大,并且两个兄弟之间是没有大小区分的。小堆与之相反,就是每个父亲节点都要比孩子节点小。    堆的空间结构虽然是个完全二叉树,但是这样的结构也是我们为了好理解才想出来的,实际上堆是通过数组的下标进行相应的排序,因为完全二叉树中的结点的编号可以算出来,这...

2018-05-08 08:25:04 15071

原创 内存管理

大纲:内存管理:连续分配和非连续分配连续分配:单一连续分配                 固定连续分配 (产生内部碎片)                 动态连续分配(产生外部碎片):首次适应算法                                          循环首次适应算法                                           最佳适应算法非连...

2018-05-03 22:21:47 140

原创 线程同步方式

1.原子访问:同一时刻只允许同一线程访问资源(变量)  关键字:volatile(防止编译优化,对特殊地址进行稳定访问)可直接操作内存2.关键段:同一时刻只允许一个线程访问一个代码段InitializeCriticalSectionAndSpinCount(变量名,0)例:// Global variableCRITICAL_SECTION CriticalSection; int main...

2018-05-02 22:19:46 153

原创 红黑树整理

BST特点:1.每个节点的颜色非黑即红2.根节点是黑色3.树中终端节点(NIL)也称哨兵均为黑色4.没有两个红节点互为父子关系5.从任意节点出发到其所能到达的所有终端节点的各条路径上的黑节点的数目完全相同添加结点情况分类:1.若树为空,则添加的结点X为树的根,并且X的颜色为黑色2.若父亲节点为黑节点,则将X插入3.若父亲节点是红色   3.1 若叔叔节点是红的,则将父亲变黑,将叔叔变黑,将爷爷变红...

2018-04-23 23:26:24 143

原创 Set

Set一. 理论:1. Set的特性是,所有元素都会根据元素的键值自动被排序,Set 的元素不像Map那样可以同时拥有实值和键值,Set 元素的键值就是实值,实值就是键值。Set 不允许两个元素有相同的键值。2. 因为Set 元素值就是其键值,关系到 Set 元素的排列规则。如果任意改变Set 的元素值,会严重的破坏Set组织。一. 实际应用:1. 初始化可以定义一个数组,将数组直接赋值给Set的...

2018-04-21 22:44:44 124

原创 排序二叉树节点的删除

首先先看看这个删除节点12后的树,还要保证该平衡二叉树的特性保持不变删除节点详细分为三类:第一类.所删除的节点是叶子节点,这样就可以先遍历这个树,然后找到需要删除的节点,把它free掉就好第二类:就是所删除的节点只有一个左孩子,或者只有一个右孩子,则把该节点的孩子变为它父亲的孩子 ,然后删除这个结点在这个例子把28删除,就是把30连接到12上第三类:就是最麻烦的一类,假如我们要删除节点12,直接删...

2018-04-17 20:26:48 8010 1

原创 二叉树的翻转代码

代码如下:#include&lt;stdio.h&gt;#include&lt;stdlib.h&gt;typedef struct node{ int nValue; struct node *pLeft; struct node *pRight; struct node *pFather;}BinaryTree;BinaryTree *CreateBinaryTree()...

2018-04-15 22:22:49 816 1

原创 二叉树的层次遍历

思路:二叉树的层次遍历思路,借助队列来实现。相当于广度优先搜索,使用队列(深度优先搜索的话,使用栈)。 若根节点为空,直接返回; 若根节点非空,则将根节点入队,然后,判断队列是否为空,若不为空,则将队首节点出队,访问, 并判断其左右子节点是否为空,若不为空,则压入队列。步骤:1.申请一个辅助队列,并且先把根节点入队2.判断队列是否为空3.队列不为空则进入循环,循...

2018-04-14 20:28:43 182

原创 二叉树的非递归遍历

1.非递归前序遍历步骤:                                   1.申请一个辅助栈                                    2.循环遍历二叉树:如果二叉树结点非空,则打印,结点入栈,二叉树向左走                                    3. 栈顶元素弹出                            ...

2018-04-14 20:12:45 131

原创 两个队列实现一个栈

思路    q1是专职进出栈的,q2只是个中转站      入栈:直接入队列q1即可      出栈:把q1的除最后一个元素外全部转移到队q2中,然后把刚才剩下q1中的那个元素出队列。之后把q2中的全部元素转移回q1中。(偷得(*^▽^*))图示:实现代码如下:#include&lt;stdio.h&gt;#include&lt;stdlib.h&gt;typedef struct node...

2018-04-08 21:31:37 107

原创 树———二叉树

定义:二叉树是另一种树形结构,它的特点是每个结点至多只有两棵子树(即二叉树中的度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。二叉树的三种遍历方式:先序遍历:遍历顺序规则为【根左右】中序遍历:遍历顺序规则为【左根右】后序遍历:遍历顺序规则为【左右根】例:如上图先序遍历:a b d e c f g h i     中序遍历:d b e a f h g i c     后序遍历:d...

2018-04-08 21:14:59 160

原创 用两个栈实现队列的操作代码

#include&lt;stdio.h&gt;#include&lt;stdlib.h&gt;typedef struct node{ int nValue; struct node *pNext;}MyStack;typedef struct node2{ MyStack *pTop; int nCount;}Stack;typedef struct node3 ...

2018-04-05 19:09:09 111

原创 堆区和栈区区别(笔试)

堆区和栈区区别:1.分配方式不同,堆区用户申请,用户释放,栈区自动释放2.堆区地址从小到大分配,栈区相反3.存放内容不同,栈区存放所有定义的变量4.堆区有管理链表,管理各个分块的内存,而栈区是一整块连续的内存5.堆区易产生内存碎片...

2018-04-05 19:06:22 549

转载 位运算

一:简介1 位逻辑运算符:      &amp; (位   “与”)  and      ^  (位   “异或”)      |   (位    “或”)   or      ~  (位   “取反”)2 移位运算符:      &lt;&lt;(左移)      &gt;&gt;(右移)优先级位“与”、位“或”和位“异或”运算符都是双目运算符,其结合性都是从左向右的,优先级高于逻辑运算符,低于...

2018-04-05 18:57:03 140

转载 c++位运算

&lt;div class="container clearfix"&gt; &lt;main&gt; &lt;div style="display:none;"&gt; &lt;img src="" onerror="setTimeout(function(){if(!/(csdn.net|iteye.com|baiducontent.com|googleu

2018-04-05 18:44:17 3276

原创 队列的基本操作

首先 我认为队列就是对链表进行尾插入头删除实现代码如下:#include&lt;stdio.h&gt;#include&lt;stdlib.h&gt;typedef struct node3{ int nValue; struct node3 *pNext;}MyQueue;typedef struct node4{ int nCount; MyQueue *pHead;...

2018-04-05 17:44:16 387

原创 栈的基本操作及实际应用

#include&lt;stdio.h&gt;#include&lt;stdlib.h&gt;typedef struct node{ int nValue; struct node *pNext;}MyStack;typedef struct node2{ MyStack *pTop; int nCount;}Stack;void s_Init(Stack **p...

2018-04-05 16:47:13 536

转载 C++中this指针的用法详解

C++中this指针的用法详解  1. this指针的用处:  一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问...

2018-03-29 19:57:31 709

翻译 虚函数表

C++ 虚函数表解析C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。虚函数表 对C++ 了解...

2018-03-29 19:22:59 324

原创 Map

Map一. 理论:1. Map 的特性是,所有元素都会根据元素的键值自动被排序,map的所有元素都是pair,同时拥有实值(value)和键值(key)。Pair的第一元素被视为键值,第二元素被视为实值。Map 不允许两个元素拥有相同的键值。2. map 的键值关系到map的元素的排列规则,任意改变map元素键值将严重破坏map的组织。所以不可以通过map 的迭代器来改变map 的键值。但是可以通...

2018-03-29 18:36:02 1260

空空如也

空空如也

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

TA关注的人

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