自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(124)
  • 问答 (1)
  • 收藏
  • 关注

原创 nginx 集群部署

nginx在1.9版本前,只支持http协议web服务器的负载均衡,1.9版本开始以后,nginx开始支持tcp的长连接负载均衡,但是nginx默认并没有编译tcp负载均衡模块,编写它时,需要加入–with-stream参数来激活这个模块。普通的基于哈希的负载算法,并不能满足负载均衡所要求的单调性和平衡性,但一致性哈希算法非常好的保持了这两种特性,所以经常用在需要设计负载算法的应用场景当中。

2022-09-16 00:14:11 3898 1

原创 socket编程 REUSEADDR/REUSESOCK 参数区别

介绍一下系统调用 setsockopt 的REUSEADDR/REUSESOCK 参数区别。众所周知,TCP连接中主动断开连接方会进入一个TIME_WAIT 状态,并连接会等待两个MSL时间才真正断开,来防止最后一个发送的ACK丢失也能重发和让数据包在网络中消散。

2022-08-22 03:21:04 763

原创 ubuntu 操作杂项

Ubuntu 18.04操作系统默认预装GCC 7.3版本,不过有时候在编译时是需要用不同gcc的版本,本文介绍怎样安装不同的gcc和g++,并设置根据不同的需要在不同版本之间转换。sudo update-alternatives --remove gcc /usr/bin/(为gcc版本号,比如gcc-4.5。这个命令输入过后,看不到java的版本了的话,就表示卸载成功了,如果,还能看到版本号,那一定是什么地方出了问题。同时输入同步时间命令。sudo update-grub,保存/更新GRUB文件。...

2022-08-11 14:46:35 850

原创 ubuntu安装zookeeper原生 C API

zookeeper是一个在分布式环境中,为应用提供一致性协调服务的一种中间件。是Google的Chubby一个开源的实现,是大数据生态中的重要组件。zookeeper可以在分布式环境中监视各个节点的状态,并根据节点的状态进行下一步合理操作。,对外提供简单易用、高效、稳定的接口。...

2022-08-11 14:28:37 441

原创 CMake 快速指南

CMake使用简单方便,可以跨平台,构建项目编译环境。尤其比直接写Makefile简单(在构建大型工程编译时,需要写大量的文件依赖关系),可以通过简单的CMake生成负责的Makefile文件。cmake命令会执行目录下的CMakeLists.txt配置文件里面的配置项,一个基本的CMakeLists.txt的配置 文件内容如下:示例一生成一个main.cpp源文件,输出"hello world",然后在同级目录创建一个CMakeLists.txt文件,内容如下:保存退出,执行cmake .命令

2022-07-14 09:45:57 559

原创 Golang 快速上手 (3)

初始化结构体默认初始化使用键值对初始化列表初始化部分初始化结构体的指针new 关键字创建结构体指针访问结构体成员指针和对象都可以通过逗号访问结构体对象的成员,如果指针通过逗号访问成员编译器会默认解引用,(*pa),name 等价于 pa.name结构体的访问权限结构体名称首字母大写,那么在其他包内才可以定义Person对象,小写则无法访问。并且,结构体的属性首字母大写则其访问权限为public的,若为小写,则为private编译器报错方法首字母大写才能在其他包内访问对象的方法

2022-06-22 10:09:20 287

原创 Golang 快速上手 (2)

数组是相同数据类型的集合,数组一旦定义长度不能修改,数组可以通过索引访问其内部元素。定义一个数组slice (切片)声明一个切片和声明一个数组差不多,不给出长度就为slice切片为引用类型,可以使用make创建初始化切片直接初始化使用数组对其初始化还可以使用数组的一部分其初始化切片的crudadd切片是一个动态数组,可以使用append()函数对其添加元素delelego语言中并没有删除切片元素的专用方法,可以使用切片本身的特性来删除元素。删除下标2位置的元素删除i

2022-06-20 22:28:33 241

原创 Golang 快速上手 (1)

Golang 拥有非常严格的代码缩进规则声明一个变量,但不使用也会报错初始化变量Go语言声明变量就会自动对变量对应的内存区域进行初始化。每个变量会被初始化成其类型的默认值。如:整型和浮点型变量的默认值为0。字符串变量的默认值为空字符串“"。布尔型变量默认为false。 切片、函数、指针变量的默认为nil.初始化变量类型可以省略,让其自动推导短声明,省略var关键字,使用 :=需要注意,短声明初始化方式只能使用在函数内部。Golang 常量常量在程序编译阶段就确定值,运行时则无法改变

2022-06-20 18:40:58 539 2

原创 音视频基础知识

连续的图像快速变化上时,根据视觉暂留原理,人眼无法辨别单幅的静态画面;看上去是平滑连续的视觉效果,这样连续的画面叫作视频。视频的播放过程可以简单理解为一帧一帧的画面按照时间顺序呈现出来的过程。每个色度成分通常用8bit表示[0,255] ,每个通道的位深越大,能够表示的颜色值就越大,比如现在高端显示器说的10bit色彩,即是每个通道用10bit表示,每个通道有1024种颜色。102410241024约为10,7374万色=10亿色, 是8bit的64倍。常见的颜色还是8bit居多。RGB16 主要数据格式

2022-06-12 16:14:38 1016

原创 moudo网络库剖析

muduo简介muduo是陈硕大神在Linux平台下基于C/C++开发的高性能网络库,在此基础上可以很方便的进行扩展,二次开发编写如http服务器。muduo网络库的核心框架,one thread per thread + Reactor模式。这也是大多数Linux端高性能网络编程框架应用的主要架构。陈硕大神写的《Linux多线程服务器端编程》对muduo库整个框架和设计细节进行了非常详尽的介绍和分析,非常推荐大家阅读,不仅仅对网络编程有帮助。此文使用muduo编写了一个简单的echoserver服

2022-05-20 23:04:53 3656 3

转载 系统调用 eventfd

eventfd 是 Linux 的一个系统调用,创建一个文件描述符用于事件通知,自 Linux 2.6.22 以后开始支持。# bionic/libc/include/sys/eventfd.h(Android 8.0源码)int eventfd(unsigned int initial_value, int flags);eventfd() 函数会创建一个 eventfd 对象,用户空间的应用程序可以用这个 eventfd 来实现事件的等待或通知机制,也可以用于内核通知新的事件到用户空间应用程序。

2022-05-13 02:23:32 210

原创 Linux下常见错误码

1 EPERMOperation not permitted操作不许可2 ENOENTNo such file or directory无此文件或目录3 ESRCHNo such process无此过程4 EINTRInterrupted system call系统调用被禁止5 EIOI/O errorI/O 错误6 ENXIONo such device or address无此器件或地址7 E2BIGArg list too longArg 列表太长8 ENOE

2022-05-02 22:48:41 3030

原创 linux 进程间传递文件描述符

在网络编程中可能使用到多进程模型,主进程只负责监听是否有连接到来,真正进行负责accept的是子进程,这就涉及到了进程间的文件描述符传递。文件描述符在linux下只是一个整形数值,它的本质其实是 进程pcb中的文件描述符表 fd_array 的下标,fd_array是一个file* 类型的数组,实现文件描述符传递不能简单的将fd发送。演示了主进程通过fork创建子进程,并创建unix domain socket进行通信,子进程向父进程发送打开的文件fd。代码示例#include <sy

2022-04-29 00:02:19 648

原创 SizeBalancedTree C++实现

SBTSizeBalancedTree,SBT也是一种自平衡二叉搜索树,它的均摊时间复杂度不差于红黑树,实现起来比红黑树简单很多,它的旋转方式与AVL树一样,它的平衡条件靠的是每个节点的侄子节点不大于叔叔节点, 旋转的方式与AVL相同。 n1上的节点数量 和 n2上的节点数量 都不大于u2上的节点数量n3上的节点数量 和 n4上的节点数量 都不大于u1上的节点数量每个节点都符合以上条件就认为这棵树平衡。SBT的特点SBT在删除的时候,可以不用进行旋转调整树的高度,即使退化成链状也无所谓

2022-04-01 23:44:10 1179

原创 C++11 新特性

C++11目录C++11列表初始化范围forSTL中的新容器arrayforward_listunordered_map/set右值引用 移动语义什么是左值、右值左值引用左值引用的短板右值引用列表初始化C++11里扩展了大括号 {} 的初始化,基本所有类型都可以使用它来初始化。class Person {public: Person(const string& name, int age) :_name(name), _age(age) {}private: strin

2022-03-20 02:27:20 782

原创 Linux多路转接 select、poll、epoll详解

Linux网络编程 多路转接五种IO模型,阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO。目录Linux网络编程 多路转接前言五种IO模型阻塞IO非阻塞IO信号驱动IO多路转接IO异步IOfcntl 设置非阻塞SetNonBlockselect函数原型前言IO简单来说就是read 和 write,总体分为两步 1 等待数据就绪 2 从内核中的缓冲区拷贝数据到用户区,或从用户区拷贝数据到内核区。高效IO的本质其实就是减少等待数据就绪的时间。IO多路IO转接服务器也叫做多任务IO服务

2022-03-04 17:11:37 762

原创 UDP/TCP 协议详解

UDP / TCP目录UDP / TCPUDP 协议UDP的特点UDP协议格式UDP的缓冲区TCP 协议TCP 协议报头确认应答(ACK)机制超时重传机制UDP 协议UDP的特点无连接一旦得知接收端的IP和端口号就可以加个报头直接向下层交付进行传输,不需要建立连接。不可靠没有确认、重传机制。无法得知也不关心报文是否到达接收端。面向数据报不能够灵活的控制读写数据的次数和数量。应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并。用UDP传输100个字节

2022-02-23 21:04:12 1518

原创 HTTP 协议

HTTP的特征:无连接:HTTP是基于TCP协议的,TCP已保证了连接。无状态:HTTP协议本身是无状态的,不记录任何用户信息,但在某些场景需要识别客户端的状态,可以由Cookie Session技术保证。URLURL(Uniform Resource Locator) 统一资源定位符。HTTP的请求方法HTTP 状态码4XX:一般是服务端request不合理的请求,或权限不足也可响应403。HTTP常见HeaderContent-Type:数据类型(text/ht

2022-02-21 23:47:40 1080

原创 Linux系统编程 ---- 多线程详解

多线程 线程(LWP: light weight process),在Linux环境下线程的本质仍是进程,底层并没有一个专门的结构体来描述一个线程。也叫轻量级的进程。每个进程至少有一个执行流,也就是一个线程。目录多线程概述线程的历史线程的用途线程的优缺点概述进程,硬盘上的程序运行以后,会在内存空间里形成一个PCB(进程控制块)。每个进程拥有自己的虚拟地址空间(mm_struct)。进程是承当操作系统资源分配的实体,线程是CPU的最小执行单元。线程存在于进程当中(进程可以认为是线程的容器),进程

2022-01-25 08:00:00 1590

原创 C++ 多态

多态多态的概念: 当不同的对象调用同一个函数产生出不同的状态。目录多态构成多态的条件虚函数虚函数的重写重写中的特例协变析构函数override & final重载、重写、重定义的区别抽象类接口继承和实现继承构成多态的条件多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如B继承了A。A对象产生的行为和B对象不同。要构成多态还有两个条件:1.必须通过基类的指针或者引用调用虚函数2.被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写虚函数被vi

2022-01-12 21:23:53 331

原创 C++ 继承

C++ 继承继承(inheritance) 是面向对象三大特性之一,它是使代码复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称子类或派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。目录C++ 继承继承后访问权限的变化父类和子类对象赋值继承中作用域成员函数继承与友元、静态成员多继承菱形继承解决菱形继承的方法继承后访问权限的变化类成员/继承方式public继承protected继承private继承父

2022-01-12 01:15:58 326

原创 并查集详解 原理+实现

数据结构 ---- 并查集(Union Find) 并查集有两个核心操作,查找和合并,O(1) 的时间复杂度查询两个元素是否在同一个集合,和将两个不同元素所在集合合并,时间复杂度也为O(1)。目录数据结构 ---- 并查集(Union Find)一、并查集并查集的数据存储形式并查集的接口并查集的初始化Quick Find 实现Quick Find 的合并(Union)Quick Find 的查找(Find)Quick Find 完整代码小结Quick Union 的实现Quick Union 的查找

2022-01-09 03:29:07 1407 1

原创 Linux系统编程 ---- 终端、进程组、会话

Linux 终端、进程组、会话 终端(Computer terminal),是与计算机系统相连的一种输入输出设备,通常离计算机较远。在UNIX系统中,用户通过终端登录系统后创建一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal)。进程中,控制终端是保存在PCB中的信息,而fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是这个终端。目录Linux 终端、进程组、会话前言终端相关函数进程组会话创建会话的注意事项会话相关函数g

2022-01-08 14:55:39 1546 2

原创 Linux系统编程 ----信号详解

Linux 信号Linux中,信号其实是软件中断,也是进程间通信的最古老的方式。它是在软件层次上对中断机制的一种模拟,是一种异步通信的方式。信号可以导致一个正在运行的进程被另一个正在运行的异步进程中断,转而处理某一个突发事件。目录Linux 信号前言概述信号编号信号表信号要素信号的状态信号的产生阻塞信号集、未决信号集信号相关函数kill 函数raise 函数前言 “中断”就是像从一个事件处理转而处理其他事件,处理完毕后继续处理最开始的事件。“信号"就是属于这么一种“中断"。我们在终端上敲"

2022-01-07 23:20:26 1093

原创 Linux系统编程 ----静态库和动态库

静态库和动态库 写好的C程序从源文件到可执行程序要经过编译和链接两大步骤,而链接分为两种,静态链接和动态链接。目录静态库和动态库静态链接和动态链接静态链接动态链接静态链接和动态链接对比静态库和动态库制作静态库静态链接和动态链接静态链接静态链接:由链接器在链接时将库的内容加入到可执行程序中。- 优点:·对运行环境的依赖性较小,具有较好的兼容性- 缺点:生成的程序比较大,需要更多的系统资源,在装入内存时会消耗更多的时间·库函数有了更新,必须重新编译应用程序动态链接连

2022-01-07 00:00:45 400 1

原创 Linux ---- 进程间通信

进程间通信 进程是操作系统的资源分配单元,不同进程(通常指的是用户进程)之间的资源是独立的,没有关联,无法直接在一个进程中直接访问另一个进程的资源。但是,进程不是独立的,不同的进程需要进行信息的交互和状态的传递等,因此需要进程间通信( IPC)目录进程间通信进程间通信的目的实现进程间通信的方法无名管道pipe 函数无名管道的特点查看管道缓冲区大小有名管道创建有名管道函数创建有名管道读写有名管道进程间通信的目的数据传输:一个进程需要将它的数据发送给另一个进程。通知事件:一个进程需要向另一

2022-01-05 19:27:34 1657 4

原创 Linux网络编程入门 ---- 实现客户端与服务端通信

功能实现实现客户端向服务端传输字符串,服务端打印服务端的ip和端口号并将字符串逆序回传给客户端。测试环境:Linux 服务器 (或者搭建本地虚拟机两台,处于同一网段)也可以通过环回接口模拟服务端和客户端通信。功能测试服务端代码#include <stdlib.h>#include <stdio.h>#include <string.h>#include <sys/types.h>#include <arpa/inet

2021-12-30 18:12:36 2467 1

原创 Linux 系统调用详解

系统调用系统调用是操作系统提供给用户程序调用系统服务的一组“特殊”接口。目录系统调用前言系统调用系统调用的作用中断实现系统调用系统调用号和系统调用表系统调用号:系统调用表:执行系统调用glibc库syscall 调用glibc库glibc函数库对比Syscall调用前言系统调用系统调用可被看成是一个内核与用户空间程序交互的接口,它把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。系统调用的作用把用户从底层的硬件编程中解放出来与具体的硬件完

2021-12-25 19:21:09 1412 5

原创 AVL树详解 原理+实现 C++

AVL Tree AVL树是由G. M. Adelson-Velsky和E. M. Landis 在1962年发明, 是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。目录AVL TreeTipsBST改进添加导致的失衡右旋 LL左旋 RR左旋+右旋 LR右旋+左旋 RL添加代码删除导致的失衡Tips二叉搜索树(BST) 对于普通的二叉搜索树(BST),增加或删除节点都可能使其退化成链

2021-12-24 03:44:12 1142 3

原创 跳表(SkipList)实现 C++

跳表 SkipList 跳表,又叫做跳跃表,它在有序链表的基础上实现了“跳跃”。这种数据结构 由William Pugh于1990年发布,设计的初衷是为了取代平衡树(例如红黑树)。Redis中的SortedSet、LevelDB中的 MemTable都用到了跳表,对比平衡树,跳表的实现和维护会更加简单,跳表的搜索、删除、添加的平均时间复杂度都是O(logN),甚至可以替代红黑树。目录跳表 SkipList跳表的原理调表的查找跳表的插入跳表的删除C++ 实现时间 / 空间复杂度时间复杂度:空间复杂度:总结

2021-12-19 23:58:24 1690

原创 二叉搜索树实现 C++

二叉树搜索树(BST)二叉搜索树是一种二叉树,是应用非常广泛的一种二叉树,英文简称为BST。又称为:二叉查找树、二叉排序树目录二叉树搜索树(BST)BST的特点SBT的接口C++实现复杂度分析BST的特点二叉树搜索树特点任意一个节点的值都大于其左子树所有节点的值任意一个节点的值都小于其右子树所有节点的值SBT的接口bool add(const T& x)bool remove(const T& x)bool contains(const T& x)

2021-12-19 22:14:29 917

原创 Linux 服务详解

Linux 服务首先服务也是一种程序,但它是一种比较特殊的程序:服务是在系统后台运行、并等待用户或其它软件调用的一类特殊程序。我们通过执行命令所打开的进程大都属于是交互式进程,如果不采用nohup进行处理,那么这些进程基本上都是与终端相关,只要将进程所在的终端关闭,那么这些进程也就自动终止了。但是服务则不同,我们无论在哪个终端上运行了一个服务,这个服务所产生的进程都与终端无关,也就是说,将终端关闭之后,这些服务进程仍然会在系统后台自动运行。目录Linux 服务了解服务系统进程systemdsyste

2021-12-17 16:19:04 3346

原创 Linux 系统进程详解

Liunx 系统进程进程是系统中正在运行的程序,服务则是系统启动后自动在后台运行的程序。合理地分配和调度系统的进程,配置管理系统所开启的服务,是保证系统稳定高效运行的关键。目录Liunx 系统进程一、Linux进程管理什么是进程进程的状态子进程和父进程进程的属性进程分类二、查看进程状态ps 命令top 命令伪文件系统 /proc三、控制进程启动进程改变进程的运行方式终止进程执行一、Linux进程管理进程是操作系统中一个非常基本的概念,在系统运维过程中也经常涉及到对进程的管理操作,下面首先介绍

2021-12-17 13:47:13 2517

原创 布隆过滤器详解 原理+实现 C++

布隆过滤器(bloom filter) 布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是由一个很长的bit数组和一系列哈希函数组成的。布隆过滤器可以用于检索一个元素是否在一个集合中它是一种概率型数据结构,它能告知你一个元素大概率存在,或一定不存在。 ,常用与黑名单查找、垃圾邮件过滤、解决缓存穿透。目录布隆过滤器(bloom filter)一、原理布隆过滤器的误判率误判率公式二、C++ 简单实现三、应用场景四、优缺点一、原理假设布隆过滤器由20位二进制、3个哈希函

2021-12-16 23:09:46 1977

原创 哈希表 详解

哈希表哈希表也叫做散列表,一种非常常用的数据结构,增删改查均为O(1)。目录哈希表一、hash表原理二、 hash冲突解决方案Java 中的解决方案三、hash函数四、通过key生成hash值自定义对象整形的hash值浮点数的hash值floatdoublestring一、hash表原理hash表是如何实现高效的?//添加三个记录。put( "Jack", 666);put("Rose", 777);put( "Kate", 888);通过hash函数生成key所对应的下标 in

2021-12-16 16:26:22 1310

原创 Linux ---- 软件包管理

Linux中的软件安装方法早期要想在Linux系统中安装软件只能采取源码包的方式安装,这是一件非常困难、耗费耐心的事情。这是由于在 Linux系统中使用的绝大多数软件都是开源软件,软件作者在发布软件时直接提供的就是软件的源代码。用户在取得应用软件的源码文件后,需要自行编译代码并解决许多的软件依赖关系,因此源码安装需要用户具有很多相关知识、高超的技能、甚至很好的耐心才能安装好一个程序。在安装、升级、卸载时还要考虑到与其他程序、库的依赖关系,所以在校验、安装、卸载、查询、升级等管理软件操作时难度都非常大。

2021-12-13 10:57:36 910

原创 Linux ---- 环境变量、命令行参数

linux 环境变量环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。目录linux 环境变量前言环境变量理解PATH常见环境变量环境变量具有全局属性环境变量相关命令调用系统接口获取环境变量自定义环境变量命令行参数命令行参数的作用main函数第三个参数前言C/C++代码在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。环境变量通常具有某些特殊用途

2021-12-12 21:45:17 1381

原创 Linux系统编程 ---- 进程/进程控制

Linux进程进程是程序的一个执行实例,正在执行的程序等。在内核的角度看 : 担当分配系统资源(CPU时间,内存)的实体。文章目录Linux进程一、PCB(进程控制块)task_struct 内容二、查看进程使用系统调用接口获取PID通过fork创建进程三、进程状态僵尸进程的危害孤儿进程无法被kill的进程进程优先级PRI & NI一、PCB(进程控制块)PCB (process control block)进程的信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集

2021-12-11 21:52:27 729 1

原创 Sqoop 数据迁移

Sqoop在实际开发中,有时候需要将HDFS或Hive上的数据导出到传统关系型数据库中(如MySQL、Oracle等),或者将传统关系型数据库中的数据导入到HDFS或Hive上,如果通过人工手动进行数据迁移的话,就会显得非常麻烦。为此,可使用Apache提供的Sqoop工具进行数据迁移。安装sqoop上传 sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz先开启hadoopstart-all.sh解压到servertar -zxvf sqoop-1.4.

2021-12-08 14:06:29 369

原创 KMP算法详解 C++

KMP详解KMP算法是基于BF算法山改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出。在KMP之前需要先掌握BF算法。BF算法BF算法,即暴力匹配,每次匹配失败父串都要回溯到 i1+1 位置,i2回溯到头部,在进行下一次匹配。最坏情况下,需要匹配 ( N * M )次。代码示例:int strStr(string haystack, string needle) { if(needle.size() == 0)

2021-12-05 17:04:58 1537 1

空空如也

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

TA关注的人

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