自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(88)
  • 问答 (1)
  • 收藏
  • 关注

原创 szszszszsz

系统监控go程序在执行时会启动一个后台线程用于系统监控。不需要依赖P,直接绑定到M上作用:1). 检查死锁:2). 获取下一个需要被触发的计时器。每个P都有一个最小堆结构p.timers,堆顶timer就是要触发的timer,每次调度时都会去检查已经到达时间的函数,可是如果迟迟没有发生调度,就有可能让timer执行时间发生较大偏差,因此使用监控线程来检测timer的运行,当没有timer要执行时,会进入休眠状态,当发现下一个计时器触发时间小于当前时间,会启动新的线程来触发计时器3). 轮询网络..

2021-03-23 11:11:59 1344

原创 redis选举领头Sentinel

1.所有监视同一个主服务器的多个在线Sentinel中的任意一个都有可能成为领头Sentinel2.每次进行领头Sentinel选举之后,无论选举是否成功,所有Sentinel的配置纪元(configuration epoch)的值都会加1。配置纪元实际上就是一个计数器,并没有什么特别的。3.在一个配置纪元里面,所有的Sentinel都有一次将某个Sentinel设置为局部领头Sentinel的机会,并且局部领头一旦设置,在这个配置纪元里面就不能再更改。4.每个发现主服务器进入客观下线的Sentine

2021-03-05 21:05:15 440

原创 RedisCluster故障转移

1.节点通信rediscluster采用Gossip协议,彼此不断的交换信息,一段时间后所有的节点都会知道集群的完整信息。集群的每个节点会单独在通信端口+10000的端口上单独开辟一个TCP通道用于集群通信。gossip消息可以分为ping,pong,meet,fail消息。meet消息:用于通知新节点加入。消息发送者通知接收者加入到当前集群,meet消息通信正常完成后,接收节点会加入到集群中并进行周期性的ping、pong消息交换。ping消息:集群内交换最频繁的消息,集群内每个节点每秒向多个其他

2021-03-05 17:56:22 1223

原创 docker中启动mongodb成功启动后立马退出

不要在启动命令后加–fork或者在配置文件中加fork:true

2021-02-05 17:47:01 1726

原创 mysql8 复制

// 主库 备库均创建用户// 先创建用户create user 'repl'@'127.0.0.1';// 如果是mysql8 的话 其密码验证使用的是sha256_passwordalter user 'repl'@'127.0.0.1' identified with sha256_password by '123456';// 赋予权限GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'127.0.0.1'// 修

2021-01-15 16:39:28 121

原创 mysql多实例

// mysql初始化 该命令会自动创建data文件夹 并且初始密码为空mysqld --initialize-insecure --datadir=/usr/local/mysql/3306// 修改创建的文件夹权限chown -R mysql:mysql 3306// 创建mysql配置文件[mysqld]datadir=/usr/local/mysql/3306socket=/usr/local/mysql/3306/mysql.socklog_bin=/usr/local/mysq

2021-01-15 14:00:32 92

原创 数据类型与优化

数据类型的选择尽量使用可以正确存储数据的最小数据类型尽量使用简单的数据类型,比如相比如字符,选择整形更好避免使用NULL使用要点整型:对于int(4),括号中的4代表的是显示字符的个数,跟实际存储的大小无关实数:建议只指定数据类型,而不指定精度,尽量只在需要对小数进行精确计算时才使用DECIMAL字符串:varchar仅仅使用必要的空间,需要使用1,2个额外字节记录字符串的长度。varchar对于性能的提升有帮助,但是因为其是动态变化的,当如果一个行占用空间增长,在页内没有更多的空间

2021-01-05 16:03:21 82

原创 事务

事务ACID特性原子性(atomicity)一个事务必须被视为一个不可分割的最小单元,整个事务的所有操作要么全部提交成功,要么全部失败回滚一致性(consistency)数据库从一个正确的状态转换到另一个正确的状态(所有的状态满足预定的约束),状态的正确与否应该是由应用层自己定义。其用来保证所有的约束没有被打破隔离性(isolation)通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的持久性(durability)一旦事务提交,所作的修改会被永久保存到数据库中隔离级别

2021-01-05 11:37:15 150

原创 TCP快速恢复

