自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 自底向上brpc(二):无锁队列和execution_queue原理

execution_queue的实现非常独特,实现了wait free的入队操作,拥有极高的生产性能。但是消费侧由于断链问题,甚至不是Lock Free的,因为如果生产者在两阶段中间被换出,那么消费者会被这个阻塞传播影响,整个消费也只能先阻塞住。但是在排队写入fd的场景下,专项优化生产并发是合理,也因此可以获得更好的执行效率。总的来说execution_queue是一个非常巧妙的实现,值得我去深入学习。

2023-01-19 16:50:46 275

原创 内存性能优化的小结

曾经的我对于cpu cache只是浮于表面的理解,只知道有局部性啊,会指令乱序,但从不知其原理。百度这篇文章让我醍醐灌顶,对cpu的理解更近了一个层次,而我自己的学习还任重而道远,成为一个优秀的程序员还有很长的路要走。。。

2022-12-16 13:17:21 191

原创 自底向上brpc(一):resource_pool

brpc的资源池实现还是比较容易理解的,与我曾经看过的资源池大同小异。我自己印象比较深刻的点,一是brpc非常看重locality,通过thread local来实现高效的资源分配,并通过一个全局的blockgroup来进行分发blcok,实现资源的合理调度。同时为了防止多线程下分发blcok导致的锁竞争导致的性能下降,采取了lock-free的实现方式。

2022-11-29 13:21:16 286

原创 基于c++20 coroutine实现对称协程

简单总结就是对于每一个coroutine函数,都会生成一个专属的类,这个类的成员变量就是这个函数栈上的所有变量,在通过我们提供的promise_type和await的原语对这个类做拓展。我在其中做的最关键的一步就是在init时进行了suspend,同时suspend时存下父函数的handle,在这个协程被挂起时,handle被保存到全局变量,函数链被依次挂起返回到最上层。当协程执行完结束时,调用final_suspend,这时会直接通过我们保存父函数的handle,来唤醒父函数,从而实现协程的对称概念。

2022-10-02 14:21:10 447

原创 C++链表的高级实现

在STL中list的底层的数据结构是链表,但是在很多c++开源项目中并没有使用STL中的list。原因是因为list中的node不是内嵌到数据结构当中的,这样就和链表的作用相违背。链表的最大作用是他是一个局部化的结构,一个结构体只需要持有链表中的其中一个节点,就可以对这个节点本身进行插入,删除等操作,新增的结构体也同样只持有新增的节点,便可以进行链表的操作,而不需要持有整个链表。然而std::list无法实现这个功能。这也是因为需要遵循STL中iterator的惯例,迭代器与数据是解耦的,但链表的lis

2021-02-05 17:16:24 174

原创 Kubernetes学习:容器

概念容器的本质是一种特殊的进程两种技术namespaceNamespace 技术实际上修改了应用进程看待整个计算机“视图”,即它的“视线”被操作系统做了限制,只能“看到”某些指定的内容。使容器间形成隔离。不足:隔离的不彻底。不能改变共享宿主机内核,有些资源和对象不能被Namespace化。CgroupsLinux Cgroups 的全称是 Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。文件系统Mount

2020-12-03 11:47:37 210

原创 CPU当中的分支预测

今天看到的一个有关cpu的问题,所以分享总结一下:抛出一个问题首先有一段代码#include <algorithm>#include <ctime>#include <iostream>int main(){ // Generate data const unsigned arraySize = 32768; int data[arraySize]; for (unsigned c = 0; c < arraySiz

2020-09-01 16:38:53 908

原创 Libco源码分析(三):时间轮的设计

时间轮是Libco中管理超时事件的定时器,在这之前先介绍一下定时器。常用的定时器数据结构有:链表:redis中的定时器是同链表实现的,时间复杂度为On,性能很差,但是redis中的超时时间只有一个所以被退化为指针。堆:堆顶是最近的超时事件,时间复杂度为logn,性能比链表较好,但是不能支持随机删除。红黑树:最左边的节点为最小超时事件,时间复杂度为logn。时间轮:时间轮本质是由数组实现,每个下标代表一个时间刻度,通过指针的移动代表时间流逝,因为是用数组,所以时间复杂度为O1,Linux内核也通

