- 博客(164)
- 收藏
- 关注
原创 CPU使用率过高问题排查
当CPU使用率过高时,通用的问题定位思路是先确定CPU资源占用率高的线程号,之后根据线程信息具体情况具体分析。本文先给出定位线程信息的方法,之后列举一些常见原因
2025-02-06 15:18:25
725
原创 Java多线程总结(三):[Lock]ReentrantLock
对于ReentrantLock来说,它本身是Lock接口的一个实现,AQS只是它使用的工具,所以,我们的思路是从Lock的角度切入,搞清楚它是如何利用AQS实现这套锁机制的。
2025-02-06 09:23:54
455
原创 Java多线程总结(三):[AQS]3. 条件队列相关代码解析
又已知Java的锁机制是参考MESA,所以我们推测J.U.C.中相关逻辑框架应与上面描述的基本一致。
2025-02-06 09:17:46
373
原创 Java多线程总结(三):[AQS]2. 资源释放的代码解析
基本上所有的操作都在其中了,所以在资源释放的时候只需要唤醒后续节点就可以,甚至,共享资源的释放过程在当初获取资源的时候都可能执行过一次了。
2025-02-06 09:16:20
211
原创 Java多线程总结(三):[AQS]0. 方法一览与CLH队列
CLH队列最显著的特点是当前节点是在前置节点的lock字段上自旋,因此CLH队列的离队操作非常简洁。同时我们注意到,因为它要基于前置节点自旋,所有它获取到的前置节点永远都是非空的,这点在代码中表现为tail节点有默认值,且从不置空,类似的,在AQS中的head节点除了初始化前之外也都是非空的。CLH的入队操作和离队操作都比较简单,入队只需要通过CAS将tail指向当前节点,之后再前置节点的lock字段上自选,离队只需要将当前节点的lock状态置为false即可。一般为模板方法,包含扩展点和执行逻辑。
2025-02-05 21:24:09
593
原创 Java多线程总结(三):[AQS]1. 资源获取的代码解析
从这个角度讲,不管是排他锁还是共享锁,唤醒后续节点都是不会产生错误的,只是会影响性能。已知AQS队列是一个双链,入队操作本身的逻辑只是“在保证head初始化的前提下,通过CAS将新节点变成新的tail,同时维护双链表结构”,这部分代码是各种类型的acquire的公用的代码,其逻辑也比较简单,见下。tryAcquireNanos与tryAcquireSharedNanos是两个有超时时间的获取锁的方法,作为api层依然没什么逻辑,但我们注意到,带有超时时间的获取锁的方法,他们对中断的处理可能都是抛出异常。
2025-02-05 21:01:07
456
原创 【Raymond-OS】Chapter 4. Paging Memory Management
通过之前 gdt 表的构建,现在我们对表构建应该不再陌生,虽然表项结构不同,但套路基本是一样的。
2025-02-05 20:55:08
683
原创 【Raymond-OS】Chapter 3. Protected Mode
出于向前兼容,系统启动后会运行在 16 位的实模式下,需要手动开始 32 位进入保护模式,此过程包含固定步骤,但 gdt 表的构建相对繁琐。
2025-02-05 20:50:43
813
原创 【Raymond-OS】Chapter 2. Loader的加载
MBR 贫瘠的 512B 空间放不下操作系统,只能化身跳板引出 Loader,将 Loader 从磁盘中读入内存后,MBR 使用 jmp 即可完成交接。
2025-02-05 12:03:06
700
原创 【Raymond-OS】Chapter 1. MBR的加载
nasm:汇编代码有不同的风格,nasm是其中一种,我们采用的是这种,所以需要nasm编译器将我们的源代码编译成机器码dd:帮助我们进行数据复制。我们的学习过程是使用虚拟机+磁盘映像,MBR扇区有位置要求,所以我们需要借助dd工具将我们的代码放到指定位置。win环境下可以找dd的win版本bochs:一款虚拟机,是我们主要的运行环境。注意不同版本的有区别。笔者win下用的是2.6.2,mac下用的是2.8,二者使用上有差别。
2025-02-05 12:02:18
581
原创 【主线】实现MyBatis : Chapter5 : 功能完善,支持批量查询与增删改
在我们之前的逻辑中,直接使用了 Map 来存储实参映射,如果入参是 DO 对象的话,通过反射也是可以实现类似的功能,此处需要一层抽象来屏蔽 Map 和 DO 对象根据形参获取实参的逻辑差异;如果做进一步优化的话,这里可以维护部分额外的信息,以空间换取实现,对于同一类型的参数可省略多余的反射过程,但此处我们不会再做进一步的处理。本章支持了很多新功能,比如批量查询、example 查询、数据插入后的主键回填等,但改动点不多,只实际到参数解析器相关,即上图红色部分。本章的重头戏是插入,我们写一个简单的测试。
2025-01-31 14:50:34
379
原创 Java多线程总结(二):volatile与Synchronized
volatile保证的是可见性和有序性对于volatile的读操作,注意到:可以理解为volatile变量在读之后会加上loadload屏障和loadstore屏障关于里面的fence:什么是IRIW和MCA(multi-copy atomicity)对于volatile字段的写操作,注意到两点:可以理解为volatile变量在写之前加入了loadstore和storestore,在写之后加入了storeload 总结一下:代码在hotspot/src/share/vm/interpreter
2025-01-31 14:48:05
733
原创 Java多线程总结(一):一些理论基础
缓存一致性的问题通常需要硬件支持,会有硬件性能损耗,并且随着CPU数量的增加而增加,比如一个96核的服务器,每个CPU运行一个线程,每个线程访问同一个变量V,当其中一个线程对V做出修改时,会把消息广播到其余的CPU上,这会造成极大的硬件性能损耗,所以SMP技术很难组件大规模的CPU系统。,它相当于一个暂存数据,有了它之后,CPU发出对应的指令后,不再同步等待响应,而是先把数据写入StoreBuffer,之后继续执行后面的指令,之后择机将StoreBuffer的数据刷回缓存行。
2025-01-29 20:42:39
1580
原创 【主线】实现MyBatis : Chapter4 : 完善参数绑定,引入结果映射
而至于使用信息进行结果映射的部分,我们这里直接采用的最简单的方式,直接使用反射构造对象并给字段赋值(在 MyBatis 中则是创建了功能更为强大的工具类,封装的层次也更深)。,其构造实际是在 mapper 文件解析时,逻辑是节点取值,稍微繁琐但并不复杂,不再赘述。参数绑定部分,我们直接以 Class 为 key 构建一个映射,value 是。首先是我们多参数的自动绑定验证,结果不出意外。接下来是新构建类的测试,我们新建了。结果映射部分,一是信息存储的。结构,二是信息使用的。当然,结果也符合预期!
2025-01-29 20:35:52
716
原创 【主线】实现MyBatis:Chapter2: 从DB读取真实的假数据
在上一章中,我们已将在代理类中成功拦截了方法执行,并返回了一条假的数据,而我们本章要做的,其实就是将这个执行过程替换为从 db 读一条固定数据返回,并且读取 db 所需要的信息我们需要从配置文件中读入。方法中,我们通过获取到的节点信息,以反射方式拿到数据源工厂实例,传递对应的配置信息后,将工厂创建的数据源对象存储在全局配置中,这样执行器在执行时即可获取到可用的连接对象。此外,我们之前是在代理类中进行假数据的创建,但从单一职责的角度看,代理类只负责代理方法,真正后续与 DB 的交互操作我们引入。
2025-01-26 09:50:55
490
原创 【主线】实现MyBatis:介绍
MyBatis 是一个流行的 ORM 框架,广泛应用于 Java 项目中对数据库的访问,从使用者角度看,它最直观的特点就是实现了接口到 SQL 的绑定,让我们能够以访问 Java 接口的方式操作数据库,此外,它还具有配置方式灵活、动态 SQL 功能丰富、数据缓存以及插件等各种功能。“造轮子”不是好的工作方式,但却是一个极好的学习方法,所有,这次我们就以造轮子的方式来进行对 MyBatis 的学习,目标是在保持架构基本一致的前提下实现其核心的增删改查及插件功能。
2025-01-25 21:52:55
124
原创 JDK之ThreadPoolExecutor(一)
文章目录1. 概述2. 工作模式2. 线程池状态+工作线程数=ctl?3. worker是怎么自己从任务队列里面获取任务的?4. 拒绝策略是怎么执行的?5. worker是如何被辞退的?1. 概述本文首先对Java线程池的整个工作流程做一个概述,之后再对其中一些值得思考的地方做一些源码解读2. 工作模式Java的线程池是一个worker thread模式,这个模式非常简单,大概就是这么...
2020-02-18 14:35:31
187
原创 JDK之CyclicBarrier
这千里的烟雾波浪嘞文章目录1. 内部类2. 成员变量3. 构造方法4. await方法4. reset方法6. 其它方法1. 内部类private static class Generation { boolean broken = false; }generation就相当于一组线程2. 成员变量// 回调函数private final Runna...
2020-02-12 18:28:46
303
原创 JDK之CountDownLatch
离家乡还是很远文章目录1. 内部类2. 成员变量3. 构造器4. await方法5. countDown方法6. 其余方法1. 内部类private static final class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 498226...
2020-02-12 16:00:44
282
原创 JDK之ReentrantLock
怎么拥抱她终究要飞翔文章目录1. 继承关系2. 内部类2.1 Sync2.2 NonfairSync2.3 FairSync3. 构造方法4. 加锁方法5. 释放锁方法6. 其它方法7. 特殊用途的方法1. 继承关系Serializable接口不必多说Lock接口六个方法:public interface Lock { void lock(); void loc...
2020-02-09 22:19:27
196
原创 RFC791-IP-3.1Internet Header Format
下面是网络包首部的一个内容摘要:version:4位版本(version)字段指明了数据包首部的格式,此文档描述的是版本4IHL:4位首部长度(Internet Header Length)字段表达网络包首部的长度,以32位(4字节)为单位,所以,也就是指向数据的开始位置。注意,有效的最小值是5type of service(TOS):8位服务类型字段指示了此次服务需要的抽象参数,在...
2020-01-24 13:25:47
319
原创 RFC791-IP-2.OVERVIEW
2. OVERVIEW2.1 Relation to other protocols下图说明了IP协议在协议层级中的位置IP协议一方面向上与host-to-host协议进行通信另一方面向下与本地网络协议进行通信。这里的本地网络可能是指一栋建筑中的小型网络,也可能是一个向ARPENET之类的大型网络。2.2 Model of Operation下述方案展示了数据包从一个应用传输到另一个应...
2020-01-23 16:40:20
1151
原创 RFC791-IP-1.INTRODUCTION
文章目录1. INTRODUCTION1.1 Motivation1.2 Scope1.3 Interfaces1.4 Operation1. INTRODUCTION1.1 MotivationIP协议是为包交换的计算机网络通信互联系统而设计。这样的系统被称为“catenet”。IP协议支持将被称为datagrams的数据块从源主机传输到目的主机,源主机和目的主机都用固定长度的地址来标识。...
2020-01-23 16:37:54
311
原创 java.util.concurrent.Future
package java.util.concurrent;/** * 代表一个异步计算的结果。包含的方法主要用来检查计算是否完成、等待计算完成以及获取计算结果 * 计算完成时候的结果只能通过get方法获取,该方法在必要的时候会阻塞,直到它准备好了 * cancel方法可以用来取消操作 * 一些附加的方法可以用来检查任务是否被正常执行完毕或取消 * 一旦一个计算已经结束,那这个计算就不能...
2020-01-17 15:13:12
598
原创 java.util.concurrent.ExecutorService
```javapackage java.util.concurrent;import java.util.List;import java.util.Collection;/** * 这个一个Executor,提供了一些方法来管理任务终止以及创建一个<Future>对象去追踪一个或多个异步任务的执行过程 * * 一个ExecutorService对象可以被shut d...
2020-01-17 14:43:00
494
原创 java.util.concurrent.Executor
package java.util.concurrent;/** * 该对象用来执行所提交的任务。这个接口提供了一种将任务提交与任务的具体运行机制(包括线程的使用细节、调度等)分离开来的途径 * 一个Executor对象通用来替代明确的线程创建,比如说,不用对一批任务中的每个任务调用new Thread(new(RunnableTask())).start() * 你可以这样做: *...
2020-01-17 10:46:26
383
原创 Http1.1--Request
文章目录1. Request2. Request-Line2.1 Method2.1.1 OPTIONS2.1.2 GET2.1.3 HEAD2.1.4 POST2.1.5 PUT2.1.6 DELETE2.1.7 TRACE2.1.8 CONNECT2.2 URI3. request-header1. Request用|隔开的元素代表选择用()括起来的元素会被当作同一个元素*语法的完...
2020-01-14 23:22:45
527
原创 LC53. 最大子序和
1. 暴力public class Solution1 { /** * 暴力解法,O(n^3) * @param nums * @return */ public static int maxSubArray(int[] nums) { if (nums == null || nums.length == 0) return...
2020-01-14 10:43:23
199
原创 LC52. N皇后Ⅱ
/** * @Classname Solution1 * @Description * @Date 2020/1/14 10:28 * @Author SonnSei */public class Solution1 { boolean[] rowArray; boolean[] colArray; boolean[][] board; int n; ...
2020-01-14 10:36:01
169
原创 LC51. N皇后
/** * @Classname Solution1 * @Description * @Date 2020/1/14 9:59 * @Author SonnSei */public class Solution1 { boolean[] rowArray; boolean[] colArray; boolean[][] board; int n; ...
2020-01-14 10:26:01
153
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人