自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 csapp-Program Optimization-review

【代码】csapp-Program Optimization-review。

2023-10-30 20:43:22 211

原创 csapp-Machine-Level Representation of Program-review

通过学习Machine-Level Representation这一章节,我觉得最大的收获就是学会了去阅读汇编代码,能够从汇编级别上去调试代码,掌握汇编层面的一些优化手段(Condition Move、对齐等等),同时也进一步加深了我对指针的理解。最后,我想用自己总结的一句话来收尾:自己从汇编层面、内存存储层面去理解代码原理、分析代码问题要比Google更加有效,cs is easy,if not easy,then try back to the source.

2023-10-21 11:40:29 316

原创 kibana启动失败:server is not ready yet

尝试登录kibana地址:http://192.168.101.65:5601/app/dev_tools#/console。可以发现索引名为.kibana_task_manager …的索引是red(非正常).我这里的做法是直接把这个索引删掉了。发现报错总是在重试某个已经创建好的es中的索引.kibana_task_manager。这篇文章主要是解决黑马项目《学成在线》的p106中的kibana无法正常启动。所以我们可以去es中看一下这里的索引是否正常。首先我们在虚拟机上查看kibana启动日志。

2023-03-29 23:17:16 1367 5

原创 设计模式——原型模式,建造者模式

原型模式是一种创建型模式.原型模式的本质是克隆.当我们需要去克隆一个类时,一般做法是首先我们先new一个相同的对象实例,然后为该对象实例的所有属性赋值成相同的已有对象的属性值.实现这种克隆的前提是我们对已有类具有充分的了解,且这种克隆方式的缺点是当待克隆类比较复杂时,我们克隆的代码量会增大.为此引出了原型模式.原型模式将克隆的任务交给了待克隆对象本身,有待克隆对象实现某个克隆接口,然后重写该接口的克隆方法.所有需要克隆该对象的类只需要实现克隆借口,然后调用待克隆对象的克隆方法即可.

2022-10-04 21:46:16 481

原创 设计模式——工厂模式

在Java中的Calendar类中的Calendar的getInstance方法即使用了简单工厂模式.在调用Calendar的getInstance方法获取实例时需要根据不同的时区来创建对应的日历对象.而创建对应的日历对象则是交给createCalendar(充当简单工厂)方法来创建。抽象工厂模式相当于是将简单工厂模式和工厂方法模式结合.抽象工厂模式对工厂方法模式中的不同工厂子类进行了优化合并:将具有同一特征的子工厂类合并,从而减少子工厂类的数量.,而抽象工厂模式中的每一个子工厂类能够创建。

2022-09-29 09:34:10 976 2

原创 设计模式——单例模式

单例模式指的是一个类只有一个实例化对象.该实例化对象是该类的一个属性,该类对外只提供一个公共的getInstance方法.其他类在获取该类的实例对象时获取到的都是同一个实例对象.单例模式分为饿汉式和懒汉式.饿汉式指的是在类初始化的时候就对该实例对象进行初始化;懒汉式指的是实例对象在被使用的时候才被初始化.二者的区别在于初始化的时机不同。

2022-09-28 21:00:57 390

原创 设计模式——UML类图

一个类是另一个类的一部分,则称两个类之间存在依赖关系.依赖关系是一种很宽泛的关系比如类B为类A的某个属性,类A的某个方法的形参或返回值,类A中的一个变量,则称类A依赖于类B。

2022-09-28 08:14:52 2825

原创 设计模式——七大原则

单一职责原则指的是一个类只能执行一个职责.假设一个类执行了两个职责,当第一个职责发生变动时,肯可能会导致第二个职责执行错误.接口隔离原则指的是当一个类通过接口依赖于另一个类时应该建立在最小的接口的基础上.依赖倒转的规则有5条高级模块不依赖于低级模块.低级模块和高级模块应该都依赖于抽象(接口或抽象类)抽象不应该依赖于细节,细节应该依赖于抽象依赖倒转原则的核心是面向接口编程依赖倒转原则的设计理念是相对于细节的多变性,抽象的东西要稳定的多.使用接口和抽象类来设计规范。