2020-08-05 10:58:27 213

原创 Redis学习(二):config rewrite

工作要求,需要了解config rewrite的功能,先介绍功能。CONFIG REWRITE 命令对启动 Redis 服务器时所指定的 redis.conf 文件进行改写: 因为 CONFIG_SET命令可以对服务器的当前配置进行修改, 而修改后的配置可能和 redis.conf 文件中所描述的配置不一样, CONFIG REWRITE的作用就是通过尽可能少的修改, 将服务器当前所使用的配置记录到 redis.conf 文件中。重写会以非常保守的方式进行:原有 redis.conf 文件的整

2020-07-21 15:08:55 1573

原创 Redis学习(一):zmalloc

zmalloc.{c,h}是对Redis内存进行一系列管理的文件,包括对malloc的封装,以及一些内存的状态数据分析。这里面有一个比较重要的变量叫used_memory,他记录了Redis一共分配了多少的内存,后面的大部分函数都是跟这个变量打交道。zmalloc zcalloc zrealloc zmalloc_size zfree这些函数都是封装了C函数库中的malloc calloc realloc free,主要是为了记录Redis分配的内存大小,虽然malloc本身会在首地址前面记录分配的大

2020-06-29 15:33:25 599

原创 Libco源码分析(二):底层协程切换的原理

涉及文件:coctx_swap.Scoctx.cppcoctx.h协程的概念协程的提出是对标线程的,首先要了解为什么会有协程,他是用来解决什么的。这里主要聊一些很多人对于协程的误区。了解过协程的都知道协程是比线程更轻量级的存在,线程的切换是在内核态,而协程的切换是在用户态。既然协程切换更快,那是不是不用线程都用协程好呢,那为什么Java语言没有对协程的支持?实际上协程解决的问题并不是程序执行的效率问题,而是用来将异步的代码转换为同步逻辑的代码。如果用过Asio,你肯定会被那异步的逻辑恶心到,读

2020-06-26 13:50:27 410

原创 Libco源码分析(一)

自从拿了腾讯实习offer后就没有再学习了,今天打算重新开始学习,打算将我寒假学习协程方面的知识记录下来,也为后面秋招做准备。Libco源码地址:Libco接下来分六个章节从源码角度介绍Libco。底层协程切换的原理时间轮的设计协程原语的设计协程的调度协程的同步一些零碎的功能然后再根据我对Libco的理解再进行一些拓展。网络库的封装实现类似Golang中Channel用于协程间通讯实现一个类似Golang中select用于配合Channel实现无栈协程感谢Libco,如果

2020-06-09 18:31:36 519

原创 关于 ucontext 的源码阅读

之前有写过一个协程库,用的是libco的context_swap.s作为协程切换,为了了解与ucontext的区别,去读了源码进行了解。#include <sysdep.h>#include "ucontext_i.h"/* 这个函数的功能是获得当前协程(或者此时还不能称为协程)的上下文将他存入参数中 */ENTRY(__getcontext) /* 4(%esp)就是函...

2020-03-21 11:41:11 472 1

原创 STL空间配置器

学习了空间配置器,感觉这块内容很容易忘记,特做此笔记。概述STL的内存管理通过空间配置器来进行管理。//alloc为配置器template <class T, class Alloc=alloc>class vector {};SGI STL默认使用二级配置器,配置器中会根据不同的场景,决定是使用一级配置器还是二级配置器,下面我们依次介绍。一级配置器一级配置相对简单,...

2020-03-03 17:46:13 124

原创 内存对齐原则

