- 博客(237)
- 收藏
- 关注
转载 线程池代码
线程池Global.h#pragma onceconst int DEFAULT_POOL_SIZE = 10;const int STARTED = 0;const int STOPPED = 1;Mutex.h#pragma once#include <pthread.h>#include <unistd.h>#include <deque>#include <iostream>#include <vector>
2022-04-10 18:36:49
489
原创 shell使用示例
shell使用示例统计一个文本文件中每个单词出现的频率;cat text | tr -s ' ' '\n' | sort | uniq -c | sort -r | awk '{print $2, $1}'tr命令用于转换或删除文件中的字符;-s选项用于缩减连续重复的字符成指定的单个字符;uniq -c用于在每列旁边显示该行重复出现的次数;打印文本文件的第十行使用tail -n +10表示从第10行开始输出到末尾,但是如果该文件没有10行,则不输出,然后通过管道输入到head -n 1表示
2022-03-27 17:04:59
623
原创 分组转发算法,路由选择协议——RIP、OSPF、BGP
分组转发算法从数据报的首部提取目的主机的IP地址D,得出目的网络地址为N;若N就是与此路由器直接相连的某个网络地址,则进行直接交付,不需要再经过其他的路由器,直接把数据报交付目的主机(这里包括把目的主机地址D转化为具体的硬件地址,把数据报封装为MAC帧,再发送此帧);否则就是间接交付,执行3;若路由表中有目的地址为D的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器,否则,执行4;若路由表中有到达网络N的路由,则把数据报传送给路由表中所指明的下一跳路由器,否则执行5;
2022-03-27 13:33:41
4383
转载 IP数据报的格式
IP数据报的格式一个IP数据报由首部和数据两部分组成,首部的前一部分是固定长度,共20字节,是所有IP数据报必须具备的,在首部的固定部分的后面是一些可选字段,其长度是可变的;版本: 占4位,指IP协议的版本;首部长度:占4位,可标识的最大十进制数值是15,首部长度字段所表示数的单位是32位字(1个32位字长是4字节),因为IP首部的固定长度是20字节,因此首部长度字段的最小值是5,当首部长度为最大值1111时(即十进制数的15),就表明首部长度达到最大值15个32位字长,即60字节;区分服务;
2022-03-27 12:02:45
2120
转载 共享内存的知识
共享内存共享内存允许两个或多个进程共享物理内存的同一块区域,由于一个共享内存段会成为一个进程用户空间内存的一部分,因此这种IPC机制无需内核介入,所以需要做的就是让一个进程将数据复制进共享内存中,并且这部分数据会对其他所有共享同一个段的进程可用。共享内存不由内核控制意味着通常需要通过某些同步方法使得进程不会出现同时访问共享内存的情况。调用一个共享内存段通常需要执行下面的步骤:调用shmget()创建一个新共享内存段或者取地一个既有共享内存段的标识符(即由其他进程创建的共享内存段)。这个调用将返回后
2022-03-25 13:36:00
1123
转载 配置网关方法
配置静态网关查看当前主机的网卡名,当前ip,子网掩码,网关地址ifconfigroute -n如果ifconfig命令无法使用,请运行以下命令安装net-tools;sudo apt update -ysudo apt install net-tools -y查看DNSnslookup hcos上图所示,网卡名称为enp0s3,IP地址为10.0.2.15,子网掩码为255.255.255.0,网关为10.0.2.2;进入/etc/netplan目录下;cd /etc/net
2022-03-23 22:59:27
6424
转载 ulimit命令
ulimit指令ulimit是一个可以设置或者汇报当前用户资源限制的命令。ulimit -a系统的资源定义在/etc/security/limits.conf文件中,使用ulimit时,就是在使用这个文件中定义的值。可以更改上面的文件来改变系统资源限制的值。...
2022-03-22 20:14:19
1138
转载 Linux附加权限
Linux附加权限set位权限suid,sgid和粘滞位权限sticky;set位权限是为了使没有取得特权的用户要完成一项必须要有特权才可以执行的任务而产生的,一般用于给可执行行文件设置,设置了suid之后,任意用户执行文件时,都将获得该文件的owner的身份;设置了sgid后,任意用户执行文件时,将获得该文件group的身份。粘滞位权限一般用于目录,目录设置了粘滞位权限后,即使用户拥有对该目录的写权限,也不可以删除目录下其他用户的文件。一个目录设置了粘滞位,会表现在其他用户权限的可执行位上,类似
2022-03-22 20:03:59
267
转载 初始化数组的几种方式、格式化输出浮点数、round函数、ceil函数、floor函数
初始化数组的几种方式memset,在<cstring>头文件中。memset按照字节来赋值。只能使用memset初始化为0,-1,或者一个特别大的数;int a[100];memset(a, 0, sizeof(int) * 100);memset(a, -1, sizeof(int) * 100);使用fill()函数和fill_n()函数,这俩函数都在algorithm头文件中。int a[100];fill(a, a + 100, 2);vector&
2022-03-18 14:19:36
436
转载 TCP报文段的首部
TCP报文段的首部TCP虽然是面向字节流的,但是TCP传送的数据单元是报文段,一个TCP报文段分为首部和数据两部分。TCP报文段首部的前20个字节是固定,后面有4n4n4n字节是根据需要而增加的选项(nnn是整数),因此TCP首部的最小长度是20字节。首部固定部分各字段的意义如下:源端口和目的端口各占2个字节,分别写入源端口号和目的端口号。序号,占4字节,序号范围是[0,232−1][0, 2^{32} - 1][0,232−1],序号增加到232−12^{32} - 1232−1后,下一个序
2022-03-17 19:02:51
6010
转载 二维数组指针,数组越界问题
二维数组指针int a[3][4] = { {0,1,2,3}, {4, 5, 6, 7}, {8, 9, 10, 11} };//0 1 2 3//4 5 6 7//8 9 10 11定义一个指向a的指针变量p:int (*p)[4] = a;上面的*p表明的是指向一个数组,指向的数组为int[4]。如何使用指针p来访问二维数组中的每个元素,按照上面的定义:p指向数组a的开头,也即第0行,p+1前进一行,指向第1行;*(p+
2022-03-16 23:55:09
683
转载 分库分表总结
分库分表垂直角度(表结构不同)垂直分表:将一个表字段拆分为多个表,每个表存储部分字段好处:避免IO时锁表的次数,分离热点字段和非热点字段,避免大字段IO导致性能下降;原则:业务经常组合查询的字段一个表,不常用的字段一个表;text,blob类型字段作为附属表;垂直分库:根据业务将表分类,放到不同的数据库服务器上好处:避免表之间竞争同个物理机的资源,比如CPU、内存、硬盘、网络IO;原则:根据业务相关性进行划分,领域模型,微服务划分一般就是垂直分库;水平角度(表结构一样)
2022-03-10 15:02:58
111
转载 grep使用例子
在etc/passwd文件中查找单词"kkk"在多个文件中查找使用-l参数列出包含指定模式的文件的文件名使用-n参数,在文件中查找指定模式并显示匹配的行号使用-v参数输出不包含指定模式的行使用^符号输出所有以某指定模式开头的行使用$符号输出所有以指定模式结尾的行使用句点.符号表示匹配任何单个字符使用[]匹配括号中的任何单个字符使用[^]匹配排除括号中的任何字符使用-r参数递归的查找特定模式使用-i参数忽略字符大小写使用-e参数查找多个模式.
2022-03-08 13:17:39
180
原创 lsof、df、iostat、sar
lsof列出打开的文件df查看文件系统的磁盘空间的使用情况-a:包括虚拟文件系统;-h:可易读单位显示;-i:显示inode信息而非使用量;-T:显示文件系统类型;iostat报告CPU利用率和磁盘IOsar命令查看系统资源综合方面利用率...
2022-03-08 12:11:39
176
原创 find、du、stace、wc
find命令-name name:查找文件find ./ -name "*.c" # 查找目录下所有.文件find ./ -name "[A-Z]*" #查找所有大写字母开头文件du命令-h易读格式显示显示文件,目录的使用情况
2022-03-08 11:27:28
252
转载 netstat、ss
netstatnetstat是一个网络信息统计工具。netstat命令常用的选项包括:-n:使用IP地址表示主机,而不是主机名,使用数字表示端口号,而不是服务名称;-a:显示结果中包含监听socket;-t:仅显示TCP连接;-p:显示socket所属的进程的PID和名字;-o:显示socket定时器的信息;-r:显示路由信息;Proto:协议名Recv-Q:socket内核接收缓冲区中尚未被应用程序读取的数据量;Send-Q:未被对方确认的数据量;Local Address
2022-03-08 10:53:12
234
转载 唤醒机制——管道fd、eventfd、socketpair
唤醒机制当使用epoll,poll和select在监听文件描述符时,设置函数中有一个参数是专门用来设置超时时间的。int select(int maxfdp1, fd_set* readset, fd_set* writeset, fd_set* exceptset, const struct timeval* timeout);int poll(struct pollfd* fdarray, unsigned long nfds, int timeout);int epol
2022-03-07 21:06:41
1279
转载 redis跳表
跳表跳表是一种较为平衡的数据结构,与红黑树不同的是,它是链状结构而非树形结构;跳表的插入查找效率为O(logN)O(logN)O(logN)。跳表节点的定义typedef struct zskiplistNode{ robj* obj; //数据 double score; //分数 struct zskiplistNode* backward; //前一个节点指针 struct zskiplistlevel { struct zskiplistNo
2022-03-07 17:10:06
1609
转载 GDB调试
GDB调试运行命令run:运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令;continue:继续执行,到下一个断点处(或运行结束);next:单步跟踪程序,当遇到函数调用时,也不进入函数体;此命令同step的主要区别是,step遇到用户自定义的函数,将进入到函数中运行,而next则直接电泳函数,不会进入到函数体内;step:单步调试如果有函数调用,则进入函数;与命令next不同,next不进入调用的函数;until:可以运行程序直到退出循环体;until + 行号:
2022-03-07 16:50:57
327
转载 Floyd算法,Dijkstra算法,Bellman算法,A*算法
任意两点最短路径:Floyd-WarShallFloyd算法解决的问题是:对于任意两个节点s和t,求s到达t的最短路径。Floyd算法的思想是动态规划:定义d(i, j, k)为点i到点j之间,只允许借道节点1...k的最短路径;初始化:d(i,j,0) = e[i, j],即i到j之间不经过任何其他中转节点的最短路径;更新dij的公式就是d(i, j, k) = min(d(i, j, k-1), d(i, k-1, k-1) + e[k, j]);更新n次;Floyd算法的时间复杂度是
2022-03-06 18:05:58
669
转载 ARM架构和X86架构的区别
ARM架构和X86架构的区别ARM是精简指令集,X86是复杂指令集;X86功耗比ARM大;X86架构采用桥的方式与扩展设备进行连接,易于扩展;ARM通过专门的数据接口与外接设备进行连接,扩展性不好;X86兼容性比ARM要好,ARM基本上采用Linux操作系统;基于x86结构电脑系统平台开发软件比arm结构系统更容易、更简单、实际成本也更低,同时更容易找到第三方软件(免去自己开发的时间和成本),而且软件移植更容易;...
2022-03-06 11:25:22
4036
转载 C++11、C++14、C++17、C++20区别、string、char*、char[]区别
C++11、C++14、C++17、C++20区别C++11c++11有如下的语言特性移动语义auto类型推导右值引用lambda表达式initializer_list初始化列表decltype类型推导使用using的类型别名:using vec = std::vector<T>nullptrconstexpr常量表达式,使用constexpr表明编译器在编译时期进行计算的表达式final关键字,使得类不能被继承,函数不能被重写delete关键字,使得类中的函数不能被
2022-03-05 23:16:38
7049
转载 三次握手性能提升,四次挥手性能提升
三次握手性能提升策略TCP内核参数调整SYN报文的重传次数tcp_syn_retries调整SYN半连接队列长度tcp_max_syn_backlog,somaxconn,backlog调整SYN+ACK报文重传次数tcp_synack_retries调整accept队列长度min(backlog,somaxconn)绕过三次握手tcp_fastopen四次挥手性能提升策略TCP内核参数调整FIN报文重传次数tcp_orp
2022-02-28 17:49:22
86
转载 Reactor和proactor模式
Reactor模型转自 https://zhuanlan.zhihu.com/p/137506808Reactor模式,是指通过一个或多个输入同时传递给服务器的服务请求的事件驱动处理模式。服务端程序处理传入多路请求,并将它们同步分派给请求对应的处理线程。即I/O复用统一监听事件,收到事件后分发给某线程。Reactor模式中有两个关键组成:(1)Reactor:Reactor在一个单独的线程中运行,负责监听和分发事件,分发给适当的处理程序来对IO事件做出反应,就像公司的电话接线员,它接听来自客户的电话
2022-02-25 12:04:46
2622
转载 限制最大并发连接数
限制最大并发连接数应对accept()时文件描述符file descriptor耗尽的办法服务端用Reactor模式处理并发连接在某个端口listen连接socketFd = accept(listenFd)epoll电平触发,如果有新连接就到达返回用accept()来活得新连接的socketfd假如accept()返回错误EMFILE该怎么办进程的文件描述符用完,无法创建socketfd由于无法拿到socketfd,也就无法close()在下次epoll_wait()时会立刻返
2022-02-19 20:57:21
571
转载 Linux下检测内存泄漏
转自 https://blog.csdn.net/weixin_36343850/article/details/77856051Linux下检测内存泄漏使用Linux命令检测内存泄漏#include <stdio.h>#include <unistd.h>#include <string.h>#include <stdlib.h>void greeting(int nSize){ char* p = (char*)malloc(nSize
2022-02-19 10:26:15
3034
原创 数据库连接
数据库连接连接的本质数据库连接就是把各个表中的记录都取出来依次匹配,并把匹配后的组和发送给客户端,把t1和t2两个表连接起来的过程如图所示。过程看起来就是把t1表中的记录和t2表中的记录连接起来组成一个更大的记录,所以这个查询称为连接查询。如果连接查询的结果集中包含一个表中的每一条记录与另一个表中的每一条记录相互匹配的组和,那么这样的结果称为笛卡尔积。因为表t1中有3条记录,表t2中有3条记录,所以这两个表连接之后的结果集合有9条记录。可以把t1表和t2表连接起来的查询语句写成下图所示样子。连
2022-02-09 22:02:28
3962
原创 vim配置以及Vundle安装插件
文章目录配置vim设置vim C/C++开发环境安装Vundle进行插件管理输入以下命令配置插件安装插件括号和引号匹配自动补全Formatter配置vim设置vim C/C++开发环境在~/.vimrc中输入以下内容set enc=utf-8set fenc=utf-8set termencoding=utf-8" disable vi compatibility (emulation of old bugs)set nocompatible" use indentation of pre
2021-10-09 16:21:30
1640
原创 Redis面试
文章目录Redis面试Redis的过期键的删除策略Redis集群方案哨兵模式Redis clusterRedis ShardingRedis单线程为什么快?Redis分布式锁底层是如何实现的?Redis事务实现事务开始命令入队事务执行Redis的持久化机制RDBAOFRedis面试Redis的过期键的删除策略可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理。惰性过期:只有当访问一个key时,才会判断该key是否已经过期,过
2021-10-06 20:09:34
114
原创 Redis分布式锁
文章目录Redis分布式锁问题描述解决方案设置锁的过期时间设置uuid防止误删Redis分布式锁问题描述随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程,多进程分布再不同的机器上,这将使原单机部署情况下的并发控制锁策略失效。解决方案使用Redis实现分布式锁。命令:SET key value NX EX secondEX second:设置键的过期时间为second秒NX:只有在键不存在时,才对键进行设置操作。SET key value NX 等同于
2021-10-06 11:44:50
156
原创 Redis主从复制
文章目录Redis主从复制怎么实现1. 创建/myredis文件夹2. 配置redis.conf配置文件到文件夹中3. 配置一主两从,创建三个配置文件4. 在三个配置文件写入内容5. 启动三个redis服务查看三个主机运行情况配从机不配主机在主机上写,在从机上可以读取数据主机挂掉,重启就行,重启后还是主机从机挂掉重启后,需要重新执行 slaveof 127.0.0.1 6379命令常用三招一主两仆薪火相传反客为主主从复制原理哨兵模式Redis主从复制主机数据更新后根据配置和策略, 自动同步到备机的mas
2021-10-05 22:26:12
134
转载 缓存穿透,缓存击穿,缓存雪崩
文章目录缓存穿透问题描述:解决方案缓存击穿问题描述解决方案缓存雪崩问题描述解决方案缓存穿透问题描述:key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会压到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。特点:应用服务器压力变大redis命中率变低一直查询数据库表现:redis查询不到数据库出现很多非正常url访问解决方案一个一定不存在于缓存以及查询步到的数据,
2021-10-05 18:01:10
130
转载 Redis新数据类型
文章目录Redis新数据类型Bitmaps命令setbitgetbitbitcountbitopBitmaps与set对比HyperLogLog命令pfaddpfcountpfmergeGeospatialRedis新数据类型Bitmaps1个字节等于8位,下面是“abc”字符串对应的二进制Redis提供Bitmaps数据类型可以实现对位的操作:Bitmaps本身不是一种数据类型,实际上它是字符串,但是可以对字符串的位进行操作。Bitmaps单独提供了一套命令,所以在Redis中使用Bitm
2021-10-05 15:59:48
242
原创 第4章 数据安全与性能保障——读书笔记
文章目录第4章 数据安全与性能保障4.1 持久化选项4.1.1 快照持久化4.1.2 AOF持久化4.1.3 重写/压缩AOF文件4.2 复制4.2.1 对Redis的复制相关选项进行配置4.2.2 Redis复制的启动过程4.2.3 主从链4.2.4 检验硬盘写入4.3 处理系统故障4.3.1 验证快照文件和AOF文件4.3.2 更换故障主服务器4.4 Redis事务第4章 数据安全与性能保障4.1 持久化选项Redis提供了两种不同的持久化方法来讲数据存储到硬盘里面。一种方法叫做 快照,它可以将存
2021-10-05 11:14:30
366
原创 第3章 Redis命令——阅读笔记
第3章 Redis命令3.1 字符串Redis的字符串就是一个由字节组成的序列。在Redis中,字符串可以存储以下3种类型的值字符串整数浮点数用户可以通过给定一个任意的数值,对存储着整数或者浮点数的字符串执行自增或者自减操作。在有需要的时候,Redis还会将整数转换成浮点数。整数的取值范围和系统的长整数的取值范围相同,而浮点数的取值范围和精度则与IEEE 754标准的双精度浮点数相同。命令用例和描述INCRINCR key-name——将键存储的值加1DECR
2021-10-04 17:06:14
180
原创 第一章——初识Redis
文章目录第一章——初识Redis1.1.1 Redis与其他数据库和软件的对比1.1.2 附加特性1.1.3 使用Redis的理由1.2 Redis数据结构简介1.2.1 Redi中的字符串1.2.2 Redis中的列表1.2.3 Redis的集合1.2.4 Redis的散列1.2.5 Redis的有序集合第一章——初识Redis1.1.1 Redis与其他数据库和软件的对比名称类型数据存储原型查询类型附加功能Redis使用内存存储的非关系数据库字符串,列表,集合,散列表
2021-10-03 22:50:31
367
原创 N: 无法安全地用该源进行更新,所以默认禁用该源。
解决方法:cd /etc/apt/sources.list.d进入该目录下,删除该目录下的文件;然后更换源。sudo apt-get update
2021-10-03 17:33:03
4156
2
原创 第五章——内存模型和原子操作
文章目录第五章——内存模型和原子操作5.1 内存模型5.1.1 对象和内存位置5.1.2 对象,内存位置和并发5.1.3 修改顺序5.2 原子操作和原子类型5.2.1 标准原子类型5.2.2 std::atomic_flag5.2.3 std::atomic\5.2.4 std::atmoic第五章——内存模型和原子操作5.1 内存模型C++所有的对象都和内存位置有关。5.1.1 对象和内存位置C++程序中数据都是由对象构成。无论是怎么样的类型,都会存储在一个或多个内存位置上。每个内存位置不是标量
2021-10-03 15:59:45
771
转载 活锁相关知识
活锁活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试——失败——尝试——失败的过程。处于活锁的实体是在不断的改变状态,活锁有可能自行解开。活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。活锁可以认为是一种特殊的饥饿。如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。T3也请求封锁R,当T1释放了R上的封锁后,系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后
2021-10-01 20:31:19
148
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人