自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 c++文件读取

#include<stdio.h>#include<string.h>#include<iostream>usingnamespacestd;structinfo{intlen;charcode[4];charcontxt[];};voidwriteText(){intlen1=12;constchar*str1="aaaa";const...

2021-09-08 08:14:57 127

原创 net lenas

2021-08-17 00:26:11 127

原创 程序员的自我修养:第二部分静态链接

一、编译过程简介g++ -o hello hello.cpp 上述过程包括了四个步骤:预编译、编译、汇编、链接1、预编译g++ -E -o hello.i hello.cpp主要处理#开始的预编译命令1)#define: 将所有的#define删除,并在源文件中展开2)#if 、#ifdef、#elif、#endif条件预编译指令:决定该代码是否需要编译3)#include预编译指令,递归地(被包含的文件也有可能包含其他文件)将被包含的文件插入到该预编译指令的位置4)删除所有注释5)

2021-05-13 23:42:20 160 1

原创 GDB使用:

在编译的时候加入-g,这样会显示变量名称,否则只会显示地址:g++ -g main.cpp -o maingdb 可执行文件名 启动GDB常用指令:list 列出源码run 运行程序break n 在源程序第n行加入断点break 函数名 在源程序某个函数入口处加入断点,在该函数第一句话处next 执行下一条指令continue 执行到下一个断点print 变量名 打印该变量的值backtrace 查看函数堆栈finish 退出所在的函数quit 退出GDB...

2021-04-29 21:40:30 104

原创 linux构建静态库和动态库,makefile使用

一、静态库目录结构1)在src文件夹中将所有的.c文件生成.o文件g++ -c *2)将.o文件打包成静态库ar rcs libmath.a *.o3)在main.cpp文件夹编译main.cpp文件g++ -o main main.cpp -L./src -lmath //-L为静态库包含的路径,-l为静态库名字二、动态库1)直接生成动态库g++ -shared -fPIC -o libmath.so *.cpp2)将动态库所在路径加入搜索路径,在src中export L

2021-04-29 21:06:45 584

原创 redis(4):慢查询、pipeline、事务、bitmap、HyperLogLog、订阅、GEO

一、慢查询:慢查询日志,系统会统计每条指令执行所需时间,当某指令超过阈值后会记录下来slowlog-log-slower-than和slowlog-max-len进行配置,配置路径在/etc/redis/里

2021-01-07 22:45:10 135

原创 背包问题:01背包、完全背包、多重背包、混合背包、二维费用背包

一、01背包问题:有 N 件物品和一个容量为 V 的背包。第 i 件物品所占容量是 Ci,得到的价值是 Wi。求解将哪些物品装入背包可使价值总和最大。根据第i件物品是否放入, dp[i,n] = max(dp[i-1,n],dp[i-1,n-Ci]),时间和空间复杂度都是O(VN),空间复杂度可以优化,每一行计算dp[i,n]的时候从右边开始计算递减,这样dp[n]=max(dp[n],dp[n-Ci]),for n<-V…Ci,因为第i个物品不放的话前面就不需要考虑了。...

2021-01-06 17:11:26 186

原创 redis使用(3):哨兵、集群、

一、定义:是一个分布式结构,对主从结构的服务器进行监控,当主服务器宕机,投票选择从服务器成为主服务器,并连接其他的slave。配置哨兵配置文件:启动哨兵redis-sentinel sentinel-6003.conf连接哨兵redis-cli -p port首先启动主从服务器(6000,6001,6002),再启动哨兵(6003,6004,6004),当主服务器(6000)挂掉后,哨兵会投票推举,其中一个从服务器(6002)成为一个主服务器原理:...

2020-11-08 21:10:37 244 1

原创 redis使用(3):删除策略、逐出策略、高级数据类型、主从复制

