- 博客(34)
- 收藏
- 关注
原创 Vscode安装,ssh插件与配置
scode和ssh插件,通过这些手段,我们可以在windows端的vscode上编辑代码文件,一旦保存,代码就会同步更新到linux上。
2024-03-03 22:00:49
1697
原创 C++STL常用组件:容器、迭代器、函数类与函数对象、容器适配器、泛型算法、绑定器
Standard template libaray标准模板库。近容器:数组、string、bitset(位容器)。迭代器:Iterator和const_interator,reverse_iterator和const_reverse_iterator。函数对象:Qreater,less。类似于C的函数指针。泛型算法:Sort,find,find_if,binary_search,for_each。
2024-02-24 09:00:00
816
原创 C++虚函数依赖、虚函数表、静态绑定与动态绑定、虚函数与动静态绑定、虚析构函数、多态、抽象类
如果类里面定义了虚函数,那么编译阶段,编译器给这个类型产生一个唯一的vftable虚函数表,虚函数表中主要存储的内容就是RTTI(run time type information,运行时的类型信息,也叫类型字符串,用于说明虚函数表是哪个类产生的)指针信息和虚函数地址。在继承关系中,如果基类的析构函数不是虚函数,当通过一个基类指针删除指向派生类对象的对象时,只会调用基类的析构函数,而不会调用派生类的析构函数。指向相应类型的虚函数表。一个类里面虚函数的个数,不影响对象内存的大小,影响的是虚函数表的大小。
2024-02-22 01:20:56
673
原创 C++运算符重载、迭代器、继承、派生类的构造与析构、重载、隐藏和覆盖
普通的C++运算符重载成员方法基本都知道,如果没有定义成员方法,那么编译器会优先寻找全局重载运算符看看是否匹配。这里给出了一个使用友元函数和全局重载运算符来实现整数与复数类对象的相加运算。值得注意的是:双目运算符一般要传两个参数,单目运算符看情况(可能需要传一个参数区分前目和后目)。加法运算符重载和输出运算符(<<)重载都需要两个参数,但它们的参数传递方式不同。对于加法运算符重载,将其定义为成员函数时,左操作数是隐式对象,而右操作数是显式参数。
2024-02-21 19:30:29
1028
原创 C++函数模板、特例化、非类型参数、类模板、allocator
模板对类型能进行参数化成【模板参数】,输入的是类型,生成的是代码。使用的时候,每指定一份类型,模板就会根据类型生成一份新的代码(比如函数模板实例化生成的是【模板函数】),有利于减少代码量,通过较少的代码也能实现函数重载。调用函数模板的时候,一般通过传入【模板参数】,也就是【类型参数】。编译器生成相应的函数代码之后,再通过()传入实参。模板的实参推演:调用模板的时候可以根据用户传入的实参的类型,推导出模板类型参数的具体类型。函数模板的特例化例子如下,细节是另起一个同名模板,但是关键字的使用方法有差异。
2024-02-15 23:13:18
953
原创 C++类和对象的细节原理:this指针、构造函数和析构函数、深浅拷贝、运算符重载、初始化列表、类的各种成员和方法
但是在C++中,当你调用一个成员函数时,编译器会自动传递调用该函数的对象的地址作为函数的隐含参数(即 this 指针),因此你无需手动传递对象的地址。类:实体的抽象类型,比如一个人的类,就是先把人的属性、行为等抽象出来,虚虚地放在代码段上,仅仅是一个模板,类型是不占空间的。实体的属性的抽象对应类的成员变量,实体的行为对应类的成员方法。类的成员方法一经编译,所有的方法参数,都会加一个this指针,接收调用该方法的对象的地址。成员对象:B类变量是A类的成员变量之一,那么可以叫这个B类变量为A类的成员对象。
2024-02-14 23:33:53
995
原创 深入了解C++:形参、内联、重载、引用、const和指针、new和delete
注意,只是不能通过这个常变量作为左值去修改值,但是可以通过提取常变量的内存空间的地址,再通过这个地址间接去修改这个常变量的值。如果初始值是一个立即数,所有出现const常量名字的地方(也就是可以把它当常量使用的地方),在编译的时候都被常量的初始化替换,这个功能类似于宏替换。文件的符号表中也不会出现inline函数,但是不是所有的inline都会被编译器处理成内联函数,比如递归,inline只是一个建议。Inline内联函数的普通函数的区别:内联成功的函数,少了函数调用开销,不在符号表中出现。
2024-02-13 23:33:58
1040
原创 深入了解C++:底层编译原理
Linux会给当前进程分配一块空间,比如x86 32位linux环境下会给进程分配2^32(4G)大小的空间,这个空间被叫做【进程的虚拟地址空间】,进程的虚拟地址空间其实并不存在,从底层来看它不过是内核创建的一系列数据结构而已。
2024-02-01 18:40:16
1125
原创 ASCII、GBK与UTF-8的联系
UTF-8字符集是unicode字符集分支而出的一种编码方案,采取可变长编码方案,共分四个长度区:1个字节,2个字节,3个字节,4个字节,按需而定。Unicode字符集的出发点是好的,但是太过奢侈,比如对于中文来说,用unicode的形式存储字符,每存储一个中文就比GBK多消耗2个字节。当把二进制数据转换为中文字符的之后,碰到1开头的数据,就知道要连着包括1在内的16个bit(2个字节)的数据一起转换为中文。占据4个字节的字符,第一个字节开头必须是11110,第二、三、四个字节开头必须是10。
2024-01-24 17:23:01
1123
原创 Redis淘汰策略、持久化、主从同步与对象模型
slots是给各个主节点设置的,举例:当有一个新的key被set的时候,redis会对这个key做一个hash,得到的hash值会对3取余,得到0-16383范围内的值,根据这个值找到对应的槽位,把数据存入相应的节点中。其中,可选的淘汰策略如下,思维导图的一个末端代表了一种淘汰策略,例如第一个末端volatile-lru代表从过期key中淘汰最长时间没有使用的key,allkeys-lru末端代表从所有key中淘汰最长时间没有使用的key。如果要get key,可以从任意节点get key,包括从节点。
2024-01-24 00:38:06
1306
原创 sql数据库的相关概念与底层介绍
SQL是一种编程语言,带有特殊目的,structured query language,结构化查询语言。除了能在mysql数据库中使用,sql还有可能可以在其他关系型数据库中使用。sql主要用于管理关系型数据库系统。关系型数据库:通常使用表存储数据,例如mysql。非关系型数据库:存储结构比较广泛,例如redis,使用的是键值对存储。
2024-01-22 00:04:54
1394
原创 Redis事务与异步方式
redis事务是一个不可分割的工作单位,事务中的操作要么全部执行,要么事前检测出事务中有错误的、不可执行的部分全部不执行;如果redis事务事前没检测出错误,事务正常执行,然而事务队列中的某个命令在执行期间出现了错误(比如有可能是因为内存不足的原因),整个事务也会继续执行下去,直到将事务队列中的所有命令都执行完毕为止,这时候就会没有严格的原子性了,会出现一部分命令成功,一部分命令执行失败的情况,需要我们人工回滚。异步连接的速度远高于同步连接的速度,甚至达到了数十倍,缺点是可能会造成业务逻辑的割裂。
2024-01-18 17:45:35
1122
原创 websocket介绍并模拟股票数据推流
Websockt是一种网络通信协议,允许客户端和服务器双向通信。最大的特点就是允许服务器主动推送数据给客户端,比如股票数据在客户端实时更新,就能利用websocket。
2024-01-10 22:27:29
1292
3
原创 POSIX API与网络协议栈
本文介绍linux中与tcp网络通信相关的POSIX API。尤其是在每次调用POSIX API的时候,网络协议栈会进行的操作与记录。
2024-01-09 22:58:04
1399
原创 负载均衡案例:如何只用2GB内存统计20亿个整数中出现次数最多的整数
在计算机底层中,类型的键值对所占的大小为8个字节,20亿个整数极端情况下如果产生了20亿个键值对那么仅仅是存储就需要16GB的内存。
2024-01-05 10:44:34
679
1
原创 手撕测试tcp服务器效率工具——以epoll和io_uring对比为例
本文主要进行效率测试,看看基于epoll模型和io_uring模型的tcp服务器,谁的效率更高。
2023-12-28 19:52:38
1377
1
原创 分布式锁的原理解析与实现工具介绍
分布式锁:在分布式场景中使用的锁。操作系统并没有提供分布式锁,只能由用户自行实现。这个锁是抽象的锁,并不是真正的锁。
2023-12-24 17:35:44
657
1
原创 手撕检测内存泄漏组件
该方法仅适用于单文件检测内泄漏,因为宏定义只在当前文件中有效。这里的组件指的是利用宏定义功能将内存操作相关的函数(malloc,free等)在保留原有功能的基础上增添上所需功能的函数。如何判断是否有内存泄漏?该组件可以在每次程序malloc的时候根据内存地址生成一个内存相关文件,每次程序free的时候根据内存地址销毁相关文件。最后如果有剩余文件,说明有内存泄漏如何判断泄漏发生在哪一行?用__LINE__和__FILE__宏定位发生内存操作的具体代码位置。如何设置组件开关?
2023-12-21 21:53:21
566
原创 C++11及上的原子操作底层原理与锁实现
可以看出L1和L2是每个核心都会有的。L3是一个处理器下的核心共有的。主存(常规语境下所指的内存)是所有核心共有的。越往下容量越大,同时读取速度越慢。Cpu访问缓存的时候会有一个最小的读取单位,叫做cache line,一般是64个字节。Flag标识的是当前的缓存是否可用。Tag标识的是当前的缓存是否命中。Data是缓存数据。
2023-12-20 10:33:18
2399
1
原创 用反应器模式和epoll构建百万并发服务器
此处的百万并发指的是可以建立至少100w个客户端连接,不考虑业务处理。反应器模式下的epoll相比起普通的epoll不同在于:普通的epoll在获取到就绪状态的event结构体之后,先判断是什么类型的fd,再进行操作。而reactor先判断是什么类型的事件,再进行操作。
2023-12-11 02:33:59
1082
原创 图解IO多路复用模型之select、poll、epoll
在之前的文章《如何不使用任何模型裸建服务器》(详情见上篇文章)中,我们最终使用了多线程来解决多客户端连接问题。Linux下,一般默认为一个线程占有8M的线程栈空间,那么如果有1024*8个连接,就需要8G的线程栈空间,显然具有高额的资源开销。在连接数巨大的时候,epoll的红黑树数据结构可以快速地实现节点的改查。包括相应事件发生的时候,内核也能迅速地查找到相应的节点并且进行后续操作。数据结构直接建立在内核中,无需将存储文件描述符集合和监听事件的数据结构实例反复复制进入内核中。没有连接数量大小的限制。
2023-12-10 03:35:56
763
原创 如何不使用任何模型裸建服务器
裸建服务器的问题较多,但是作为后端程序员依然有必要了解,以便更深刻地理解为什么要使用IO多路复用模型、异步模型等。
2023-12-09 02:34:48
1118
原创 与epoll媲美的io_uring
而io_uring会先将io任务存入内核中的submit队列,发起请求后程序可以异步地继续执行其他任务和操作,直到io_uring_sumbit函数一次性将所有请求提交至内核进行处理,内核会异步地执行这些任务,哪怕有些请求暂时没法处理也不会阻塞整个程序的执行。常规IO函数的隐藏步骤:read、write、recv、send都是常规的IO函数,它们底层其实都分了两个步骤,一是发起读写请求,二是进行数据的拷贝(读函数将数据从内核缓冲区拷贝进用户空间,写函数将数据从用户空间拷贝入内核缓冲区),并进行结果返回。
2023-12-05 18:23:18
1408
原创 基于dpdk的用户态协议栈设计实现(二)
接:基于dpdk的用户态协议栈设计实现(一)基于dpdk的用户态协议栈设计实现(一)-CSDN博客本文只介绍应用层代码的编写,不会深入开展讲解计算机底层宏大的架构。
2023-11-30 21:09:23
1135
原创 基于dpdk的用户态协议栈设计实现(一)
49]的执行需要输入eth0的PCI地址,所谓的PCI地址就是PCI设备的标识符,PCI设备就是显卡、网卡等。其中,[43] Insert IGB UIO module,IGB、[44] Insert VFIO module都是插入驱动程序模块,是dpdk用于接管网卡的组件,不过它们在功能和特性、支持的设备等方面存在差异。[47] Setup hugepage mappings for NUMA systems,都在为dpdk设置巨页,巨页的设置可以减少页表、减少访问内存的开销,增加dpdk的吞吐量。
2023-11-27 02:31:49
1244
1
原创 简述利用samba实现windows和linux之间文件同步
该命令的作用是将密码和某个用户名关联起来,这个用户名可以自取,不一定要和linux下的登录用户名一致。samba+sourceinsight只是一种实现不同操作系统之间交互的组合,根据个人习惯和开发环境的不同也能使用其他的工具和组合,例如ssh+vscode。该文件夹的作用相当于linux和windows之间的沟通窗口,等待一切配置好了之后,可以通过该窗口将文件在两个系统之间进行传输。如果有合法的能连接到外网的方法也可。3、 在windows的磁盘目录里输入\IP,就可以查看该共享文件夹了。
2023-11-23 17:49:27
711
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人