2022-09-27 21:41:56 588

原创 高级数据结构——图

图是由顶点和边组合.一般我们会以V来定义图的顶点集合(Vertex),以E来定义图的边集合(Edge).如图,上述即为一个简单的无向图,其中顶点与顶点之间的边上的数值代表该边的权重.按照是否有方向可以将一个图分为无向图和有向图。

2022-09-18 21:35:19 463

原创 MySQL锁——锁类型,加锁方式

一个事务在持有AUTO-INC锁时,其他事务在对数据进行更新操作时会发生阻塞.InnoDB为了提高效率,引入了一种轻量级锁.在插入数据时,InnoDB会为AUTO-INCREMENT修饰的字段添加轻量级锁,然后赋予一个自增的值,之后无须等待整个插入语句执行完就可以释放该轻量级锁。按照唯一索引的退化原则对范围内的数据一条一条查询,一条一条加锁,当某条记录存在时,退化成记录锁,只锁这一个记录,当记录不存在是,退化成间隙锁,锁住两个记录之间的间隙。在对记录加独占锁之前,需要先在表级别加上一个意向独占锁。

2022-09-18 10:19:26 1534

原创 MySQL事务——事务隔离界别,MVCC

然后事务A修改数据a的值为200,此时a的trx_id变为21,并将旧版本的数据存储到undo log中,事务B再次读取数据a时发现trx_id=min_trx_id,而且a的trx_id在事务B的m_ids中,所以不读取该版本的a,而是依靠roll_pointer读取undo日志中的旧版本的数据a,当校验了旧版本的数据a的trx_id满足要求时,读取该a的值为100.事务B启动[creator_trx_id:22,m_ids:21,22,min_trx_id:21,max_trx_id:23]

2022-09-15 21:31:13 316

原创 高级数据结构——LRU Cache、LFU Cache

LRU:Least Recent Used,即为最近最少使用,LRU是一种Cache替换算法.Cache的容量是有限的,因此当Cache装满时,如果有新的内容需要添加进来,那么就需要对Cache中的内容进行调整,而LRU算法则是将Cache中最近最少使用的内容剔除掉,也就是最久未使用的内容剔除掉.LFU和LRU一样,也是一种Cache替换算法.LFU:Least Frequent Used,即为最少频率使用。

2022-09-13 17:41:10 833

原创 高级数据结构——海量数据(位图,布隆过滤器)

位图(bitmap),适用于存储海量,非负整数,不重复的数据.假设我们用int数组来存放数据,1GB相当于是10亿字节,那么当存储40亿整形数据时,一个整形数据占用4个字节,因此一共需要40*4/10=16G,而16G远远超过了普通电脑的内存.而用位图存储40亿整形数据时,因为1个bit来存储1个数据,因此只需要16/4/8=0.5G此次位图的介绍采用的是byte数组,因此位图中1个元素实际上能够存储的元素个数为8(1byte = 8bit)

2022-09-12 11:24:49 708

原创 高级数据结构——红黑树

在之前介绍AVL树时,我们知道AVL树是高度平衡的二叉搜索树,而高度平衡意味着在对AVL树中的节点作更新操作时,我们需要花费较大的时间去动态调整树的结构.而红黑树相当于是对AVL树的一种改善.红黑树不像AVL树那样保持高度平衡(左右子树的高度差不超过1),而是通过给每个节点添加颜色标志(红/黑)这种限制来保证任意一条路径(从根节点到叶子结点)的长度不会超过其他路径长度的2倍,所以红黑树是一种接近平衡的二叉搜索树.红黑树具有4个性质每个节点的着色方式只有两种:红色或黑色根节点的着色为黑色。

2022-09-11 15:14:56 2442

原创 Java多线程——synchronized,volatile,CAS,ReentrantLock