一、删除策略 将到期的key删除通过hash的形式将时效性数据的地址和对应的有效时间保存1)定时删除: 创建一个定时器,当key设置有过期时间,且过期时间到达,会立即执行删除操作,此时不管cpu在调度什么进程,都会抢占cpu,降低性能2):惰性删除: 过期时间到达,不会立即执行删除操作,会等到下一次访问该数据的时候才会删除数据3)定期删除: 在一个周期内去轮询一个数据库,选择W个设置了有效期的key,如果过期了直接删除,否则不删除,如果删除数量达到了W/4个,则继续该过程,否则对下一个数据库进行

2020-11-06 10:12:13 130

原创 redis使用(2):持久化、事务

一:linux下的使用:启动redisredis-server [--port]可以换端口连接redisredis-cli [-p]二、持久化:两种保存方式:

2020-11-04 15:57:44 78

原创 redis使用(1):基本数据类型、通用命令key

一、基本操作:help 指令 获取相对应指令的帮助信息二、数据类型: key永远是string类型,key一般设置成表名:主键名:主键值:字段名 ,来对应数据库中的数据1)value是string: 如果string类型是数字,可以当成是数字进行操作set key value 信息设置mset key1 val1 key2 val2....一次性设置多个数据get key信息获取,如果不存在则返回nilmget key1 key2...一次性获取多个数据strlen key获取val的长度

2020-11-02 09:27:52 163

原创 智能指针:

将指针和一个栈变量绑定,当这个变量创建的时候调用构造函数,回收的时候调用析构函数。其中重载了->和.可以将智能指针对象直接当作指针使用一、unique_ptr#include<iostream>#include<memory>#include<string>using namespace std;template<class T>struct Node{ T data; unique_ptr<Node<T>> n

2020-10-16 15:48:16 70

原创 gcc、gdb使用:

g++编译的可执行文件必须要有调试信息,即编译指令中加入-g,g++ -std=c++11 -g main.cpp -o main进入gdb调试gdb [filename]

2020-10-10 15:18:01 66

原创 从零实现http:(2)zlib使用

一、zlib常用函数常用数据结构:typedef struct z_stream_s{z_const Bytef* next_in;//压缩数据的首地址uInt avail_in; //压缩数据的长度uLong total_in; // 将要压缩数据缓冲区的长度Bytef *next_out; // 压缩后数据保存位置。uInt avail_out; // 压缩后数据的长度uLong total_out; // 压缩后数据缓冲区

2020-09-22 16:50:08 245 1

原创 Linux高性能服务器编程(1):高性能服务器程序框架

一、服务器基本框架:IO单元处理客户端连接,读写网络数据,逻辑单元,业务线程,请求队列是各个线程之间通信的方式IO分为同步IO和异步IO:同步IO是,IO就绪(比如socket收到了客户端的数据)就会通知程序,异步IO只有在事件完成后才会通知程序。比如使用read(),需要两个步骤:1)内核缓冲区等待数据的接收2)将数据从内核缓冲区copy到应用缓冲区同步IO会在1)完成后通知进程,而异步IO会在2)结束后通知进程。阻塞IO会在1)中等待直到内核缓冲区收到数据,非阻塞IO在1)中会立即返回,

2020-09-22 15:41:25 83

原创 IO复用select、poll、epoll

进程分为running和waiting状态,CPU会调度running的进程,waiting的进程不占用CPU资源。一个进程创建了SOCKET,就会有一个文件句柄指向改对象,SOCKET中包含了缓冲区,等待列表。当一个进程调用RECV()就会进入waiting,并且添加到等待队列中。一、select:select模型监听多个SOCKET,是把一个进程添加到多个SOCKET的等待队列中当一个SOCKET发生了读写,就需要遍历所有的SOCKET,判断哪一个SOCKET发生了变化,同时进行删除,最大数量

2020-09-15 16:25:56 103

原创 linux_unix编程手册(1):进程、动态分配内存

一、进程进程是内核定义的抽象实体,并未该实体分配资源。由用户内存空间(代码和数据)和内核数据结构(ID,虚拟内存表,打开的文件描述符表等)组成使用pid_t getpid(void)来获取进程号,最大进程号为215 -1 (32767),溢出会重置成300使用pid_t getppid(void)来获取父进程进程号进程的内存分配:(进程的虚拟内存范围在声明周期会发生改变)优势:1)不同的PTE可以指向不同的PA,实现进程的隔离2)不同的PTE可以指向相同的PA,实现进程之间的内存共享3)在

