自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 memory引擎表在主从复制过程中为什么会导致sql线程中断

1、对memory引擎的操作会不会记录到binlog里,并传到slave进行回放?首先创建一个memory引擎表:然后在表中插入一条记录让我们看看对memory引擎的表进行的操作会不会记录到binlog里可见对memory引擎的表进行的操作会记录到binlog,这里记录的binlog有点奇怪,有#号,像是被注释掉了一样,让我们再看看从库上会不会这条insert语句会不会在从库进行回放。下图为在从库执行的select语句,可见这条insert语句会在从库进行回放。2、为

2020-09-27 01:07:19 206

原创 mysql的自增主键

autotest表是测试表(mysql版本为5.7),结构如下一、insert指定自增主键的值1.insert into指定自增主键的值时,自增主键会变吗?以下是表中数据的初始值接着插入自增主键9如果insert指定自增主键的值不会导致auto_increment值的变化的话,那么接着不指定自增主键的值执行insert语句时,就会插入一条id=8的记录,测试结果如下:可见指定主键执行insert语句时会导致auto_increment的值变化2.当指定自增主键的值

2020-09-16 00:08:25 2273

原创 为什么说外键不加索引会导致死锁

首先建立子表和父表,并在父表上加一个主键,假设表里面有数据create table father (x INT(10), PRIMARY KEY(x));create table son(x INT(10),y INT(10),FOREIGN KEY (X) REFERENCES father (x));然后开启两个事务事务1: ...

2020-01-03 21:56:04 1368

原创 【linux命令】top

首先让我们看看执行top命令会显示些什么信息,下图是在centos(如果没记错应该是centos6.7)上执行free命令显示的界面。接下来让我们来一行一行的看这么多信息是什么意思。第一行:16:35:24表示当前时间;up 93 days,23:47 代表系统运行的时间;2 users表示当前有2个用户在登录;load average:0.00,0.01,0.05分别表示系统一分钟...

2019-12-20 19:02:27 188

原创 【linux命令】 free

