- 博客(26)
- 问答 (1)
- 收藏
- 关注
原创 Redis持久化以及集群方案略述
redis的数据全部在内存中,如果突然宕机,数据就会全部丢失,因此需要持久化来保证Redis的数据不会因故障而丢失,redis重启的时候,可以重新加载持久化文件来恢复数据;Redis持久化的相关配置默认情况下,只开启rdb持久化aofappend only fileaof 日志存储的是Redis服务器的顺序指令序列,aof日志只记录对内存修改的指令恢复通过重放(replay),aof日志中指令序列来恢复Redis当前实例的内存数据结构的状态配置策略缺点:随着时间的增加,aof日
2021-08-29 14:19:07
238
原创 Redis存储原理与数据模型
字典数据结构实现redis DBKV 是通过字典来实现的;hash结构,当节点数量大于512个,或单个字符串长度大于64,hash结构采用字典实现;相关数据结构如下typedef struct dictEntry { void *key; union { void *val; uint64_t u64; int64_t s64; double d; } v; struct dictEntry *ne
2021-08-26 17:00:46
314
原创 Redis网络,协议与事务特性
redis网络层是reactor模型,如下图reactor并发处理链接,线程串行处理命令串行,并发,并行示例如下图:redis pipelineredis pipeline是客户端提供的,而不是服务端提供的,该模式下客户端write之后并不等待respone,而是直接返回,write直接把请求写入缓存,然后直接返回,待服务端处理完请求后,依次全部返回结果。示意图如下redis 事务MULTI开启事务,事务执行之后,单个命令是入队列操作,直到调用EXEC才会一起执行lua脚本redi
2021-08-25 13:21:14
169
原创 Redis基础数据结构详解
Redis是Remote Dictionary Service的简称,也是远程字典服务Redis是内存数据库,KV数据库,数据结构数据库
2021-08-24 17:13:09
224
原创 Linux内核-内存管理(二),关键数据结构
内存管理关键数据结构1.结点管理pg_data_t是用于表示结点的基本元素,定义如下:1.node_zone是一个数组,包含了结点各内存域的数据结构2.node_zonelists指定了备用结点以及内存域的列表,以便在当前结点没有内存时,从备用结点分配内存。3.结点中不同内存域的数目保存在nr_zones.4.node_mem_map是指向page实例数组的指针,用于描述结点内所有物理内存页。它包含了结点内所有内存域的。5.在系统启动期间,内存管理子系统初始化之前,内核页需要使用内存(另外还
2021-08-21 21:43:05
248
原创 Linux内核-内存管理(一)
概述内存管理是内核最复杂同时也是最重要的一部分。其特点在于非常需要处理器和内核之间的协作(所需执行的任务决定了两者必须紧密合作)。内存管理的实现涵盖了许多领域:1.内存中物理内存页的管理;2.分配大块内存的伙伴系统;3.分配较小块内存的slab,slub和slob分配器;4.分配非连续内存的vmalloc机制;5.进程地址空间。Linux内核一般将处理器的虚拟地址空间分为上下两个部分。底部较大的部分用于用户空间,顶部较小的部分用于内核空间。虽然底部用户空间会随着上下文切换发生改变,但内核空间
2021-08-20 17:20:07
238
原创 Linux内核---锁与进程间通信
概述Linux作为多任务操作系统,能够同时运行多个进程。通常,各个进程必须尽可能保持独立,避免彼此干扰。这对于保护数据和系统稳定性都很有必要。但有时候,应用程序必须彼此通信。举例来说:一个进程的数据传输到另一个进程时数据由多个进程共享时进程必须彼此等待时需要协调资源的使用时如果几个进程共享一个资源,则很容易彼此干扰,必须防止这种情况。因此内核不仅提供了共享数据的机制,同时提供了协调对数据访问的机制。用户空间应用程序和内核自身都需要保护资源,特别是后者。在SMP系统上,各个CPU可能同时处于核
2021-08-16 17:02:57
258
原创 Linux内核----进程调度器剖析
**进程调度概念** 内存中保存了对进程的唯一描述,并通过若干结构与其他进程链接起来。调度器面对的情形就是这样的,不同任务(进程)之间共享CPU,创造出并行的错觉,由此延申出进程调度策略和上下文切换。 **前提** 内核必须提供一种方法,在各个进程之间尽可能的共享CPU时间,而同时又必须考虑不同任务的优先级。由此延申出来各种不同的进程调度策略。 **调度原理** 调度器的一般原理是,按所能分配的计算能力,向系统中的每个进程提供最大的公正性。或者从另一个角度来说,它试图确保没有进程被亏..
2021-08-13 15:19:54
245
原创 Linux 内核 -------之进程管理
进程概念Linux内核把进程称为任务(task),进程的虚拟地址空间分为用户虚拟地址空间和内核虚拟地址空间,所有进程共享内核虚拟地址空间,每个进程有独立的用户空间虚拟地址空间。进程有两种特殊形式:没有用户虚拟地址空间的进程称为内核线程,共享用户虚拟地址空间的进程称为用户线程。通用在不会引起混淆的情况下把用户线程简称为线程。共享同一个用户虚拟地址空间的所有用户线程组成一个线程组。Linux进程四要素a.有一段程序供其执行b.有进程专用的系统堆栈空间c.在内核有task_struct数据结构d.有
2021-08-12 11:02:25
433
原创 TCP/IP协议栈 总结(一)
TCP 提供一种面向链接的,可靠的字节流服务。面向链接意味着两个使用TCP的应用(通常一个客户端,一个服务器)在彼此交换数据前必须先建立一个TCP链接。这一过程与打电话很相似,先拨号振铃,等待对方摘机说“喂”,然后才说明是谁。TCP通过下列方式来提供可靠性1.应用数据被分割成TCP认为最适合发送的数据块2.当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。3.当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确.
2021-05-17 17:38:15
428
原创 mysql理解(二)_缓存
MySql主从复制1.主库更新事件(update,insert,delete)通过io-thread写入binglog;2.从库读取binglog,通过io-thread写入(write)从库本地relay log(中继日志);3.从库通过sql-thread读取(read)relay log,并把更新事件在从库中执行(replay)一遍例如微博读写分离架构如下图为什么需要缓冲层?前提读多写少,单个主节点能⽀撑项⽬数据量;数据的主要依据是mysql;mysqlm.
2021-05-13 16:33:56
226
1
原创 mysql基础操作理解(一)
MySql基础按照数据结构来组织、存储和管理数据的仓库;是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合;SQL定义结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。SQL是关系数据库系统的标准语言。关系型数据库包括:MySQL, SQL Server, Oracle, Sybase, postgreSQL 以及 MS Access.
2021-05-13 15:21:20
114
原创 协程漫读
协程的概念协程就是充分利用给线程的CPU的时间,当遇到阻塞,执行下一个任务。协程在应用层提供上下文切换功能,当遇到阻塞时通过让出yield让出,通过协程调度已准备IO的任务,从而不至于阻塞等待IO数据导致的线程阻塞从而影响性能。协程在具备异步性能的同时又具备同步的代码逻辑结构,极具可读性。协程解决了什么问题1.协程解决了同步情况下密集IO的性能低下的问题2.协程解决了异步IO请求处理的复杂性协程如何提高同步情况下密集IO的性能底下的问题协程有两个关键的原语操作,yiel.
2021-04-25 17:33:03
144
原创 网络通信协议浅析
通信协议的设计核心有两点1.解析效率2.可扩展升级协议的设计细节包括1.帧数据完整性判断2.序列化与反序列化3.协议升级4.协议安全5.数据压缩网络通信协议的设计目标为:1.解析效率:互联网业务具有高并发的特点,解析效率决定了使用协议版本的CPU成本2.编码长度:信息编码出来的长度,编码长度决定了使用该协议的网络宽带以及存储成本3.可读性:编码后的数据的可读性决定了使用协议的调试和维护版本(不同的序列化协议是不同的应用场景)4.兼容性:互联网的需.
2021-04-14 22:21:45
364
原创 生成coredump文件
生成core文件 要寻找还未写出的日志消息,需要用到core dump时生成的core文件,但是在默认情况下是不生成的,因此需要先开启。 通过ulimit -c可查看core文件是否开启:如果显示为0,说明未开启,此时可以通过ulimit -c unlimited开启,这里unlimited指的是core文件的最大大小,可以设置为其它数字ulimit -c unlimited可以看到,运行程序生成的可执行文件core_dump,程序发生了异常退出,此...
2021-04-12 10:19:57
464
原创 log4cpp浅析
log4cpp是个基于LGPL的开源项目,移植自Java的日志处理跟踪项目log4j,并保持了API上的一致。其类似的支持库还包括Java(log4j),C++(log4cpp、log4cplus),C(log4c),python(log4p)等。Log4cpp中最重要概念有Category(种类)、Appender(附加器)、Layout(布局)、Priorty(优先级)、NDC(嵌套的诊断上下文)。 Category、Appender与Layout三者的关系如下图所示:...
2021-04-12 09:53:18
4818
原创 try-catch技术探索
不同于其他高级语言,c语言层面没有try-catch的结构,本文通过使用c语言实现该功能的方式探究try-catch的技术原理 先聊一下setjmp和longjmp方法,在c语言中使用setjmp/longjmp实现从一个函数跳转到另外一个函数 使用方法 使用setjmp在代码上设置标签,当调用longjmp时,程序的执行从longjmp处跳转到setjmp设置标签处实现跨函数的跳转。另外在初次调用setjmp时,其返回值为0,如果使用l...
2021-04-07 17:28:49
164
原创 无锁队列理解
由于普通锁的粒度比较大,以至于在并发量高的环境下,锁对于并发性能影响很大,本文章对无锁队列做探索,该无锁队列目前只支持单读单写,上干货 该队列由链表组成,每个节点有N个泛型T组成,该队列实现对T类型元素单读单写的无锁操作,可以方便的用在单生产者消费者模型中 队列的主要元素如下: yqueue_t的实现,每次批量分配⼀批元素,减少内存的分配和释放(解决不断动态内存分配的问题)。 yqueue_t内部由⼀个⼀个ch...
2021-04-05 20:56:11
780
1
原创 对锁的一些理解
如果多个线程访问相同的数据,并且它们中至少有一个修改了数据,那么对共享数据的所有访问必须同步以防止数据竞争。但是,一个正在读取共享数据的线程可能中断另一个正在修改相同共享数据的线程,因此,可能导致线程读取到不一致的数据。 锁的类型分几种,分别是互斥锁,自旋锁,读写锁,以及原子操作,锁的粒度依次降低 互斥锁 mutex是睡眠等待(sleep waiting)类型的锁,当线程抢互斥锁失败的时候,线程会陷入休眠。优点就是节省CPU资源,...
2021-03-31 21:32:32
221
原创 服务端定时器技术理解(一)
服务端在一下业务场景下,需要用到定时器1.⼼跳检测 2.技能冷却 3.武器冷却 4.倒计时 5.其它需要使⽤超时机制的功能对于服务端来说,驱动服务端逻辑的事件主要有两个,一个是网络事件,另一个是时间事件。对这两种事件的处理有两种方式:1.在主线程处理网络事件时,处理时间事件,例如ngnix,redis2.网络事件和时间事件在不同的线程中处理,例如,skynet第一种模式示例代码如下:while (!quit) { int now = get_now_.
2021-03-28 14:46:59
461
原创 异步请求池理解
当业务服务器访问需要等待的服务时,业务访问线程需要等待挂起直到该服务给出反馈,例如对mysql,redis,http,dns等服务的请求,这些请求的返回需要等待一段时间,大大加深了业务服务器的承载压力,也会影响其总体性能,异步请求池就是为解决这个问题应运而生的。异步请求池需要考虑下列问题:1.异步请求使用一个链接还是多个链接2.链接的网络IO的管理问题3.既然是多个链接,发完请求后响应没有接受之前,fd存储在哪里4.请求和响应能否做在一个线程之中为解决以上问题,特提出一下设.
2021-03-26 22:36:46
295
2
原创 内存池的理解(一)
内存池理解(一)内存池就是在组件启动之间,预先申请好的一大块内存,这样在组件中申请和释放内存就可以由内存池统一 管理。由内存池统一管理内存的好处如下(1)可以一定程度有效的防止内存泄漏和内存碎片化(2)当组件出现内存泄漏的时候,有通用的内存池管理可以较为方便的定位组件内存泄漏点内存池的实现有几种方式1.伙伴算法伙伴算法,简而言之,就是将内存分成若干块,然后尽可能以最适合的方式满足程序内存需求的一种内存管理算法,伙伴算法的一大优势是它能够完全避免外部碎片的产生。申请时,伙伴算
2021-03-24 20:28:47
265
原创 线程池学习笔记(一)
线程池线程池是事先申请号的一组线程,不断的对任务队列中的任务处理的并行处理架构,线程池原理如下图如上图,主进程产生任务后,不断的加入到线程池的任务队列中,在加入任务队列时,唤醒线程池中一个线程来处理任务更为实际示例如下图场景下面展示线程池的重要组件,上代码//线程组件typedef struct NWORKER { pthread_t thread; //线程id int terminate; //线程池终止标志 struct NWORKQUEUE *.
2021-03-21 11:18:02
132
原创 epoll,reactor模型理解
网络编程,根本上来说是对网络IO技巧。在对多客户端的网络编程的一个很拥有的方式是通过epoll来管理socfd,通过epoll_create创建epoll对象,通过epoll_ctl加入想要关心sockfd,可以在sockfd相应事件触发时调度sockfd去处理网络数据。通过recv或send发送数据。ractor模型,巧妙的利用epoll_event.data.ptr指针,引入较为复杂的数据结构,可以再触发相应事件的时候,通过回调对事件进行处理struct epoll_event ev;ev.
2021-03-12 20:11:48
617
原创 设计模式原则
设计模式(一)设计模式概念 设计模式是指在软件开发中,经过验证的,用于解决特定环境下,重复出现的,特定问题的解决方案; 经过验证,特定环境,重复出现,这几个性质决定了,设计模式不是一种纯粹的技术,而是一种针对特定行业,特定环境和问题的一种经验复合体。也决定了设计模式的掌握不是一蹴而就的。模式设计原则1. 依赖倒置原则*高层模块不应该依赖低层模块,两者都应该依赖抽象*抽象不应该依赖具体实现,具体实现应该依赖抽象高层模块与低层模块在业务上有关联,低层模块与高层模块都可能发生变化,但是他们的变化
2021-01-22 15:04:02
70
原创 基于KCP的可靠UDP封装
基于KCP的可靠UDP封装交互原理客户端服务端交互过程:1)客户端与服务端都指定端口和IP,客户端服务端启动后,都创建KCP和socket ;2)客户端在启动后,首先向服务端发送链接消息,在服务端未回复链接成功的确认标识时,客户端不断向服务端发送链接请求消息;3)服务端在收到链接请求消息后,重置本地KCP,并向客户端发送链接成功确认消息,并启动服务端心跳,检测客户端消息;4)客户端在收到服务端链接确认消息后,确认链接,并开始不断的向服务端发送心跳消息,以维持客户端与服务端的链接;5)当客户端断
2021-01-21 16:59:15
1490
空空如也
利用EtherNet/IP访问PLC设备,读写数据
2017-12-06
TA创建的收藏夹 TA关注的收藏夹
TA关注的人