当没有线程占用锁对象时处于无锁,当有一个线程占用该锁时变成偏向锁,偏向搜不是真的加锁,而是添加一种锁标记,如果之后没有发生锁竞争就无须开销锁资源,如果有锁竞争就添加自旋锁,自旋锁是一种轻量级锁,在锁冲突不激烈的情况下,在抢占不到锁时不会处于阻塞状态而会一致尝试抢占锁,当锁竞争激烈时,自旋锁不能马上获取到锁,就会膨胀为重量级锁,调用OS的mutex将没有抢占到锁的线程加入到阻塞队列中,重量级锁的具体执行过程如上述介绍。.lock前缀指令在多核处理器中会做2件事情:将当前工作内存中的变量的值写回到主内存中;

2022-09-09 14:31:09 409

原创 高级数据结构——AVL树

AVL树又被称为是高度平衡的二叉搜索树,一棵AVL树的任意左右子树的高度差不超过1,且任意一个节点大于该节点的左子节点的值,小于该节点的右子节点的值AVL树可以是专门为了查找数据而生,它适用于海量静态数据的查询的场景,而不适合频繁插入删除数据的场景.

2022-09-08 21:32:30 572

原创 索引常见面试题

索引对于数据库而言就相当于目录对于书.能够提高查找的效率,相当于是利用空间换时间.索引的存在能够让存储引擎更快地获取到目标数据.存储引擎的主要功能就是存储数据,为数据创建索引以及更新,查询数据.MySQL的存储引擎有InnoDB,MyISAM,Memory等,MySQL5.5之后的存储引擎默认为InnoDB.

2022-09-05 22:45:46 742

原创 MySQL——执行一条select语句期间发生了什么

连接建立好以后,输入的SQL语句就可以发送到MySQL服务上MySQL服务接收到SQL语句后会解析SQL语句的第一个字段,如果是select的话,就会从[查询缓存]里查找数据,看是否能直接找到SQL语句对应的结果,[查询缓存]中的记录是 以key-value的形式存储的,key是SQL语句,value是SQL语句对应的结果。Server层负责建立连接,分析和执行SQL.MySQL的大部分功能都在Server层实现.所有的内置函数和跨存储引擎的功能(存储过程,视图,触发器等)也在Server层实现.

2022-09-05 08:00:00 260

原创 IP基础知识和IP相关协议

网络层的作用是实现点到点的通信,也就是主机与主机之间的通信.网络层(IP)和数据链路层(MAC)之间的关系就相当于行程表和具体的车票之间的关系.IP负责远程定位源IP地址和目标IP地址,而MAC负责两个直连设备之间的传输. 在整个传输过程中,源IP和目的IP是不发生改变的,发生改变的是源MAC和目的MAC.A类地址最大主机数等于主机号上的最大主机数-2,之所以-2是因为要去掉全1和全0的主机号.全1用于指定某个网络下所有主机,适用于广播,全0指定某个网络.B类地址C类地址D类地址E类地址。

2022-09-04 22:41:06 1103

原创 TCP的优化

当发送方接收到接收方的ACK报文后会进入FIN_WAIT2状态.如果调用的是shutdown函数,因为可能还可以继续发送或接收数据,所以发送方可以一直处于FIN_WAIT2状态.但如果调用的是close函数,那么则会处于孤儿连接,因此在FIN_WAIT2状态不能持续太长时间,这个时间有tcp_fin_timeout参数决定,通常是60s(超过60s会直接关闭连接.),和TIME_WAIT一致.WR:关闭连接的写.即不能再发送数据.如果发送缓冲区中有数据会立即发送,并发送一个FIN报文.

2022-09-01 22:28:40 932

原创 TCP确保可靠的机制——重传,滑动窗口,拥塞窗口,流量控制,延迟确认