tcp快速恢复算法在接收到3个"重复"ACK后会产生会执行算法流程如下:收到第3个重复的ACK时,将ssthresh设置为当前cwnd的一半。设置cwnd=ssthresh+3重传丢失的报文段每收到一个重复的ACK,cwnd+1确认新数据的ACK到达时,设置cwnd=ssthresh。思考:1) 为何第二步操作的cwnd需要+32)为何第4步每次收到重复的ACK,cwnd会加一3)为何新数据的ACK到达时,设置cwnd=ssthresh理解:收到3个重复的ACK意味着网络很有可能没有

2021-01-01 16:55:33 4780 3

原创 delay ack与nagle算法

tcp在处理交互数据流时会采用delay ack与nagle算法Delay Ack在接收到数据时,并不立刻发送ACK,而将ACK的发送推迟到下一次与该方向要发送的数据一起发送或是达到最大时延(大多数为200ms)可以通过TCP_QUICKACK选项设置Nagle算法该算法要求一个TCP连接上最多只能有一个未被确认的未完成的小分组(小于MSS的数据块),该分组的确认到达之前不能发送其他的小分组。TCP收集这些小分组,并在确认到来时以一个分组一起发出去。nagle算法规则:如果改包长度达到MSS

2021-01-01 13:57:40 213

原创 avl树

简述二叉搜索树的最坏情况下搜索的时间复杂度可能达到O(n),avl树在普通的二叉搜索树的基础上加入了自动平衡的特性,其左子树与右子树的高度差的绝对值不大于2,且左子树与右子树也是一棵avl树旋转avl树进行插入或者删除后,通过旋转来满足平衡性质总共有4种情况需要旋转LL: 左孩子的左子树进行了插入导致了不平衡,此时需要右旋RR:右孩子的右子树进行了插入导致了不平衡,此时需要左旋LR:左孩子的右子树进行了插入,此时需要先左旋再右旋RL:右孩子的左子树进行了插入,此时需要先右旋再左旋代码实

2020-12-30 15:02:00 200

原创 mysql用户管理

mysql登陆// -p无空格紧跟密码 -e后跟sql语句 执行后立马退出mysql服务器mysql -h hostname|hostIP -P port -u username -p DatabaseName -e "SQL 语句"mysql -h localhost -P 3306 -u root -p123456 test -e "show tables"mysql权限管理mysql安装后自动会创建一个叫mysql的数据库,其中存储的都是用户权限表,比较重要的有user: 全局权限管理

2020-12-30 11:06:11 93

原创 mysql约束

主键约束主键使用需要注意:每个表只能定义一个主键主键值必须唯一标志表中的每一行,且不能为NULL一个字段名只能在联合主键字段表中出现一次联合主键不能包含不必要的多余字段。当把联合主键的某一字段删除后,如果剩下的字段构成的主键仍然满足唯一性原则,那么这个联合主键是不正确的。这是最小化原则// 设置单字段主键// 1.在创建表时指定create table `student`( `id` int primary key)create table `student` ( `id` in

2020-12-28 15:30:41 106

原创 读者写者问题

