自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(101)
  • 资源 (1)
  • 收藏
  • 关注

原创 Python 使用 matplotlib 将离散的节点用光滑曲线连接

前言:由于写论文需要测试算法的效率,所以需要使用某画图工具来将算法(分布式共识算法)的效率体现出来,本人一开始想到的是使用MATLAB,然后先不说其安装有多麻烦,仅仅是大小,我这个苏菲婆就顶不住了,然后问了问师姐,师姐:Python。嗯。用需要用到三个库:• numpy• matplotlib• scipy具体的作用就不介绍了,懂得都懂,但是安装只要安装后面两个就好了,matplotlib包含numpy安装:因为本人使用的是conda环境,所以在安装前先将一些东西升级conda updat

2021-04-23 21:47:52 13313 2

原创 读写文件

如何读取文件内容://打开文件filePath := "D:/tool/GoIDE/Project/pbft/golang.txt"content, err := ioutil.ReadFile(filePath)if err != nil { fmt.Println("文件打开失败", err)} //读取文件中的内容fmt.Printf("文本为%s\n",string(content))//因为是直接读取所以不用关闭文件什么的操作下面是写操作file, err1 := os.

2021-04-12 21:05:22 215

原创 map与 string 之间的转换

解决思路:将map转化为 json将json转化为 string注意: 得先将map转换为string先,如果先将string转换成map的话,格式很麻烦,但也不是不可以函数如下:Func mapToString(param map[string]string) string { dataType,_:=json.Marshal(param) dataString:=string(dataType) return dataString}Func stringToMap(str st

2021-04-12 21:02:02 1655

原创 go.mod

首先说为什么我要使用 go mod 而不是直接使用GOPATH?因为本人是使用GOLang来编辑的,当我导入某个第三方库的时候,在编辑器中是可以的,如下:但是当我使用cmd go build的时候,死活找不到我已经go get的包,老是编译失败。。。然后就直接使用go mod,方便简单一个项目一个mod多好Go mod 步骤:首先命令行cd到你的项目目录下(随便什么位置都可以)然后:go env -w GO111MODULE=onGO111MODULE=off:关闭 Go Module

2021-04-12 20:57:09 146

原创 奇怪的if判断--Comma-ok断言

就如同下面这一句:addr,ok:=nodeTable[nodeID];ok如果断言失败,ok为false,否则ok为true并且addr为变量的值,即赋值成功。放在上面所给代码的这个情况下就是:如果用户输入的节点在节点池列表中,那么就会判断上述语句,如果不在就直接Fatal。当然这里的ok变量显得很多余,你也可以使用下列的方式来写:addr := nodeTable[nodeID]但是使用这种写法一旦断言失败就会出现运行错误,就很惨。...

2021-04-09 16:33:40 239

原创 类型别名和类型定义

记住下面一句话:类型别名和原类型完全一样,只不过是另一种叫法而已完全一样(identical types)意味着这两种类型的数据可以互相赋值,而类型定义要和原始类型赋值的时候需要类型转换(Conversion T(x))。下面这个例子中,v是整数类型,可以直接赋值给d,因为d的类型是D,是是整数的别名。而var i I = v这一句会出错,因为I和整数是两个类型。所以类型别名和类型定义最大的区别在于:• 类型别名和原类型是相同的,• 而类型定义和原类型是不同的两个类型。package main

2021-04-08 23:34:21 412

原创 匿名字段

结构体可以包含一个或多个匿名(或者称为内嵌)字段,即这些字段没有显式的名字。仅指明字段的类型,此时该类型就是字段的名字。匿名字段本身可以是一个结构体类型,即结构体可以包含内嵌的结构体。匿名字段匿名字段和面向对象编程中的继承概念相似,可以被用来模拟类似继承的行为。Golang 中的基础就是通过内嵌或组合来实现的,所以说在 Golang 中组合比继承更受欢迎。比如下面的例子:type test struct { name string age int int // 匿名字段}.

2021-04-08 23:30:52 218

原创 下划线的作用

就是声明后不在使用有的函数如下图所示必须是两个返回值的,但是这个返回值又没有用,就可以直接使用“_“表示我只需要判断这个目录存在即可,并不需要使用其他的功能。

2021-04-08 23:28:17 657

原创 panic异常

先抛出一个问题:这段代码的panic的作用是什么??一般而言,当panic异常发生时,程序会中断运行,并立即执行在该goroutine中被延迟的函数(defer 机制)。随后,程序崩溃并输出日志信息。日志信息包括panic value和函数调用的堆栈跟踪信息。panic value通常是某种错误信息。对于每个goroutine,日志信息中都会有与之相对的,发生panic时的函数调用堆栈跟踪信息。通常,我们不需要再次运行程序去定位问题,日志信息已经提供了足够的诊断依据。因此,在我们填写问题报告时,一般

2021-04-08 23:23:24 1558

原创 PBFT(六):checkpoint 、stable checkpoint和高低水位

什么是 checkpoint 呢? checkpoint 就是当前节点处理的最新请求序号。前文已经提到主节点收到请求是会给请求记录编号的。比如一个节点正在共识的一个请求编号是101,那么对于这个节点,它的 checkpoint 就是101。那什么是 stable checkpoint (稳定检查点)呢?stable checkpoint 就是大部分节点 (2f+1) 已经共识完成的最大请求序号。比如系统有 4 个节点,三个节点都已经共识完了的请求编号是 213 ,那么这个 213 就是 stable ch

2021-04-08 17:29:19 551

原创 PBFT(五):client为何只需要f+1个相同的回复就可确认?

之前我们说,prepare和commit阶段为何都要2f+1个节点反馈,才能确认。client只需要f+1个相同的reply就可以了呢?我们还是来考虑最坏的情况,我们假设这f+1个相同的reply中,有f个都是恶意节点。所以至少有一个rely是正常节点发出来的,因为在prepare阶段,这个正常的节点已经可以保证prepared(m,v,n,i)为真,所以已经能代表大多数的意见,所以,client只需要f+1个相同的reply就能保证他拿到的是整个系统内“大多数正常节点“的意见,从而达到一致性。...

2021-04-08 17:28:00 452

原创 PBFT(四):prepare和commit阶段为何都要2f+1个节点反馈确认?

对于prepare和commit来说,节点需要在2f+1个状态复制机的沟通内就要做出决定,这是刚好可以保证一致性的,考虑最坏的情况:我们假设收到的有f个是正常节点发过来的,也有f个是恶意节点发过来的,那么,第2f+1个只可能是正常节点发过来的。(因为我们限制了最多只有f个恶意节点)由此可知,“大多数”正常的节点还是可以让系统工作下去的。所以2f+1这个参数和n>3f+1的要求是逻辑自洽的。还有网上的另一个证明,但是其实也是一个意思:某副本收到f+1个相同的反馈确认,如果这f+1个反馈中包含faul

2021-04-08 16:54:00 966 1

原创 PBFT(三):为什么PBFT算法只能容忍(n-1)/3个作恶节点?

高级的说法: http://qyuan.top/2019/08/13/pbft-1/节点总数是n,其中作恶节点有f,那么剩下的正确节点为n - f,意味着只要收到n - f个消息就能做出决定(所以后面要对f做出限定条件),但是这n - f个消息有可能由f个是由作恶节点(作恶节点也可以什么都不干)冒充的,那么正确的消息就是n - f - f(最恶劣的情况下)个,为了多数一致,正确消息必须占多数,也就是n - f - f > f但是节点必须是整数个,所以n最少是3f+1个。或者可以这样理解,假定f个节

2021-04-08 16:31:47 2243

原创 PBFT(二):主节点与副本节点的关系

这一段怎么理解:PBFT是一种状态机副本复制算法,所有的副本在一个视图(view)轮换的过程中操作,主节点通过视图编号以及节点数集合来确定,即:主节点 p = v mod |R|。v:视图编号,|R|节点个数,p:主节点编号。PBFT算法中节点只有两种角色,主节点(primary)和副本(replica),两种角色之间可以相互转换。两者之间的转换又引入了视图(view)的概念,视图在PBFT算法中起到逻辑时钟的作用。解决:所以说副本节点并不是,将整个状态机进行复制,而是一个实实在在的节点。引用:

2021-04-08 16:08:10 1447

原创 PBFT(一):过程

PBFT 算法的基本流程主要有以下四步:客户端(不是主节点)发送请求给主节点(PBFT算法只是在各个服务器节点上运行的)主节点广播请求给其它节点,节点执行 pbft 算法的三阶段共识流程。节点处理完三阶段流程后,返回消息给客户端。客户端收到来自 f+1 个节点的相同消息后,代表共识已经正确完成。(要注意各个阶段确认消息的数量)下面介绍 pbft 算法的核心三阶段流程,如下图所示:算法的核心三个阶段分别是pre-prepare 阶段(预准备阶段)prepare 阶段(准备阶段)com

2021-04-08 16:05:31 2226

原创 进程死锁

死锁定义:若系统中存在一组进程,且它们中每一个都无限等待被该组进程中所占用的且永远无法释放的资源,那么这种现象就被称为进程“死锁”产生死锁的原因:竞争资源进程推进顺序不当产生死锁的必要条件:互斥条件:某个资源一段时间内只能被一个进程所占用占有且等待条件:已经占用了某些资源,又申请其他资源,这时候就在等待了,但是又占有着资源。不可剥夺条件:不可剥夺资源如打印机等循环等待条件:占用资源被申请其他资源处理死锁的基本方法:预防死锁:破坏占有且等待条件:这样就必须保证一个进程在申请资

2021-03-15 16:18:35 222

原创 并行和并发的区别

简而改之:多处理器就叫并行,单处理器就叫并发并发(Concurrent),在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。并行(Parallel),当系统有一个以上CPU时,当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。并发,指的是多个事情,在同一时间段内同时发生了。并行,指的是多个事情,在同一时间点上同时发生了。并发的多个任务之间是互相

2021-03-13 15:33:47 176

原创 快速排序

简介:快速排序可以说是归并排序的进阶版,它的主要思想就是找一个”对照物“,一般是数组的第一个元素(因为这样操作简单),然后从头尾开始,每个元素和这个”对照物“比较,比如说:将第一个数字“5” 和最后一个数字”9“对比,因为9比5大,所以9就放在5的右边(即不操作)然后将指向9的指针 减一 变成 指向0然后继续比较5和0,这时发现0是比5小的,就直接交换5和0的位置(然后指向0位置的指针,就加一指向了2):这个时候,右边的比较就结束了,就要开始从左往右比了,即2和5比较,如果因为2比5小,所以指向

2021-02-21 15:13:12 89

原创 选择排序

简介:这里思路就比较简单,就是每一轮都将最大(或者最小)的放到最前面来,比如说数组:1,2,4,3将第一个与后面的所有进行比较,然后将比较所得的最小的放到位置1,然后将位置二的“2”与后面的进行比较,得到最小的放到位置二,其他同理。代码实例:#include <stdio.h> int sort(int *array, int length) { int i, j, temp; for (i = 0; i < length-1; i++) { for (j

2021-02-21 15:10:17 136

原创 希尔排序

希尔排序的简介:就是简单的插入排序(如冒泡排序)的升级版,就是一个特殊的插入排序,将一整个数列,分成n组,将每一组进行排序,然后再合并为n/2组,然后在对每一组进行排序,知道最后只剩一组。宏观简介:图片取自( https://www.cnblogs.com/chengxiao/p/6104371.html )插曲:for循环的执行顺序:for 循环语句的一般形式为:for (表达式1; 表达式2; 表达式3){ 语句;}下面来看看它的执行过程:求解表达式1。求解表

2021-02-21 15:08:02 95

原创 插入排序

简介:插入排序的基本思想是:将数组的第一个数认为是有序数组,从后往前(从前往后)扫描该有序数组,把数组中其余n-1个数,根据数值的大小,插入到有序数组中,直至数组中的所有数有序排列为止。这样的话,n个元素需要进行n-1趟排序具体算法描述如下:将待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列;取出下一个元素,在已经排序的元素序列中从后向前扫描;如果该元素(已排序)大于新元素,将该元素移到下一位置;重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;将新元

2021-02-21 15:03:57 64

原创 冒泡排序

简介:以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。宏观简介:第一轮第二轮以此类推代码实例:#include <stdio.h> int main(){int arr[10];int i,j,temp; printf("请输入10数字:\n");//输入10个数字for (i = 0; i < 10; i++) {sca

2021-02-21 15:00:29 52

原创 Paxos

简介Paxos 其实是一类能够解决分布式一致性问题的协议,它能够让分布式网络中的节点在出现错误时仍然保持一致;Leslie Lamport 提出的 Paxos 可以在没有恶意节点的前提下保证系统中节点的一致性,也是第一个被证明完备的共识算法,目前的完备的共识算法包括 Raft 本质上都是 Paxos 的变种。作为一类协议,Paxos 中包含 Basic Paxos、Multi-Paxos、Cheap Paxos 和其他的变种Basic PaxosBasic Paxos 是 Paxos 中最为基础的协

2021-02-11 15:58:10 411

原创 拜占庭将军问题

大致:在 存在消息丢失的不可靠信道上 试图通过 消息传递 的方式达到 一致性 是 不可能 的来源由于当时拜占庭罗马帝国国土辽阔,为了达到防御目的,每个军队都分隔很远,将军与将军之间只能靠信差传消息。在战争的时候,拜占庭军队内所有将军和副官必须达成一致的共识,决定是否有赢的机会才去攻打敌人的阵营。但是,在军队内有可能存有叛徒和敌军的间谍,左右将军们的决定又扰乱整体军队的秩序。在进行共识时,结果并不代表大多数人的意见。这时候,在已知有成员谋反的情况下,其余忠诚的将军在不受叛徒的影响下如何达成一致的协议,拜

2021-02-06 21:10:42 483

原创 操作系统--内存管理方式

一共由三种方式:• 段式管理• 页式管理• 段页式管理页式管理:特点:分页管理方式是从计算机的角度考虑设计的,以提高内存的利用率,提升计算机的性能, 且分页通过硬件机制实现,对用户完全透明管理方式:页式管理的基本原理是将各进程的虚拟空间划分为若干个长度相等的页;将虚拟内存空间和物理内存空间皆划分为大小相同的页面,如4KB、8KB或16KB等,并以页面作为内存空间的最小分配单位,一个程序...

2020-04-05 00:49:08 2150

原创 操作系统--进程和线程的区别

进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元(根本区别)同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进行至少包括一个线程。系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。(内存分配)进程结束后它拥有的所有线程都将销...

2020-04-05 00:40:37 276

原创 华为20届面试软件题第一题 利用python

引言:参加了华为的实习生面试,在上机考试这一关,本着事先准备的原则,在网上找了一些往年的华为题来练练手,以下是我自己对题目的见解及解决方式,若那里有不对的或者更好的解决方式,请务必教教我这个菜鸡!!!主体题目如下(图片获取自https://blog.csdn.net/lyxleft/article/details/88698136?depth_1-utm_source=distribute....

2020-04-02 22:51:34 409 1

原创 python--输入方式

引言:今天遇到一题,需要输入下列格式:我在想python好像没有类似C语言那样格式化输入的方法呀,然后去网上找了还真没有,但是还是有其他的收获的。主体:python一共有三种输入方式,但是那是从前了,现在也不支持python2了。现在python3支持两种输入方式input(把之前python2的raw_input吞了),默认返回字符串类型,但是不会再末尾加上换行符sys.stdi...

2020-03-31 22:42:15 613

原创 python--循环语句

引言:今天在刷面试题的时候,我丫竟然连基础的循环语句都忘记了(这能忍???),面对的问题是这样的:我就想利用一个循环然后一个一个用isupper判断,然后我竟然写出了下面的代码(我用的是python。。。)这丫要不是我还没膨胀到改写python,我特么就以为是这个pycharm错了。。。。。。现在就总结一哈,python的循环语句主体:python提供了以下几种类型的循环:而且...

2020-03-31 22:38:43 104

原创 JTB学生教师账号授权

引言总所周知JTB的产品需要用钱购买注册码,但是如果你能网上找的话那也是可以滴,如果你找不到(比如说我)但是你又是学生或者老师的话(一般大学生和老师都会有一个与学校关联的邮箱)这样你就可以注册一个JTB专门为学生和老师准备的免费帐户(就你可以免费是由他公司的产品的账号),这样你就可以有一个免费使用一年(所有产品)的账号步骤首先打开购买注册码的页面(https://www.jetbrains....

2020-03-31 22:33:11 218

原创 数据库--行锁

行锁:偏向InnoDB存储引擎,开销大,加锁慢,会出现死锁,锁定粒度最小,发生锁冲突的概率最低,并发度最高。InnoDB与MyISAM有两个最大的不同的特点:支持事务采用行级锁事务具有四个属性–ACID原子性:要么全执行,要么一个都不执行一致性:在事务开始和完成时,数据都必须保持一致隔离性:事务执行过程是独立的,不受外部条件影响的持久性:事务完成之后,他对数据的修改是永久的...

2020-03-18 00:06:55 264

原创 数据库--表锁

分类:表锁行锁页锁表锁:偏向myisam存储引擎,开销小,加锁快;无死锁;锁定粒度大,发生锁冲突的概率最大,并发率最低。建立一个实例:建表CREATE TABLE mylock(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,name VARCHAR(20))ENGINE=MYISAM;然后插入几个数据:INSERT INT...

2020-03-18 00:03:04 156

原创 数据库--Show Profile

含义:是MySQL提供可以用来分析当前会话中语句执行的资源消耗情况,可以用于SQL语句的调优测量。默认情况下,这个功能是关闭的,并且保持15运行结果。分析步骤:查看当前MySQL版本是否支持SHOW VARIABLES LIKE 'profiling';开启这个功能:SET profiling=ON;测试一下,运行一下SQL随便什么SQL都行查看profi...

2020-03-17 23:59:17 101

原创 数据库--函数和存储,批量插入数据脚本

自定义函数与存储过程之间存在几点区别:自定义函数不能拥有输出参数,这是因为自定义函数自身就是输出参数;而存储过程可以拥有输出参数。自定义函数中必须包含一条 RETURN 语句,而这条特殊的 SQL 语句不允许包含于存储过程中。可以直接对自定义函数进行调用而不需要使用 CALL 语句,而对存储过程的调用需要使用 CALL 语句。建立表1CREATE TABLE dept(Id INT...

2020-03-17 23:56:29 175

原创 数据库--慢查询日志

引言:MYSQL的慢查询日志是MySQL提供的一种日志记录,用来记录在MySQL响应时间超过阈值的语句。具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。Long_queru_time默认的时间是10,单位为秒。由他来查看那些SQL超出我们最大忍耐时间值,如何操作这个功能:默认MySQL是不开启这个慢查询功能的,因为会或多或少消耗资源。首先先查看是否已...

2020-03-17 23:48:57 511

原创 数据库--单表优化案例

首先创建数据表:CREATE TABLE IF NOT EXISTS article(-> id int(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,-> author_id INT(10) UNSIGNED NOT NULL,-> category_id INT(10) UNSIGNED NOT NULL,-&gt...

2020-03-17 23:43:48 97

原创 数据库--性能分析

MySQL query optimizer:MySQL中有专门优化select语句的优化模块,主要功能是:通过计算分析系统中收集到的统计信息,为客户端请求的query提供“它”认为最优的执行计划,(它认为最优的数据检索方式,但不认为是DBA认为最优的,这部分最耗时间)当客户端像MySQL请求一条query的时候,命令解析器模块完成请求分类,区别出是SELECT并转发给MySQL query ...

2020-03-17 23:38:02 764

原创 数据库--索引结构

BTree结构:初始化介绍一个B+树,浅蓝色的块,我们称之为一个磁盘块。可以看到每个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示)。真实的数据都藏在叶子节点中,非叶子节点只存储指引搜索方向的数据项。结构种类Hash结构FULL-TEXT结构R-Tree结构那些情况需要创建索引:1)主键自动建立唯一索引2)频繁作为查询条件的字段3)查询中与其他表关联的字段,外键关系建立...

2020-03-17 23:26:50 93

原创 数据库--索引

1. 什么是索引:MySQL官方对索引的解释是:帮助MySQL高效获取数据的数据结构。所以索引的主要功能是:查找和排序。直接影响WHERE 和 ORDER BY 的效率。2. 什么样的结构呢?在数据之外,数据库还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据。这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。3. 索引的特点索引占据空间很大...

2020-03-17 23:23:25 144

原创 数据库--SQL的执行顺序

SQL的执行顺序:手写(就是我们写SQL语句的顺序)一般如下所示:机器(sql服务器理解SQL语句)的顺序:总结JOIN图:因为这些图都是取自阿里云教程的视频,所以后面有些本来事一张图的因为视频原因,不能是一整张。...

2020-03-17 23:17:40 218

计算机网络总复习.docx

此文件是我大学学习计算机网络自己整合的资料,上传到这里只是为了以防以后需要找不到文件。

2020-03-04

空空如也

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

TA关注的人

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