自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(79)
  • 收藏
  • 关注

原创 vue quickstart

创建工程cnpm install -g vue-cli vue init webpack project cnpm install cnpm run devaxios//main.jsimport VueAxios from 'vue-axios';import axios from 'axios';Vue.use(VueAxios, axios);//demo1.vue<script>export default {name: "demo1",met

2020-12-11 14:00:55 201

原创 git cookbook-最佳实践

git 最佳实践总结一下日常工作中的git的使用实践使用场景:多人协同开发同一个项目模块需要解决冲突,越早解决冲突越好本地master分支最好经常pull,越频繁的把远程master分支merge到本地Master,越能减少冲突的出现git的每次commit都是一个全量数据,svn每次提交都是一个增量数据git 的每次commit都应该是一个有意义的可执行的全量代码,而不应该是一些fix bug的提交如果修改了代码还不想commit记录,用commit --amend修改commit记

2020-08-04 14:24:37 312

原创 SIGBUS SIGSEGV

SIGSEGV只读映射区写数据SIGBUS一些硬件内存对齐要求

2020-04-29 17:20:15 237

原创 static inline

## inlineinline仅仅是展开替换,不存在函数入口,如果放在.h中,会重复引用,所以配合static 使用

2020-04-29 16:57:12 186

原创 EINTR

慢系统调用可能永远阻塞的系统调用EINTR调用系统调用被中断,返回错误码EINTR触发例子,永远阻塞的系统调用进程,接收到信号,执行注册的信号回调函数,慢系统调用被中断,触发EINTR处理重复系统调用忽略错误...

2020-04-27 17:48:25 815

原创 用户态到内核态

通过系统调用,外围设备中断,异常都可以进入到内核态,主要说一下系统调用过程。PCBPCB是进程控制块,是一个存放进程信息的结构体,主要包括 进程id 进程的状态:就绪,运行,挂起,停止 进程切换时需要保存和恢复的一些寄存器 文件描述符 用户id,组id 信号相关信息 信号信号本质是给PCB写入信息,改变进程相关信息,进程去处理...

2020-03-12 10:43:02 162

转载 数据库b+树

首先来回答一个问题:为什么在磁盘中要使用b+树来进行文件存储呢?原因还是因为树的高度低得缘故,磁盘本身是一个顺序读写快,随机读写慢的系统,那么如果想高效的从磁盘中找到数据,势必需要满足一个最重要的条件:减少寻道次数。我们以平衡树为例进行对比,就会发现问题所在了:先上个图这是个平衡树,可以看到基本上一个元素下只有两个子叶节点抽象的来看,树想要达成...

2020-02-22 18:13:43 942

原创 无锁队列

cas:bool compare_and_swap(int* ret, int oldval, int newval){ if (*ret == oldval) { *ret = newval; return true; } return false;}gcc cas:bool __sync_bool_compare_an...

2020-02-05 12:20:33 186

原创 linux内核(二) epoll源码之锁的使用

本文重点针对epoll源码中锁的使用,2.6.22.6源码中,epoll使用了三个锁,一个spin_lock,一个mtx,一个全局的mtx1.ep->lock (spinlock)使用自旋锁的原因是poll 回调函数可能会从wake_up()调用,可能涉及到中断上下文,而中断是不能被睡眠的,所以只能用自旋锁.2.ep->mtx (mutex)因为poll事件循环可能涉及...

2019-12-24 17:55:13 295

原创 linux内核(一)linux内核同步,spin_lock与中断以及内核抢占,信号量和互斥锁,屏障,原子操作,BLK大内核锁,读写锁(一)

注:代码为linux内核版本为2.6.22.6以及4.4.32,不代表其他版本内核的实现方式spin_lock与spin_lock_irqsave自旋锁是内核中最常见的锁,也就是线程争用被持有的自旋锁时,并不会睡眠挂起而是在busyloop等待锁重新可用,因此自旋锁更适用于时间短,加锁不睡眠的场景,由于信号量和互斥锁在挂起的时候需要让出cpu执行别的线程,因此涉及到两次上下文切换,当上下文...

2019-12-21 15:28:58 187

原创 gcc linux利用CAS实现无锁编程

