自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++ 四个阶段,智能指针,强制转换,深拷贝和浅拷贝,移动构造与拷贝构造,对比如何提高运行效率

四个阶段预处理–>编译–>编译–>链接.i–>.s–>.o–>.exe预处理:展开宏定义,加载头文件,删除注释,对行标号编译:语法分析,词法分析,生成汇编文件编辑(编译阶段可以进行gcc -o优化)编译:生成二进制文件链接:加载动态库或静态库的一部分,生成可执行文件智能指针auto : 两个auto指向同一个对象,会出现内存崩溃unique:保证同一时间只有一个智能指针指向该对象sharedweak强制转换const_cast:用于去除指向常数对

2022-03-28 23:43:50 2062

原创 C++实现生产者和消费者模型

头文件 和 全局变量消费者生产者main函数代码#include <iostream>#include<thread>#include<mutex>#include<condition_variable>#include<queue>using namespace std;//任务队列queue<int>products ;mutex m ;condition_variable cond ;boo

2022-03-27 22:01:07 262

原创 web服务器问题排查

连不上服务器ping 网站域名无法ping通,可能是dns解析的问题ping通,则通过netstat查看端口,可能端口未开启若端口开启,则需要查看日志进程问题(cpu高或内存高)1.top查看进程信息,定位到可疑进程2.pstack + 进程ID 查看进程堆栈3.定位到相应代码,查找问题程序非法执行或崩溃1.如果有日志,先查日志2.程序崩溃会生成core文件,core文件进程的栈的内存状态,用gdb打开core文件,显示崩溃的位置...

2022-03-15 21:38:29 1292

原创 操作系统知识点整理,进程调度方式,kill和kill-9

原码,反码,补码原码:是对自然正数(包括0)的二进制编码,正数在计算机中直接用原码进行存储。反码:可以理解为是求补码的中间过程,反码=原码逐位取反。计算机并不存储反码。补码:计算机求相反数的编码,补码=反码+1。负数在计算机中使用补码进行存储原码代表着计算机中的正数,0属于正数,补码则为原码取反加一,目的将 -0 归于正数,因此负数范围整体减一,为-128到 -1进程调度的几种方式先来先服务调度算法短进程优先调度算法时间片轮转法最高响应比优先法多级反馈队列...

2022-03-11 23:04:10 639

原创 redis知识点汇总,Redis事务

为什么Redis是单线程的Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程Redis优点基于内存操作。内存读写速度快支持持久化。Redis支持RDB和AOF两种持久化机制,持久化功能可以有效地避免数据丢失问题。支持事务。Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行支持主从复制。主节点会自动将数据同步到从节点,可以进行读写分离I

2022-03-07 23:10:27 423

原创 为什么用ip不用mac寻址?arp协议的主要功能

IP地址根据逻辑划分,MAC地址是固定的物理地址,逻辑划分更便于寻址通过NAT协议转换,多个用户可以使用同一个IP每台计算机都有唯一的MAC地址,寻址困难,不便于管理ip地址工作在网络层,mac地址工作在数据链路层,路由器之间用ip寻址,局域网内用mac寻址...

2022-02-25 22:04:28 2456

原创 c++零散知识点整理,结构体和类的区别,new和malloc,左值和右值,内存对齐,指针函数指针

C++结构体和类的区别结构体是一种值类型,而类是引用类型结构体用栈存储,而类使用堆存储结构体内默认权限是public,类默认为private

2022-02-16 19:06:16 480

原创 CAS和ABA

https://zhuanlan.zhihu.com/p/400817892CAS(Compare & Set/Compare & Swap)CAS是解决多线程并行情况下使用锁造成性能损耗的一种机制,类似于乐观锁,在提交操作时检查是否一致CAS操作包含三个操作数——内存位置(V)、预期原值(A)、新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。无论哪种情况,它都会在CAS指令之前返回该位置的值。CAS有效地说明了“

2022-02-11 21:08:54 110

原创 线程资源,线程通信,线程锁相关