上图是在ubuntu16.04上执行free命令的输出信息,-m是让其以MB为单位进行显示。下面让我们来看看每个字段具体的意思。total:代表内存总数used:代表的是当前使用的内存free:代表现在还有多少内存可以使用(不包括buffers和cached中的)shared:代表共享的内存(共享的,在linux里面有很多共享内存,比如一个libc库,很多程序调用,但实际只存一...

2019-12-20 16:33:00 119

原创 文件系统相关

参考下面的文章:https://www.cnblogs.com/zengyiwen/p/6019705.htmlhttps://www.cnblogs.com/alantu2018/p/8461749.html

2019-08-16 21:26:48 101

原创 深度优先搜索和广度优先搜索实现

面试被问到广度优先搜索和深度优先搜索的非递归实现,脑袋瞬间空白.....,之前看过的都瞬间忘记了,还是没有多写所以记得不是很牢靠,所以在这里再写一遍。//dfs递归和非递归实现#include<stdlib.h>#include<iostream>#include<vector>#include<stack>using nam...

2019-08-14 18:49:48 105

原创 epoll的水平触发和边沿触发方式在应用中什么时候会返回可读或可写

水平触发:当我们关注的事件为读事件时,只要缓存中有东西可读,那么就触发;当我们关注的事件为写事件时,只要缓存中有东西可写那么就触发。边沿触发:当我们关注的事件为读事件时:1.当由不可读变为可读时会触发(即BUFFE由空到非空)。2.当可读的内容变多时(即有新的数据到来)会触发。当我们关注的事件为写事件时:1.由不可写变为可写时会触发(即BUFFE由满变为非满)。2.当buffer中...

2019-07-16 17:03:35 598

原创 C++中虚函数能不能声明为private

如果声明虚函数声明为private时编译会报错,但是还是有手段调用声明为private的虚函数的。首先让我们来看看调用声明为private的虚函数时会发生什么情况。#include <iostream>using namespace std;class classB{private: virtual void fun() { cout << "virtua...

2019-07-13 22:11:12 2419 1

原创 c++ lambda原理猜想及验证

猜想:让我们先看看lambda表达式的形式:[capture list] (parameter list) ->return type{function body}。可以看到lambda的第一部分为捕获列表,第二部分为参数列表,第三部分为返回值类型,第四部分为函数体。就是这样一个表达式,那么c++是怎么处理它的呢。猜想c++会构建一个类,然后capture list中的参数作为类中的成...

2019-06-26 22:42:22 130

原创 C++移动语义和完美转发

移动语义和完美转发都是通过C++的右值引用来实现的。关于什么是右值引用可以去看看C++ primer这本书。1、移动语义首先,很多人会想,为什么我们有了拷贝赋值以后为什么还要有移动语义呢。我们先来看一个例子,假设我们有个类A和类B(两个类都是class test类型,见下图),假如我们想把类A赋值给类B(类A中有通过new分配的内存空间),传统的赋值拷贝是要再申请一块内存空间给B,然后...

2019-06-12 22:19:11 705

转载 malloc,mmap

http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201210975312473/http://blog.sina.com.cn/s/blog_7c60861501015vkk.htmlLinux 的虚拟内存管理有几个...

2019-06-12 20:29:49 272

转载 为什么多线程读写 shared_ptr 要加锁?

为什么多线程读写 shared_ptr 要加锁?陈硕(giantchen_AT_gmail_DOT_com)2012-01-28最新版下载:http://chenshuo.googlecode.com/files/CppEngineering.pdf我在《Linu...

2019-05-28 23:54:00 168

原创 对sleep(0)和sched_yield一点理解

在了解sleep(0)和sched_yield之前先让我们看看linux是怎么调度的(这里只讲CFS)1.CFSCFS不会根据优先级分配一个不变的运行时间,比如说分配5ms这样的,它是一个分配占用处理器比例的一个分配算法。CFS的做法是允许每个进程运行一段时间,循环轮转,选择运行最少的进程(通过vruntime来判断,下面可以看到vruntime是怎么计算的)作为下一个运行进程,而不再采用...

2019-05-25 23:35:47 1126

原创 C++中volatile变量测试

volatile有好几个特性,让我们来验证一下1.对声明为volatile的变量操作时,每次都会从内存中取值,而不会使用原先保存在寄存器中的值。 让我们看一下两个例子,一个例子是对不声明为volatile的变量操作,一个例子是对声明为volatile的变量操作。编译器为gcc version 4.8.4,平台为32位ubuntu14.04,开启了一级优化,即g++ -O1 ...

2019-05-25 19:08:07 292

原创 epoll_wait返回事件的测试

由epoll返回的事件可以有EPOLLIN,EPOLLOUT,EPOLLRDHUP,EPOLLPRI,EPOLLERR,EPOLLHUP。关于EPOLLIN,EPOLLOUT,EPOLLPRI相信大家都熟悉,EPOLLIN代表有数据可读,EPOLLOUT代表可写,EPOLLPRI代表有带外数据可读。接下来让我们关注一下EPOLLRDHUP,EPOLLERR,EPOLLHUP事件...

2019-05-22 11:18:15 3675

原创 生成1-n的不重复的随机数,1-n都会出现

1.让我们先来看一种粗暴的解法​#include <stdio.h>#include <stdlib.h>#include <time.h>#define N 100int main() { int i, j, flag, num, a[N]; srand((unsigned)time(NULL)); for (i = 0; i &...

2019-05-21 22:28:30 722

原创 二叉树的前序,中序,后序遍历的非递归实现

下面所有的测试都是基于这颗树来的,如果有什么边界条件没注意到,麻烦告诉我一下,谢谢!1.中序遍历讲一下边界条件:除了判断save是否为空外为什么还要加一个判断temp是否为空,因为当你遍历完左子树然后遍历根节点时save已经为空了,但是还有右子树需要遍历。2.前序遍历3.后序遍历...

2019-05-21 18:55:11 197

原创 static_cast,const_cast,reinterpret_cast,dynamic_cast

1.static_cast 在c++primer中提到,任何具有明确定义的类型转换,只要不包含底层const(关于什么是底层const什么是顶层const可以去c++primer看一下),都可以使用static_cast,如把double类型的对象转换成int类型的对象。但是书中没有提到的是,把一个类转换成另一个类(两个类之间没有关系)的时候编译器会报错。看下面代码。...

2019-05-21 12:15:07 179

转载 一致性哈希原理

转载自https://www.cnblogs.com/lpfuture/p/5796398.html一致性Hash算法背景  一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得DHT可以在P2P环境中真正得到应用...

2019-05-21 10:37:59 109

转载 bitmap

两个月之前——为满足用户标签的统计需求,小灰利用Mysql设计了如下的表结构,每一个维度的标签都对应着Mysql表的一列:要想统计所有90后的程序员该怎么做呢?用一条求交集的SQL语句即可:...

2019-05-21 01:27:13 133

原创 缓冲的设计

本人实现了一个buffer,该buffer相当于一个环形缓冲区,添加数据时内部数据不需要挪动位置。该缓冲并没有实现缓冲的收缩功能以及对字节大小端的转换,如果需要稍微改进下就可以了。有兴趣的可以在GitHub上下载:https://github.com/xiaowenmu/buffer...

2019-05-17 16:14:12 287

原创 epoll在多线程下的使用

首先让我们思考一个问题,当一个进程正在阻塞在epoll_wait的时候,另一个线程调用epoll_ctl时会发生什么呢,这个动作安全吗?测试当epoll_wait期间另一个线程执行epoll_ctl是否安全其实这种动作是安全的(测试平台为linux,内核为4.4版本),先看一下man里面的描述,可见是安全的。1.下面让我们来测试一下,首先把fd2加入监听,然后再调用epoll_wa...

2019-05-11 14:10:46 8779

原创 vector内存分配浅析

STL中vector的内存分配原则是分配为2倍的,为什么是2倍呢,让我们来分析一下。其实分配内存就是在时间和空间上做一个平衡,如果每次增加的内存很少,那么在空间上浪费的就要少一点,但是时间耗费的要多。如果每次增加的内存很多,那么重新分配的次数就要少一点,时间耗费的也要少一点,但是浪费的空间就要多一点。可能有的人对空间浪费的说法不太清除,我在这里简单说明一下。假设每次增加内存时都以常数c增加,那...

2019-05-10 14:16:39 2844

原创 线程池的简单实现

本文讲述的是实现一个简单的线程池,用户只需要把任务放进线程池里面,然后线程池会自己取任务然后去执行。下面是代码。任务是由队列管理的,以保证任务按先入先执行的规则。在队列中添加任务和删除任务之间要实现互斥访问队列,所以先实现一个互斥锁类。其中RETCHECK是我们还要实现一个条件变量,后面可以用上它,只是做一些简单的封装下面是线程的实现下面是线程池...

2019-05-09 20:09:25 96

原创 MESI(缓存一致性协议)

现在的处理器都是多核处理器,并且每个核都带有多个缓存(指令缓存和数据缓存,见下图)。为什么需要缓存呢,这是因为CPU访问内存的速度比较慢,所以在CPU和内存之间加了个缓存以提高访问速度。既然每个核都有缓存,那么假设两个核或者多个核同时访问同一个变量时这些缓存是如何进行同步的呢(缓存细分为一个个缓存行),这就有了MESI协议。缓存行的四个状态:MESI中每个缓存行都有四个状态,分别是E(...

2019-04-30 12:49:42 40980 22

原创 linux定时器timerfd系列函数学习

使用timerfd的好处是可以结合epoll或poll或select使用,当超时时间到时epoll等会返回可读。1.int timerfd_create(int clockid,int flags)timerfd_create返回一个文件描述符,该文件描述符和定时器所关联。clockid:clockid可以为CLOCK_REALTIME或者CLOCK_MONOTONIC。最好使...

2019-04-29 17:09:32 642

原创 对C++构造函数与析构函数以及成员的构造和析构顺序理解

1.对象构造过程中执行的顺序(1)先构造基类的成员(2)执行基类的构造函数(在执行构造函数里我们写的代码之前基类的成员已经创建好了)(3)构造派生类的成员(4)执行派生类的构造函数由输出结果可知,先构建基类b的成员也就是c,再执行基类b的构造函数。然后再构造派生类a的成员d,然后再执行a的构造函数。2.对象析构过程中的执行顺序(1)先执行派生类的析构...

2019-04-25 21:00:52 1017

原创 C++类型转换

在讲类型转换之前,我们先说一下数字是怎么在计算机中存储的。其实数字在计算机中都是用二进制0,1表示的,比如说int a = 3,那么它在计算机中的存储格式为00000000000000000000000000000011。负数是以补码的形式存储的,关于补码可以自己去了解下,这涉及到源码反码的概念。1.比int小的首先转换成int,unsigned int,long,unsigned long,...

2019-04-25 10:45:32 1060

原创 当一个会话中的后台作业写终端时会发生什么情况(SIGTTOU 和SIGTTIN信号)

在一个会话中只有前台进程组能够读写终端,但是当后台进程读写终端会发生什么情况呢。1.上面的测试案例是测试写到终端的情形,执行这个程序之前,先执行命令 stty tostop ,禁止后台作业输出至控制终端。再执行上面的程序,用trace来追踪可见该进程收到了SIGTTOU信号并且停止了。再把程序放在前台来,又能正常运行了2.让我们再测试一下读会怎么样,测试代码如下让...

2019-04-23 22:27:00 357

原创 数据手册中的本地内存映射和全局内存映射

假设有两个核心,每个核心上有L1,L2两个高速缓存。核心0的记为L1(0),L2(0),核心1的记为L1(1),L2(1)。则核心0既可以通过本地内存映射的地址访问L1(0),L2(0),也可以通过全局内存映射地址访问L1(0),L2(0)。核心1既可以通过本地内存映射的地址访问L1(1),L2(1),也可以通过全局内存映射地址访问L1(1),L2(1)。但是当核心0想要访问L1(1),L2(1)...

2019-04-23 10:44:04 329

原创 静态链接库和动态链接库

前言:记得以前看过一点静态链接库和动态链接库的东西,今天想去再看一下,搜了好几篇文章看了下,内容大都有错,所以决定自己写一篇关于静态链接库和动态链接库的东西。有的可以在深入理解计算机系统上可以找到。在讲这篇文章的问题之前,首先简单介绍一下编译的四个阶段。1.预处理在预处理阶段编译器只是把头文件展开,并在使用宏定义的地方用原来的东西替换。如下所示 ...

2019-04-23 10:39:58 144

原创 网络编程中epoll_create的参数和listen的参数

1.epoll_create的参数在linux2.6内核之后就没有什么作用了,这个参数会被忽略,但是必须要大于0。见下图2.listen函数的第二个参数视实现不同而不同(有的实现把backlog*1.5当作未完成连接的最大数,有的实现把backlog当作已完成连接队列和未完成连接队列之和),在linux4.4内核上该值表示未完成连接队列的最大值。可以通过man listen来查看。以下是我...

2019-04-18 22:34:00 1303 1

原创 文件描述符状态标志

目前只有一种文件描述符状态标志FD_CLOEXEC,它的作用就是标志着执行exec时该文件描述符会不会主动关闭。如果清除了该标志,就表明执行exec时该文件描述符不会关闭。系统的默认操作是在exec后仍保持这个文件描述符为打开状态。dup、dup2和fcntl对文件描述符状态标志的影响1.新描述符的执行时关闭标志总是由dup函数清除,这样当执行exec时新描述符保持打开状态。2.先看一...

2019-04-13 14:59:34 669

原创 linux下几种情况下的文件共享情况

内核使用3种数据结构表示打开文件,它们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响。(值得注意的是如果共享文件表项的话那么它们也共享文件偏移量,对文件进行读写操作的时候需要注意这一点)(1)每个进程在进程表中都有一个记录项,记录项中包含一张打开文件描述符表,可将其视为一个矢量,每个描述符占用一项。与每个文件描述符相关联的是:a.文件描述符标志(close_on_exec...

2019-04-13 13:39:26 283

原创 linux下守护进程的创建和sighup信号

先来说下我理解的守护进程:守护进程没有控制终端,我觉得可以把它理解为一个后台进程。本篇文章假设读者知道什么是进程组与会话。下面看一下unix环境高级编程中守护进程的创建流程:1.首先在进程中调用fork进程,这样就能保证子进程不是进程的组长进程(因为进程组的组长进程不能调用setsid创建新的会话),然后结束掉父进程。这时子进程就变成了会话首进程,并且创建了一个会话。2.接下来在会...

2019-04-11 17:19:09 530 1

原创 arm汇编的学习

一.处理器模式(不同架构可能会有所不同,比如cotex A系列的多了几种模式) 模式 描述 Supervisor (SVC) 当复位或者软中断(SWI)指令被执行时进入 特权模式 FIQ 一个高优先级的快速中断产生时进入 ...

2019-04-11 15:41:40 1566

原创 omap138平台上uboot打印串口的修改

经过修改,可以在omapl138平台上达到想要的目的(把打印串口由uart2改为uart1)。一、在da850sdi.h里面1.#define CONFIG_SYS_NS16550_COM1 DAVINCI_UART2_BASE /* Base address of UART2 */改成 #define CONFIG_SYS_NS16550_COM1 DAVINCI_...

2019-04-11 15:14:09 508

转载 转:git用法

一:Git是什么?  Git是目前世界上最先进的分布式版本控制系统。  二:SVN与Git的最主要的区别?  SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网...

2019-03-11 16:32:36 65

原创 对于写递归程序的一点浅显理解

首先写出在《数据结构与算法分析:c语言描述》看到的关于写递归的四条基本法则:                                       1.基准情形                                       2.不断递进                                       3.设计法则(假设所有的递归调用都能运行)    ...

2018-09-05 16:10:41 398

linux简单命令

简单介绍linux命令 .....................................................................................................................................

2018-01-17

空空如也

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

TA关注的人

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