虽然内存对齐之前一直都有了解,但让我总结我一直总结不出来,所以小结一下对成员变量进行对齐一个变量的相对首地址的偏移要为变量大小的倍数,如int变量偏移只能在0,4,8,12这些地址上。char的倍数为1所以可以在任意地址。对结构体整体进行对齐结构体的对齐值是其成员的最大对齐值。#pragma pack(n)编译器可以设置一个最大对齐值,怎么类型的实际对齐值是该类型的对齐值与默认对齐值取...

2020-03-02 15:20:10 103

原创 C++四种类型转换

static_cast(静态类型转换)子类转父类父类转子类(不保证正确)基本类型转换void*转其他类型其他类型转void*dynamic_cast(动态类型转换)dynamic_cast会在运行时期检查类型转换是否合法,有一定安全性,但因为是运行时检查,所以会损失性能。dynamic_cast只能转换引用或指针,在转换失败时会返回空指针,引用则抛出异常。我的理解,在向下转换...

2020-02-24 18:49:33 271

原创 单例模式总结

(以下全是线程安全)最简单的实现:加锁#include <iostream>#include <mutex>using namespace std;std::mutex mt;class Singleton{private: Singleton(){}public: static Singleton* instance() { ...

2020-02-24 16:37:13 139

原创 八大排序算法总结

讲述难度从我个人角度从简单到难,从熟悉到陌生,比较重要的排序是堆排序和快速排序。以下全都是C++代码实现,遵循的原则是最简洁。1.冒泡排序冒泡排序应该是最简单的排序了,高中的时候就已经练了滚瓜烂熟了。冒泡排序的排序规则是:从最后一个数开始,每次与他上一个数进行比较,根据比较大小进行交换,接着向上移,直到遇到i,一轮比较完成,将未排序中最大(最小)的数冒泡到最上面。vector<in...

2020-02-12 17:04:04 612

原创 回溯算法问题总结

1.全排列给定一个没有重复数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]这道题虽然是简单题,但也把我折腾个够呛,奇淫技巧就不说了,老老实实的回溯就行了。可就是简单的回溯我一开始也写不好,一开始简单的想着每次回溯前删除一个数...

2019-12-22 22:06:14 304

原创 字符串问题总结

1.无重复字符的最长字串给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: "pwwkew"输出: 3解释: 因为无...

2019-12-20 17:00:43 149

原创 回文串问题总结

1.最长回文子串给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。示例 2:输入: "cbbd"输出: "bb"中心传播法,在每个元素中间插入‘#’来适应偶数回文串的情况,再遍历数组,每次遍历一个字符时,将该字符作为中心字符,向两边遍历,如果相等...

2019-12-20 16:46:06 205

原创 链表问题总结

1.删除链表的倒数第n个节点给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.解在只循环一次的情况下,这题有两种解法一种是用数组存储每次遍历的链表,这种比较简单但浪费一定空间。第二种是快慢指针,快...

2019-12-19 18:47:43 168

原创 unp第五章总结(网络编程中出现的一些问题情况)

子进程结束未被处理成为僵死进程子进程完成任务后会向父进程发送SIGCHLD信号,父进程必须捕获信号,在信号处理函数中调用wait或waitpid来处理已终止的子进程。当程序阻塞在慢系统调用(如accept)时捕获到信号时,内核会返回一个EINTR错误给被中断的系统调用,编写程序时一定认清被中断的系统调用且处理它们。通常的做法是重新循环重启被中断的系统调用。connect是一个例外。如果该函...

2019-12-11 12:10:40 207

原创 TCP/IP总结(补充)