利用__sync_bool_compare_and_swap(),实现无锁编程CAS即compare and swap,每次都会和old 值进行比较,如果没有发生更改再用new值给ptr赋值,然后返回true#include <bits/stdc++.h>#include <pthread.h>#include <stdlib.h>#includ...

2019-12-11 18:28:19 843

原创 gcc linux 利用原子操作实现无锁编程

_ATOMIC_ADD_和_ATOMIC_SUB_是我实现的两个宏,分别对应__sync_fetch_and_add(x, y) __sync_fetch_and_sub(x,y)x需要传地址,y为要加/减的数,可以替代多线程mutex编程#include <bits/stdc++.h>#include <pthread.h>#include &...

2019-12-11 16:37:15 320

原创 分布式事务 CAP定理,BASE理论与数据库事物的ACID强一致性模型

先看看mysql中的事务四大特性:也就是ACID A:原子性(Atomicity) 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。就像你买东西要么交钱收货一起都执行,要么要是发不出货,就退钱。 C:一致性(Consis...

2019-12-08 14:54:43 534

原创 开源网络库owl分析(一)reactor模式分析

代码地址:https://github.com/xunshuidezhu/owlowl是本人开发的一个基于reactor架构的网络库,包含了reactor模型,日志库,协程库,http模块,计时器,采用epoll LT模式,配合协程的使用,可以轻松实现异步网络io,而不必采用非阻塞io+epoll的多线程并发模型.网络库的核心模型为reactor模式,主要有demultiplexer也就是...

2019-12-05 15:47:08 611 1

原创 生产者消费者与阻塞队列

队列以及锁和条件变量的封装,注意队列的阻塞在生产者消费者代码中实现,代码中的队列只负责任务的生产消费场所#include <bits/stdc++.h>#include <pthread.h>#include <unistd.h>using namespace std;struct Data { int data;};class...

2019-12-05 15:33:37 152

转载 linux内核问题

1) Linux中主要有哪几种内核锁?2) Linux中的用户模式和内核模式是什么含意?3) 怎样申请大块内核内存?4) 用户进程间通信主要哪几种方式?5) 通过伙伴系统申请内核内存的函数有哪些?6) 通过slab分配器申请内核内存的函数有?7) Linux的内核空间和用户空间是如何划分的以32位系统为例)?8) vmalloc()申请的内存有什么特点?9) 用户程...

2019-11-30 22:03:56 235

原创 c++ 装饰器设计模式

装饰器设计模式就是在原有类的基础上增加一些装饰功能,顶层的接口实现子类作为要实例化的对象,传到装饰器中,增加特定装饰器的功能,我习惯用代码解释,直接看代码.这段代码包含了两个例子,都是先定义一个顶层的接口,然后定义装饰器抽象类,里面维护了一个接口的指针,在具体的装饰器中,通过构造函数传递顶层接口的实现子类指针,借助多态机制实现装饰功能.#include <bits/stdc++.h...

2019-11-24 15:04:31 170

原创 c++ pimpl编程技法

之前写过一次关于pimpl的博文,最近写代码又频繁遇到这个,再次总结一次.先来看一段代码,这段代码中无论Impl中的print函数如何更改,客端调用Shape的print接口都不用更改,因此降低了接口的耦合性.屏蔽掉了接口的具体实现方式.另一个作用就是降低了头文件之间的依赖关系,大大降低编译时间#include <bits/stdc++.h>using namespace...

2019-11-24 14:57:28 181

原创 gdb调试 显示代码

1.gdbtuigdbtui -q 需要调试的程序名 【用gdb -tui可以进入】直接使用 GDB 调试代码,在需要的时候使用切换键Ctrl + X + A调出 GDB TUI 。2.layout1. 显示源代码窗口(gdb) layout src2. 显示寄存器窗口(gdb) layout regs3. 显示汇编代码窗口(gdb) layout ...

2019-11-17 16:32:24 1909

原创 k-v存储引擎设计

存储引擎设计存储引擎会设计成k-v,也就是键值对,按时间序列和图像帧以及雷达帧进行存取。核心数据结构采用跳表-哈希表-双向链表,具体分为时间序列-帧序列跳表,通道号(根据通道号可分辨雷达数据or图片数据)哈希表,数据存储链表。时间序列-帧序列跳表的key会分为2个级别,第一个级别的key存储的是时间序列,由于同一时间序存在多个帧序列,而帧序列可以看成时间序列的子序列,因此按第一级跳表可以找到某...

