自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++11 智能指针

为了更加容易安全的管理动态内存,新的标准库提出了两种智能指针类型来管理动态对象;两种指针的区别是管理底层指针的方式:shared_ptr允许多个指针指向同一个对象;unique_ptr 独占所指向对象;weak_ptr 是一种弱引用。在<memory>头文件中1、shared_ptr:① 对象需要共享时用shared_ptr,智能指针是个模板类,可以指定类型,传入指针通过构造函数初始化,不能将指针直接赋值给一个智能指针,一个是类,一个是指针,使用make_shared初始化。多个指针指向相

2021-10-13 11:25:16 191

原创 HTTPS如何保证数据传输安全

HTTPS在HTTP基础上加了SSL/TLS协议:SSL代表安全套接字层。它是一种用于加密和验证应用程序和服务器之间发送的数据的协议。身份验证:HTTP的加密机制是一种共享密钥加密和公开密钥加密并用的混合加密机制。SSL/TLS协议作用:认证用户和服务,加密数据,维护数据的完整性的应用层协议加密和解密需要两个不同的密钥,故被称为非对称加密;加密和解密都使用同一个密钥的对称加密:优点在于加密、解密效率通常比较高,公钥是公开的。加密过程:客户端向服务端发起SSL连接请求服务端把公钥发送给客户

2021-10-06 20:59:28 240

原创 Redis学习总结

1、Redis是什么Redis是一个数据库,不过与传统数据库不同的是Redis的数据库是存在内存中,所以读写速度非常快,因此 Redis被广泛应用于缓存方向。Redis也经常用来做分布式锁,Redis提供了多种数据类型来支持不同的业务场景。除此之外,Redis 支持事务持久化、LUA脚本、LRU驱动事件、多种集群方案。2、Redis的数据结构Redis支持五种数据结构:string字符串+hash哈希+list列表+set集合+Zset有序集合2.1 stringString类型是二进制安全的,

2021-10-04 10:04:34 204

原创 虚拟地址和物理地址

1、地址概念物理地址:物理内存就是真实的内存,CPU的地址线可以直接进行寻址的内存空间大小。比如在32位平台下,寻址的范围是2^32也就是4G,并且这是固定的。在实际的应用中,很多的应用程序都比较大,计算机实际所配置的内存空间无法满足。所以出现了虚拟内存技术。经过不断有目的的换入和换出,处理器似乎是拥有了一个大于实际物理内存的内存空间。于是,这个存储空间叫做虚拟内存空间,而把真正的内存叫做实际物理内存,或简称为物理内存。对32位处理器,虚拟内存空间为4G,每个进程都认为自己拥有4G的空间;实际上,

2021-09-28 21:05:29 11259

原创 设计模式之工厂

1、简单工厂模式主要作用是封装对象的创建,把对象的创建和操作过程分离,用于批量管理对象的创建过程,便于程序的维护和扩展。简单工厂是工厂模式最简单的一种实现,对于不同产品的创建定义一个工厂类,将产品的类型作为参数传入到工厂的创建函数,根据类型分支选择不同的产品构造函数。typedef enum ProductTypeTag{ TypeA, TypeB, TypeC}PRODUCTTYPE;class Product //产品抽象基类{ public:

2021-09-25 09:51:54 64

原创 设计模式之单例

1、单例模式保证一个类只有一个实例,提供一个访问它的全局访问点,使得系统中只有唯一的一个对象实例。应用:常用于管理资源,如日志、线程池要点:在类中,要构造一个实例,就必须调用类的构造函数,并且为了保证全局只有一个实例;需防止在外部调用类的构造函数而构造实例,需要将构造函数的访问权限标记为private;同时阻止拷贝创建对象时赋值时拷贝对象,因此也将它们声明并权限标记为private;另外,需要提供一个全局访问点,就需要在类中定义一个static函数,返回在类内部唯一构造的实例。class

2021-09-22 11:49:13 58

原创 序列化和反序列化

