- 博客(130)
- 收藏
- 关注
原创 Redis分布式锁
Redis锁在面试中是Redis绕不开的话题,关于Redis锁,网上很多文章,大多都是这个方案:1、单机Redis2、RedLock3、Redission分布式锁本文基于这三个点,延伸出几个问题,同时介绍下Martin和RedLock实现作者Salvatore的论点。当然分布式锁并不只限于这两种,还有基于ZooKeeper的分布式锁的实现、Chubby的分布式锁、Mysql分布式锁、基于 Etcd、Hazelcast 分布式锁的等等,其中关于基于ZooKeeper的分布式锁的内容将放在下
2021-03-27 11:48:48
586
原创 spark RDD 打印元素
最近使用Scala操作Spark,想要输出RDD中相关内容去查找错误。这样就遇到了一个问题:在单机模式下输出了相关的内容,而在集群模式中的操作却没有输出。试过了一些方法,包含idea中调试,Print输出都不好使。实际上在官方文档中已经有了这样的一句话。Printing elements of an RDDPrinting elements of an RDDAnother comm...
2020-03-08 02:08:17
2539
原创 Cassandra单机启动问题
在创建单机数据库中使用cqlsh出现如下错误Connection error: ('Unable to connect to any servers', {'127.0.0.1': error(111, "Tried connecting to [('127.0.0.1', 9042)]. Last error: Connection refused")})解决方案一:https://a...
2019-09-18 11:06:20
1056
2
原创 Spring AOP
一、AOP的概念AOP,面向切面编程,是对OOP的补充。从网上看到的一句话:这种在运行时,动态的将代码切入到类的指定方法或者指定位置上的编程思想,就是面向切面的编程。这是其中的一种方式,在运行时动态添加。还有另外一种是在编译代码的时候,将代码切入到指定的方法或者位置上去,这是静态添加的方式。二、发现代码中冗余如果我们写了一段需要添加事务的代码,例如账户转账,那么此时这个Service层代...
2019-09-02 17:43:16
286
原创 Spring IOC
一、Spring框架看下Spring 框架图,在Spring中有核心容器,Core Container即是IOC部分,这里面就有Bean。Bean:可重用组件的含义。JavaBean:用Java写的可重用组件。二、程序的耦合和解耦在一般情况下我们写CSD三层代码的时候使用直接new的方式来创建一个对象,这样程序之间的耦合性太大,如果编译的时候有一个层的实现类不存在的的时候,则编译器将不会...
2019-09-02 16:35:18
271
原创 Memcached网络模型
memcached通过epoll(也是使用libevent)进行实现的异步服务器,在其中担任主要任务的线程有两种,一个是主线程,一个是worker线程。一、libeventmemcached使用libevent实现事件监听。在这简单介绍一下libevent的使用,一般有以下几步:1)event_base = event_init(); 初始化事件基地。2)event_set(eve...
2019-08-16 11:53:43
429
原创 从缓存来看程序局部性提高程序运行效率的原因
一、什么是程序局部性一个写的优美的程序往往具有一个良好的局部性,那么什么是程序局部性呢?程序局部性是指程序在运行的一段时间内,它们更加倾向于引用的数据靠近最近引用过的数据。因此,整个程序的执行会限制于程序中的某一部分,对应的执行代码的时候访问的存储空间也局限于某一个内存区域。现在不论是操作系统还是应用程序,都参考了局部性的原理,例如:缓存机制、CPU指令执行顺序等。在硬件层,局部性原理允许计算...
2018-12-07 19:42:25
1276
原创 系统调用和库函数
一、系统调用下图我们可以看到用户和操作系统的关系: (1)什么是系统调用系统调用就是内核的一种出口,它是操作系统提供给用户程序调用的一组”特殊“的接口。逻辑上系统调用可以被看作一个内核与用户空间程序的接口。它的执行流程就是,把用户进程的请求传递给内核,待内核处理完毕后将处理结果返回给用户空间。(陷入进内核态0x80) (2)系统调用和API系统调用和API很多人会理...
2018-04-20 22:50:13
840
转载 【操作系统】实模式和保护模式
本文转载自:https://www.cnblogs.com/chenwb89/p/operating_system_002.html一、实模式 a.那究竟实模式是什么呢? 在计算机上面,实模式存在的时间非常之短,所以一般我们是感觉不到它的存在的。CPU复位(reset)或加电(power on)的时候就是以实模式启动,在这个时候处理器以实模式工作,不能实现权限分级,也不能访问20...
2018-03-18 16:17:05
1274
转载 nasm汇编讲解
一、什么是nasm汇编nasm使用在windows、linux等系统下的汇编。二、语法介绍2.1 nasm 是区分大小写例如:符号 foo 与 FOO 是两个不同的标识符。2.2 内存操作数表达式2.2.1 在 nasm 语法里,对 memory 操作数需要加 [ ] 括号下面的代码:foo equ 1bar dw 2...
2018-03-17 12:37:53
14789
1
原创 守护进程
一、简介守护进程也叫做精灵进程,是一种特殊的进程。它的生命周期很长,常常在系统引导装入时启动,在系统关闭的时候才结束。由于他们没有控制终端,所以他们是在后台运行的。在Linux系统上存在很多守护进程,这些守护进程执行了日常事务活动。同时大多数服务器也是用守护进程实现的。我们可以用命令ps axj 查看系统中的进程。其中a表示不但列出当前用户进程,还列出所有其他用户进程,x表示列出所有有
2018-01-29 18:16:27
366
原创 【Linux】进程组、作业、会话以及终端的理解
一、进程组(1)概念我们知道每一个进程除了自己的进程 ID外,还拥有一个进程组ID。多个进程组成的集合叫做进程组。他们彼此之间不是孤立的,存在父子、兄弟等关系,每个进程都有父进程(除了0号进程),而所有的进程的父进程都是以init进程为根,形成一个树状结构。如果我们需要发送一个任务到10个进程,让这10个进程去执行,但是如果我们因为某种原因需要终止这项进程,则需要一个一的把这些
2018-01-29 16:16:17
982
原创 深入TCP(三)--三次握手和四次挥手
经过前面两篇文章的铺垫,我们对于TCP有了一个较为明显的认识,因此此篇文章便讲解建立连接和断开连接的过程–三次握手四次挥手。一、建立连接(1)窗口机制TCP采用的是窗口机制进行流量控制。那么什么是窗口机制呢?窗口机制实际上是一种流量控制的手段,它是一段缓冲区,在信息传递的过程中用户端和服务器端各自分配一块缓冲区来存储接收的数据,此时通讯的时候我们需要告诉对方我们的缓冲区的大
2018-01-28 20:51:59
1213
1
原创 【Linux】进程间通信--信号量
一、信号量简介信号量和之间的进程间的通信(命名管道,匿名管道、消息队列)不同,它不是用来传递数据的,它是一个计数器,用在多个进程提供对共享数据对象的访问,使得资源在一个时刻只有一个进程或者线程所拥有。那么共享内存的访问就存在了两种问题,一种是互斥的访问,一种是同步的访问。在介绍同步和互斥的操作的之前,我们来介绍一下临界区和临界资源的概念。临界资源:同一时刻只能被一个进程同时使用,也就
2018-01-25 17:01:33
904
原创 智能指针知识框图
下图主要介绍了智能指针的一个分类,提供了一个思维导图供记忆,具体实现在http://blog.csdn.net/archyli/article/details/69808166 这篇博客中展现。如果看不清楚,留下邮箱我会发原图和源文件。如有错误请指正。
2018-01-12 17:00:23
657
1
原创 【Linux】进程间通信--共享内存
一、共享内存是什么共享内存是两个进程之间最快的也是最有用的通信方式。由于之前我们所介绍的通讯方式都要进过内核和自己的用户空间之间进行传递,而共享内存则是进程直接把内存映射到自己进程的地址空间内,所以A进程和B进程可直接看到对方对这块区域所进行的操作。由于进程可以直接读写内存,并不需要任何的数据的拷贝,这一点和前面所介绍的进程间的通信就不一样,所以它的效率很高,换句话说,进程不再通过执行进入内核的系统
2018-01-09 23:49:27
485
原创 【Linux】进程间通信--消息队列
一、消息队列是什么消息队列提供了从一个进程向另外一个进程发送一块数据的方法,每个数据块都有相应的类型,接收者进程接收的数据块可以由不同的类型值。消息队列和管道的不同之处,是消息队列是基于消息的,而管道是基于字节流的。消息队列和命名管道一样有缺陷:每个消息的最大长度是由上线的。每个消息队列的总字节数是有上限的。系统上消息队列的总数也是有上限的。这个上限值我们可以分别在proc/sys/kcrn
2018-01-09 16:25:55
476
原创 【LInux】进程间通信--管道
一、什么是管道管道是Unix中一种进程间通信的方法,我们把从一个进程链接到另外一个进程的数据流称为“管道”。管道是最像队列的一种进程间通信模型,生产者的进程在管道的写端写入数据,消费者的进程在管道的读端进行读取数据,这个过程类似于队列,区别就是我们并不需要关心使用的管道的线程安全和内存分配等琐碎的事情,这些事情都是由操作系统为你完成。二、管道的分类管道分为命名管道和匿名管道。
2018-01-08 20:53:35
1081
原创 学习总结与期望与博客
2017已经过完了,自己的目标还是没有达到,从最初的想打ACM到现在的找工作,感觉自己也转变了很多。记得自己最初对编程感兴趣是初一的时候,看C语言是如此的生涩难懂,那时候我就决定了我以后的路,现在想想好后悔自己放弃了曾经大把的时间没有去学习。最初自己写博客的目的是为了总结,然后看到曾经的同学变成了如今的学长,变成了如今的大牛,写的博客浏览量上10W,自己觉得他们很厉害,至于现在一个人的浏览量都超过3
2018-01-01 01:18:09
1031
1
原创 【Linux】dup和dup2函数解析与文件描述符
一、文件描述符1.1 文件描述符概念我们知道在Linux下一切皆文件,因此我们需要一个东西对这些文件进行管理,此时就需要文件描述符来管理了。 文件描述符简称fd,对于内核而言,所有打开的文件都要通过文件描述符来引用。文件描述符是一个递增的非负整数,一旦当我们打开或者创建一个新的文件的时候,内核向进程返回一个文件描述符。文件描述符一般有以下三个性质:每个进程都具有自己的一个递增的文件描述符,如果我
2017-12-31 00:30:46
995
原创 【Linux】open函数的参数和作用
一、open函数用来干什么open函数在Linux下一般用来打开或者创建一个文件,我们可以根据参数来定制我们需要的文件的属性和用户权限等各种参数。二、open函数的定义和参数我们首先来看下open函数在Linux下的定义#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(const char *pathnam
2017-12-30 16:09:47
41868
7
原创 进程等待与wait&waitpid
一、进程等待的简介(1)进程等待用来干什么的我们通过之前学习过的知识知道了,如果一个进程如果在终止的时候会关闭它所有的文件描述符,同时释放在用户空间分配的内存,但是还保存着PCB等相关信息,与此同时还保存了一些其他的的相关信息。如果此时进程正常终止,则其中保存着它的退出状态;如果是异常退出,则这些其他的相关信息会保存着该进程的终止信号是哪个。这个时候我们的子进程的父进程可以调用wait和waitpi
2017-12-06 20:37:53
1191
原创 进程退出方法总结与exit函数&_exit函数
一、简介一般情况下进程正常退出返回0,异常退出则返回相应的退出码。而一个程序一般的退出场景有以下三个:代码运行结束,结果正确代码运行结束,结果不正确代码异常终止常见的进程退出方式有正常结束和异常退出正常结束:1、main函数中执行return退出2、exit3、_exit异常结束:1、ctrl + c,信号终止2、kill信号终止——3、abort()不管进程是上述什么方法退
2017-12-03 21:20:38
4920
原创 解析fork函数与vfork函数
一、fork函数与vfork函数的简介(1)fork函数在Linux下fork函数很重要,它的作用是创建子进程,即在当前进程中创建一个新的进程,新进程为子进程,原来的进程为父进程。我们来看一下这个函数的返回值和类型#include <unistd.h>pid_t fork(void);我们可以看到这个函数的返回值是一个pid_t的类型,它的返回类型分别为:子进程返回0父进程返回子进程的ID出
2017-12-03 20:01:18
850
原创 make与makefile的编写
一、简介大家都说makefile是用来检验一个人有没有具有完备的大型工程的能力,因为它关系到了整个工程的编译规则。 它像一个shell一样在文件的内部也可以使用操作系统命令,一般我们在这个文件里面按照文件的类型功能和模块分为若干个目录,它指定了什么文件先编译什么文件后编译,它还有一个好处就是自动化编译,一旦我们写好了makefile文件,我们只需要一个make命令便可以让整个工程完成编译。如果我们
2017-12-03 01:18:23
483
原创 排序--插入排序的实现
一、简介插入排序类似于我们玩扑克牌,如果想要让我们手中的牌有序,那么当我们从牌堆中抽出一张牌放入自己手中的牌组内时,需要把这张牌和手中最大的牌开始向前比较,直到找到一个大于前面的牌小于后面一张牌的情况下插入即可。二、时间复杂度逆序时间复杂度最坏,因为每次插入都需要移动数据,所以时间复杂度为 O(N^2)有序最好,不需要移动数据,所以时间复杂度O(N)三、实现插入排序的
2017-12-01 23:56:34
475
原创 排序--选择排序的优化和实现
一、简介选择排序的思想很简便,排序过程也很直观。选择排序是一种不稳定的排序算法。二、时间复杂度三、算法原理每一次循环调出来一个最大的或者最小的元素放在整个数组的最前面或者最后面即可完成整个排序。四、选择排序的优化我们知道,按照选择排序的思想,每次遍历都会选择出来一个最大(或者最小)的元素放在数组的一端,那么我们可以这么思考一下:我们为什么不能在遍历出来一段空间内的一
2017-12-01 23:51:19
562
原创 排序--希尔排序的实现(shellsort)
一、简介希尔排序是插入排序的一种,它是插入排序的一种优化,它在插入排序之前使用了一个预排序,使整个数组接近有序,方便后续的排序。 在网上看到一个动态,这个动图很形象的说明了希尔排序的思想,所以我把它放出来。二、时间复杂度时间复杂度O(N^1.3),相比于直接插入排序,在顺序情况下不如直接插入排序。三、实现1. 第一个阶段预排序(接近于有序)采用分组来先排序一遍,使小的
2017-12-01 23:36:11
651
原创 Linux下彩色进度条的实现
一、简介我们在Linux下安装文件都会有一个进度条来提示我们安装的进度,它里面会动态增长的一个图像表示进度,同时还有百分数表示安装百分比等等信息。 我们首先来看一下实现效果:实现一个进度条我们首先需要知道如下的知识我们才能完全的写出这个小程序。二、缓冲区一般C库函数写入文件是全缓冲方式,而写入显示器是行缓冲方式,printf、fwrite库函数会自带缓冲区,而我们只要达到了一种缓冲方式我们就可以刷
2017-11-30 20:01:27
1081
原创 常见进程调度算法总结
一、定义进程调度也称为低级调度,它所调度的对象为进程(或者内核级线程),而进程调度算法主要有以下几种:先来先服务调度算法 短作业优先调度算法 高优先权优先调度算法 基于时间片的轮转调度算法 多级反馈队列调度算法 二、调度算法介绍(1)先来先服务调度算法(FCFS)简介:先来先服务调度算法是一种最简单的调度算法,可用于作业调度,也可用于进程调度。 原理:在进程调度中采用先来
2017-11-30 18:20:01
3349
原创 解析僵尸进程与孤儿进程
一、僵尸进程与孤儿进程的定义我们知道一个子进程如果要结束,其内核释放进程的所有资源,但是还保存了一部分资源供父进程使用(是一个被称之为僵尸进程的数据结构,包含有进程号、运行时间、退出状态等,它需要父进程去处理),所以其父进程要调用wait或者waitpid获取子进程的状态信息,然而如果父进程没有调用这个信息会发生什么情况呢?如果父进程没有调用这个信息,那么这段信息将会被一直占用,但是系统中的资源是
2017-11-29 21:07:14
1156
原创 详解并查集
一、概念并差集主要用来求解不相交集合的问题,主要针对于合并和查找两种算法。二、并差集实现并差集的实现主要包含了三个部分:初始化并差集。合并并差集。 查找并差集。 (1)并差集的初始化并差集的初始化是对单个数据建立了一个单独的集合,每个集合应该包含以下两个数据:这个集合所表示的数据。这个集合的根集合所在位置。由以上两个数据,一般的并差集的结构一般有两种表示形式:结构体构造。数组构造。
2017-11-26 22:25:47
647
原创 【BTree、B-树】B树的C++实现
一、B树的概念B树是平衡的多叉树,一个节点有多于两个(不能小于)结点的平衡多叉树。由于B树倒着生长所以平衡。缺点:浪费空间二、B树满足以下性质:1、根结点至少有两个孩子。[2,M]个孩子 2、每个非根结点有【(M/2),M】个孩子。 3、每个非根结点有【(M/2-1),M-1】个关键字,并且以升序排序。 4、每个结点孩 5、key[i]和key[i+1]之间的孩子节点的值介于key[i]、k
2017-11-25 15:40:51
4105
原创 Linux下软件安装的几种方式
一、简介Linux下软件安装的方式主要有源码安装、rpm安装、yum安装,而常用的安装包主要有以下三种:tar包:例如software-1.2.3-1.tar.gz。它是使用UNIX系统的打包工具tar打包的。rpm包,如software-1.2.3-1.i386.rpm。它是Redhat Linux提供的一种包封装格式。 (现在用的全称叫RPM Package Manager,以前叫Redh
2017-11-25 10:48:42
10043
原创 C++中四种强制转换
一、简介C++中存在四种强制类型转换,分别是static_cast 、const_cast 、 dynamic_cast 、reinterpret_cast二、存在原因我们直到在C语言中有强制类型转换,可以转换成合理的类型,那么我们为什么要在C++中引入四种强制类型转化的概念呢? 由于新类型的强制类型转换可以提供更好的强制控制转换过程,一旦当程序员使用了四种强制类型转换,其他的人读程序的时
2017-11-24 17:07:29
1569
2
原创 大数据处理--布隆过滤器的原理与实现
一、定义如果向之前的章节,40亿个不重复无符号的整形判断是否存在,我们可以选择用位图来解决,那么如果是40亿个邮箱地址我们该如何解决呢。因此我们便想着能否把邮箱地址按照一定的方式映射到一个集合呢,接着我们只需要看点是否为1就知道这个集合有没有它了,这便是布隆过滤器的基本思想。我们采用字符串哈希函数来处理字符串,但是一个字符串哈希函数可能会产生很多的冲突,因此我们可以采用多个哈希函数来解决这点。二、布
2017-11-20 00:13:03
1360
2
原创 C++位图详解(BitMap)
题目:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快 速判断一个数是否在这40亿个数中。 【腾讯】思路:这道题首先要判断40亿个不重复的无符号整数究竟占多大的内存,因为太大的内存我们无法加载到现有的计算机中。一个整数是4个字节,40亿个整数就是160亿个字节,也就相当于16G内存,就一般的计算机而言很难实现这个加载,所以我们可以采取以下两种方案,一种是分割,一种是位图。方法:①分割
2017-11-19 11:26:13
18662
27
原创 判断机器大小端的两种实现方式
一、为什么会有大小端之分这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小
2017-11-18 15:12:31
8616
原创 C++中防止一个类被继承
一、思路在C++的继承里面我们知道,子类的构造函数会调用父类的构造函数,子类的析构函数会调用父类的析构函数,因此我们便想办法禁止子类调用父类的构造函数和析构函数即可,因此提出了如下两种方法。二、方法①构造函数与析构函数设置为私有我们把父类的构造函数和析构函数定义为私有成员,此时子类便不可调用父类的构造函数和析构函数,因此便达成了防止一个类被继承的目的,但是此时又出现一个问题,我们如何区构造一个类对象
2017-11-18 12:07:08
2169
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人