2020-09-14 14:40:39 186

转载 从零实现http:(1)以oop的方式实现http

一、post和get方法的不同:get请求的参数在URL中,post可以不在curl 'http://127.0.0.1:8080/get/req2?name=%E4%B8%80%E7%81%B0%E7%81%B0&age=19'

2020-09-03 21:31:32 341

原创 深度探索c++对象模型(5):ctor、dtor、copy

一、无继承的对象构造:类中包含的都是POD,则该类的ctor、dtor、copy都是trivial,初始化、拷贝、回收该类型对象,编译器不会产生对应的ctor、dtor、copy。二、加入虚函数:由于构造函数需要初始化vptr,因此ctor、copy是nontrivial,dtor是trivial在一个类B中使用了其他类A,并且该类有ctor、dtor、copy,则B的ctor、dtor、copy都是nontrivial。三、虚拟继承:由最底层的class对Point进行初始化四、vpt

2020-08-23 11:42:10 5703

原创 深度探索c++对象模型(4):function

一、各种函数的调用方式nonstatic member function:非静态成员函数和普通函数效率没有区别,会将nonstatic member function转化成nonmember function。1)加入一个this指针用以关联函数和具体的对象2)对于nonstatic data member的存取使用this指针来3)重写成新的外部函数并生成独一无二的名字virtual member function:1)通过指针和引用来调用,转化成vptr来调用函数,register fl

2020-08-22 21:19:58 108

原创 深度探索c++对象模型(3):data

空基类的大小为1byte,为了让不同的空类型的地址有区别一、data member的布局:nonstatic member data按声明顺序存在class object中static member data位于global data segment(不会影响object大小)。对static member data取地址,得到的是指向该数据类型的指针。二、data member的存取:对于static data member进行存取操作,在任何情况下,使用指针和dot是一样的。对一个类的memb

2020-08-22 10:50:13 235

原创 深度探索c++对象模型(2):构造函数

构造函数可能被编译器当成是一个转换函数,因此引入explicit,禁止隐式转换(c++11中没有被声明explicit的构造函数都有可能被当成是转换函数)一、默认构造函数:如果用户自己没有是声明构造函数,编译器就会自己生成一个默认构造函数,该默认构造函数在以下几种情况是nontrivial的,只有在以下四种情况下,编译器才会合成默认构造函数,且内置数据类型都不会被初始化,只有base class subobject和member class才会被初始化:1)一个类中没有ctor,内含一个member

2020-08-20 19:55:37 138

原创 深度探索c++对象模型(1):关于对象

一、简单对象模型class Point { public: Point( float xval ); virtual ~Point(); float x() const; static int PointCount(); protected: virtual ostream& print( ostream &os ) const; float _x; static int _point_count;

2020-08-20 09:36:48 75

原创 linux:信号量、互斥量、条件变量、死锁

一、定义:临界区: 访问共享区域的代码,并且如果另外一个进程在执行相同的代码,这个代码就不会执行互斥: 一个进程处于临界区访问共享资源的时候,没有其他几次呢很难过会同时处于临界区临界区实现:1)禁用中断。中断是实现并发的一个模块,禁用中断,就没有上下文切换2)...

2020-08-16 20:44:07 268

原创 操作系统(1):进程与线程、调度管理

一、并发:一个CPU交替执行多个程序由于程序在执行涉及到磁盘的操作会特别慢,因此可以在程序执行磁盘操作的时候切换到其他程序。除了改变PC指针以外,还需要保护现场,用PCB来记录。多进程的组织:PCB+状态+队列二、线程用户级线程:进程=资源+指令执行顺序,如果只需要切换程序而不用切换资源,就实现了线程的切换。两个线程切换的时候,如果使用一个栈的话会导致错误,因此需要使用两个栈。首先需要切换栈,用TCB记录栈的指针,...

2020-08-11 21:09:02 198

原创 深入理解计算机操作系统(2):虚拟内存