读者优先readcount = 0 表示读者数量mutex = 1 用于对writecount资源加锁w = 1 用于对资源操作加锁Reader() { P(mutex) readcount++ if(readcount==1) P(w) V(mutex) ...dosomething P(mutex) readcount-- if(readcount==0) V(w) V(mutex)}Writer() { P(w) ...dosomething

2020-12-18 22:06:35 181 1

原创 vim基础操作

i - 当前位置插入 进入插入模式x - 删除光标所在字符s - 删除当前字符并进入插入模式dd - 剪切当前行yy - 复制当前行p - 贴贴a - 在光标后插入A - 在一行后插入o - 在当前行后新开一行O - 在当前行前新开一行^ - 定位到本行第一个非空字符位置$ - 定位到本行最后一个非空字符位置gg - 到第一行G - 到最后一行w - 到下一个单词的开头e - 到下一个单词的结尾% - 括号匹配操作.操作符:重复上一次操作 即从进入插入模式到退出插入操作的操

2020-12-11 17:11:31 164

原创 mongodb索引

索引类型唯一性索引db.users.createIndex({roleid:1}, {unique:true})db.users.createIndex({roleid:1}, {unique:true, dropDups:true})// dropDups在遇到重复索引键时自动丢弃文档唯一性索引保证了集合中所有索引项的唯一性,当插入数据时,如果索引项重复,插入会失败稀疏索引对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段

2020-12-03 14:24:47 192

原创 golang 二维切片

a := make([][3]int, 2)var b [2][3]inta1 := b[:][:]

2020-12-02 20:28:23 1175

原创 连接虚拟机中的mongodb

场景在本机中使用虚拟机,在虚拟机中启动了mongodb服务, 现在想通过本机连接虚拟机中的mongodb问题在本机中直接连接虚拟机中的mongodb发现无法连接解决方案虚拟机中的端口未向外开放sudo firewall-cmd --zone=public --query-port=28017/tcp// 查询端口是否开放sudo firewall-cmd --zone=public --add-port=28017/tcp --permanent// --permanent 永久开放/

2020-12-01 15:16:56 1651

原创 Mongodb事务

写关注writeConcern:决定一个写操作落到多少个节点上才算成功。w取值包括:0: 发起写操作不关心是否成功1~集群最大数据节点数:写操作需要被复制到指定节点数才算成功majority:写操作需要被复制到大多数节点才算成功all:全部节点确认发起写操作的程序会被阻塞知道写操作到达指定的节点数为止journal定义为写操作如何才算成功true:写操作落到journal文件才算成功false:写操作到达内存及算成功wtimeout如果写操作在指定毫秒内无法复制就会返回一

2020-11-29 14:12:17 2231

原创 sed

-r: 使用扩展正则表达式-建议用到正则表达式的地方都统一加上 不容易混淆-f: 后接保存了sed指令的文件-i:对文件直接修改-n:sed默认输出所有行,使用-n参数后只显示处理过的行 一般与p组合使用a\:向匹配行后面插入内容i\:向匹配行前面插入内容sed '1a\haha' 1.txt // a前面的数字代表第几行后面sed '/line/a\haha' 1.txt // 如果多行匹配都会插入hahased '$i\haha' 1.txt // 最后一行前插入c\:将匹配行完全替

2020-11-26 11:38:59 207

原创 crantab,at

at用于处理仅执行一次就结束的指令 必须要atd服务at运作方式使用at指令产生所要运作的工作,将这个工作以文本的方式写入/var/spool/at/目录内,atd服务进行取用于执行1.先搜寻/etc/at.allow这个文件 写在这个文件中的使用者才能使用at2.如果/etc/at.allow不存在,就寻找/etc/at.deny,卸载这个文件中的使用者不能使用at3.如果两个文件都不存在,只有root可以使用at指令at [-mldv] TIMEat -c 工作号码-l:列出目前系统上

2020-11-25 15:01:32 99

原创 git基本命令

git 基础操作git init //在本地初始化git仓库git clone + 地址 // 获取已经存在的Git仓库拷贝git status // 查看文件处于什么状态git add // 将内容添加到下一次提交中 只保存当前内容,后续对文件的修改内容不会包 // 括在此提交中git diff // 查看文件更新了哪些部分 可以使用其他图形化工具来查看差异git commit (-m msg)// 提交暂存区文件 -a:将已跟踪得文件 不经过暂存区 直接commitgit commit

2020-11-23 16:23:46 75

原创 docker基础

Docker基础操作docker info // 查看docker程序信息docker run -i -t centos /bin/bash //使用docker run命令创建容器 // -i 参数保诚容器中STDIN是开启的 -t 参数告知Docker要为创建的容器分配一个伪tty中断// 如果本地存在centos镜像会直接生成容器 否则会取Docker仓库去拉取镜像// 最后会在生成的容器中运行 指定的命令exit // 在容器中使用exit退出容器docker ps -a //查

2020-11-19 11:04:01 61

原创 linux文件/目录权限

文件权限修改: chmod [-R] 740 filename中间的数组是根据 r:4 w:2 x:1 每种身份分别相加计算而来权限对文件的意义:r: 可读取文件的实际内容w: 可以编辑,新增,或者修改文件的内容(不包含删除该文件)x:该文件可被执行对于文件的rwx都是针对"文件的内容"而言权限对目录的意义:r:能够查询该目录下的所有文件名w:具有改动目录结构的权限->建立新的文件与目录删除已经存在的文件与目录(无论文件的权限)将已存在的文件或目录更名搬移该目录内的文

2020-11-17 15:09:58 233

原创 erlang common_test测试框架

这种中文文献少的语言用起来真尼玛蛋疼,看英语头疼。测试文件名字使用 *_SUITE.erl的形式,模块中都包含ct.hrl头文件,在每个测试文件中需要导出all/0函数,返回索要在该模块中执行的测试用例组和测试用力的列表。Init and End per Suiteinit_per_suite/1:测试套件初始化时会调用1次。参数是一个propolist结构的变量Config,作为每个测试用例的运行时数据,返回值是修改后的Config,一般在这个函数中可以保存一些链接信息。end_per_suite

2020-11-13 14:49:41 412

原创 迭代变量捕获的坑

func main() { var lists []func() var vue []int for a := 1; a < 3; a++ { vue = append(vue, a) lists = append(lists, func() {fmt.Println(a)}) } fmt.Println(vue) // [1,2] for _, f := range lists { f() //[3,3] }}每次循环产生的函数,其记录的是循环变量的地址,所有循环产生

2020-11-12 20:43:38 172

原创 二叉树前/中/后序遍历(栈,Morris实现)

使用栈模拟前序遍历:进栈顺序先右节点再左节点vector<int> preorderTraversal(TreeNode* root) { if(root==NULL)return {}; vector<int>ans; stack<TreeNode*>st; st.push(root); while(!st.empty()){ TreeNode* head=st

2020-10-26 20:55:14 278

原创 ssl/tls

对称加密: A与B公用同一密钥进行加密以及解密。缺陷:需要保证密钥的安全->可以采用线下沟通获取密钥。非对称加密: A与B各自拥有1一个密钥以及一个公钥,密钥自己绑定,公钥对外公开,A对B发送数据时,用私钥A加密数据的hash值(数字签名),然后使用公钥B加密数据内容,将hash值以及加密的内容和填充的无用数据(为了防止私钥暴露)发送给B,B收到后,使用公钥A解码hash值,使用私钥B解密数据,自己运算hash值与解码的hash值进行比较。缺陷:A与B在一开始需要交换公钥,可能受到中间人的截获,中间

2020-10-23 14:44:01 162 1

原创 磁盘与文件系统

从磁盘中读写1个字节:移动磁头到指定磁道,旋转磁道直到指定扇区,通过磁生电/电生磁来读/取一个字节。只需要往控制器中写柱面,磁道,扇区,缓存位置,就能通过指令获取数据。操作系统对这整个过程进行了封装抽象。将多个扇区合成一个block,然后按照顺序排序,使得相邻盘号的block放在一起(这样连续读取相邻盘块可以花费较少的寻道时间),程序只需要传入一个block号,就能通过磁盘驱动自动取出多个相邻扇区的数据,block越大,空间浪费越多但是速度越快(每次寻道能读出更多的数据)。因为有多个进程都要对磁盘进.

2020-10-07 12:15:00 346

原创 输入输出

操作系统对外设的使用,实际上是对外设的控制器进行数据的读入读出,但是不同的设备控制器拥有不同的语义以及寄存器,所以操作系统将外设抽象成了文件视图,这样处理起来更加方便。无论什么设备都是通过操作系统提供的统一接口:open,read,write,close来进行调用。不同的设备文件对应不同的设备文件(/dev/xxx),根据设备文件找到控制器的地址,内容格式等。...

2020-10-06 14:51:35 68

原创 分段与分页

重定位一个程序要加入到内存后才能开始运行,我们需要在内存中找一块空闲区域来存放程序,那么对于程序中所指明的地址,我们需要进行重定位操作,将逻辑物理地址转化成实际的物理地址。重定位的时机:编译时:需要在编译时就知道哪些物理内存是空闲的(很不灵活),一般嵌入式系统可以用。载入时:在程序载入到内存时改变程序中的地址,但是一旦载入到内存中就不能在动了,但是程序在载入后都会需要移动(swap交换)。运行时重定位:每执行一条指令都从逻辑地址算出物理地址,每个进程的基地址都存放在PCB中,执行指令时第一步先从

2020-10-05 19:15:45 1029

原创 进程同步与信号量

对于多个进程访问共享数据,需要进程进行同步合作完成操作。我们可以使用信号量来描述共享数据。struct semaphore{ int value; // 记录资源的个数 PCB *queue; //记录等待在该信号量上的进程};P(semaphore s){ //消费资源 s.value--; if(s.value < 0){ sleep(s.queue); }}V(semaphore s){ // 产生资源 s.value++; if(s.value>=0){

2020-10-02 21:34:17 500

原创 线程

进程=资源+指令执行序列进程切换需要切换资源以及指令序列,当我们只切换指令序列,而资源公用的话,可以避免进程金环的代价且保留了并发的优点。用户级线程实际上就是我们平时所用的协程。调用点由用户进行设置,对于内核来说,不知道存在多个用户级线程,因此,在某一个线程阻塞时,内核无法切换用户级线程,只能切换到另一个进程。在线程创建以及切换时,只需要保存当时切换的状态就能顺利完成切换工作。每个线程都有各自独立的栈,使用TCB来保存其栈地址,调用Yield时,线程进行切换,将当前esp保存,将要切换的栈地址赋值给

2020-10-01 20:27:32 248

原创 因特网,互联网,万维网

互联网:能彼此通信的设备组成的网络就叫互联网。因特网:互联网的一种,由成千上万台设备组成的互联网,使用TCP/IP协议进行通信,并且拥有一个公网地址万维网:在因特网中,应用层使用的是HTTP协议。...

2020-09-30 18:05:23 129

原创 多进程图像

CPU管理的直观看法CPU的工作原理:程序要运行需要放到内存中,其实就是有许多的指令存放在内存中,CPU每次都从中取出一条指令进行执行。多道程序交替执行当一个程序遇到IO阻塞时,此时不使用CPU,CPU完全可以切换到另外的一个程序进行执行,充分发挥CPU的效能。在进行切换的时候,需要修改PC的值以及返回地址,其他种种寄存器的值,这些信息都放在了一个名为PCB的结构当中。操作系统将这些进程记录好,按照合理的次序推进执行。从开机的时候,操作系统就启动了第一个进程(linux shell,window

2020-09-30 17:28:05 126

原创 Prim算法

算法描述Prim算法和kruskal算法一样都用于找最短生成树,其是从顶点的角度来进行选择。算法过程维护一个集合S将某一点x加入该集合S中重复下列操作直到S中存在所有的顶点集合选取与集合S相连的最短边所在的顶点加入集合S中算法证明参见kurskal...

2020-09-30 10:22:53 155

原创 kruskal

kruskal是用来找连通图中的最小生成树,简单点来说,就是对于n个点,找n-1条边,将n个点连接起来,使得边的权值相加最小,这样构成的树就叫最小生成树算法过程描述将所有边按照权值进行排序遍历所有边,按照权值从小到大选取。选取的一个边看其顶点是否处于一个连通集中,如果属于,则放弃该边,如果不属于,选取该边进入生成树中,并将两顶点所处集合合并产生的生成树为最小生成树算法证明对于一个点x,所有与这个点直接相连的边中最小的边必定是最小生成树的一条边:假设该边为x->y,如果不选该边,那么必

2020-09-29 14:59:13 96

原创 并查集

在一些有N个元素的集合问题中,开始时通常让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中,可以用并查集来描述,其是树形结构。操作步骤初始化:把给个点所在的集合初始化为自身void init(){ for(int i=0; i<n; i++){ father[i] = i; }}查找:查找元素所在集合int find(int x){ int r = x; while(father[r] != r){ r =

2020-09-29 10:48:01 55

原创 操作系统接口

为何要有操作系统接口为了使用户不能随时随地的访问内存中内核部分的数据(使用jmp,mov等指令),需要提供给用户操作内核的方法。内核程序和用户程序隔离通过硬件将此时的状态分为内核态,用户态。内存分为内核段,用户段。内核态可以访问任何数据,用户态不能访问内核数据通过CS,DS两个段寄存器的信息来区分此时的状态DPL:目标内存段的特权级->在GDT表中,GDT表中用来描述一段内存,操作系统初始化时,就把操作系统内存段的DPL制成0CPL:当前内存段的特权级CS:IP是当前指令,用CS的最低

2020-09-28 17:28:24 362

原创 Floyd算法

Floyd算法是一种利用动态规划思想寻找多源点之间最短路径的算法。该算法时间复杂度为O(n^3),对于稠密图来说效果比执行[V]次的Dijkstra算法以及SPFA算法要好,其可用于边权为负的图。代码编写简单DP思路f[k][i][j]表示i和j之间可以通过编号为1…k的节点的最短路径。有2种转义方式:1.f[k][i][j]由f[k-1][i][j]转移而来,表示i到j不经过点k2.f[k][i][j]由f[k-1][i][k]+f[k-1][k][j]转移而来,表示经过k这个点那么状态转移方

2020-09-28 14:40:44 959

空空如也

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

TA关注的人

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