![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
八股文
文章平均质量分 78
艳梓
平时学到的东西,怕忘记,所以写到这里可以随时复习很方便。
展开
-
ReentrantLock源码分析
Java中提供的锁:synchronized,lock锁ReentrantLock就是一个互斥锁,可以让多线程执行期间,只有一个线程在执行指定的一段代码。使用方式:我们要分析的是:为什么在多个线程进行竞争的时候lock()可以加锁,只让一个线程进入,为什么在线程执行完业务逻辑的时候释放锁时,别的线程才可以竞争锁资源。......原创 2022-08-08 22:42:23 · 175 阅读 · 0 评论 -
操作系统——内存管理(非连续)
一、分页存储管理的基本概念将内存空间分为一个个大小相等的分区(比如:每个分区4KB),每个分区就是一个页框或页帧或内存块或物理块。每个页框有一个编号,即页框号或内存块号或页帧号或物理块号,从0开始。将用户进程的地址空间也分为与页框大小相等的一个个区域,称为页或页面。每个页面也有一个编号,即页号,页号也是从0开始。注意:页框不能太大,否则可能产生过大的内部碎片操作系统以页框为单位为各个进程分配内存空间。进程的每个页面分别放入一个页框中。也就是说,进程的页面与内存的页框有一一对应的关系。各个页面不必连续存放原创 2022-07-06 20:57:15 · 1236 阅读 · 0 评论 -
操作系统——死锁
死锁的概念死锁定义:多个进程由于竞争资源而造成的阻塞现象,若无外力作用,这些进程将无法继续推进。相似概念:饥饿等待时间过长以至于给进程推进和响应带来明显影响,“饿而不死”死锁产生的原因:死锁产生的必要条件死锁预防死锁避免: 安全性算法系统安全状态银行家算法...原创 2022-07-05 18:55:16 · 141 阅读 · 0 评论 -
Redis分布式锁——秒杀超卖
分布式锁应用场景秒杀环境下:订单服务从库存中心拿到库存数,如果库存总数大于0,则进行库存扣减,并创建订单订单服务负责创建订单库存服务负责扣减库存模拟用户访问库存多线程并发访问,出现超卖问题,线程不安全。没有保证原子性单体锁的分类单体应用锁指的是只能在 一个JVM 进程内有效的锁。我们把这种锁叫做单体应用锁分布式锁核心逻辑分布式锁的核心逻辑就是在多个服务中设置一个公共的资源,在公共资源中设置锁,供多个服务去同时抢夺锁资源,一旦其中一个线程抢夺成功,其他线程就进入自旋状态,不同的尝试访问获原创 2022-07-03 14:54:55 · 1684 阅读 · 0 评论 -
Redis内存回收
Redis内存回收Redis之所以性能强,最主要的原因就是基于内存存储。然而单节点的Redis其内存大小不宜过大,会影响持久化或主从同步性能。我们可以通过修改配置文件设置Redis的最大内存:当内存使用达到上限时,就无法存储更多数据了。在学习Redis缓存的时候,可以通过expire命令给Redis的Key设置TTL(存活时间)可以发现,当key的TTL到期以后,再次访问name返回的是nil,说明这个Key已经不存在了,对应的内存也得到释放,从而起到内存回收的目的。Redis本身是一个典型的k原创 2022-07-02 20:35:15 · 324 阅读 · 0 评论 -
Redis通信协议
RESP协议Redis是一个CS架构的软件,通信一般分为两步(不包括pipeline和PubSub):①客户端向服务端发送一条命令②服务端解析并执行命令,返回响应结果给客户端因此客户端发送命令的格式、服务端响应结果的格式必须有一个规范,这个规范就是通信协议。而在Redis中采用的是RESP(Redis Serialization Protocol)协议:在RESP中,通过首字节的字符来区分不同数据类型,常用的数据类型包括5种:...原创 2022-07-02 18:50:39 · 973 阅读 · 0 评论 -
Redis网络模型
服务器大多都采用Linux系统,这里我们以Linux为例来讲解:任何Linux发行版,其系统内核都是Linux.我们的应用都需要通过Linux内核与硬件交互。为了避免用户应用导致冲突甚至内核崩溃,用户应用与内核是分离的:阻塞IO,顾名思义就是两个阶段都必须等待:可以看到,阻塞IO模型中,用户进程在两个阶段都是阻塞状态。顾名思义,非阻塞IO的recvtrom操作会立即返回结果而不是阻塞用户进程。可以看到,非阻塞IO模型中,用户进程在第一个阶段是非阻塞,第二个阶段是阻塞状态。虽然是非阻塞,但性能原创 2022-07-02 16:56:59 · 1431 阅读 · 0 评论 -
Redis数据结构——五种数据类型
String是Redis中常见的数据存储类型:Redis的List类型可以从首、尾操作列表中的元素:哪一个数据结构能满足上述特征?Redis的List结构类似一个双端链表,可以从首、尾操作列表中的元素:Set是Redis中的单例集合,满足下列特点:可以看出当插入一个非整数值的时候,编码就会由IntSet转换为HT格式底层源码:Zset也就是SortedSet,其中每一个元素都需要指定一个score值和member值:Hash结构与Redis中的Zset非常类似:两者的区别在于是否需要排序,因原创 2022-06-30 22:15:12 · 612 阅读 · 0 评论 -
Redis原理篇——数据结构
一.动态字符串SDS我们都知道Redis中保存的Key是字符串,value往往是字符串或者字符串集合。可见字符串时Redis中最常用的一种数据结构。不过Redis没有直接使用c语言中的字符串,因为c语言字符串存在很多问题:SDS之所以叫做动态字符串,是因为它具备动态扩容的能力,例如一个内容为“hi”的SDS:加入我们要给SDS追加一段字符串“,Amy”,这里首先会申请新内存空间:IntSet是Redis中set集合的一种实现方式,基于整数数组来实现,并且具备长度可变,有序等特征。结构如下:为了原创 2022-06-29 21:40:20 · 303 阅读 · 0 评论 -
JVM——堆
1、堆内存(进程与线程角度)一个进程对应一个JVM实例一个JVM实例对应一个堆空间进程包含多个线程,所以线程之间共享同一个堆空间2、具体认识堆3、堆中内存的分区现代垃圾收集器大部分都基于分代收集理论设计,堆空间细分为:Java 7及之前堆内存逻辑上分为三部分:新生区 + 养老区 + 永久区,其中新生代又被划分为Eden(伊甸园区)+Survivor0(幸存者0区)+Survivor1(幸存者1区)。Java 8及之后堆内存逻辑上分为三部分:新生区 + 养老区 + 元空间:其中,新生区原创 2022-06-17 19:22:29 · 232 阅读 · 0 评论 -
jvm——类加载过程
一个类的完整的生命周期如下Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚拟机是如何加载这些 Class文件呢?系统加载 Class 类型的文件主要三步:加载->链接->初始化。链接过程又可分为三步: 验证->准备->解析。类加载过程的第一步主要完成下面三件事情:虚拟机规范上面这 3 点并不具体,因此是非常灵活的。比如:“通过全类名获取定义此类的二进制字节流” 并没有指明具体从哪里获取、怎样获取。比如:比较常见的就是从ZIP 包中读取(日后出现的 JAR 、 EAR 、 WAR 格原创 2022-06-16 14:54:08 · 251 阅读 · 0 评论 -
JVM——程序计数器
下图为JVM运行时数据区的简图1.PC寄存器介绍①JVM中的程序计数寄存器(Program Counter Register),Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。②它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域原创 2022-06-14 16:38:38 · 127 阅读 · 0 评论 -
八股文——操作系统
八股文——操作系统1、什么是操作系统操作系统(简称 OS)是管理计算机硬件与软件资源的程序,是计算机的基石操作系统本质上是一个运行在计算机上的软件程序 ,用于管理计算机硬件和软件资源。操作系统存在屏蔽了硬件层的复杂性。 操作系统就像是硬件使用的负责人,统 筹着各种相关事项。操作系统的内核(Kernel)是操作系统的核心部分,它负责系统的内存管理,硬 件设备的管理,文件系统的管理以及应用程序的管理。 内核是连接应用程序和硬件 的桥梁,决定着系统的性能和稳定性。2、什么是系统调用首先在介绍系统原创 2022-04-22 19:19:44 · 5222 阅读 · 0 评论