自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++内存池

我们常说的 malloc 函数是 glibc 提供的库函数。glibc 的内存管理使用的方法是 ptmalloc,除此之后还有很多其他内存管理方案,比如 tcmalloc (golang 使用的就是 tcmalloc)。ptmalloc 对于申请内存小于 128KB 时,分配是在堆段,使用系统调用 brk() 或者 sbrk()。如果大于 128 KB 的话,分配在映射区,使用系统调用 mmap()。

2023-10-16 17:00:37 117

原创 Redis缓存穿透/击穿/雪崩以及数据一致性的解决方案

布隆过滤器是一个连续的 bit 数组,数组的每个元素都是一个 bit 位,即0或者1, 来标识数据是否存在。如果这些下标的值都为1,表示该 key 可能存在(存在hash冲突的原因);如果某一位为0,则该值一定不存在。/*** 布隆过滤器添加元素伪代码*/// 新建一个二进制数组// 待添加元素i<=3;i++){ // 使用3中hash算法计算出3个数组下标// 将下标元素置为1/*** 布隆过滤器查找元素伪代码*/i<=3;i++){//计算E的数组下标。

2023-10-11 15:50:50 103

原创 cmake

使用简单方便,可以跨平台,构建项目编译环境。尤其比直接写Makefile简单(在构建大型工程编译 时,需要写大量的文件依赖关系),可以通过简单的CMake生成负责的Makefile文件。

2023-09-17 16:11:40 97

原创 寄存器和函数调用栈介绍

首先,什么是栈帧?引用百度百科:C语言中,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。栈帧是一块因函数运行而临时开辟的空间。每调用一次函数便会创建一个独立栈帧。栈帧中存放的是函数中的必要信息,如局部变量、函数传参、返回值等。当函数运行完毕栈帧将会销毁。

2023-09-12 21:05:10 1132 1

原创 Linux内存分配器

WMARK_MIN,WMARK_LOW,NR_WMARK最低水线(WMARK_MIN):如果内存区域的空闲页数小于最低水线,说明该内存区域的内存严重不足低水线(WMARK_LOW):空闲页数小数低水线,说明该内存区域的内存轻微不足。默认情况下,该值为WMARK_MIN的125%高水线(WMARK_HIGH):如果内存区域的空闲页数大于高水线,说明该内存区域水线充足。默认情况下,该值为WMARK_MAX的150%

2023-09-03 21:20:47 134

原创 Linux 内存管理

为了解决内存不够用,在逻辑上扩充内存,提出了内存的覆盖与交换技术。

2023-08-31 00:43:34 74

原创 Linux 内核进程线程原理

Linux下每个进程本质上是一个 task_struct(PCB:进程控制块)。它是进程管理和控制的最重要的数据结构,每一个进程均有一个 PCB,在创建进程时,建立 PCB,伴随进程运行的全过程,直到进程撤消而撤消。PCB 记录了操作系统所需的,用于描述进程的当前情况以及控制进程运行的全部信息(如打开的文件、挂起的信号、进程状态、地址空间等等)。当我们创建进程或线程时,系统会为我们产生一个 task_struct 结构,用来保存进程或者线程的信息。

2023-08-22 20:26:39 223

原创 Linux内核进程管理与调度

内存中保存了每个进程的唯一描述, 并通过若干结构把他和其他进程连接起来。调度器调度进程在cpu上运行,这涉及到2个部分,其中一个是,另一个是。

2023-08-22 16:36:54 175

原创 nginx 过滤模块例子

├── configNginx 可以方便的加入第三方的过滤模块。ngx_http_myfilter_module:自定义过滤模块的名称ngx_http_myfilter_module.c:自定义模块的源码HTTP_AUX_FILTER_MODULES 这个变量与一般的内容处理模块不同修改 nginx.conf 配置文件,添加 add_prefix on;然后进入到ngxin源码目录 /usr/nginx-1.14.1 下,执行如下命令进行nginx配置。

2023-08-12 12:06:04 106

原创 nginx 访问统计模块的实现