当服务器资源十分紧张时会缩小接收缓冲区的大小.因此当客户端发送数据包给服务器时,服务器由于资源紧张减少接收缓冲区的大小,并且应用层无法读取数据,进一步减少了接收窗口的可用大小.也就是说此刻发送窗口的大小是大于接收窗口的(因为接收窗口因为资源紧张减少了大小),在接收方返回最新窗口之前,假设发送了一个超过此时接收方窗口大小的数据,则会造成服务器丢包,同时客户端中的发送窗口的大小会变成负值.当RTO较短时,重传的报文可能在接收到ACK报文前就被发送,则会造成不必要的重传报文的发送.

2022-09-01 09:30:00 1362

原创 TCP的连接过程——三次握手和四次挥手

假设只有两次握手,此时服务器发送完报文后处于ESTABLISHED状态,也就是说可以发送数据给客户端了,这时因为网络收敛客户端迟迟收不到服务器的ACK报文,然后服务器又发送了数据给客户端,网络恢复,数据报文优先于ACK报文到客户端,尽管客户端可以通过上下文丢弃异常的ACK报文(因为客户端要的ACK报文的ack=71)而发送RST中断连接,但服务器发送的数据已经到达客户端,所以造成了资源的浪费.同时会用客户端发送的SYN包中的序号+1作为确认序号返回给客户端,同时将标志位中的ACK设置为1,之后服务器处于。.

2022-08-31 23:05:50 672

原创 HTTP/2和HTTP/3特性介绍

HTTP/2中是基于四元组[源IP,源端口,目的IP,目的端口]来定位接收方的,在数据传输过程中,四元组是不发生改变的,这意味着当通信一方如果网络发生迁移(如从流量到WIFi),建立的连接就会因为IP地址的改变而断开,本次连接中发送的数据就无法到达接收方,需要重新发送.而重新连接有需要经历TCP与TLS握手的延迟.这个弊端是基于TCP建立在有连接的基础上进行通信的,因此要想优化这个弊端,就需要更换传输层协议,HTTP/3就是如此....

2022-08-31 07:30:00 2576

原创 HTTPS优化——协议优化,证书优化,会话复用

客户端和服务器首次建立连接时生成的对称加密密钥会被缓存到本地,并用一个唯一映射该密钥的Session ID来标识.这样在之后的连接中,客户端只需要发送自己的Session ID给服务器,就可以直接开始通信.为了安全,缓存中的对称加密密钥会定期失效.玩游戏最快战胜对方的方式就是[充钱].软件都是在硬件上跑的,想要提高软件的效率,最直接的方法就是提高硬件的质量. 因为HTTPS是计算密集型,所以主要提升的硬件应该是CPU.客户端在验证服务器的身份证书时,为了验证证书是否被CA吊销,需要去访问CA,下载。...

2022-08-30 21:50:13 1030

原创 HTTPS RSA握手和ECDHE握手解析

假设客户端和服务器各自随机生成一对公钥和私钥,分别标记为A,a,B,b.每一方的公钥A/B = G^a/b % P,其中G是底数,P是模数(通常是一个比较大的质数).当我们知道a/b,G,P时是很容易计算出A/B的,但反过来知道A/B,G,P是很难计算出a/b的.A,B是公开的,所以客户端和服务器交换公钥后,客户端通过B。第三次握手时客户端再验证了服务器的身份后,根据椭圆曲线和基点G生成自己的公钥,并结合服务器的公钥计算出会话密钥(x坐标),并将自身生成的公钥发送给服务器,服务器由此生成会话密钥。...

2022-08-29 22:08:31 1035

原创 HTTP——HTTP特性,缓存技术以及HTTP版本的演变

HTTP/2中的数据包不是顺序发送的,可以乱序发送.同一个连接里连续的数据包可能属于不同的回应.一个请求或响应中的所有数据包称为数据流,为了区分不同的数据包,每一个数据包都会标记一个Stream ID,一个数据流中的数据包的Stream ID是相通的.接收方可以根据Stream ID来组装数据包。为了保证数据的完整性,会用摘要算法(哈希)计算出数据的一个指纹(哈希),服务器会对接收到的数据再次计算出一个指纹并与报文中数据的指纹做对比,如果相同则说明数据是完整的.二者是可以相互加密解密的....