1、序列化和反序列化序列化指的是将一个内存对象转化成一串字节数据(存储在一个字节数组中),可用于保存到本地文件或网络传输。反序列化就是将字节数据还原成内存对象,能够轻松地存储和数据传输我们的系统大多是小端系统,而一般在网络传输中却规定使用大端传输;主机字节序=小端字节序(高位字节存储在内存高位地址);网络字节序=大端字节序。发送端总是把发送的数据转化为大端字节序然后发送。接收端根据自身选择是否转化。12 00 00 00 0c 小端=内存中低位字节在前 0c 00 00 00内存/*移位之

2021-09-20 10:33:32 95

原创 TCP四次挥手详解

1、四次挥手状态及消息类型第一次挥手:假设客户端打算关闭连接,发送一个TCP首部FIN被置1的FIN报文给服务端。第二次挥手:服务端收到以后,向客户端发送ACK应答报文。第三次挥手:等待服务端处理完数据后,向客户端发送FIN报文。第四次挥手:客户端接收到FIN报文后回一个ACK应答报文。服务器收到ACK报文后,进入close状态,服务器完成连接关闭。客户端在经过 2MSL一段时间后,自动进入close状态,至此客户端也完成连接的关闭。2、为什么挥手需要四次?关闭连接时,客户端发送FIN报

2021-09-10 11:09:58 6360

原创 互斥锁,自旋锁,读写锁,乐观悲观锁

1、互斥锁和自旋锁基础的两种就是互斥锁和自旋锁,有很多⾼级的锁都是基于它们实现的,加锁的目的就是保证共享资源在任意时间⾥,只有⼀个线程访问,这样就可以避免多线程导致共享数据错乱的问题。当一个线程加锁后,其他线程加锁就会失败,失败的处理方式:互斥:线程释放CPU给其他线程。自旋:线程会忙等待,直到它拿到锁。忙等待锁互斥锁是⼀种独占锁,当线程 A 加锁成功后,此时互斥锁已经被线程 A 独占了,只要线程 A 没有释放⼿中的锁,线程 B 加锁就会失败,于是就会释放 CPU 让给其他线程,既然线

2021-09-06 09:52:35 371

原创 TCP三次握手

1、TCP三次握手状态及消息类型三次握手:服务端先从close到listen。①第一个SYN报文:客户端到服务端。客户端随机初始化序列号client_isn,放进TCP首部序列号段,然后把SYN置1。把SYN报文发送给服务端,表示发起连接,之后客户端处于SYN-SENT状态。②第二个报文SYN+ACK报文:服务端到客户端。服务端收到客户端的SYN报文,把自己的序号server_isn放进TCP首部序列号段,确认应答号填入client_ins + 1,把SYN+ACK置1。把SYN+ACK报文发送

2021-09-03 15:45:31 636

原创 HTTP请求

1、 HTTP请求请求由三部分组成,分别是:请求行、请求头(首部行)、请求正文HTTP请求方法(方法Method是对所请求对象所进行的操作,也就是一些命令)常见的方法具体如下:GET 申请获取资源,不对服务器产生影响POST 客户端向服务器提交数据的方法。会影响服务器,服务器可能动态创建新的资源或更新原有资源。HEAD 类似GET,仅要求服务器返回头部信息PUT 上传某个资源;DELETE 删除某个资源TARCE 用于测试,要求目标服务器返回原始的HTTP请求内容CONNECT 用于代

2021-08-31 15:35:27 82

原创 C++实现LRU算法

1、LRU概念:least recently used,最近最少使用是一种存页面置换算法;缺页异常(缺页中断):当 CPU 访问的页面不在物理内存时,便会产生⼀个缺页中断,请求操作系统将所缺页调入到物理内存。在第4步找空闲页,找不到空闲页的话,就说明此时内存已满了,这时候,就需要页面置换算法选择⼀个物理页。LRU 是通过历史的使用情况来推测要淘汰的页面。额外开销较大:需要寄存器和栈的硬件支持。完全实现 LRU,需要在内存中维护⼀个所有页面的链表,最近最多使用的页面在表头,最近最少使用的页面在表尾

2021-08-26 22:14:16 728

原创 LeetCode买卖股票的最佳时机系列总结

LeetCode买卖股票的最佳时机系列总结此类动态规划从二维动规理解后优化到一维动规,部分题目还可以用到贪心。目录:121 买卖股票的最佳时机1122 买卖股票的最佳时机2123 买卖股票的最佳时机3188 买卖股票的最佳时机4309 买卖股票的最佳时机+冷冻期714 买卖股票的最佳时机+手续费(2的基础上卖出时-手续费)121 买卖股票的最佳时机(买卖一次)给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入

2021-08-26 09:43:18 291

原创 C++: volatile + const + extern + static

1、Volatile①volatile和 const 对应,用来修饰变量,volatile 关键字是一种类型修饰符。②一个定义为volatile的变量说明该变量可能会被意想不到地改变(操作系统、硬件或者其它线程),所以编译器每次操作该变量时一定要从内存中真正取出,而不是使用已经存在寄存器中的值,因此编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。③一般用在并行设备的硬件寄存器(如:状态寄存器)+ 多线程应用中被几个任务共享的变量。2、constconst 基本原理 : 被

2021-08-17 22:28:42 192

原创 C++三大特性

C++ 三大特性(1)继承让某种类型对象获得另一个类型对象的属性和方法。它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。常见的继承有三种方式:实现继承:指使用基类的属性和方法而无需额外编码的能力。接口继承:指仅使用属性和方法的名称、但是子类必须提供实现的能力。例如,将人定义为一个抽象类,拥有姓名、性别、年龄等公共属性,吃饭、睡觉、走路等公共方法,在定义一个具体的人时,就可以继承这个抽象类,既保留了公共属性和方法,也可以在此基础上扩展跳舞、唱歌等特有方

2021-08-15 21:41:16 999

原创 vector底层+扩容

1、底层实现Vector在堆中分配了一段连续的内存空间来存放元素。包括三个迭代器,first 指向的是vector中对象的起始字节位置;last指向当前最后一个元素的末尾字节;end指向整个vector容器所占用内存空间的末尾字节。last - first表示 vector 容器中目前已被使用的内存空间;end - last 表示 vector 容器目前空闲的内存空间;end - first表示 vector 容器的容量。2、扩容过程:如果集合已满,在新增数据的时候,就要分配一块更大的内存,

2021-08-13 09:29:59 1301

原创 半连接队列+全连接队列+SYN攻击

1、半连接队列和全连接队列TCP进入三次握手前,服务端会从CLOSED状态变为LISTEN状态,同时在内部创建了两个队列:半连接队列(SYN队列)和全连接队列(ACCEPT队列)。半连接队列(SYN队列):TCP三次握手时,客户端发送SYN到服务端,服务端收到之后,便回复ACK和SYN,状态由LISTEN变为SYN_RCVD,此时这个连接就被推入了SYN队列,即半连接队列。全连接队列(ACCEPT队列):服务端收到第三次握⼿的 ACK 后,内核会把连接从半连接队列移除,然后创建新的完全的连接,并将

2021-08-08 22:21:44 472 2

原创 IO多路复用select epoll

IO多路复用一个进程维护多个Socket。类似CPU并发。多路复用接口 select/poll/epoll ,内核提供给⽤户态的多路复用系统调用,进程可以通过⼀个系统调用函数从内核中获取多个事件。1、select:把已连接的socket放在一个文件描述符集合,调用 select 函数将⽂件描述符集合拷贝到内核⾥,让内核来检查是否有网络事件产⽣。通过遍历,有事件产生就把此socket标记为可读/可写,然后再整个拷贝会用户态,用户态还需要遍历找到刚刚标记的socket。两次遍历+两次拷贝。2、poll

2021-08-06 22:18:01 117

原创 孤儿进程和僵尸进程

1、孤儿进程当父进程退出而它的子进程还在运行,这些子进程将成为孤儿进程、孤儿进程将被init进程所接收,由init进程完成对它们的状态收集。(任何一个进程都必须有父进程)。2、僵尸进程多进程程序,父进程一般需要跟踪子进程的退出状态,当子进程退出,父进程在运行,子进程必须等到父进程捕获到了子进程的退出状态才真正结束。在子进程结束后,父进程读取状态前,此时子进程为僵尸进程。设置僵尸进程的目的是维护子进程的信息,以便父进程在以后某个时候获取。这些信息至少包括进程ID,进程的终止状态,以及该进程使用的CPU

2021-08-05 22:02:33 104

原创 进程的状态切换

除了创建和结束一般有三个状态:运行状态(Runing):该时刻进程占用CPU;就绪状态(Ready):可运行,由于其他进程处于运行状态而暂时停止运行;阻塞状态(Blocked):该进程正在等待某⼀事件发生(如等待输入/输出操作的完成)而暂时停止运行。就绪态和运行态可以相互转换,其它的都是单向转换。就绪状态的进程通过调度算法从而获得CPU 时间,转为运行状态;而运行状态的进程,在分配给它的 CPU 时间片用完之后就会转为就绪状态,等待下一次调度。阻塞状态是缺少需要的资源

2021-08-04 21:09:14 1099

原创 内存调页算法+CPU调度算法

1、内存调页算法当进程访问虚拟地址时,会查看页表,如果发生对应的数据不再物理内存上会发生缺页异常,产生一个缺页中断去寻找空闲页,找不到空闲页的话,就说明此时内存已满了,就需要页面置换算法选择⼀个物理页。最佳页面置换算法(OPT)计算页面下一次访问时间,然后比较,选择未来最长时间不访问的页面,实际中无法实现,访问页面是动态的,用来衡量其他算法效率。先进先出置换算法(FIFO):选择在内存驻留时间很长的页面进行中置换。最近最久未使用的置换算法(LRU):完全实现 LRU,需要在内存中维护⼀个所有页面的

2021-08-03 22:25:34 642

原创 C++快速排序和归并排序思路+实现

1、快速排序:O(NlogN),不稳定。基本思路:1.1、设置两个变量 left、right。1.2、整个数组找基准正确位置,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面。在数据随机情况下,默认数组的第一个数为基准数据,赋值给key,即key = array[left]。因为默认数组的第一个数为基准,所以从后面开始向前搜索(right),找到第一个小于key的array[right],(循环条件是array[right] >= key;结束时 array[righ

2021-08-02 22:19:55 421

原创 keepalive和keep-alive

keepalive和keep-alive1、Keep-AliveHTTP 的 Keep-Alive 也叫 HTTP 长连接,该功能是由应用程序实现的,可以使得用同一个 TCP 连接来发送和接收多个 HTTP 请求/应答,减少了 HTTP 短连接带来的多次 TCP 连接建立和释放的开销。2、 KeepaliveTCP 的 Keepalive 也叫 TCP 保活机制,该功能是由内核实现的,当客户端和服务端长达一定时间没有进行数据交互时,内核为了确保该连接是否还有效,就会发送探测报文,来检测对方是否还在线

2021-07-31 22:01:27 311

原创 TCP和UDP

TCP传输控制协议(Transmission Control Protocol)UDP用户数据报协议(User Datagram Protocol)抓住TCP的三个特点:面向连接、可靠和字节流。1、TCP面向连接(三次握手,四次挥手);UDP是无连接的,即发送数据之前不需要建立连接。无连接状态,TCP需要维护连接状态,包括接收发送缓存,拥塞控制参数和序号与确认号的参数。2、TCP提供可靠的服务。通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达(超时重传,数据确认等方式);UDP尽力而为交

2021-07-31 21:52:08 87

原创 死锁必要条件和避免

死锁必要条件及避免算法1、死锁概念当两个线程为了保护两个共享资源而使用了两个互斥锁,他们在应用不当的时候,造成互相等待对方解锁,在没有外力作用下会一直等待无法继续运行,发生了死锁。本质原因​ 1、系统资源有限。​ 2、进程推进顺序不合理。死锁在满足下列四个条件才会发生:互斥条件持有并等待条件不可剥夺条件环路等待条件①互斥条件:多个线程不可同时使用同一个资源。②持有并等待条件:A在获取资源1,又想申请资源2,而此时资源2被C持有,A会进入等待状态,但是A在等待的时

2021-07-29 21:26:34 428

原创 同步IO和异步IO+IO模型

在说明同步IO和异步IO之前先说一下IO五大模式。1、五大IO模型①阻塞IO②非阻塞IO③IO多路复用IO④信号驱动IO⑤异步IO。阻塞IO:发起请求一直等到数据返回。A同学用杯子装水,打开水龙头装满水然后离开,水龙头没有水,他也要等到有水并装满杯子才能离开去做别的事情。非阻塞IO:不管有没有数据都返回,没有就隔一段时间再来请求,如此循环。在事件已经发生的情况下操作费阻塞IO,才能提高效率。所以非阻塞IO一般和其他IO一起使用,如IO复用,SIGIO信号。B同学也用杯子装水,打开水龙头后

2021-07-29 15:50:24 224

原创 进程通信和线程通信

进程通信和线程通信:1.进程间通信:①管道管道传输数据是单向的,如果想相互通信,我们需要创建两个管道才行,半双工。1.匿名管道,用完销毁。int pipe(int fd[2])⼀个是管道的读取端描述符 fd[0] ,另⼀个是管道的写⼊端描述符 fd[1] 。注意,这个匿名管道是特殊的文件,只存在于内存,不存于文件系统中。通信的数据是无格式的流并且大小受限。2.命名管道:因为数据是先进先出的传输方式。管道这种通信方式效率低,不适合进程间频繁地交换数据;所谓的管道,就是内核里面的⼀串缓存。从

2021-07-25 22:20:05 2742

原创 进程和线程基础

进程和线程基本概念:进程是对运行时程序的封装,操作系统进行资源调度和分配的基本单位。线程是进程的子任务,是CPU调度和分配的基本单位。同⼀个进程内多个线程之间可以并发运行,同时多个进程之间共享代码段、数据段、打开的文件等资源,但每个线程各⾃都有⼀套独立的寄存器和栈,这样可以确保线程的控制流是相对独立的。区别:进程是资源分配的最小单位,线程是CPU调度的最小单位;进程在执行过程中拥有独立的内存单元,而多个线程共享进程的内存。(资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中

2021-07-25 22:14:26 86

原创 C++虚函数相关知识总结!

1、什么是虚函数,虚函数的工作方式当基类希望派生类定义适合自己的版本,就将这些函数声明为虚函数(virtual)。类中有虚函数,就会创建一个虚函数表。编译器处理虚函数的方法是:为每个类对象添加一个隐藏成员,隐藏成员中保存了一个指向函数地址数组的指针,称为虚表指针(vptr),数组为虚函数表。虚函数依赖虚函数表工作的,表来保存虚函数地址,当我们用基类指针指向派生类时,虚表指针vptr指向派生类的虚函数表。 这个机制可以保证派生类中的虚函数被调用到。2、虚函数表的存放内容2.1 单继承:虚函数表的每

2021-07-13 22:03:13 548

原创 常见字符串函数实现strstr,strcpy,strlen,strcat,strcmp

常见字符串函数实现1、strstrstrstr(str1,str2) 函数用于判断字符串str2是否是str1的子串(hello,ll----->2)KMP算法---->字符串单模匹配的模型 void getNext(int* next, const string& s) { int j = 0; next[0] = 0; for(int i = 1; i < s.size(); i++) {

2021-06-27 21:30:24 219

原创 左值和右值,右值引用

左值(lvalue)和右值(rvalue)的区别一个左值是指向一个指定内存的东西。当一个对象被用作左值的时候,用的是对象在内存中的位置,用作右值的时候,用的是对象的值。下面举几个例子:①赋值运算符需要一个(非常量)左值作为左侧运算对象,结果仍是左值。 int x = 6; 6是一个右值,没有指定的内存地址,x是一个变量。一个变量有着具体的内存位置,所以是一个左值。②取地址符(&)作用一个左值对象,返回一个右值(指针)。int* y = &x; 取地址操作符&获取了x的内存地址

2021-06-24 22:51:39 132

原创 TCP基本知识

TCP基本认识1、TCP头格式序列号:用来解决网络包乱序问题。确认应答号:用来解决不丢包的问题。TCP数据长度 = IP总长度 - IP首部长度 - TCP首部长度。2、什么是TCPTCP 是面向连接的、可靠的、基于字节流的传输层通信协议。它能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。面向连接:一定是「一对一」才能连接;可靠的:TCP 都可以保证一个报文一定能够到达接收端;字节流:消息是「没有边界」的,有序的,当「前一个」消息没有收到的时候,即使它先收到了后面的字节,那么

2021-06-24 22:47:02 481

转载 String 的构造函数、拷贝构造函数、析构函数和赋值函数

编写类String 的构造函数、析构函数和赋值函数,已知类String 的原型为:class String{public:String(const char *str=NULL);//普通构造函数String(const String &str);//拷贝构造函数String & operator =(const String &str);//赋值函数~String();//析构函数private:char* data;//用于保存字符串};#include &

2021-06-17 22:28:00 280

原创 C++常见面试题

1、C++内存分配机制。答:(1)栈(Stack):位于函数内的局部变量(包括函数实参),由编译器负责分配释放,函数结束,栈变量失效。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。其操作方式类似于数据结构中的栈。(2)堆(Heap): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。一般由malloc(或new)函数来分配内存,并且需要用free(delete)函数释放内存。(3)全局区/静态区(Global Static Area):①全局变量和静态变

2021-06-13 17:06:06 122

原创 回溯算法总结

回溯算法回溯+递归,本质是穷举,虽有剪枝操作,总体效率较低。一般分为:①组合类型②分割类型③子集类型④排列类型⑤矩阵类型。可抽象为树结构,在集合中递归查找需要的子集。解题的时候掌握部分模板,for循环横向遍历,递归纵向遍历,去重方法,优化剪枝,最好自己画一棵树方便理解。解题思路:1、组合类型:#77组合 #39,40,216数组总和Ⅰ,Ⅱ,Ⅲ #17电话号码字母组合77,216:返回1–n所有k个数组合,n等于树宽,k等于树深;确定参数,除了n和k,加入start记录从何开始遍历;终止条件,放入ve

2021-06-12 21:40:01 75

空空如也

空空如也

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

TA关注的人

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