一、虚拟内存物理地址:计算机的主存由M个连续的字节大小的单元组成,每个字节由自己唯一的物理地址。虚拟地址:CPU生成一个虚拟地址,MMU翻译该地址成为一个物理地址,对主存进行访问。虚拟内存是在磁盘上分配的空间。虚拟内存和物理内存之家通过块(虚拟页、物理页)来交换数据。作为缓存的工具:页表(PTE数组,存放在物理内存中):将虚拟页映射到物理页PTE由一个有效位和n位地址字段组成,有效位表示是否在DRAM中有缓存,有的话,地址就是对应的物理页的起始地址。没有有效位用空地址表示,或者表示虚拟页在磁盘

2020-08-06 14:44:06 927

原创 深入理解计算机操作系统(1):链接器

链接器定义:链接是将各种代码和数据片段收集起来组合成为一个单一文件的过程。可能发生在编译、加载到内存、程序执行时候。首先使用预编译器将mian.cpp翻译成main.i(ASCII码的中间文件),再使用编译器翻译成main.s(汇编文件),再使用汇编器翻译成可重定位目标文件main.o,最后使用链接器将main.o和sum.o链接成可执行文件。最后使用加载器把生成的可执行文件加载到内存中。目标文件:1)可重定位目标文件:包含二进制代码和数据,可在编译的时候与其他可重定位目标文件合并,生成可执行目标

2020-08-04 09:47:07 550

原创 设计模式:UML类图、策略模式、单例模式、工厂模式、观察者模式

一、UML类图:类与类之间存在6个关系:1)依赖:类A用到了类B,不是成员变量中用到,而是在成员函数中用到了2)关联:类A使用了类B,并且是在成员变量中用到的3)聚合:和关联类似,也是使用实例化来关联,一个是整体,一个是部分4)组合:相比聚合具有更强的耦合度。部分没有单独存在的意义,整体负责单独的生命周期。5)继承:6)实现:纯虚函数二、策略模式:strategy中的算法经常变化。所以将strategy中的算法作为虚函数,在派生类中进行重写。Context中包含了一个stra

2020-08-01 14:43:08 2345

原创 STL源码(5):仿函数、适配器

一、仿函数:重载了()的struct或classSTL里面的仿函数都是继承下面两个结构体,只有继承了才能使用适配器:**二、适配器:**将一种接口转成另外一种接口容器adapter: stack、queue迭代器适配器:**reverse_iterator:**使得迭代器的从尾部到头部来遍历容器,output_iterator将reverse_iterator与一个正向迭代器绑定,通过调用正向迭代器的方法来实现逆向迭代器。insert_iterator: output_iterator

2020-07-28 21:01:20 81

原创 STL源码(4):关联容器

一、RB-TREE:节点的设计:为了实现方便,加入了header节点,header的左节点为leftmost,右节点为rightmost,为root的父节点。rb_tree的数据结构:迭代器:set、multiset:两者不同在与插入的时候,set使用insert_unique()(不能插入重复的),multiset使用insert_equal()(可以插入重复的)底层使用rb_treemap、multimap:二、hashtable:当元素的个数大于bucket的个数的时候,

2020-07-28 09:51:55 49

原创 STL源码(3):序列容器

一、vector:迭代器是普通指针使用三个指针表示使用空间的头尾和可用空间的尾首先判断有无备用空间,有的话在备用空间里构造,没有的话重新开辟2倍大小的空间,将旧空间里的元素复制过来。push_back:直接在finish指针处构造新对象,然后调整finish指针;pop_back:finish–,析构finish处的对象erase:先拷贝再析构insert:1)备用空间足够:第一种情况:finish-pos>n第二种情况:finish-pos<n2)备用空间不够:

2020-07-27 10:06:51 63

原创 STL源码(2):迭代器、trait

一、iterator_traits:算法在使用iterator的时候需要知道迭代器指向对象的属性,如果这里的迭代器是一个对象,则可以通过 ::直接获取,但是如果迭代器是一个指针,不能直接获取。因此需要traits来获取迭代器指向对象的属性。二、_type_trait:如果对象是一个内置类型(int,double),或者对象的成员变量是内置类型,编译器会自动调用析构函数,我们显示调用析构函数会造成效率下降,因此对于无意义的析构函数的对象不需要调用析构函数。因此使用_type_trait来获取对象的