用户模式下的方法有:原子操作(例如一个单一的全局变量),临界区。内核模式下的方法有:事件,信号量,互斥量。原子操作:指不会被线程调度机制打断的一个或一系列操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。互斥量:为协调共同对一个共享资源的单独访问而设计的。信号量:为控制一个具有有限数量用户资源而设计。事件:用来通知线程有一些事件已发生,从而启动后继任务的开始

2022-02-11 16:59:58 393

原创 GET与POST的区别

HTTP规范中对这两个方法的约定,但是,仅仅只是约定,并不是强制,两者是可以混用的GET方法用来向服务器请求资源,而POST方法请求服务器修改数据GET方法数据被放入URL,而POST放入bodyGET方法发送的数据有限制(长度和类型),而POST没有https://www.cnblogs.com/tuyang1129/p/12570894.html...

2022-02-07 22:37:15 140

原创 golang mutex和rwmutex

https://www.cnblogs.com/f-ck-need-u/p/9998729.html

2022-02-03 22:22:51 332

原创 MyISAM与InnoDB 的区别

https://blog.csdn.net/qq_35642036/article/details/82820178

2022-02-03 21:54:55 410

原创 Linux进程状态解析 之 R、S、D、T、Z、X

https://blog.csdn.net/sdkdlwk/article/details/65938204

2022-02-03 16:48:23 1023

原创 常用算法简记