2022-08-29 22:03:11 321

原创 初始Spring MVC

Spring MVC是基于Servlet API构建的一种Web框架.Spring MVC可以分成两部分Spring和MVC,其中Spring说明Spring MVC是Spring的一部分.而什么是MVCMVC是三个单词的首字母的拼接:Model,View,Controller,译为模型,视图和控制器.其中模型主要用于处理数据逻辑,负责在数据库中存储数据,视图即为数据的显示,而控制器则是应用程序与用户交互的部分,负责从视图中获取数据,并向Model发送数据.

2022-08-25 11:04:50 791

原创 SpringBoot日志文件

默认情况下输出的日志都是Spring Boot默认的一些日志.当我们由于实际需求需要自定义日志时,首先需要在程序中得到日志对象,然后使用日志对象输出对应的日志内容获取日志对象使用日志工厂来找到对应类的日志对象Logger类是org.slf4j包下的Logger接口使用日志对象打印日志内容使用日志对象的对应方法来打印日志。

2022-08-24 22:02:54 1420

原创 SpringBoot配置文件

一个项目的所有数据信息都存储在配置文件中,包括但不限于连接数据库的信息:数据库url,用户名,密码等.项目的启动端口(server.port)定位日志和异常日志(方便调试)

2022-08-21 23:24:32 225

原创 初始SpringBoot——SpringBoot的概念和使用

配置好依赖后点击"GENERATE"得到一个demo.zip,解压zip项目并用idea打开项目。定义:SpringBoot是Spring框架的脚手架,目的是为了简化Spring的开发。快速集成框架,Spring Boot 提供了启动添加依赖的功能,用于秒级集成各种框架。内置运行容器,无需配置Tomcat等Web容器,直接运行和部署程序.可以完全抛弃繁琐的XML,使用注解和配置的方式进行开发。支持更多的监控的指标,可以更好的了解项目的运行情况。快速部署项目,无需外部容器即可启动并运行项目。

2022-08-21 21:56:52 187

原创 Bean的作用域和生命周期

Bean的作用域指的是Bean在Spring框架中的某种行为模式.如单例模式代表的是Bean对象在Spring中存储的只有一份,所有人共享这独一份的Spring.

2022-08-18 23:58:47 284

原创 Spring之更便捷的读取和存储对象

通过图可以看到@Configuration是负责配置文件的控制,@Controller是负责验证前端传来的参数,@Service是负责处理前端传来的参数,@Repository是负责存储前端传来的参数,并和数据库进行交互.而@Component则负责一些工具类.方法注解@Bean,顾名思义涵盖的对象是一个具体的方法.但单纯使用@Bean是无法将bean对象存储到Spring中的,需要搭配类注解共同使用。从上述的使用过程中可以看到每一个注解的使用方式都是类似的.但为什么还需要这么多的注解呢?...

2022-08-18 22:34:15 185

原创 Spring的创建和使用

在resources文件夹中创建Spring配置文件:spring-config.xml(固定格式)并在配置文件中将相应的Bean对象存储.在从Spring容器中取出特定的Bean对象后,就可以像创建好一个新的实例对象一样去使用这个对象.在idea中创建Spring项目中是非常简单的一件事情.大致可以分为三个步骤。在文件夹中找到图中的类,如果能够正常启动说明Spring项目创建成功。创建Bean对象的过程实际上就是创建一个Java对象的过程.通过Spring上下文获取指定的Bean对象。......

2022-08-18 16:54:02 144

原创 剑指Offer题解面试题解最终章

题解:尽管二叉树没有二叉搜索树那样特殊的性质.但二叉树也可以依靠递归去得到最近公共祖先.首先遍历根节点的左侧和根节点的右侧.如果遍历过程中发现节点是p或q直接返回,如果左右两侧都不为空,说明root即为最近公共祖先,如果一侧为空,一侧不为空说明两个节点在不为空的一侧.题解:二叉搜索树的性质是根节点的左树上的节点的值小于根节点的值,右树上的节点的值大于根节点的值.根据这个特点我们得知两个节点的最近公共祖先的值一定介于两者之间.利用递归求得结果.所以B[i] = lArr[i]*rArr[i]...