2020-07-22 10:53:56 82

原创 网络基础(4):http

http:超文本传输协议URL:统一资源定位符,表示资源在互联网上的位置URI:统一资源标识符(URL是URI的子集)URI的格式:

2020-07-21 16:43:47 1075

原创 网络基础(3):UDP、多播、DNS

一、UDP:面向数据报的传输协议,进程的每个输出都产生一个UDP数据报,而TCP程序产生的数据会根据MSS进行重组或者拆分,不提供可靠性。长度:UDP报文的长度校验和:覆盖首部和数据,由于UDP数据报可能为奇数,因此计算的时候需要填0,还会用到IP首部里面的部分,为0说明发送端没有计算检验和IP分片:一个主机会有多个网卡,发送IP报文首先判断哪个网卡发送,并且获取MTU,比较IP数据大小和MTU的比值,需要则进行分片,每个分片除了最后一个数据段总是8的倍数,运输层(TCP、UDP首部只会出现在

2020-07-20 14:57:51 565

原创 网络基础(2):TCP

一、TCP报文特点:**面向连接:**在通讯前先建立一条连接**基于字节流、可靠传输:**发送到字节流之间存在关联,接收端收到乱序可以恢复顺序,接收端每接受一条数据,会返回一个确认,**缓冲传输、流量控制:**接收端接受的数据先存在缓冲区,并告诉发送端缓冲区还有多大空间**全双工:**每个端口既可以发送数据也可以接收数据TCP报文:序号:表示这个报文段中第一个数据字节序号确认号:用来给对方确认的,对于自己来说是期望下一次接收到的数据,接收到的序列号+数据大小+1头部长度:4位,最多60字

2020-07-17 19:49:57 461

原创 STL源码剖析(1):分配器

空间配置与释放:vc++、CB适配器:allocator调用了operartor new和operator delete,底层调用的是malloc和free,除了需要存储数据的内存还需要额外的开销(cookie表示元素大小,消耗8个字节),因此不适合小内存的分配gcc\g++ alloc配置器:设计了双级配置器:1)当配置区>128bytes,使用一级适配器,直接调用malloc 和 free2)二级分配器:先使用malloc得到内存池,将内存池作为分配的空间,根据容器元素大小将指定链表作

2020-07-08 18:17:31 212 1

原创 网络编程(7):client和server的封装

一、clients类的封装:#ifndef _EasyTcpClient_hpp_#define _EasyTcpClient_hpp_#define WIN32_LEAN_AND_MEAN#define _WINSOCK_DEPRECATED_NO_WARNINGS#ifdef _WIN32 //windows会定义宏_WIN32 #include<Windows.h> #include<winSock2.h>#else //linux系统下需要包含

2020-07-07 21:24:28 222

原创 git管理项目

使用git将工程传递到gitee中1)git add 文件名2)git commit -m"修改说明"3)git push origin master一、客户端1.linux#define WIN32_LEAN_AND_MEAN#define _WINSOCK_DEPRECATED_NO_WARNINGS#ifdef _WIN32 //windows会定义宏_WIN32 #include<Windows.h> #include<winSock2.h>

2020-07-06 16:10:00 1477

原创 linux(2):权限管理、网络配置、rpm包

一、脚本:shell脚本:1)在文本编辑器中写代码,保存为.sh文件即可,第一行要添加 #!/bin/sh2)但是该文件没有执行权限,需要添加执行权限3)执行路径+文件名(linux执行脚本会从path变量中的路径来寻找对应的脚本)二、vim编辑器vi + 文件名 进入编辑先i进入编辑模式,再esc退出编辑模式,wq保存并退出...

2020-07-05 16:36:22 2699

原创 网络编程(5):select模型

一、select模型:

2020-06-29 22:35:22 302 1

空空如也

空空如也

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

TA关注的人

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