- 博客(67)
- 收藏
- 关注
原创 谈谈我三年的代码历程
心路历程茫茫人海,我们是一个个相遇的“存储单元”。看到这篇文章的朋友你们好,很高兴能有人来倾听我诉说大学里学习编程的经历。时光荏苒,岁月如梭。往事已去,但是也去得不久。我尽可能的还原出我刚刚开始学编程时的思维想法和行为指导,给大家讲出我蜕变至今背后的底层逻辑。初入码海我果然不是什么天才少年,刚开始打代码的我总是想着如何在“人”看来简单的去实现“计算机”看来复杂的事情。我希望能写出一些新颖的代码、大家没见过的,以证明我是天才一般的存在。事实是我离那些“神人”太远了,无法突破前辈画好的框架。这是我第一
2022-02-25 13:02:27
385
原创 简述进程管理模块
进程管理进程作为用户操作的实体,它贯穿操作系统的整个生命周期,而程序是由若干段二进制代码组成的。进程可以说是程序的运行态抽象,即运行于处理器中的二进制码叫做进程,保存在存储介质中的二进制码叫做程序。进程会在执行过程中引入运行环境维护信息,因此进程管理啊主要涉及两个部分内容:进程控制结构体和进程间调度策略。进程控制结构体用于记录和手机进程运行时的资源消耗信息,并维护程序运行的现场环境;进程间调度策略主要负责决策一个进程将在何时能获得处理器的执行权。简述进程管理模块进程作为拥有执行资源的最小单位,他为每
2021-11-14 21:41:25
1076
原创 实现系统调用API
实现系统调用API 系统调用API作为应用层与内核层的重要通信手段已被使用到各种应用场合,但应用层与内核层间的通信手段不只系统调用API一种,我们还可采用中断、地址重映射等方式在这两层间建立通信连接,不过最广泛使用的通信方式依然是系统调用API。本次目的在于实现通过SYSENTER汇编指令完成应用层到内核层的跳转。SYSENTER指令是一个快速进入0级特权的指令。在执行之前,处理器必须为其提供0级特权的衔接程序和0级特权全的栈空间,这些数据保存在MSR寄存器和通用寄存器当中。IA32_SYSEN
2021-11-14 21:40:45
591
原创 实际中断处理
中断处理处理外界发出的信号。中断信号可能是关于数据读写操作的,也可能与外部设备控制有关。Intel处理器只有一个外部中断引脚INTR,为了使处理器能够同时接收多个硬件设备发送来的中断请求信号,特将锁有外部设备的中断请求汇总到中断控制器,再经由中断控制器的仲裁后,有选择性地将中断请求信号依次发往处理器的外部中断引脚INTR。再多核处理器出现前,8269A PIC(Programmable Interrupt Controller,可编程中断处理器)是最普遍的中断控制器.目前APIC(Advanced P
2021-11-14 21:39:59
550
原创 跳转到应用层
跳转到应用层到这一步简陋内核初步完成,此时的系统位于0级特权的内核层,而应用程序位于3特权级的应用层,若想从内核到应用层,在特权级跳转的过程中必须提供目标代码段和栈段以及其他跳转信息。X86中的门存在的目的由于操作系统运行在0级特权下,应用程序在3级特权下,出于保护和稳定的目的,操作系统通过"门"机制向用户态程序提供必要服务。共有四种门:中断门,陷阱门,调用门,任务门。其中中断门,陷阱门,任务门都可以由门描述符描述(IDT)如何跳转特权级跳转的过程中必须提供目标代码段和栈段以及其他跳转信息。
2021-11-14 21:39:19
230
原创 初步内存管理
初级内存管理展示如何获取物理内容信息、统计可用物理内存 页数量以及内存分配物理页等相对基础的功能。关于可用物理内存的相关信息,已经在Loader引导加载程序中通过BIOS中断服务程序获得,同时系统采用2MB物理页。获取物理内存信息物理信息通过BIOS中断服务程序INT 15h AX=E820h获得,并保存在物理地址7E00h处。接下来,将会把物理地址7E00h处的信息提取出来,转换成相应结构体再加以统计。地址7E00h出的物理地址空间信息存有若干组,他们描述计算机平台的地址空间划分情况,其数量会依
2021-10-24 21:05:36
100
原创 操作系统如何建立异常处理?
异常的分类错误(fault) 错误是一种能被修复的异常。只要错误被修正,处理器可将程序或任务的运行环境还原至异常发生前,并重新执行产生异常的指令,也就是说异常的返回地址指向产生错误的指令,而不是其后的位置。陷阱(trap) 陷阱异常同样运行处理器集训执行程序或任务,只不过处理器会跳过产生异常的指令,即陷阱异常的返回地址指向诱发陷阱指令之后的地址。终止(abort) 终止异常用于报告非常严重的错误,它往往无法准确提供产生遗产的位置,同时也不允许程序或任务继续执行,典型的终止异常有硬件错误或系统
2021-10-20 20:10:15
241
原创 Loader
Boot将代码的位置放置到0x7c00这个位置后,BIOS上电自检后就会跳转到这个位置执行Boot程序。Boot程序要做的就是在文件系统里一个目录项一个目录项的检索出loader.bin代码,放置到指定位置进行执行。之后的执行权都转交到了Loader上。Loader会检测一下几部分:检测硬件信息。内核运行在非实模式下,然而很多的硬件信息需要在实模式下的BIOS中断服务中获取。处理器模式切换引导加载必经过三个模式:实模式(16位)->保护模式(32位)->长模式(64位)。CP
2021-10-20 20:08:38
344
原创 一文贯穿操作系统内核架构与当代软件架构迭代
前言在日复一日地使用各种中间件和学习原理时,笔者陷入了迷茫,各种中间件层出不穷:到底何时能学完?技术的本质到底是什么?学习到底怎么才能学习到根源?但是,不难发现中间件日趋同质化,他们都朝着一个既定目标:进入内存加快运行速度。但是进入了内存也不意味着快了,还得需要良好的数据结构去保障内存的空间利用和搜索效率。反复思考,日夜琢磨。我终于得到了万物基于OS这个感触,虽然之前一直听说这句话,但直到最近的深入学习才感受到刻骨。至此,特地开启一个新的系列,此系列不仅立志于内核相关内容分析,也专注与内核原理研究
2021-09-17 10:48:55
97
原创 Kubelet部分调优参数以及ceph架构解析
参考官方文档:https://kubernetes.io/docs/reference/config-api/kubelet-config.v1beta1/Ceph架构描述FASTDFS
2021-06-05 17:13:16
104
原创 Redis(六):哨兵机制
上次说到主从库集群模式。在这个模式下,如果从库发生了故障,客户端可以继续向主库或者其他从库发送请求,进行相关的操作,但是如果主库发生了故障,那就没有直接会影响到从库的同步,因为从库没有相应的主库可以进行数据复制操作了。而且,如果客户端发送发的都是读操作请求,那还可以由从库继续提供服务,在这纯读的业务场景下还能被接受。但是,一旦有些操作请求了,按照主从库模式下的读写分离要求,需要由主库来完成写操作。此时,也没用实例可以来服务客户端的写操作请求了,如图无论是写服务中断,还是从库无法进行数据同步,都是不能接受
2021-06-04 09:17:47
199
1
原创 OceanBase官方文档阅读笔记(一)
什么是OceanBase?OceanBase数据库是阿里巴巴和蚂蚁集团不基于任何开源产品,完全自研的原生分布式关系数据库软件,在普通硬件上实现金融级高可用,首创“三地五中心”城市级故障自动无损容灾新标准,具备卓越的水平扩展能力,全球首家通过TPC-C 标准测试的分布式数据库,单集群规模超过 1500 节点。 产品具有云原生、强一致性、高度兼容 Oracle/MySQL 等特性,承担支付宝 100% 核心链路,在国内几十家银行、保险公司等金融客户的核心系统中稳定运行。TTPC(transact
2021-06-03 12:45:05
4511
原创 kubernetes
自动恢复机制:杀死POD后 kubectl delete pod my_pod 仍然会新启动一个POD 或者用docker 杀死容器 也会创建新的容器 watch -n 1 kubectl get deploy POD k8s最小单元 会记住部署kubectl get deploy,pod与kuberctl run 有什么区别:只有一个POD 没有deploy信息 不会自愈自愈后不一定有卷仍然存在,看重新启动的机器(解决:共享卷挂在)POD(容器组) 可以允许多个容器存在 共享IP等
2021-04-25 15:02:59
104
原创 JVM散记
new对象对空间有几部分:(运行时元数据(hash值,GC分代 锁状态标志 数组长度) 类型指针(Header)) 父类数据(实例数据,私有的数据也会存放在这里,但是被封装无法直接访问,取决于继承的定义)栈空间如何知道堆空间在哪(Hash值)虚拟地址 填充数据赋值的时候是赋Hash值属性如何摆放? 先放父类字段,再放其次的,宽度相同的也会放在一起。 可以通过参数设置子类数据在父类数据的空隙放置。访问 句柄访问,。。。。访问定位:java栈本地变量表reference只想堆空间的对象 只需要移动句柄
2021-04-24 15:42:38
106
原创 Redis(三)
为什么单线程的Redis这么快?事实上Redis并不是单线程的,我们通常说的单线程是指Redis的网络IO和键值对的读写是由一个线程来完成的,这也是Redis对外提供键值存储服务的主要流程。但Redis的其他功能,比如说持久化,异步删除,集群数据同步等,其实是由额外的线程执行的。为什么用单线程?日常中我们会听到一个说法“使用多线程,可以增加系统吞吐率,或是可以增加系统扩展性。”对于一个多线程的系统来说,在有合理的资源分配的情况下,可以增加系统中的处理请求操作的资源实体,进而提升系统能够同时处理的请求数
2021-03-30 18:35:20
59
原创 redis(五):主从库如何实现数据一致
AOF和RDB分别可以通过回放日志和重新读入RDB文件的方式恢复数据,从而保证尽量少丢失数据,提升可靠性。即使用了这两种方法,也依然存在服务不可用的问题,比如实例宕机了在恢复期间,是无法服务新来的数据存取请求。那Redis又何来的高可靠性呢?这里有两层含义:数据少量丢失服务尽量少中断AOF和RDB保证了前者,而对于后者,Redis的做法就是增加副本冗余量,将一份数据同时保存在多个实例上。即使又一个实例出现了故障,需要过一段时间才能恢复,其他实例也可以对外提供服务,不会影响业务使用。多实例保
2021-03-30 18:34:39
237
原创 Hadoop集群搭建-Hadoop运行模式
Hadoop运行模式包括:本地模式,伪分布式模式,完全分布式模式。本地模式:数据存储在linux本地。(测试使用)伪分布式:数据存储在HDFS(Hadoop的一个数据存储软件)(公司没钱的时候使用)完全分布式模式:数据存储在HDFS,多台服务器同时工作。(企业里大量使用)完全分布式运行模式环境搭建准备3台虚拟机安装JDK配置环境变量安装Hadoop配置环境变量配置集群单节点启动配置ssh群起并测试集群...
2021-03-22 14:56:19
65
原创 分布式集群下的Session数据共享问题解决思路
hash一致性利用Ip的hash运算,使得nginx将某一ip下的访问都负载均衡到某台特定服务器,这样就不用多台服务器之间同时存储一样的数据。
2021-02-18 00:10:15
146
原创 编程思想--七大原则
单一职责原则降低类的负责度,一个类只负责一项职责。提高类的可读性,可维护性。降低变更引起的风险接口隔离原则客户端不应该依赖它不需要的接口,即一个类对于另一个类的依赖应该建立在最小的接口上。依赖倒转原则高层模块不应该依赖底层模块,二者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。依赖倒转的中心思想是面向接口编程。依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多,以抽象为基础搭建的架构比细节为基础的架构要稳定的多。在JAVA中,抽象指的是接口或者
2021-01-08 13:12:46
614
2
原创 Redis(四)
除了AOF还有什么在宕机后让Redis快速恢复数据?AOF应用的场景应当是:数据量不大。一般而言只要采用的不是always的持久化策略,对性能的影响也就不大。但是,也正因为记录的是操作命令而不是实际的数据,所以,用AOF的方法进行故障恢复的时候,需要逐一把操作日志的方法都执行一遍。如果操作日志非常多,Redis就会恢复的很缓慢,影响到正常使用。当然这不是理想的结果。于是我们需要一种既可以保证可靠性,又能在宕机时实现快速恢复的其他办法?内存快照所谓内存快照,就是指内存中的数据在某一个时刻的状态记录。
2021-01-07 16:48:46
97
原创 Redis(四)
宕机了,Redis如何避免数据丢失?当redis作为缓存或者后端数据库时,有一个绝对不能忽视的问题:“宕机了,如何避免Redis中的数据丢失?”最简单粗暴的方法–一、从后端数据库恢复这些数据,这个方式会存在两个问题:需要频繁访问数据库,会给数据库带来巨大压力;二、将这些数据从慢速数据库中读取出来,性能比不上Redis,导致使用这些数据的应用程序响应变慢。所以对Redis来说,实现数据持久化,避免从后端数据库中进行恢复,是至关重要的。目前,Redis中主要有两大机制:AOF日志和RDB快照。AOF是如
2020-12-25 11:24:26
69
原创 Redis(二)
redis为啥这么快?一方面,他是内存数据库,所有操作都在内存的层面完成。另一方面,这要归功于他的数据结构。redis的键值对是按照一定的数据结构来组织的,操作键值对最终就是对数据结构来进行增删改查的操作,所以高效的数据结构就是reids快速处理数据的基础。redis的底层数据结构一共有六种,分别是简单动态字符串,双向链表,压缩列表,哈希表,跳表和整数数组可以看到,String类型的底层实现只有一种数据结构,也就是简单的动态字符串。而List,Hash,Set和Sorted Set这四种数据类型,都有
2020-12-17 12:35:15
87
原创 Redis(一)
最简单的键值数据库成为SimpleKv(具有组建的键值数据库架构),其中key是String类型,value是基本类型,比如:String(在JAVA中不是基本类型) 整型等。所支持的方法有put,get,delete。其基本内部架构有访问框架,索引模块,操作模块和存储模块。在现实情况下redis在设计通信模块时(属于访问框架)需要考虑到:如果采用单线程就有可能造成堵塞,降低效率;如果采用多线程就要设计共享资源。redis为什么采用哈希表作为索引:常见的索引类型很多,如哈希表,B+树,字典树。一般而言,内
2020-12-16 13:42:45
138
1
原创 工作中学习一:HIBERNATE
hibernate(冬眠)简介Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代
2020-12-15 20:03:51
88
1
原创 Spring Cloud几大痛点
部分组件停止维护和更新,给开发带来不便部分环境搭建复杂,没有完整的可视化界面,需要大量的二次开发和定制配置复杂,难以上手推荐使用SpringCloud Alibaba
2020-11-02 19:32:07
189
原创 BeanFactoryPostProcessor
BeanFactoryPostProcessor是管理beanFactory的组件,开启方法为在组件继承BeanFactoryPostProcessor类并注上@Componet在容器创建的过程中实例化所有的BeanFactoryProcessor并实现他们的方法。
2020-10-16 19:25:24
117
原创 Aop工作底层原理(深入源码)
在注解开发的模式下AOP由注解@EnableAspectJAutoProxy实现而AOP导入的组件是(AspectJAutoProxyRegistrar.class)这个类继承了ImportBeanDefinitionRegistrar(导入bean定义注册器)
2020-10-15 20:33:34
270
原创 BeanPostProcessor生命周期(深入源码)
BeanPostProcessor:Bean的后置处理器,在bean初始化前后进行处理工作。源码内容如下,该类为借口,定义了两个方法。/** * Apply this BeanPostProcessor to the given new bean instance <i>before</i> any bean * initialization callbacks (like InitializingBean's {@code afterPropertiesSet} *
2020-10-15 19:54:31
84
原创 Spring注解驱动开发:容器(深入源码)
AnnotationConfigApplicationContext(注释配置应用程序上下文)在AnnotationConfigApplicationContext中,定义了两个属性分别是reader用于编程带注释的bean类,scanner用于扫描bean候选对象。AnnotationConfigApplicationContext的构造方法大体上可以分为两种:第一种:/*** Create a new AnnotationConfigApplicationContext, scanni
2020-10-13 20:39:15
63
原创 BeanPostProcessor生命周期
AnnotationConfigApplicationContext(Class<?>… anntatedClasses)注册以及刷新容器refresh()finishBeanFactoryInitialization()preInstantiateSingletons()初始化所有剩下的单实例对象(懒汉式除外)getBean(String name)return doGetBean(String name,Class,boolean)判断是否为单实例若为 获取单实例对象若获
2020-10-13 10:15:44
94
原创 spring 全注解开发(深入源码)
Conditional注解进行条件判断Conditional用来在给容器注册时添加控制条件其中可以放入继承与Condition类的数组对象继承对象需要实现的方法为mathces,其中ConditionContext可以用来判断当前信息(bean内容 类加载器,运行环境,注册bean定义,资源加载)。@import这个东西他引入你要注册的类的数组,默认为全类名@ImportSelector返回需要导入的组件的全类名数组@ImportBeanDefinitionRegistrar...
2020-10-11 21:29:37
108
原创 NIO模型全系知识点
NIO有以下几个核心部分组成:ChannelsBuffersSelectorsChannel和Buffers所有IO和NIO都从一个Channel开始。Channel有点流的概念。数据都可以从Channel读到Buffer中,也可以从Buffer写到Channel。Channel主要实现类:FileChannelDatagramChannelSocketChannelServerSocketChannelChannel中的Scatter/Gather分散(scatter)从C
2020-10-09 19:58:47
213
原创 Spring框架入门
IOC和AOPIOC 控制反转。原来由人去操作创建对象调用对象的方法之类的行为,现在统统交给spring矿建进行。实现的方式主要有两种:(1)XML文件配置(2)注解配置XML文件配置中主要使用bean标签及bean标签下的两个属性值指定对象(id=“” class="")。于此同时也可以 使用property标签对于方法中的属性进行注入(要求对应类中必须要有set方法并且是无参构造,property标签中的name和value属性指定了依赖注入的确切属性8)或者使用有参构造器进行属性注入(使用co
2020-09-29 21:04:01
121
原创 事务隔离级别
ioslation:事务隔离级别(1)事务有特性称为隔离性,多事务操作之间不会产生影响。不考虑隔离性会产生很多问题(脏读,不可重复读,虚(幻)读)。脏读:一个未提交事务读取到了另一个未提交事务的数据 。多个事务同时操作一条数据时,其中有一个改变了数据,其他事务读到了改变后的数据进行操作。最先改变数据的事务发现数据不和自己要求,进行事务回滚。不可重复读:一个未提交事务读取到了另一个提交事务修改的数据。虚读:一个未提交 事务读取到了另一个提交事务添加的数据。通过设置隔离级别来解决上述问题...
2020-09-29 15:46:03
57
原创 事务
事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败。事务四大特性:原子性 :过程不可分割,要么都成功,如果只要有一个失败都失败。一致性:操作之前操作之后总量不变。隔离性:多事务操作同一条数据时不受影响。(线程安全)持久性:提交数据后永久变化。...
2020-09-28 21:36:34
42
原创 AOP术语
连接点:类里面哪些方法可以被增强,这些方法称为连接点。切入点:实际真正被增强的方法叫做切入点。通知(增强):实际增强的逻辑部分称为通知(增强 )。通知有多种类型(1)前置通知(2)后置通知(3)环绕通知(4)异常通知(5)最终通知切面:把通知应用到切入点的过程。...
2020-09-27 18:05:56
50
原创 有接口的动态代理
有接口的动态代理使用 JDK中自带的proxy进行方法加强,就相当于给原来的对象穿上外套。平常情况下的对象的方法可能没有达到我们的预期,我们就可以用动态代理,在不改变原代码的基础上实现我们的想法public class JDKProxy { public static void main(String[] args) { Class[] interfaces = {UserDao.class};// Proxy.newProxyInstance(JDKProxy.
2020-09-27 17:54:46
100
原创 AOP
面向切面编程。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。不通过改变原始代码来修改功能。独立功能块,降低耦合度。底层原理使用动态代理。(1)有接口 JDK动态代理(2)没有接口CGLIB动态代理...
2020-09-27 17:09:23
49
原创 IOC上
(1)控制反转,把对象创建和对象之间调用的过程,交给spring管理。(2)为了降低耦合度(降低各个对象和类的关联程度)底层原理(1)XML解析(2)工程设计模式,反射机制过程(1)配置XML文件,配置创建的对象(2) 有service类和dao类,创建工厂类IOC接口加载XML文件,通过工厂模式创建对象(1)BeanFactory IOC容器基本实现 spring内部使用 不提供给外部开发人员使用。*接上接口的时候不会创建对象只会加载配置,只有在需要创建对象的时候才创建对象。(类似懒汉
2020-09-25 21:06:04
99
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人