在编写 HTTP 模块之前,首先应该考虑的一点是自己的模块应该介入 HTTP 模块的11个阶段中的哪一个阶段。由于我们要编写的是页面访问次数的统计,意味着我们在 HTTP 请求寻找到相应的 location 配置之后就可以介入,因为我们只需要知道请求的 IP 地址。//宏定义,初始化模块数据结构中的某些变量的值//模块的上下文,来使得不同模块有自己的特定行为。//定义模块配置项,来处理 nginx.conf 中相应内容//定义模块配置项,来处理 nginx.conf 中相应内容。

2023-08-05 21:11:34 1108

原创 Nginx数据结构介绍

是C99引入的一个新特性:允许定义结构体的时候创建一个空数组,但空数组必须声明为结构体的最后一个成员,且结构体至少包含一个其他类型的成员。这个数组的大小可以在程序运行的过程中根据需求进行更改。

2023-07-31 09:44:39 192

原创 内存对齐学习

这就是内存对齐。

2023-07-29 20:35:15 57

原创 AVL树、B/B+树、红黑树

B树是一种自平衡的多叉查找树。B树中所有结点中孩子结点个数的最大值成为B-树的阶,通常用m表示。作用:当数据量巨大,只能存在磁盘时,使用B树的目的就是为了减少磁盘的I/O操作。每个结点最多有m-1个关键字,且最多有m个分支。根节点至少有1个关键字,至少有2个分支。非根节点至少有 ceil(m/2)-1个关键字,ceil(m/2)个分支。(ceil代表向上取整)如果一个结点有n-1个关键字,那么该结点有n个分支。这n-1个关键字按照递增顺序排列。每个结点内各关键字互不相等且按从小到大排列。

2023-07-27 08:48:35 58

原创 设计模式介绍

这样做的好处是,再增加或删除观察者,不需要修改Me类,只需要将其添加道vector或从vector中移除即可。人数少的时候,还可以应付,假如关心我的人有1000人,那这时候我们该怎么办?以自己为例,我下班的时候会告诉孩子和他妈,我开车要往回走了。

2023-07-17 17:04:58 37

原创 Nginx.conf文件介绍

nginx.conf文件内容构成如下所示:下面是某个nginx.conf文件的详细内容:全局配置 全局块是默认配置文件从开始到events块之间的一部分内容,通常包括配置运行Nginx服务器的用户(组)、允许生成的worker process数、Nginx进程PID存放路径、日志的存放路径和类型以及配置文件引入等,如:events配置 events块涉及的指令主要影响Nginx服务器与用户的网络连接。 常用到的设置包括“是否开启对多worker

2023-07-16 14:15:02 827

原创 Redis持久化、主从复制、集群

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave)。数据的复制是单向的,只能由主节点到从节点。默认情况下,每台Redis服务器都是主节点,且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。主从之间采用异步复制的方式。考虑这种情况:万一我们的master 突然宕机了,不能提供写服务了,只能依靠slave实现读的功能,这种情况是很糟糕的。为了解决这种情况,提出的哨兵模式。

2023-07-07 10:15:12 80

原创 Redis计数统计

编写拓展模块时,只需要这个文件就可以编写了(该头文件里定义了一些常量以及可以使用的API)。模块里必须有一个函数,是模块入口点,可以在函数里自定义模块名、新命令、新数据类型解释:ctx:上下文argv:传入参数argc:传入参数的个数argv可以通过MODULE LOAD myModuleTest.so arg1 arg2传入,因此可以根据传入的参数使用不同的新命令函数里需要最先调用解释:ctx:上下文modulename:自定义模块名,不能跟已有的冲突。

2023-06-26 12:06:41 413

原创 Redis源码分析之存储原理和数据类型

redis源码如何阅读?

2023-06-18 14:58:51 85

原创 Redis协议与异步方式

Redis使用单reactor的非阻塞I/O多路复用机制,采用单线程串行处理命令,且线程同时处理命令和网络IO。串行:表现在单CPU上,多个线程排好队,依次执行。并行:表现在多CPU上,每个CPU处理一个线程,多个线程可以同时执行同一段代码。并发:表现在单CPU上:一个CPU交替执行多个线程;表现在多CPU上:多个CPU处理多个线程,并行一定是并发。

2023-06-14 11:21:53 368

原创 Redis相关命令详解及原理