2022-08-17 22:33:02 205

原创 剑指Offer面试题解总结61~70

题链题解:约瑟夫环.对于n个元素,第一个要删除的数是第m%n个,假设n-1个元素最终剩下的元素的编号是x,那么f[n] = (m%n+x) % n,因此可以通过迭代得到最终结果.i

2022-08-17 21:05:18 237

原创 剑指Offer面试题解总结51~60

题链题解:根据题目我们可以设三个数字分别为2x,3y,5z,然后按照从小到大的顺序更新这三个数字,每次选择三个数字中最小的数字,并让对应的变量加1,假设更新的是2x,那么x+1,其他的同理这道题的思想其实可以类比合并两个有序数组,只不过这里是三个部分,和有序数组不相同的是这里要保证三个数组中去除掉相等的数字.第一个只出现一次的字符题链题解:根据题意我们记录一个哈希表HashMap记录每个字母出现的次数.然后从前往后遍历数组,找到第一个出现次数为1的字母.数组中的逆序对题链题解:利用归并排序的

2022-08-15 23:03:37 308

原创 剑指Offer面试题解总结41~50

题解:这道题的潜规则就是时间复杂度达到O(1).因此我们可以维护两个堆,一个最小堆,一个最大堆,最小堆中存放数组中较大的一半元素,最大堆中存放数组中较小的一半元素.当数组中元素为奇数时,我们规定最大堆中元素个数比最小堆中元素多一个(也可以反过来).这样当两个堆中元素个数相同时,说明数组元素为偶数,就取出两个堆的堆顶元素(位于中间的两个元素)取平均数,否则就取出大堆中的堆顶元素.=0&&num[i-1]*10+num[i]在[0,25]内,f[i]+=f[i-2]....

2022-08-11 23:04:34 183

原创 初始Spring——Spring容器,IoC,DI

Spring是一个开源框架,是一个集合了多个工具方法的IoC容器.容器的主要功能有2个:将物品存放到容器中和从容器中取出物品.而Spring则是负责将对象存入到Spring容器中和从Spring容器中取出对象.与每次new对象相比Spring的优势是不用每次使用都创建对象,而是事先将对象创建后存到Spring容器中.使用时只需要从Spring容器中取对象,而对象用完以后也不用销毁而是存放到Spring容器中等待下一次使用....

2022-08-11 09:15:35 167

原创 JVM面试题总结

应用类加载器负责加载当前项目中的类,自定义类加载器负责加载指定路径下的类.加载的等级依次降低.而双亲委派模型则是按照加载等级从高到低加载,当父加载器加载完后仍无法加载到需要的类,才会在本加载器中查找加载.JMM规定了所有变量都存储到主内存中,每条线程拥有自己的工作内存,工作内存中保存了该线程使用的变量的主内存的拷贝,线程对变量的操作在工作内存中完成.不同的线程不能直接访问其他线程工作内存中的变量,而需要主内存去传递对应的变量值.而一旦涉及到在堆上创建新的对象,则新的对象的引用一定是不同的....

2022-08-08 19:09:46 151

原创 剑指Offer面试题解总结31~40

题解:这道题的难点就是如何去处理random节点.对于next节点和节点的值,我们只需要依次创造新节点去连接起来即可,而我们无法直接让新创建的节点的random指向原链表中的某个节点.解决方法就是用哈希表存储原节点和新节点的映射关系,key是原节点,value是新节点.这样我们就可以通过原节点的random节点映射到对应的新节点.题解:全排列问题(回溯).递归交换两两节点的值.同时为了简单处理不重复的存储,我们选取HashSet来存储每个排列.题解:一道非常经典的回溯题.先序递归遍历....

2022-08-07 22:22:35 120

空空如也

空空如也

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

TA关注的人

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