2019-10-31 15:46:19 570

原创 应用层协议设计

应用层报文协议设计为了让数据能够按时间序列存储以及按时间序列设计索引取出数据,并且能够在应用层对数据包进行校验,能够用过状态机编程以实现数据的检验,重传,成功发送等多种状态。具体设计如下:时间戳字段,字段名time_stamp, 数据格式 time_t, 由七个uint16_t构成的结构体,分别表示年-月-日-时-分-秒-毫秒。时间戳字段一方面用于作为数据传输的校验功能,另一方面用于数...

2019-10-31 15:43:44 1497

原创 位图bitmap数据结构详解与实现

当数据量很大而每个数据的状态又很少的情况时候,可以用位图来设计存储数据的容器。在地址空间中,栈是向下生长的,如果用int32_t来作为一个存储单元,则每32位可以看作一组,底层的数据结构可以连续的数组,则原本用32个字节才可以表示一个状态现在可以用一个字节表示一个状态。在数据插入位图的时候,用位或运算,在查找的时候,用位与运算。代码如下:#include <iostream...

2019-10-21 15:52:47 2199

转载 c++实现反射

https://blog.csdn.net/q1007729991/article/details/56012253

2019-10-07 16:15:56 166

原创 gcc大全

1。gcc包含的c/c++编译器gcc,cc,c++,g++,gcc和cc是一样的,c++和g++是一样的,一般c程序就用gcc编译,c++程序就用g++编译2。gcc的基本用法gcc test.c这样将编译出一个名为a.out的程序gcc test.c -o test这样将编译出一个名为test的程序,-o参数用来指定生成程序的名字3。为什么会出现undefined referen...

2019-10-05 18:30:57 606

原创 operator++()与operator++(int)以及前置后置递增与左值右值的关系