Redis 是Remote Dictionary Service 的简称;也是远程字典服务;Redis 是内存数据库,KV数据库,数据结构数据库;Redis 应用非常广泛,如Twitter、暴雪娱乐、Github、Stack Overflow、腾讯、阿里巴巴、京 东、华为、新浪微博等,很多中小型公司也在使用。

2023-06-11 13:28:42 102

原创 FastDFS合并存储

FastDFS提供了【合并存储】功能,可以将【海量小文件】,合并存储为【大文件】。默认创建的大文件为64MB,然后在该大文件中存储很多小文件。大文件中容纳一个小文件的空间称为一个Slot,规定Slot最小值为256字节,最大为16MB也就是小于256字节的文件也需要占用256字节,超过16MB的文件不会合并存储而是创建独立的文件。#是否启⽤trunk存储,缺省false#trunk⽂件最⼩分配单元 字节,缺省256#trunk内部存储的最⼤⽂件,超过该值会被独⽴存储,缺省16M。

2023-06-10 14:44:08 204

原创 分布式FastDFS存储原理2

这个标题有点拗口,先举个例子:一组内有Storage-A、Storage-B、Storage-C三台机器。对于A这台机器来说,B与C机器都会同步Binlog(包括文件)给他,A在接收同步时会记录每台机器同步给他的最后时间(也就是Binlog中的第一个字段timpstamp)。比如B最后同步给A的Binlog-timestamp为100,C最后同步给A的Binlog-timestamp为200,那么A机器的最后最早被同步时间就为100.这个值的意义在于判断一个文件是否存在某个Storage上。

2023-06-10 11:25:17 110

原创 分布式FastDFS存储1

FastDFS上传和下载文件的过程

2023-06-04 01:07:03 138

原创 C++云盘项目2--云盘架构分析

是计算机广 泛使用的杂凑算法之一(又译摘要算法、哈希算法),理论上 MD5 是不可逆的,而且 MD5 本来也不是作加密使用,而是用来校验数据的完整性,只是因 为其不可逆且稳定、快速的特点,被广泛用于对明文密码的加密。为了解决这个问题,我们可以先对数据进行编码,比如 编码,变成可见字符,也就是 ASCII 码可表示的可见字符,从而确保数据可靠传输。编码的内容是有 0 ~ 9,a ~ z,A ~ Z,+,/ 组成, 正好 64 个字符,这些字符是在 ASCII 可表示的范围内,属于 95 个可见字符的一部分。

2023-05-25 10:10:26 573 1

原创 C++云盘项目1--FastDFS

FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。FastDFS由跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)三个部 分组成,主要解决海量数据存储问题,特别适合以中⼩⽂件(建议范围:4KB < file_size < 500MB)为 载体的在线服务,例如图⽚分享和视频分享⽹站。

2023-05-24 09:26:02 781

原创 用户态协议栈

/以太网首部//目地MAC地址//源MAC地址//类型//IP数据头unsigned char version:4, //版本hdrlen:4;//首部长度//服务类型//总长度//标识unsigned short flag:3, //标志 缺省offset:13;//片偏移//生存时间(TTL)//协议//首部检验和//源IP地址//目的IP地址//UDP协议头//源端口//目的端口//封包长度//校验和//整个数据包。

2023-05-21 12:21:36 327

原创 第15章 进程池和线程池

发生发生

2022-06-04 17:58:43 228

原创 第14章 多线程编程

14.1 Linux线程概述14.1.1 线程模型 线程是CPU调度的最小单位。线程可分为内核线程和用户线程。内核线程:运行在内核空间,由内核来调度;用户线程:运行在用户空间,由线程库来调度。当进程的一个内核线程获得CPU使用权是,它就加载并运行一个用户线程。.......................................

2022-05-23 09:36:46 258

原创 第13章 多进程编程

13.1 fork系统调用Linux创建新进程的系统调用是fork函数。#include <sys/types.h>#include <unistd.h>pid_t fork(void);返回值:每次调用都返回2次:1、在父进程中返回子进程PID2、在子进程中返回0失败时返回-1,并设置errno fork复制当前进程,复制后子进程跟父进程具有相同的内存空间,且代码与父进程完成相同。...

2022-05-07 19:37:12 885

原创 第12章 高性能I/O框架库Libevent