未决连接队列在内核中,内核为任何一个给定的监听套接字(被动 socket)维护了一个未决连接队列,该队列分为两个部分,分别是未完成连接队列和已完成连接队列这个两个队列元素个数之和不超过 backlog,这是函数 listen 的参数(但现在listen的参数好像没用了)。MSSMSS,最大报文段长度。在连接建立的时候,即在发送 SYN 段的时候,同时会将 MSS 发送给对方(MSS 选项...

2019-12-05 19:23:11 129

原创 TCP/IP总结(重传,Nagle算法,滑动窗口,拥塞控制)

TCP是如何保证可靠传输的为了保证可靠传输,TCP比UDP多了很多控制协议和算法。连接管理——3次握手和4次握手数据破坏——通过校验和丢包——应答与超时重发机制分片乱序——序列号窗口滑动——提高发送效率,对发送端和接收端流量进行控制加快通信速度——快速重发,三次收到重发消息进行重发流控制——避免网络流量浪费拥塞控制——慢启动算法,拥塞窗口TCP的重传机制TCP是可靠的传输...

2019-12-03 21:43:00 1109

原创 TCP/IP总结(TCP与UDP区别,三次握手四次挥手)

1.TCP协议和UDP协议的区别TCP基于有连接,UDP基于无连接。有连接就是TCP在传输前先发送连接请求和应答包,确定双方能正常传输后,才开始进行数据传输。无连接就是UDP在发送数据之前,并不考虑对方能否接收到,甚至目的地址可能都是无效。TCP能保证可靠传输,UDP不能保证可靠传输TCP。所谓可靠就是TCP能保证把数据一定送到目的地址。为了实现可靠,TCP采用有连接的,超时重传,应答机制等...

2019-11-28 12:52:58 346

原创 LeetCode 10.正则表达式匹配

正则表达式匹配给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘’ 的正则表达式匹配。‘.’ 匹配任意单个字符'’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 。示例 1:输入:s = “aa”...

2019-11-23 14:42:05 72

原创 APUE:进程环境

进程环境main函数在main函数之前执行一个特殊的启动例程。可执行程序文件将此启动例程指定为程序的起始地址。启动例程从内核获得命令行参数和环境变量,为main函数做好安排。进程停止main返回。调用exit。调用_exit。最后一个线程从启动例程返回。最后一个线程调用pthread_exit。异常终止有三种调用abort。接到一个信号。最后一个线程对取消请求做出响应...

2019-07-11 13:52:16 106

原创 APUE:标准I/O库(二)

标准I/O库二进制I/O#include <stdio.h>size_t fread(void *ptr, size_t size, size_t nobj, FILE *fp) ;size_t fwrite(const void *ptr, size_t size, size_t nobj, FILE *fp) ;两个函数的返回:读或写的对象数这些函数有两种常见用法:...

2019-07-10 11:12:57 103

原创 APUE:标准I/O库(一)

标准I/O库流和FILE对象对于标准I/O库,操作都是围绕着流来进行的。fopen返回一个指向FILE对象的指针。缓存标准I/O提供了三种类型的缓存:全缓存:当填满标准I/O缓存后才进行实际的I/O操作,对于再磁盘上的文件通常是使用全缓存的,缓存通过malloc来获得。术语刷新说明标准I/O缓存的写操作。可以自动刷新也可以调用fflush来刷新一个流。再UNIX刷新有两种意思,一个...

2019-07-03 15:36:37 98

原创 APUE:文件和目录(二)

文件和目录(二)link,unlink,remove和rename函数#include <unistd.h>int link(const char *existingpath, const char * newpath) ;返回:若成功则为0,若出错则为-1此函数创建一个新目录项newpath,它引用现存文件existingpath。如若newpath已经存在,则返回出错...

2019-07-02 14:45:51 104

原创 APUE:文件和目录(一)

文件和目录stat函数#include <sys/types.h>#include <sys/stat.h>int stat(const char *pathname, struct stat *buf) ;int fstat(int filedes,struct stat *buf) ;int lstat(const char *pathname, struc...

2019-06-27 15:52:12 126

原创 APUE:文件IO

文件IOopen函数#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(const char * pathname , int oflag,.../*, mode_t m o d e * / ) ;返回:若成功为文件描述符,若出错为- 1pathname是要打...

2019-06-26 16:02:11 149

空空如也

空空如也

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

TA关注的人

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