- 博客(17)
- 收藏
- 关注
原创 linux进程调度
CFS是Linux默认的普通进程调度器,其核心思想是完全公平。它摒弃了传统时间片,引入了虚拟运行时间的概念。每个进程的虚拟运行时间会根据其优先级(nice值)进行加权计算。CFS通过一颗红黑树来组织所有可运行进程,树的键值就是虚拟运行时间。调度时,它总是选择虚拟运行时间最小的进程来运行。这样,高优先级进程的虚拟时间增长慢,更容易被频繁调度,从而获得了更多的CPU时间;同时,经常睡眠的交互式进程也能快速得到响应,保证了系统的公平性和交互体验。
2025-11-03 15:37:54
840
原创 初识Docker
docker容器在产生数据的时候,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除之后,数据自然而然的也会消失。为了能保存数据,容器中引用了数据卷的概念。Dockerfile是一个创建镜像所有命令的文本文件,包含了一条条指令和说明, 每条指令构建一层,,通过docker build命令,根据Dockerfile的内容构建镜像,因此每一条指令的内容, 就是描述该层如何构建。
2025-07-13 16:28:49
862
原创 gRPC使用
RPC 即远程过程调用协议(Remote Procedure Call Protocol),可以让我们像调用本地对象一样发起远程调用。RPC 凭借其强大的治理功能,成为解决分布式系统通信问题的一大利器。解决了单体架构的弊端,但同时引入了新的问题服务拆分后,服务和服务之间发生的是之间的调用,之间的调用,那么就需要发起网络调用。网络调用我们能立马想起的就是http,但是在微服务架构中,http虽然便捷方便,但性能较低。这时候就需要引入RPC(远程过程调用),通过自定义协议发起TCP调用,来加快传输效率。
2025-05-26 16:18:27
913
原创 Golang —— channel
在go语言中的goroutine是可以支持高并发操作的,而且go语言对高并发支持做的是非常好的一种语言,线程与线程之间或者协程与协程之间实现如果需要实现并发,那么不可或缺的就是需要进行通信,那么go语言协程间如何实现高性能通信的呢?——Channel。Channel是Go中的一个核心类型,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯。go语言中有一种很经典的说法,我们如何理解上面这段话呢?其实我们知道在内核视角下,线程是内核调度的最小单位。
2025-05-10 21:23:09
815
原创 Nginx 代理与conf文件
Nginx(发音类似“Engine-X”)是一款高性能的开源网页服务器和反向代理服务器,最初由俄罗斯程序员Igor Sysoev开发,现广泛应用于各种网站和应用的服务器端。是一款用于搭建网站、实现请求转发和负载均衡的高效Web服务器,因其速度快、占用资源少和扩展性强而广受欢迎。
2025-05-07 15:01:32
937
原创 Golang —— Slice
Go 语言切片是对数组的抽象。Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。切片中的元素存放在一块内存地址连续的区域,使用索引可以快速检索到指定位置的元素;切片长度和容量是可变的,在使用过程中可以根据需要进行扩容。
2025-05-01 14:48:33
1176
原创 go语言实现raft —— PartD
空间不够:如果日志无限追加下去,本地硬盘空间可能存储不下重启过慢:因为重启需要重发(replay)所有日志,如果日志过长,重放过程将会持续很久不能正常的对外提供服务因此,raft论文也给我们提供了一个解决的思路,就是给日志做快照(snapshot)。针对某个日志entry做了快照之后,该entry以及以前的日志都可以被截断。当然,这种方法能解决的我们上面两个问题的本质原因在于:相比日志,快照的存储更为紧凑。日志记录的是事件(比如),而快照通常记录的是数据条目(比如。
2025-04-23 09:12:15
498
原创 go语言实现raft —— PartC
前面的PartA和PartB部分实现了在不宕机的情况下的日志的选举和日志应用。但是如果某个peer异常重启之后是无法正常的加入到集群当中的。为此,需要将Raft的关键信息定时的进行持久化,重启后加载,以保证集群的正常工作。至于哪些条目需要持久化,在论文中都有。主要涉及以下两个函数在本次测试中并不会真正的将这些条目持久化到磁盘中,而是调用了测试框架中的persist.go中的persist类进行持久化。
2025-04-02 23:36:58
772
原创 go语言实现raft —— PartB
在前面PartA的逻辑中,我们实现了一个基本的框架,从领导者选举到领导者发送心跳给各个节点。但是PartA是不包含日志相关的内容的,而PartB主要就是完善PartA的相关内容,将对应的日志消息添加到对应的逻辑中这三个部分的代码是层层递进的关系,需要不断的完善。
2025-03-26 14:07:26
970
原创 go语言实现raft —— PartA
之所以使用go实现raft是因为raft论文中的伪代码实现给的也是用go语言的逻辑,因此为了避免重复造轮子,提高工作效率,我们这里也采用go语言实现raft。我们知道raft的三个子问题分别是:领导者选举、日志复制和安全性的问题。关于这几个问题的讲述,我在上一篇博客中有讲述到。这里不再赘述,这里主要讲解代码层面上的实现。
2025-03-22 11:07:29
535
原创 raft共识算法
相比于Paoxs,Raft的最大特点就是易于理解。为了这个目标,Raft主要做了两方面的事情问题分解:把共识算法分为三个子问题,分别是领导选举问题、日志复制问题和安全性问题状态简化:对算法做出一些限制,减少状态数量和可能产生的变动。服务器只在三个状态进行切换,服务器之前使用两类RPC进行通信。
2025-03-18 17:23:22
892
原创 MySQL连接池
定义:数据库连接池()是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。大白话:创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的 时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度, 还更加安全可靠。这里讲的数据库,不单只是指Mysql,也同样适用于Redis。3 为什么需要使用数据库连接池。
2024-12-25 22:03:06
678
原创 数据传输序列化 Json和protobuf
序列化 (Serialization)将对象的可以,与之相对应的过程称之为反序列化(Unserialization)。。
2024-11-21 18:57:39
1493
原创 Tcp粘包分析
使用过TCP的通信的都可能会遇到这样的问题,代码写的没有问题,但是每次接收到的数据总是怪怪的。有时候接受的长,有时候接收到的数据又比较短。反正数据就是得不到正确的解析,接下来我们分析一下究竟是什么原因导致的?又应该如何解决呢?最后作者还想补充一点关于http协议如何解决TCP粘包问题。
2024-11-15 22:40:57
1342
原创 C++线程池思想
C++线程池是一种并发的技术,它能有效的管理并发线程、减少资源占用和提高程序的性能。本文基于linux的 <pthread> 线程库,使用C++对线程池进行封装,并对底层实现方式进行描述。
2024-11-10 15:31:15
1007
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