- 博客(211)
- 收藏
- 关注
原创 进程互斥和进程同步
一、进程互斥 由于进程具有独立性和异步性等并发特征,计算机的资源有限,导致了进程之间的资源竞争和共享,也导致了对进程执行过程的制约。1、临界资源和临界区(临界部分)临界资源:一次只能供一个进程访问的资源。 临界区:把不允许多个并发进程交叉执行的一段程序称为临界区(critical region)或临界部分(critical section)。 临界区是由属...
2019-09-01 11:36:12
699
转载 处理机调度算法
调度的概念 在多道程序系统中,进程的数量往往多于处理机的个数,进程争用处理机的情况就在所难免。 处理机调度是对处理机进行分配,就是从就绪队列中,按照一定的算法(公平、高效)选择一个进程并将处理机分配给它运行,以实现进程并发地执行。 处理机调度是多道程序操作系统的基础,它是操作系统设计的核心问题。调度的层次一个作业从提交开始直到完成,往往要经历以下三级调度,如...
2019-08-31 15:52:45
1118
原创 进程、线程
1、什么是进程 进程的目的就是为了对并发执行的程序进行控制。进程实体由程序段、数据段、PCB三部分构成。我们知道计算机运行的本质就是对数据的处理的机器。数据段就是各种数据。 程序段就是一系列操作计算机的指令,即操作数据的方法策略。 PCB 即进程控制块(Process Control Block),控制运行程序段的时机。 书本上是这样定义进程的:“进程是进程实体的运行过程,是系...
2019-08-30 22:30:16
353
原创 OS的运行机制、体系结构、中断
操作系统的运行机制和体系结构一、操作系统的运行机制 操作系统需要两种CPU状态:内核态(Kernel Mode)和用户态(User Mode),内核态用于运行操作系统程序,用户态用于运行用户程序。CPU的两个状态可以执行不同的指令集合,所以可以指令集合划分为两类:特权(privilege)指令和非特权指令,特权指令是指只能有操作系统程序使用,用户程序不能使用的指令,非...
2019-08-30 11:38:47
816
原创 Redis管道
概念 Redis是一个响应式的服务,当客户端发送一个请求后,就处于阻塞状态等待Redis返回结果。这样一次命令消耗的时间就包括四个部分:请求从客户端到服务器的时间、命令排队的时间和命令真正执行时间、结果从服务器到客户端的时间,第一个和第四个消耗的时间总和称为RTT(Round Trip Time),当客户端与服务器存在网络延时时,RTT就可能会很大,这样就会导致性能问题。...
2019-08-13 17:01:57
340
原创 如何控制缓存更新
背景 计算机为了在性能上有一个倍数式的增长,引入了缓存设计,同时也间接引入了并发问题。抛开让人闻风丧胆的并发问题,缓存的引入,本质的问题是磁盘虽然硬件成本低,但是性能低效,而缓存则相反,成本高,但是性能极好,所以在二者权衡之下,选择折中的方案,两者相结合得最大性价比。系统架构同样也面临着性能问题,响应问题。 缓存带来的作用:由于redis的容量一般都只有...
2019-08-11 11:52:21
799
原创 背包问题
1、0 1背包问题题目:有N件物品和一个容量为V的背包。第i件物品的费用是w[i],价值是p[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。基本思路:这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[i][v]=max{f[...
2019-08-07 22:10:55
727
转载 ByteBuf 的零拷贝(Zero Copy)
所谓的 Zero-copy, 就是在操作数据时, 不需要将数据 buffer 从一个内存区域拷贝到另一个内存区域. 因为少了一次内存的拷贝, 因此 CPU 的效率就得到的提升. 在 OS 层面上的 Zero-copy 通常指避免在 用户态(User-space) 与 内核态(Kernel-space) 之间来回拷贝数据. 例如 Linux 提供的 mmap 系统调用, 它...
2019-08-06 17:56:39
468
转载 NIO开发流程
NIO原理剖析Java原生NIO开发大致流程:第一步,绑定一个服务的端口 这与传统阻塞IO中的ServerSocket类似,没什么好说的第二步,打开通道管理器Selector并在Selector上注册一个事件 当注册的事件发生时,Selector.select()会返回,否则一直阻塞。这一步很有意思,也是NIO第一个与传统IO不同的地方,NIO通过一个...
2019-08-04 16:58:17
671
原创 Spring IoC源码:refresh都干了什么
IoC 构建过程首先是源码的入口之一AnnotationConfigApplicationContext: public static void main(String[] args){ AnnotationConfigApplicationContext annotationConfigApplicationContext = ...
2019-07-21 20:24:46
548
原创 Spring的后处理器-BeanPostProcessor跟BeanFactoryPostProcessors
Spring的后处理器只要有两大类,一个是针对BeanDefinition的容器级别的后处理器 - BeanFactoryPostProcessor(后面简称BFPP);一个是针对getBean操作获得的对象的后处理器 -BeanPostProcessor(后面简称BPP)。此两个后处理器不同之处主要有三点:1、触发时机不同,前者BFPP是在容器refresh方法中调用,而后者实际调用时机...
2019-07-21 17:50:57
795
原创 传输层协议TCP、UDP
UDP用户数据报协议 用户数据报协议(User Datagram Protocol,简称UDP)是一种允许在基于IP的网络中无连接地发送数据报的协议。通过使用用户数据报协议,应用程序可以非常快速地发送信息,因为既不必建立与收件人的连接,也不必等待答案。但是,不能保证数据包将到达完成,并在同一顺序它们被发送。此外,该协议不提供自己的保护,以防止第三方操纵或访问。但是,可以通过可选...
2019-07-19 11:22:42
715
原创 应用层(DNS、HTTP)
7层模型主要包括:1. 物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的模数转换与数模转换)。这一层的数据叫做比特。 2. 数据链路层:主要将从物理层接收的数据进行MAC地址(网卡的地址)的封装与解封装。常把这一层的数据叫做帧。在这一层工作的设...
2019-07-18 21:58:37
1416
转载 IO多路复用三种机制Select,Poll,Epoll
I/O多路复用(multiplexing)的本质是通过一种机制(系统内核缓冲I/O数据),让单个进程可以监视多个文件描述符,一旦某个描述符就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写操作。select、poll 和 epoll 都是 Linux API 提供的 IO 复用方式。相信大家都了解了Unix五种IO模型,不了解的可以[1] blocking IO ...
2019-07-16 22:14:52
309
原创 Redis为什么这么快
Redis为什么这么快1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);2、数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加...
2019-07-16 20:50:58
162
转载 限流算法
三种常见的限流算法 在开发高并发系统时,有三把利器用来保护系统:缓存、降级和限流。那么何为限流呢?顾名思义,限流就是限制流量,就像你宽带包了1个G的流量,用完了就没了。通过限流,我们可以很好地控制系统的qps,从而达到保护系统的目的。本篇文章将会介绍一下常用的限流算法以及他们各自的特点。1、计数器算法 计数器算法是限流算法里最简单也是最容易实现的一种算法。比如我们规...
2019-07-16 19:58:25
204
原创 类加载过程、类成员初始化顺序
一、 概述 上一篇文章介绍了class文件的存储细节,class文件包括了类的各种描述信息,但是Java程序的运行需要在内存中实现,那么虚拟机是如何加载这些class文件的?class文件中的静态结构是如何转换成实际的存储结构的?内存分配是如何完成的?这些都是本篇文章要讨论的内容。 虚拟机将类的描述文件class文件加载到内存,并且进行安全校验、数据类型解析、内存...
2019-07-08 22:28:54
722
转载 JVM之内存分配与回收策略、finalize()
前言 对象的内存分配,往大的方向上讲,就是在堆上分配,少数情况下也可能会直接分配在老年代中,分配的规则并不是百分之百固定的,其细节决定于当前使用的是哪种垃圾收集器组合,当然还有虚拟机中与内存相关的参数。垃圾收集器组合一般就是Serial+Serial Old和Parallel+Serial Old,前者是Client模式下的默认垃圾收集器组合,后者是Server模式下的默认垃圾收集器组...
2019-07-08 20:38:21
268
原创 垃圾收集器
下面一张图是HotSpot虚拟机包含的所有收集器:(A):图中展示了7种不同分代的收集器:Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1;(B):而它们所处区域,则表明其是属于新生代收集器还是老年代收集器:新生代收集器:Serial、ParNew、Parallel Scavenge; 老年代收集器:S...
2019-07-08 19:40:30
169
原创 java注解
概念 Annotation(注解)是 Java 提供的一种对元程序中元素关联信息和元数据(metadata)的途径和方法。Annatation(注解)是一个接口,程序可以通过反射来获取指定程序中元素的 Annotation 对象,然后通过该 Annotation 对象来获取注解中的元数据信息。 注释是给人看的,注解是给程序看的,注解可以替代配置文件,java里...
2019-07-06 16:21:12
159
原创 异常处理
概念 如果某个方法不能按照正常的途径完成任务,就可以通过另一种路径退出方法。在这种情况下会抛出一个封装了错误信息的对象。此时,这个方法会立刻退出同时不返回任何值。另外,调用这个方法的其他代码也无法继续执行,异常处理机制会将代码执行交给异常处理器。 常见的异常输入输出异常:IOException 算术异常类:ArithmeticExecption 空指针异常类:N...
2019-07-06 15:24:34
169
转载 搜索引擎-倒排索引
单词——文档矩阵 单词-文档矩阵是表达两者之间所具有的一种包含关系的概念模型,图3-1展示了其含义。图3-1的每列代表一个文档,每行代表一个单词,打对勾的位置代表包含关系。 从纵向即文档这个维度来看,每列代表文档包含了哪些单词,比如文档1包含了词汇1和词汇4,而不包含其它单词。从横向即单词这个维度来看,每行代表了哪些文档包含了某个单词。比如对于词汇1来说,文档1...
2019-07-05 21:07:26
362
转载 哈夫曼树
定义 我们希望建立这样一株二叉树,其叶结点为一组给定的带权结点,称这个树的权重为每个叶子结点到根结点的距离与其权值的乘积的累和,即: 其中x.w表示叶结点的权重,而x.d为叶结点的深度。哈夫曼树是所有满足上面条件的二叉树中权重最小的。哈夫曼树的构造算法(心里默念:把每个叶节点按照权值的大小,先把最小的两个叶节点构成一个父节点是他们之和的小二叉树,在以父节...
2019-07-05 16:15:11
787
转载 一致性哈希
一、分布式算法 在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin)、哈希算法(HASH)、最少连接算法(Least Connection)、响应速度算法(Response Time)、加权法(Weighted )等。其中哈希算法是最为常用的算法. 典型的应用场景是: 有N台服务器提供缓存服务,需要对服务器进行负载均衡...
2019-07-03 17:22:24
229
转载 布隆过滤器
布隆过滤器介绍布隆过滤器在wiki上的介绍: 布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难为什么要用布隆过滤器? HashMap 的问题: 讲述布隆过滤器的原理之前,我...
2019-07-03 15:31:08
1220
转载 散列(哈希)
1、为什么有哈希 对于线性表、队列、树这些数据结构,它们的记录在结构中是随机的,而且和记录的关键字之间并不存在确定关系,查找某个元素时需要进行一系列与关键字的比较,即这种查找是建立在“比较”的基础上。所以查找的效率依赖于比较的次数,那么如何才能不经过比较直接找到记录所在位置呢?刚才说到上述数据结构的关键字与记录位置之间是不存在确定关系的,那么我们可以让这两者之间建立一种确定关系,也...
2019-07-03 10:16:14
805
转载 堆和优先级队列(PriorityQueue)
1. 堆的概念堆逻辑概念上是一棵完全二叉树,而物理存储上使用数组,还要一定的顺序要求。 TreeMap内部使用的是排序二叉树原理,排序二叉树是完全有序的,每个节点都有确定的前驱和后继,而且不能有重复元素。与排序二叉树不同,在堆中,可以有重复元素,元素间不是完全有序的,但对于父子节点直接,有一定的顺序要求。根据顺序分为两种堆:最大堆、最小堆堆是一种特殊的树,一个堆需要满足如...
2019-06-30 17:13:19
1407
原创 二叉树的遍历
递归的本质是通过栈来保存状态,然后再次调用自己进入新的状态,然后函数返回的时候回到上次保存的状态。往往机器保存的状态不一定用得到,这就会造成栈资源浪费。所以要把递归改为非递归,这样自己可以设置需要保存的状态,减少栈空间的浪费。//树的节点类class Node { public int val; //节点值 public Node left; //左子树 public...
2019-06-30 14:59:29
183
原创 算法的时间复杂度
通常,对于一个给定的算法,我们要做两项分析。第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式、数学归纳法等。而在证明算法是正确的基础上,第二部就是分析算法的时间复杂度。算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上能很好反映出算法的优劣与否。因此,作为程序员,掌握基本的算法时间复杂度分析方法是很有必要的。...
2019-06-29 11:54:13
502
原创 Comparable、Comparator、Arrays
Comparable简介 Comparable是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过 Collections.sort或 Arrays.sort进行自动排序。此外,实现此接口的对象可以用作有序映射中的键或有序集合中的集合,无需指定比较器。该接口定义如下:package java.lang...
2019-06-29 10:23:53
250
原创 String类、StringBuilder、StringBuffer
String特点:字符串的内容是用不可变的 字符串是常量,是可以共享使用的 字符串效果上相当于是char[]字符数组,但是底层原理是byte[]字节数组 String类的一个最大特性是不可修改性,而导致其不可修改的原因是在String内部定义了一个char类型的常量数组,因此每次对字符串的操作实际上都会另外分配一个新的常量数组空间(这片空间位于jvm的方法区)。三种...
2019-06-28 22:31:19
228
原创 Stream流
概述 Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream的操作有两个特点:可以多个操作链接起来运行;内部迭代; 集合和流的区别:集合包含目前的所有元素,你...
2019-06-28 16:42:15
170
原创 Lambda表达式
函数式接口 函数式接口在Java中是指:有且仅有一个公共抽象方法的接口。 函数式接口,即适用于函数式编程场景的接口。而Java中的函数式编程体现就是Lambda,所以函数式接口就是可以适用于Lambda使用的接口。只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利地进行推导。 从应用层面来讲,Java中的Lambda可以被当做是匿名内部类的“语法糖”,...
2019-06-28 11:48:09
265
原创 RedisTemplate操作Redis
RedisTemplate介绍Spring封装了RedisTemplate对象来进行对Redis的各种操作,它支持所有的Redis原生的api。RedisTemplate位于spring-data-redis包下。RedisTemplate在Spring代码中的结构如下:org.springframework.data.redis.core Class RedisTemplate&...
2019-06-21 11:28:22
545
转载 PrintStream和PrintWriter的区别简介
PrintStream:将基本的数据类型的数据或引用数据类型的对象格式化成字符串后再输出。使用该类不必书写转化成字符串的操作方法,可以直接输出。 PrintStream继承了FilterOutputStream.是"装饰类"的一种,所以属于字节流体系中(与PrintStream相似的流PrintWriter继承于Writer,属于字符流体系中),为其他的输出流添加功能.使它们能...
2019-06-20 09:27:05
850
原创 Elasticsearch查询
1.基本查询基本语法GET /索引库名/_search{ "query":{ "查询类型":{ "查询条件":"查询条件值" } }}这里的query代表一个查询对象,里面可以有不同的查询属性 查询类型: 例如:match_all,match,term,range 等等 ...
2019-06-17 21:50:28
179
原创 Elasticsearch
Elasticsearch1.1 ES定义 ES=elaticsearch简写, Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTf...
2019-06-17 14:52:03
366
转载 分布式文件系统FastDFS
为什么要使用分布式文件系统呢?嗯,这个问题问的好,使用了它对我们有哪些好处?带着这个问题我们来往下看:单机时代 初创时期由于时间紧迫,在各种资源有限的情况下,通常就直接在项目目录下建立静态文件夹,用于用户存放项目中的文件资源。如果按不同类型再细分,可以在项目目录下再建立不同的子目录来区分。例如: resources\static\file、 resources\static...
2019-06-15 10:10:30
337
原创 跨域问题
确实,我们这种搬砖工人就是为了混口饭吃嘛,好好的调个接口告诉我跨域了,这种阻碍我们轻松搬砖的事情真恶心!为什么会跨域?是谁在搞事情?为了找到这个问题的始作俑者,请点击浏览器的同源策略。 这么官方的东西真难懂,没关系,至少你知道了,因为浏览器的同源策略导致了跨域,就是浏览器在搞事情。所以,浏览器为什么要搞事情?就是不想给好日子我们过?对于这样的质问,浏览器甩锅道:“同源...
2019-06-14 15:53:48
179
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人