如果需要重载++或者--,编译器怎么确定是前置还是后置,其实前置后置是不同的写法。先上结论,operator++()是前置也就是++i,operator++(int)是后置也就是i++。++i返回的是引用,前置递增、递减运算符返回的是左值,后置递增,递减返回的是右值。上代码:class A {public: int a;public: A& oper...

2019-09-06 16:27:18 1030

原创 stl容器内部数据结构

1.vector 底层数据结构为数组 ,支持快速随机访问2.list 底层数据结构为双向链表,支持快速增删3.deque 底层数据结构为一个中央控制器和多个缓冲区,详细见STL源码剖析P146,支持首尾(中间不能)快速增删,也支持随机访问...deque是一个双端队列(double-ended queue),也是在堆中保存内容的.它的保存形式如下...

2019-09-01 19:38:04 272

原创 环形缓冲区

本来是leetcode 一道题,环形缓冲区也是一样的设计思路,记录一下class MyCircularQueue {private: vector<int> data; // 存放循环队列的数据 int head; // 循环队列头 int tail; // 循环队列尾 int len; // 循...

2019-09-01 19:33:00 179

原创 设计模式六大原则

1.单一原则(Single Responsibility Principle):一个类只负责一项职责,尽量做到类的只有一个行为原因引起变化;  a、业务对象(BO business object)、业务逻辑(BL business logic)拆分;2.里氏替换原则(LSP liskov substitution principle):子类可以扩展父类的功能,但不能改变原有父类的功能;...

2019-08-30 16:05:31 61

原创 脏读,幻读,不可重复读

脏读:事务A读到了事务B未提交的数据。脏读:指一个事务读取了另外一个事务未提交的数据。不可重复读:事务A第一次查询得到一行记录row1,事务B提交修改后,事务A第二次查询得到row1,但列内容发生了变化。幻读:事务A第一次查询得到一行记录row1,事务B提交修改后,事务A第二次查询得到两行记录row1和row2。...

2019-08-21 17:04:43 83

原创 正则表达式总结

正则总结:\将下一个字符标记符、或一个向后引用、或一个八进制转义符。例如,“\\n”匹配\n。“\n”匹配换行符。序列“\\”匹配“\”而“\(”则匹配“(”。即相当于多种编程语言中都有的“转义字符”的概念。^匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。$匹配输入字符串的结束位置。如果设置了RegExp...

2019-08-17 20:03:30 83

转载 UML类图详解

UML类图在架构设计中还是很重要的,一篇总结类图很好的文章UML类图与类的关系详解虚线箭头指向依赖;实线箭头指向关联;虚线三角指向接口;实线三角指向父类;空心菱形能分离而独立存在,是聚合;实心菱形精密关联不可分,是组合;上面是UML的语法。在画类图的时候,理清类和类之间的关系是重点。类的关系有泛化(Generalization)、实现(Realization...

2019-08-06 10:57:25 409

原创 服务器架构设计模式(一)

相比与单机程序设计,多机分布式程序面临着更多的挑战,比如网络通信,多机并发,临界区同步,事件的分离与处理,不同操作系统的移植性。要想开发出健壮的,性能优秀的,跨平台的服务器/中间件,需要十分有经验的架构师,开发能力十分强悍,对底层认识很深的程序员。而设计模式帮助缓解了很多内在的和偶然的软件复杂性。模式是在特定环境中针对一个标准问题的可重复解决方案。设计模式是大师用他们的经验来帮助我们解决各种通用问...

2019-08-03 12:55:22 1158

原创 udp实现可靠传输

做项目正好需要用可靠传输UDP来做传输层,基本思路还是在应用层模仿TCP,超时重传,滑动窗口等机制,三次握手,四次挥手过于复杂,简化成了2次握手,仅确认SEQ或者ACK,如果没有收到正确的报文则重传报文。数据包在发送之前会先存到数据队列,实现缓存,每次发包从数据去取,超时重传时间,超时重传最大次数也要设置,以防止进程被阻塞。...

2019-07-23 22:00:48 276

原创 c和c++内存模型

C分为四个区:堆,栈,静态全局变量区,常量区C++内存分为5个区域(堆栈全常代 ): 堆 heap : 由new分配的内存块,其释放编译器不去管,由我们程序自己控制(一个new对应一个delete)。如果程序员没有释放掉,在程序结束时OS会自动回收。涉及的问题:“缓冲区溢出”、“内存泄露” 栈 stack : 是那些编译器在需要时分配,在不需要时自动清除的存储区。存放局部变...

2019-07-15 22:16:26 307

转载 c++内存对象模型

http://mp.blog.csdn.net/postedit

2019-07-15 22:13:13 118

原创 mutable

常函数就是带const修饰的函数,为什么要有常函数这个概念,因为为了封装的良好性,优势我们用到的一些函数并不需要我们去改变类中的参数,和成员变量,仅仅只是为了显示和输出的作用,因此才引进常函数,multable的英文意思主要是可变的,我们了解到c++中,一件事情并不是绝对的,如果有常函数,那么一定有可以修改的方法,这里就用到了这个关键字。。看一下下面的代码下面是一个小例子:class...

2019-07-15 15:44:17 104

原创 trivial,non-trival, pod

Trivial(平凡)和Non-Trivial(不平凡)是对于class(类)的或者类中的四个函数而言的:  1.构造函数  2.拷贝构造函数  3.赋值函数  4.析构函数Trivial其中Trivial(平凡)的概念本人的理解是无意义的,Trivial是相对于Non-Trivial而言的。Non-Trivial对于Non-Trivial而言的,如果上面四种函数满...

2019-07-15 14:08:22 1051

转载 reactor模式与事件驱动

https://blog.csdn.net/baidu20008/article/details/41378761

2019-07-14 13:48:24 292

原创 tcp长连接保活与心跳机制

TCP Keepalive的起源TCP协议中有长连接和短连接之分。短连接环境下,数据交互完毕后,主动释放连接;长连接的环境下,进行一次数据交互后,很长一段时间内无数据交互时,客户端可能意外断电、死机、崩溃、重启,还是中间路由网络无故断开,这些TCP连接并未来得及正常释放,那么,连接的另一方并不知道对端的情况,它会一直维护这个连接,长时间的积累会导致非常多的半打开连接,造成端系统资源的消耗和浪...

2019-07-13 12:36:37 3107

原创 服务器设计:心跳机制

心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制。应用场景:在长连接下,有可能很长一段时间都没有数据往来。理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。在这个时候,就需要我们的心跳包了,用于维持长连接,保活什么是心跳机制?...

2019-07-13 12:05:38 896

空空如也

空空如也

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

TA关注的人

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