优先级队列小顶堆priority_queue <int,vector<int>,greater<int> > q;大顶堆priority_queue <int,vector<int> > q;组合问题(每个元素只能使用一次)for循环每次从startIndex开始遍历,下一层搜索要从i+1开始void backtracking(int n, int k, int startIndex){ if(终止条件){} for (int

2022-01-30 23:27:58 456

原创 CAP理论

一致性(所有节点在同一时间具有相同的数据)可用性 (保证每个请求不管成功或者失败都有响应)分隔容错性(系统中任意信息的丢失或失败不会影响系统的继续运作)关于P,在整个系统中某个部分,挂掉了,或者宕机了,并不影响整个系统的运作或者说使用,而可用性是,某个系统的某个节点挂了,但是并不影响系统的接受或者发出请求,CAP 不可能都取,只能取其中2个原因是:如果一致性是第一需求,要数据同步,不然请求结果会有差异,但是数据同步会消耗时间,期间可用性就会降低。如果可用性是第一需求,那么只要有一个服务在,.

2022-01-26 19:46:01 1436

原创 go map底层

实现map底层为哈希表,采用拉链法解决哈希冲突,主要出现的结构体有两个,一个叫hmap,一个叫bucket(bmap)Golang的map中用于存储的结构是bucket数组。hmap和bucket的关系是这样的而bucket又是一个链表,所以,整体的结构应该是这样的:go中数据经过hash后,得到一个hash值,Gol会把hash值分为高位和低位,低位用于寻找当前key属于hmap中的哪个bucket,高位用于寻找bucket中的哪个key。扩容会创建一个扩大一倍的bucket数组,并旧

2021-12-29 19:15:11 236

原创 go slice底层

slice的数据类型Go 中数组为值类型,因此数组赋值和函数传参都是值复制的,即每次传参都用数组,那么每次数组都要被复制一遍,会导致大量内存占用。如果用指针传递,万一原数组的指针指向更改了,那么函数里面的指针指向都会跟着更改。因此slice采用引用类型,用切片传数组参数,既可以达到节约内存的目的,也可以达到合理处理好共享内存的问题。slice的数据结构切片的结构体由3部分构成,Pointer 是指向一个数组的指针,len 代表当前切片的长度,cap 是当前切片的容量。cap 总是大于等于 len

2021-12-29 16:55:10 151

原创 虚函数,虚表指针的初始化时期,静态函数能否为虚函数,哪些函数不能是虚函数

析构函数能否声明为虚函数或者纯虚函数?析构函数可以为虚函数,并且一般情况下基类析构函数要定义为虚函数,只有在基类析构函数定义为虚函数时,调用操作符 delete 销毁指向对象的基类指针时,才能准确调用派生类的析构函数(从该级向上按序调用虚函数),才能准确销毁数据。构造函数能否声明为虚函数或者纯虚函数?构造函数不能定义为虚函数。在构造函数中可以调用虚函数,不过此时调用的是正在构造的类中的虚函数,而不是子类的虚函数,因为此时子类尚未构造好。虚函数对应一个 vtable (虚函数表),类中存储一个 vptr

2021-12-24 15:30:35 1838

原创 rpc及和http对比

Day1实现了一个简易的客户端和服务端,支持消息的编码解码。对于rpc来说,双方在确定传输协议后(tcp),需要确定报文的编码格式(项目支持gob和json)。编码格式的确认:以客户端举例,采用gob进行编码,而服务端并不知道客户端的编码方式,因此可以在请求报文前添加一个固定的json编码,编码内容:1. 标记请求是否为rpc请求。2. 报文的编码方式。...

2021-12-22 17:59:28 1262

原创 分布式锁的三种实现方式

参考:https://www.cnblogs.com/liuqingzheng/p/11080501.html产生原因为了保证一个方法或属性在高并发情况下的同一时间只能被同一个线程执行,在传统单体应用单机部署的情况下,可以使用并发处理相关的功能进行互斥控制。但是,随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的应用并不能提供分布式锁的能力。为了解决这个问题就需要一种跨机器的互斥机制来控制

2021-12-18 18:40:33 169

原创 c++指针和引用,STL实现

引用本身是不占空间一般情况下,siziof一个引用,会返回引用对象大小但是当编译器无法确定引用对象所占空间大小时,会用一个指针替代,返回一个指针大小+引用对象大小

2021-12-09 20:29:24 331

原创 C++内联函数与一般函数的区别,inline内联函数相比于define优点

https://blog.csdn.net/qq_33757398/article/details/81390151

2021-12-09 15:07:49 116

原创 Mysql表锁,行锁

概念乐观锁:顾名思义,对加锁持有一种乐观的态度,即先进行业务操作,不到最后一步不进行加锁,"乐观"的认为加锁一定会成功的,在最后一步更新数据的时候再进行加锁。悲观锁:悲观锁对数据加锁持有一种悲观的态度。因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。使用场景乐观锁:比较适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的

2021-11-23 19:55:29 168

原创 常用设计模式的作用

单例模式保证一个类只生成唯一的实例对象,因为对象是唯一的,所以构造方法为私有,不可以通过new来创建。因此要提供一个静态的公开的方法,让外部类获取对象。实现方式简单工厂模式(不是设计模式)通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。优点:工厂类包含必要的判断,可以根据外界给的信息,决定究竟该创建哪个具体的类的对象,用户使用时可以直接根据工厂类去创建所需要的实例,无需了解这些对象是如何创建的。缺点:由于工厂类中集中了所有实例的创建逻辑,“高内聚”方面做得不好;当系统

2021-11-13 17:46:16 261

原创 FTP和SMTP

FTPFTP会建立两个连接,控制连接和数据连接。控制连接在主机间交换命令和消息,数据连接则用于文件的传输。对FTP传输而言,控制连接贯穿了整个用户会话期间,但是针对会话中的每一次文件传输都需要建立一个新的数据连接SMTPSMTP即简单邮件传输协议,用于从发送方的邮件服务器发送邮件到接收方的邮件服务器。SMTP用的是持久连接,如果发送邮件服务器有几个邮件发往同一个接收邮件服务器,它可以通过同一个TCP连接发送所有这些邮件。对每个邮件,客户机都用一个新的MAILFROM开始,用一个独立的句点指示该邮

2021-11-12 23:07:03 2582

原创 redis过期键删除策略

redis过期键删除策略

2021-11-11 21:25:15 649

原创 redis数据结构,zest为什么不用红黑树

5种基本数据结构string,list,hash,set,zsetstring表示的是一个可变的字节数组,采用预分配冗余空间的方式来减少内存的频繁分配list表示双向链表,随机定位性能较弱,首尾插入删除性能较优hash第一维是数组,第二维是链表,采用拉链法解决哈希冲突。扩容 当hash内部的元素比较拥挤时(hash碰撞比较频繁),就需要进行扩容。扩容需要申请新的两倍大小的数组,然后将所有的键值对重新分配到新的数组下标对应的链表中(rehash)。如果hash结构很大,比如有上百万个键值对,那

2021-11-11 21:05:53 1552

原创 channel底层实现,无缓存和有缓存区别

Channel,发送一个数据到Channel 和 从Channel接收一个数据 都是 原子性的。而且Go的设计思想就是:不要通过共享内存来通信,而是通过通信来共享内存,前者就是传统的加锁,后者就是Channel。也就是说,设计Channel的主要目的就是在多任务间传递数据的,这当然是安全的原因channel内部维护了一个互斥锁,来保证线程安全type hchan struct { qcount uint // total data in the queue data.

2021-11-04 23:36:17 659

原创 go中make和new的区别,为什么小对象多了会造成gc压力,无缓冲 Chan 的发送和接收是否同步

区别make和new都是内存的分配(堆上),但是make只用于slice、map以及channel的初始化(非零值),会返回一个相应类型的值;而new用于类型的内存分配,并且内存置为零,会返回一个相应类型的指针 。make返回的是引用类型本身;而new返回的是指向类型的指针。make是引用类型的初始化方法...

2021-11-04 23:26:35 630

原创 vector详解,迭代器的几种失效的情况

vector用memset清零memset:作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作后果:会破坏vector的内部的结构,造成vector中的数据错误,可能会导致内存泄露。vector的clear的作用size设置成0,capacity不变扩容概述vector 为空的时候没有预分配空间,每次添加一个元素时,会判断当前是否还有剩余可用空间,如果没有则进行试探性扩容,并且把内存拷贝到新申请的内存空间上,并且释放原先的内存;扩增倍数vs为

2021-11-03 23:13:03 3129

原创 进程间通信效率比较

匿名管道没有名字标识,匿名管道是特殊文件只存在于内存,没有存在于文件系统中,shell 命令中的「|」竖线就是匿名管道,通信的数据是无格式的流并且大小受限,通信的方式是单向的,数据只能在一个方向上流动,如果要双向通信,需要创建两个管道,再来匿名管道是只能用于存在父子关系的进程间通信,匿名管道的生命周期随着进程创建而建立,随着进程终止而消失命名管道突破了匿名管道只能在亲缘关系进程间的通信限制,因为使用命名管道的前提,需要在文件系统创建一个类型为 p 的设备文件,那么毫无关系的进程就可以通过这个设备

2021-11-03 21:57:19 913

原创 Redis缓存穿透,缓存雪崩,缓存击穿

缓存穿透缓存穿透是指查询一个不存在的数据,由于缓存是不命中时被动写的,如果从DB查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到DB去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了。缓存空值,不会查数据库。采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,查询不存在的数据会被这个bitmap拦截掉,从而避免了对DB的查询压力。布隆过滤器的原理:当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。查询时,将元素通过散列

2021-11-02 23:32:28 84

原创 如何保证缓存与数据库双写时的数据一致性

1、先删除缓存再更新数据库进行更新操作时,先删除缓存,然后更新数据库,后续的请求再次读取时,会从数据库读取后再将新数据更新到缓存。存在的问题:删除缓存数据之后,更新数据库完成之前,这个时间段内如果有新的读请求过来,就会从数据库读取旧数据重新写到缓存中,再次造成不一致,并且后续读的都是旧数据。2、先更新数据库再删除缓存进行更新操作时,先更新MySQL,成功之后,删除缓存,后续读取请求时再将新数据回写缓存。存在的问题:更新MySQL和删除缓存这段时间内,请求读取的还是缓存的旧数据,不过等数据库更新完成

2021-11-02 22:27:06 165

原创 Redis 持久化机制,AOF重写阻塞原因,RDB阻塞

定义持久化就是把内存的数据写到磁盘中,防止服务宕机导致内存数据丢失RDB的方式会根据指定的规则定时将内存中的数据存储在硬盘上RDB是 Redis 默认的持久化方案。RDB持久化时会将内存中的数据写入到磁盘中,在指定目录下生成一个dump.rdb文件。Redis 重启会加载dump.rdb文件恢复数据,将数据从硬盘载入内存。通过 RDB 方式的持久化,一旦Redis异常退出,就会丢失最近一次持久化以后更改的数据。优点:Redis 加载 RDB 恢复数据远远快于 AOF 的方式。使用单独

2021-11-02 22:11:57 373

原创 Mysql主从复制

原理主数据库进行增删改操作后,相应的操作语句会记录到binlog日志文件中。从数据库会请求主数据库的binlog日志文件,获取到新的操作语句,然后在自己的从数据库上自动执行相同的操作语句,进而实现主从的同步。过程Master开启bin-log功能,binlog日志文件用于记录数据库的增删操作。需要开启三个线程,Master:I/O线程;Slave:I/O线程,SQL线程。Slave start;通过I/O线程连接Master,并且请求某个bin-log,position之后的内容。Mas

2021-11-01 23:36:10 40

原创 Cookie 和 Session 原理

CookieCookie是由服务器发给客户端的特殊信息,信息以文本文件的方式存放在客户端,客户端每次向服务器发送请求都要携带cookie。cookie存放于HTTP请求头,通过分析存放于请求头的Cookie得到客户端特有的信息,从而动态生成与该客户端相对应的内容。SessionSession是服务器端使用的一种记录客户端状态的机制,存放在服务器内存,数据库,文件中。服务器会向客户端发送一个Session id,客户端每次请求都要携带Session id,用以区分用户数据。禁用Cookie采用

2021-11-01 20:44:43 94

原创 请求分页管理,内中断,外中断(王道考研_操作系统)

定义在执行过程中,当所访问的信息不在内存时,由操作系统将所需信息从外存调入内存,然后继续执行程序若内存空间不够,由操作系统将内存在暂时用不到的信息换出到外存页表缺页中断在请求分页系统中,每当要访问的页不再内存中,便产生一个缺页中断,然后由操作系统的缺页中断处理程序处理中断。此时,缺页的进程阻塞,放入阻塞队列,调页完成后再将其唤醒,放回就绪队列。如果内存中有空闲块,则为进程分配一个空闲块,将所缺页面装入该块,并修改页表当中相应页表项如果内存中没有空闲块,则由页面置换算法选择一个页面淘汰

2021-10-30 15:47:50 754

原创 web server和线程池,线程池线程数量

锁#ifndef LOCKER_H#define LOCKER_H#include <exception>#include <pthread.h>#include <semaphore.h>// 线程同步机制封装类// 互斥锁类class locker {public: locker() { if(pthread_mutex_init(&m_mutex, NULL) != 0) { throw

2021-10-29 10:20:36 300

原创 红黑树特性, 红黑树和AVL树区别

(1)每个节点或者是黑色,或者是红色。(2)根节点是黑色。(3)每个叶子节点(NIL)是黑色。 【注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!】(4)如果一个节点是红色的,则它的子节点必须是黑色的。(5)从一个节点到该节点的叶子节点的所有路径上包含相同数目的黑节点。【确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树】...

2021-10-29 08:47:11 55

原创 段页式存储及分段分页优缺点分析,对比(王道考研_操作系统)

分段分页优缺点分析段页式管理将进程按照逻辑模块分段,再将各段分页,再将内存空间分为大小相同的页框。最后将各个页装入各个内存块中。

2021-10-28 23:49:23 3301

空空如也

空空如也

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

TA关注的人

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