Libevent是开源社区一款高性能的I/O框架库,具有如下特点:跨平台支持。Libevent支持Linux、Unix、Windows 统一事件源。Libevent对I/O事件、信号、定时事件提供统一的处理。 线程安全。Libevent使用libevent_pthreads库提供线程安全支持。 基于Reactor模式实现。12.1 I/O框架库概述各种I/O框架库的实现原理基本相似,要么以Reactor模式实现,要么以Proactor模式实现,要么同时以这两种...

2022-05-03 17:08:54 516

原创 第11章 定时器

定时是指在一段时间之后触发某段代码的机制,我们可以在这段代码中依次处理所有到期的定时器。在对定时事件管理时,要将定时事件封装成定时器。通过使用某种容器类数据结构(链表、时间轮)将所有定时器串联起来,实现对定时事件的统一管理。Linux提供了3中定时方法,分别是:socket选项SO_RCVTIMEO和SO_SNDTIMEO SIGALARM信号 I/O复用系统调用的超时函数11.1 socket选项SO_RCVTIMEO和SO_SNDTIMEO...

2022-05-02 12:16:09 1692

原创 第10章 信号

信号是由用户、系统或者进程发送给目标进程的信息,以通知目标进程某个状态的改变或系统异常。10.1 Linux信号概述10.1.1 发送信号

2022-04-24 23:34:54 1983

原创 第9章 I/O复用

应用程序通过I/O复用函数向内核注册一组I/O事件,内核通过I/O复用函数把就绪的事件通知给应用程序。常用的I/O复用函数是select、poll、epoll。I/O复用函数本身是阻塞的,因为它们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的。当多个文件描述符同时就绪时,如果不采取额外的措施,程序就只能按顺序依次处理其中的每-个文件描述符,这使得服务器程序看起来像是串行工作的。如果要实现并发,只能使用多进程或多线程等编程手段。9.1 select系统调用...

2022-04-13 12:42:28 336

原创 内存泄漏检测

1.1 ValgrindValgrind其实是一个工具集,内存错误检测只是它众多功能的一个。Valgrind工具包包含多个工具,如Memcheck,Cachegrind,Helgrind, Callgrind,Massif。Memcheck。这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。这也是本文将重点介绍的部分。 Callgrind。它主要用来检查程序中函数调用...

2022-04-08 10:28:40 499

原创 第8章 高性能服务器程序框架

8.1 服务器模型8.1.1 C/S模型

2022-04-05 12:09:42 1139

原创 第7章 Linux服务器程序规范

7.1 日志

2022-04-04 12:05:29 1057

原创 第6章 高级I/O函数

6.1 pip函数 pip函数用于创建一个管道,实现进程之间的通信。

2022-03-28 15:05:25 256

原创 第5章 Linux网络编程基础API

5.1 socket地址API大端字节序:高字节存储在低地址处,反之亦然。小端字节序:高字节存储在高地址处,反之亦然。由于不同的主机可能使用不同的字节序,为了使数据能在两台使用不同字节序的主机之间直接传递,需要统一发送出去的数据的格式:发送端总是把要发送的数据转化成大端字节序后再发送,接收端知道对方发过来的数据是大端字节序,所以接收端可以根据自身采用的字节序来决定是否对接收到的数据进行转换。因此,大端字节序也称为网络字节序;由于现在主机基本都采用小...

2022-03-25 10:17:24 2963

翻译 类型别名typedef使用

typedef的几种用法:1、为类型定义别名例1:typedef double DOUBLE; //DOUBLE是类型double的别名DOUBEL d = 3.14; //等价于 double d = 3.14例2:typedef int Int; //定义类型int的别名是Inttypedef Int INT, *INT_PTR; //INT是Int的别名,INT_PTR是int*的别名例3:typedef stuct Stude

2022-03-24 17:23:43 277

转载 6.2 最大熵模型

https://blog.csdn.net/peghoty/article/details/26550597

2019-08-23 00:02:35 82

博主建生+如何减肥成功

博主建生+如何减肥成功

2023-12-04

进程示意图1111111

进程示意图1111111

2023-08-18

Linux虚拟内存介绍

Linux虚拟内存介绍

2023-08-15

Linux 内核源码介绍

linux kernel

2023-08-15

openssl库详细介绍

openssl库详细介绍

2023-04-24

空空如也

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

TA关注的人

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