自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(93)
  • 资源 (12)
  • 收藏
  • 关注

原创 多线程——6自定义线程池

自定义线程池线程池主要关注点首先需要线程池里面的线程不能停止还需要一个任务队列(任务队列可以让空闲线程处于wait状态)线程初始化大小每个线程run起来之后都必须去看任务里面有没有任务没有任务就wait, 有任务就在同步代码块中取出任务,然后在同步代码块外执行任务具体实现public class SimpleThreadPool { private final int s...

2020-02-21 10:09:47 3327

原创 多线程——2如何正确的中断线程

多线程探险——2常用方法一、内容安排什么是守护线程(Daemon Thread)Join方法的含义自己join自己会是什么效果Interrupt方法综合案列:如何去停止线程二、文章内容1. 什么是守护线程(Daemon Thread)守护线程:从字面意思我们可以感觉到好像是要守护某个事物一样, 实际上简单理解守护线程就是另外一个线程的兄弟(真的做到了不...

2019-11-02 10:29:12 3594

原创 自制操作系统-kernel加载

kernel加载1. 为什么需要ELF文件格式在操作系统的层面,任何一个程序在运行时就类似于将cs和ip指向了当前程序的入口地址, 但是此入口地址不一定在程序的起始处,因为起始处可能存在函数及其他变量声明; 那么现在的问题就是操作系统怎么去确定程序的起始地址在哪里。固定在程序开始部分设置元数据信息指定程序起始地址总结:ELF定义了程序元信息的格式程序中重要组成部分程序段、程序节、程序头表(program header table)、程序节头表(section header tabl

2021-06-09 19:05:48 421 2

原创 自制操作系统-分页模式

分页模式1. 为什么需要分页分页模式可以更大限度的利用内存空间,每个进程有自己连续的虚拟地址但是对应的物理地址可以不连续, 这样分页就相当于做了一个虚拟地址和物理地址的映射不使用分页的情况会导致当内存空间不连续时程序无法利用, 如当前系统还有两块儿离散的内存,一块儿10M另外一块儿5M, 但是当前有一个程序需要12M的内存,这种情况系统就无法分配内存给程序,只能让程序继续等待2. 分页需要准备什么?本次实现采用了二级页表的方式页目录1024个: 起始地址0x100000页表1024个:

2021-05-30 19:02:47 472 1

原创 自制操作系统-Loader

带你写操作系统-Loader0. 当前代码结构1. Loader程序需要做什么Loader需要打开保护模式准备GDT打开保护模式Loader需要加载Kernel程序2. 什么是保护模式此前操作的内存仅仅在1M以内,我们当前的操作系统一般都是4G或更大内存,所以我们需要操作更多的内存此前的程序可以修改任意处的内容, 这样没有安全限制的操作如果运行用户程序是不安全的总结开启1M以上的内存空间对内存区域进行安全校验3. 如何实现内存安全校验目标: 将内存区域划分

2021-05-29 23:13:25 425 4

原创 自制操作系统-Boot(2)

Boot(2)0. 本节任务显存操作熟悉硬盘读写实现实现MBR程序加载LoaderLoader程序中打印Hello Loader1.电脑启动后OS的加载流程1.1 OS的加载思考我们在HelloWorld程序中知道默认只会加载512Byte的数据到内存中执行,难道我们的OS只有512Byte?显然我们的OS肯定不止512Byte。 那么我们该如何加载大于512Byte的OS代码并执行呢,相信你已经想到了,我们完全可以在512Byte中写一个程序去加载我们的OS然后将执行权交给OS即

2021-05-23 17:39:07 433 3

原创 自制操作系统-BOOT(1)

Boot(1)0. 本节任务显存操作熟悉硬盘读写实现实现MBR程序加载LoaderLoader程序中打印Hello Loader1.电脑启动后OS的加载流程1.1 OS的加载思考我们在HelloWorld程序中知道默认只会加载512Byte的数据到内存中执行,难道我们的OS只有512Byte?显然我们的OS肯定不止512Byte。 那么我们该如何加载大于512Byte的OS代码并执行呢,相信你已经想到了,我们完全可以在512Byte中写一个程序去加载我们的OS然后将执行权交给OS即

2021-05-18 23:00:23 334 7

原创 自制操作系统-HelloWorld

OS HelloWorld1. 电脑上电之后的故事当点击电源按钮之后通常我门的电脑主板BIOS就被启动检查基本的硬件环境, 然后由BIOS将磁盘的0磁道0扇区的512Byte数据加载到内存地址0X7C00处, 最后交出CPU控制权将CS设置为0X0000并且IP设置为0x7c00解释:整个过程BIOS就加载了0磁道0扇区的512Byte数据,也就是如果我们写的OS代码想让BIOS加载就必须把我们的代码放到磁盘的0道0区内存地址是线性的, 如果总共1M内存,那么地址标识范围0X0000 - 0X

2021-05-14 22:07:48 598 14

原创 自制操作系统-环境准备

环境准备1. 环境清单ubuntu-16.04.2-desktop-amd64.isonasm-2.14rc16bochs-2.6.9其他基本工具gcc as ld make dd mount umount cp sync rm objdump objcopy2. ubuntu 环境准备2.1 工具及资料VMware 15ubuntu-16.04.2-desktop-amd64.iso 镜像百度云地址链接:https://pan.baidu.com/s/

2021-05-14 22:04:38 283 1

原创 语法分析实现2--语句解析实现

语法分析实现–语句解析实现1. 目标及代码目标: 在语法分析实现1 中已经实现了表达式得解析, 接下来需要实现得就是具体语句得解析如: a = 1+2*5 赋值语句, if语句,while语句等语句解析实现, 目标依然是将Token流解析为语法树代码地址: git代码仓库注意: 本文章主要目的是记录个人学习历程,如有不对的地方欢迎大家评论指出2. 实现前分析3. 具体实现3.1 声明语句实现创建抽象得Stmtement语句类/** * 语句节点 */pu

2020-11-21 00:30:52 3011

原创 语法分析实现--表达式解析

语法分析实现1. 目标及代码目标: 实现表达式的语法树构建(加减乘除的表达式解析)如: 将 a = 1+2*5等表达式解析为语法树的形式代码地址: git代码仓库注意: 本文章主要目的是记录个人学习历程,如有不对的地方欢迎大家评论指出2. 语法分析阶段做什么?语法分析阶段主要的功能就是把词法分析的结果构建一颗语法树, 此法阶段就相当于找到了一个一个的单词而语法阶段要做的就是按照文法规则将这些单词组织起来此处采用的方法为递归下降法, 文法部分内容太偏数学如果有兴趣可自行搜

2020-11-18 23:33:04 5517 5

原创 自定义编程语言实现分析

自定义编程语言实现分析一、实现自定义编程语言需要做什么程序是如何运行的以Java语言为例,Java语言如果需要运行那么首先源代码需要进行编译,编译成字节码文件(.class)后由JVM执行; 也就是说我们直接写的代码JVM是不可以运行, 所以这里需要对源代码进行翻译翻译的具体过程翻译的过程实际上就是编译原理的内容, 编译原理中我们可以知道实现编译器需要几个大致步骤如下:词法分析:如果将源代码理解为字符串,那么词法分析的作用就是将一串字符串分解为一些列的单词(Token)并标注

2020-11-16 00:15:26 3584

原创 词法分析器实现

词法分析器实现以下内容为本人学习记录,如有错误可直接在评论中提出目的: 将输入的一个一个的字符流转换为符号流, 具体实现效果如下源代码: "int age = 10;"词法分析后:[ {int -> keyword}, {age -> variable}, {= -> operator}, {10 -> integer},]一、具体实现1. 定义符号类型public enum TokenType { KEYWORD

2020-11-16 00:11:45 3038 1

原创 Netty实现HTTP文件服务器

Netty实现HTTP文件服务器1. 实现步骤Netty服务器启动文件服务handler实现添加通道处理器2. 具体实现2.1 Netty服务器启动netty的服务启动基本类似public class MyStaticWebServer { private ServerBootstrap serverBootstrap; private Integer port; public MyStaticWebServer(Integer port) {

2020-08-04 17:47:00 3276 1

原创 Netty 实现HTTP通信

Netty 实现HTTP通信1. 服务端实现public class MyHttpServer { private ServerBootstrap serverBootstrap; private Integer port; public MyHttpServer(Integer port) { this.port = port; serverBootstrap = new ServerBootstrap(); } publ

2020-08-04 17:31:00 3381

原创 Netty实现TCP通信

Netty实现TCP通信Netty实现网络通信时实际上是根据不同的通道类型来实现不同类型的协议处理1. 服务端实现public class NettyDiscardServer { public static void main(String[] args) throws InterruptedException { //启动管理器 ServerBootstrap serverBootstrap = new ServerBootstrap();

2020-08-04 17:24:03 3799

原创 NIO实现群聊

NIO实现群聊1. 实现步骤构建Selector以及服务端监听通道启动监听并处理建立连接请求处理读数据群发数据实现客户端测试实现2. 服务端实现2.0 服务端完整代码package com.hgy.chat;/** * 群聊服务器 */public class ChatServer { private ServerSocketChannel serverSocketChannel; private Selector selector; /**

2020-08-04 17:06:43 2839

原创 NIO实现TCP网络通信

NIO实现TCP网络通信传统socket采用的是阻塞IO模式来实现的Socket通信,这里的阻塞实际上就是程序和内核交互时的模式,在NIO中可以利用NIO的特性实现非阻塞形式的Socket通信1. 实现步骤实现服务端的端口监听实现服务端获取客户端连接并注册到Selector中实现消息解析实现客户端代码并测试2. 服务端实现2.1 实现服务端的端口监听public class MyServer { private ServerSocketChannel serverSock

2020-08-04 16:50:07 3294

原创 Java实现自定义自旋锁

自旋锁1.空轮询实现此处主要利用while空轮询以及原子包的CASpackage com.gy.spinlock;import java.util.concurrent.atomic.AtomicInteger;/** * 利用空轮询实现 */public class SpinLock01 { private AtomicInteger state = new AtomicInteger(0); public void lock() { whil

2020-06-01 21:33:36 5099 1

原创 GC算法【JVM】

JVM-GC算法1.什么对象是垃圾?当一个对象没有任何引用指向他的时候他就是一个垃圾2.GC的作用GC的作用实际上很简单就是回收没有用的对象,实际上对象回收后会存在内存碎片化,这样不连续的空间没办法法分配大对象,所以GC也有整理内存碎片化的作用3.常见GC算法3.1引用计数算法原理:给每一个对相关保存一个被引用次数的标记值, 被引用一次改值就增加1, 这样在GC回收的时候直接就判断当前值是否为0即可优缺点优点:实现简单缺点:无法解决循环引用问题JDK中是否使用?没有

2020-05-26 10:28:41 4723

原创 堆【JVM】

JVM-堆1. 堆的作用堆的作用其实就是保存运行时的数据,主要就是存储创建的对象;但是在不同版本的JDK有些许的变化,在JDK8以后堆中还存储了静态变量和字符串常量池2.堆的内存细分新生代EdenSurvivorfromto老年代3. 参数调整-Xms默认值为电脑的1/64-Xmx默认值为电脑最大内存1/4注意为什么设置的堆大小是600M而使用Runtime对象去获取时发现总的可用大小为575M;这里是因为Survivor区在划分时s

2020-05-26 09:01:54 3006

原创 Java中为什么字符串拼接效率低

JVM-为什么字符串拼接效率低前置内容java虚拟机栈字符串拼接原理1. 源码准备首先编写两个方法一个使用字符串拼接,一个使用StringBuilder进行拼接;public class hello { public void concatStrByDefault() { String basic = "name "; for (int i = 0; i < 100; i++) { basic += i; } System.out.println(b

2020-05-25 17:40:26 4924

原创 Java字符串拼接原理

JVM-字符串底层实现原理前置内容java虚拟机栈1.那些字符串会进入字符串常量池直接写的字面量字面量的拼接结果(注意:如果字符串拼接中有变量则结果不会进入字符串常量池)调用String的intern方法可以将String存入字符串常量池2. 字面量的拼接原理java源码package com.hgy;import java.util.Arrays;import java.util.List;public class hello { public stati

2020-05-25 17:12:15 5396

原创 虚拟机栈【JVM】

JVM-虚拟机栈1. 作用虚拟机栈实际上是程序在运行时来记录方法调用的一个栈, 我们的每一个线程都有一个虚拟机栈,在这个线程里面没调用一个方法就有一个栈帧入栈,当一个方法调用完成这个栈帧就出栈;直到最后一个栈帧出栈整个线程的生命周期也就结束了2. 栈中存储的基本单位栈帧栈帧的基本组成局部变量表(也就是当前方法里面能使用那些变量)操作数栈(他是一个类似于解析表达式的栈,主要用于暂存中间结果)动态链接(保存了运行时常量池的地址,主要可以将符号链接转为直接引用)其他信息3.局部变

2020-05-24 22:24:25 4633

原创 static和static final的区别

JVM-static vs static final如果不清楚JVM类加载过程请先看另一篇文章类加载系统开发时我们经常用到static以及static final来修饰我们的字段变量,那么他们到底有什么区别呢?其实他们的区别可以用使用字节码文件来解析1. 准备测试代码package com.hgy;import java.util.Arrays;import java.util.List;public class hello { private static String name

2020-05-24 19:19:44 4957

原创 方法区【JVM】

JVM-方法区1. 方法区的作用当类加载器加载完成类之后,会将类信息、运行时常量池、静态变量(此处指的是指针,如果是一个对象对象的分配还是在堆中)等存储在方法区;但在JDK不同版本对字符串常量和静态变量的存储有所不同,这部分内容后续列出2. 不同版本的方法区JDK6:在JDK6以前方法区也就是HotSpot虚拟机中的永久代,此时类信息、运行时常量池、静态变量等存储在方法区JDK7:在JDK7中法区也是HotSpot虚拟机中的永久代,此时类信息以及其他信息存储在永久代,但是静态变量以及字符串常

2020-05-24 18:53:24 5190

原创 类加载器【JVM】

JVM-类加载器1. 类加载系统作用:类加载系统的主要作用就是将编译生成的字节码文件加载到内存,当然此处的字节码文件可以存在磁盘或网络等其它地方。主要过程:加载链接初始化1.1 加载过程加载过程主要把磁盘或网络中其他形式的字节码加载到内存中, 并且在内存中生成Class对象1.2链接过程验证主要用于验证当前字节码文件是否满足虚拟机的格式, 比如class文件在文件开头都有CA FE BA BE这几个十六进制数据,如果没有就说明字节码文件有问题准备准备阶段主要

2020-05-24 10:27:49 4550

原创 云服务器上安装dedecms

1.环境搭建,这一步我建议打架直接在装系统时选择包含Apache,mysql,php等环境的系统2.创建web服务器角色点击左下角的服务器管理器3.添加角色4.由于我的是已安装,所以提示安装了,选上web服务器IIS即可5.点击下一步,选上你需要的,然后下一步下一步安装,完成即可6.按如图所示展开并删除箭头所指的默认网站7.右键网站添

2020-04-21 23:22:36 5961

原创 SpringMVC+Spring+Mybatis整合

第一步必不可少,添加相关的jar包下载地址:http://download.csdn.net/detail/sui_feng_piao_guo/9836045第二步:当然就连接数据库,所以我们先配置mybatis以及mybatis和spring的整合1)创建一个源文件sources,然后再改文件下创建一个名为mybatis-config.xml,代码如下

2020-04-21 23:20:24 4469

原创 不需要maven的SSM框架整合

第一步必不可少,添加相关的jar包下载地址:SSM-jar地址(下载需要拷贝地址到浏览器窗口,写了一上午挺累的,愿意的客官赏两个积分,网上也有很多也可以自己照着图上的下载对应的版本)后面所提到的整个的文件目录(部分springmvc)第二步:当然就连接数据库,所以我们先配置mybatis以及mybatis和spring的整合1)创建一个源文...

2020-04-21 23:20:05 12852 31

原创 spring+springmvc+mybatis(下)

spring+Mybatis+springMVC的第二部分

2020-04-21 23:19:13 5517

原创 Docker私服搭建

在开发中我们如果需要交付容器我们有哪些方式?实际上我们可以直接把文件打成压缩包的形式,也可以通过私服进行传递1.压缩文件形式docker commit 容器id 镜像名:tagimage to zipdocker save -o 压缩文件名 镜像:tagzip to imagedocker load -i 压缩文件名注意目录挂载的内容不会被打包2. 创...

2020-04-17 16:20:15 4592

原创 Docker部署Nginx

部署Nginx搜索nginx镜像docker search nginx拉取nginx镜像docker pull nginx创建容器,设置端口映射、目录映射# 在/root目录下创建nginx目录用于存储nginx数据信息mkdir ~/nginxcd ~/nginxmkdir confcd conf# 在~/nginx/conf/下创建nginx.conf文件...

2020-04-16 17:00:28 4296

原创 Docker部署Tomcat

部署Tomcat搜索tomcat镜像docker search tomcat拉取tomcat镜像docker pull tomcat创建容器,设置端口映射、目录映射# 在/root目录下创建tomcat目录用于存储tomcat数据信息mkdir ~/tomcatcd ~/tomcatdocker run -id --name=c_tomcat \-p 8080...

2020-04-16 16:59:25 4250

原创 Docker部署MySQL不能正常连接

1.部署mysqldocker镜像拉取docker pull mysql创建容器mkdir /root/mysqlcd /root/mysqldocker run -id \-p 3307:3306 \--name=c_mysql \-v $PWD/conf:/etc/mysql/conf.d \-v $PWD/logs:/logs \-v $PWD/data:/...

2020-04-16 16:53:07 4571

原创 Redis 位图基本使用

1. 为什么需要位图在我们平时开发过程中,会有一些 bool 型数据需要存取,比如用户一年的签到记录,签了是 1,没签是 0,要记录 365 天。如果使用普通的 key/value,每个用户要记录 365个,当用户上亿的时候,需要的存储空间是惊人的。为了解决这个问题,Redis 提供了位图数据结构,这样每天的签到记录只占据一个位,365 天就是 365 个位,46 个字节 (一个稍长一点...

2020-04-12 12:40:45 4261

原创 Redis延时队列实现

1. zset数据结构利用zset数据结构的分值,可以利用时间戳的方式来实现一个分布式延时队列的实现; 通过zadd向zset中添加数据,然后启动一个线程去执行zrangeByScore方法获取数据即可2. 具体实现public class RedisDelayingQueue<T> { static class TaskItem<T> { ...

2020-04-12 12:16:12 4155

原创 Redis分布式阻塞队列

1. 数据结构ListRedis List的主要操作为lpush/lpop/rpush/rpop四种,分别代表从头部和尾部的push/pop,除此之外List还提供了两种pop操作的阻塞版本blpop/brpop,用于阻塞获取一个对象2. 实现思路利用list数据结构的阻塞操作实现take方法, 当队列元素为空是则线程阻塞此处假设redis队列不会被存满,所以push操作不会阻塞...

2020-04-12 12:06:02 5655

原创 Redis 实现分布式阻塞锁

1. Redis分布式锁实现原理分布式锁本质上要实现的目标就是在 Redis 里面占一个“茅坑”,当别的进程也要来占时,发现已经有人蹲在那里了,就只好放弃或者稍后再试。占坑一般是使用 setnx(set if not exists) 指令,只允许被一个客户端占坑。先来先占, 用完了,再调用 del 指令释放茅坑。死锁问题:如果逻辑执行到中间出现异常了,可能会导致 del 指令没有被调用,这样...

2020-04-12 03:26:05 10587 4

原创 Redis 基本数据结构

1. String底层实现数据结构类似java的ArrayList扩容: 小于1M是每次两倍, 大于1M每次扩容1M最大容量: 512MRedis 的字符串是动态字符串,是可以修改的字符串,内部结构实现上类似于 Java 的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配,如图中所示,内部为当前字符串实际分配的空间 capacity 一般要高于实际字符串长度 len。当字...

2020-04-12 00:00:23 3907

操作系统开发软件包(bochs,nasm)

开发OS用到的软件,包括bochs,nasm

2021-05-11

sqlcipher数据库.zip

简书地址如下:https://www.jianshu.com/p/4f1b66b11344 查看加密数据库工具

2021-02-25

redis-3.2.8

redis-3.2.8的安装包,希望帮到你.........................................................................................................................................................................................................................

2018-06-16

docker手册

docker中文手册,使用与初学则学习docker使用。内容比较详细,但是需要读者具备基本的Linux操作能力。

2018-01-11

hibernate 参考手册

hibernate的学习手册,适用于对hibernate有一定了解的人,一次对hibernate有更加全面的认识。

2018-01-11

SSM整合所需jar

SSM整合所需jar,

2017-11-09

tomcat-7.0容器

tomcat-7.0容器

2017-09-24

tomcat-7.0

..............................................................................................................................................................................................................................................................................................................................

2017-09-22

Spring+SpringMVC+Mybatisjar(完整)

SSM整合使用

2017-05-08

mysql链接jar包

2016-11-26

Java利用反射获取类信息

Java利用反射获取类信息

2016-11-26

APMServ_V5.2.6_

用于搭建虚拟空间

2016-11-10

空空如也

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

TA关注的人

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