自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

程序员的自我修养

积跬步 积小流

  • 博客(255)
  • 资源 (1)
  • 收藏
  • 关注

原创 C++继承与构造函数、复制控制

每个派生类对象由派生类中定义的(非static)成员加上一个或多个基类子对象构成,因此,当构造、复制、赋值和撤销派生类型对象时,也会构造、复制、赋值和撤销这些基类子对象。        构造函数和复制控制成员不能继承,每个类定义自己的构造函数和复制控制成员。像任何类一样,如果类不定义自己的默认构造函数和复制控制成员,就将使用合成版本。 1:构造函数和继承       派生类的构造函

2017-07-09 09:34:51 3384

原创 C++继承相关知识点总结

1:派生类继承基类的成员并且可以定义自己的附加成员。每个派生类对象包含两个部分:从基类继承的成员和自己定义的成员。        每个派生类对象都有基类部分,包括基类的private成员。类可以访问共基类的public 和 protected 成员,就好像那些成员是派生类自己的成员一样。派生类不能访问基类的 private 成员。也就是说,虽然派生类继承了基类的私有成员,但是不可访问。比如下面

2017-07-09 09:22:40 793

原创 编译时混合使用动态库和静态库

编译某个

2017-07-07 21:18:00 3106

转载 STL 的 erase() 陷阱-迭代器失效总结

下面材料整理自Internet&著作。TL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时,需要注意一些问题。1.list,set,map容器在使用 list、set 或 map遍历删除某些元素时可以这样使用:1.1 正确

2017-06-30 08:23:55 797

原创 非阻塞模式下,虽然connect出错,但是getsockopt取得的错误却是0的问题

调试项目代码时,发现了一个奇怪问题,记录如下:    非阻塞模式下,connect发起建链,返回-1(这在非阻塞模式下是很正常的现象)。然后将该socket的写事件进行监听,在写事件触发后,getsockopt函数获取错误时,没有检测到发生错误(第三个参数返回0),最后在write操作时,发生错误。    原因:因配置文件的问题,导致得到的对端IP地址为空字符串"": struct s

2017-06-24 21:52:46 3009

原创 利用backtrace和ucontex定位segment错误

C程序运行时,经常会碰到”segmentfault”错误。这是由于程序中非法访问内存导致的。当操作系统的内存保护机制发现进程访问了非法内存的时候会向此进程发送一个SIGSEGV信号,导致进程直接退出,并在shell中提示segment fault。          因此,可以通过设置SIGSEGV信号处理函数,在处理函数中调用backtrace系列函数得到异常时的函数调用栈信息。

2016-12-26 09:28:09 1925

转载 内存管理:03高端内存简介

一:通俗解释        内核空间和用户空间的地址都是虚拟地址,都要经过 MMU 的翻译,变成物理地址。用户空间的虚拟地址,通过查询页表来翻译,而内核空间虚拟地址是所有进程共享的,而且从效率角度看,如果同样走页表翻译的流程,速度太慢;于是,内核在初始化时,就创建内核空间的映射(因为所有进程共享,有一份就够了),并且,采用的是线性映射,而不是走页表翻译这种类似哈希表的方式。这样,内核地址的翻译

2016-10-09 18:28:43 943

原创 内存管理:02虚拟存储器

现代系统提供了虚拟存储器的概念,它是对物理内存的抽象。虚拟存储器是硬件异常,硬件地址翻译,主存,磁盘文件,操作系统的完美交互,它为每一个进程提供了一个大的,一致的私有的地址空间。        虚拟存储器提供了下面的几种能力,1:它将主存看成磁盘的高速缓存,并且根据需要在主存和磁盘之间传送数据。2:为每个进程提供一致的地址空间,简化存储管理。3:保护每个进程的地址空间不被其他进程破坏。

2016-10-08 20:14:43 1626

原创 内存管理:01存储器层次结构

在日常的编程中,我们简单的把存储器系统看成一个线性的字节数组,但实际的存储系统并不是这样的。         存储器系统是一个由具有不同容量,不同成本,不同访问时间的若干存储设备组成的层次结构,从上到下依次是:寄存器,高速缓存存储器,主存,硬盘,网络文件。层次越高,容量越小,成本越高,访问时间越短,高层的存储设备是底层存储设备的缓存区。这样,一个编写良好的程序总是倾向于频繁的访问某一个层次上的

2016-10-08 18:47:28 2308

翻译 互斥锁和内存可见性

一:引言         POSIX线程遵循一种共享状态的并发模型。在这种模型中,若干线程同时访问共享对象时,需要在线程间有合适的协调机制。特别是,需要以下特性来简化这种模型中的编程:         原子性访问:当某个线程正在修改共享对象时,需要避免另一个线程访问它;         内存可见性:一旦某个线程修改了共享对象,我们希望当修改发生后,在另一个线程中就能立即得到最新的状态。

2016-08-26 17:04:34 3589

翻译 条件变量用例--解锁与signal的顺序问题

我们知道,当调用signal/broadcast唤醒等待条件变量的其他线程时,既可以在加锁的情况下调用signal/broadcast,也可以在解锁的情况下调用。         那么,到底哪种情况更好呢?man手册中其实已经给出了答案:         The pthread_cond_broadcast() or pthread_cond_signal() functions may

2016-08-24 16:35:37 5176 1

原创 服务端编程中多线程的应用

本文是陈硕的《Linux多线程服务端编程  使用muduo C++网络库》一书中,第三章的读书笔记。其中暗红颜色的文字是自己的理解,鲜红颜色的文字表示原书中需要注意的地方。 一:进程和线程         每个进程有自己独立的地址空间。“在同一个进程”还是“不在同一个进程”是系统功能划分的重要决策点。《Erlang程序设计》[ERL]把进程比喻为人:         每个人有自己的

2016-08-11 18:52:46 4687

原创 负载均衡之加权轮询算法

在介绍加权轮询算法(WeightedRound-Robin)之前,首先介绍一下轮询算法(Round-Robin)。  一:轮询算法(Round-Robin)  轮询算法是最简单的一种负载均衡算法。它的原理是把来自用户的请求轮流分配给内部的服务器:从服务器1开始,直到服务器N,然后重新开始循环。  算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。 

2016-07-31 09:30:10 40393 6

转载 负载均衡的那些算法们

负载均衡的那些算法们by:简单的老王 上周发了问卷,想了解一下大家对老王有没有什么建议,然后好多朋友都投了票,想了解编程技术和服务器架构的干货,所以接下来会先聊聊编程和架构相关的算法,然后大概在6月下旬会跟大家聊聊面试那些事儿(老王到目前大约参加了几百次的面试,可以从面试官的角度来聊聊不一样的面试)。老王聊技术有个特点,就是绝不假大空,只求贴地飞行。所以,聊的东西一定会跟实际有关联

2016-07-31 09:20:47 993

原创 进程保活方法

mysql-proxy源码中,使用了一种进程保活的方法。这种方法的基本原理是:当父进程完成基本的初始化后,创建子进程,由子进程继续后面的主体逻辑。而父进程wait子进程的退出状态。一旦发现子进程是由于收到信号而退出的,则重启子进程。         这种方法的实现代码如下:#include #include #include #include #include #include #

2016-07-23 08:20:25 1775

原创 05Dockerfile简介

Dockerfile是一个用于构建Docker镜像的文本文件,其中包含了创建Docker镜像的全部指令。基于这些指令,可以使用”docker  build”命令来创建镜像。 一:用法         ”docker  build”命令通过Dockerfile,以及一个上下文环境来构建镜像。所谓构建上下文,是指本地目录中的所有文件。比如使用当前目录作为上下文来构建镜像:$ docker

2016-07-17 08:34:15 1089

原创 04使用harbor配置私仓

安装harbor之前,需要安装好Python,Docker,DockerCompose。Python需要2.7以上的版本,Docker需要1.10以上的版本;Docker Compose 需要1.6.0以上的版本。 一:安装Docker Compose         https://docs.docker.com/compose/install/中介绍的各种安装方法,只有使用pi

2016-07-17 08:23:53 7439

原创 Redis源码解析:30发布和订阅

Redis的发布与订阅功能,由SUBSCRIBE,PSUBSCRIBE,UNSUBSCRIBE,PUNSUBSCRIBE,以及PUBLISH等命令实现。         通过执行SUBSCRIBE命令,客户端可以订阅一个或多个频道。当有客户端通过PUBLISH命令向某个频道发布消息时,频道的所有订阅者都会收到这条消息。         除了订阅具体的频道之外,客户端还可以通过执行PSUBS

2016-07-13 12:52:09 3279

原创 Redis源码解析:29事务

Redis通过MULTl,EXEC,WATCH,DISCARD等命令来实现事务(transaction)功能。         事务从MULTI命令开始,之后,该客户端发来的其他命令会被排队,客户端发来EXEC命令之后,Redis会依次执行队列中的命令。并且在执行期间,服务器不会中断事务而改去执行其他客户端的命令请求,它会将事务中的所有命令都执行完毕后,然后才去处理其他客户端的命令请求。 

2016-07-06 20:47:13 1917

原创 Redis源码解析:28集群(四)手动故障转移、从节点迁移

一:手动故障转移         Redis集群支持手动故障转移。也就是向从节点发送”CLUSTER  FAILOVER”命令,使其在主节点未下线的情况下,发起故障转移流程,升级为新的主节点,而原来的主节点降级为从节点。         为了不丢失数据,向从节点发送”CLUSTER  FAILOVER”命令后,流程如下:         a:从节点收到命令后,向主节点发送CLUSTER

2016-07-05 12:30:44 6791 2

原创 Redis源码解析:27集群(三)主从复制、故障转移

一:主从复制         在集群中,为了保证集群的健壮性,通常设置一部分集群节点为主节点,另一部分集群节点为这些主节点的从节点。一般情况下,需要保证每个主节点至少有一个从节点。         集群初始化时,每个集群节点都是以独立的主节点角色而存在的,通过向集群节点发送”CLUSTER  MEET      ”命令,可以使集群节点间相互认识。节点间相互认识之后,可以通过向某些集群节点发

2016-07-05 12:22:01 4111

原创 Redis源码解析:26集群(二)键的分配与迁移

Redis集群通过分片的方式来保存数据库中的键值对:一个集群中,每个键都通过哈希函数映射到一个槽位,整个集群共分16384个槽位,集群中每个主节点负责其中的一部分槽位。当数据库中的16384个槽位都有节点在处理时,集群处于上线状态;相反,如果数据库中有任何一个槽没有得到处理,那么集群处于下线状态。所谓键的分配,实际上就是指槽位在集群节点中的分配;所谓键的迁移,实际上指槽位在集群节点间的迁移

2016-06-25 11:46:50 3512

原创 Redis源码解析:25集群(一)握手、心跳消息以及下线检测

Redis集群是Redis提供的分布式数据库方案,通过分片来进行数据共享,并提供复制和故障转移功能。 一:初始化1:数据结构         在源码中,通过server.cluster记录整个集群当前的状态,比如集群中的所有节点;集群目前的状态,比如是上线还是下线;集群当前的纪元等等。该属性是一个clusterState类型的结构体。该结构体的定义如下:typedef struct

2016-06-20 19:34:43 8668 1

原创 Redis源码解析:24sentinel(五)TLIT模式、执行脚本

十一:TILT模式         根据之前的介绍可知,哨兵的运行,非常依赖于系统时间,但是当系统时间被调整,或者哨兵中的流程因为某种原因(比如负载较高、IO发生阻塞、进程被信号停止等)而被阻塞时,哨兵的行为就会变得不可预知了。         所谓TILT模式,就是一种特殊的保护模式。进入TILT模式后,哨兵只定期发送命令用于收集信息,而不采取实质性的动作,比如不会进行故障转移流程。

2016-06-05 10:47:20 3922 1

原创 Redis源码解析:23sentinel(四)故障转移流程

十:故障转移流程中的状态转换         当哨兵针对某个主节点进行故障转移时,该主节点的故障转移状态master->failover_state,要依次经历下面六个状态:SENTINEL_FAILOVER_STATE_WAIT_STARTSENTINEL_FAILOVER_STATE_SELECT_SLAVESENTINEL_FAILOVER_STATE_SEND_SLAVEO

2016-06-05 10:38:09 2205 1

原创 Redis源码解析:22sentinel(三)客观下线以及故障转移之选举领导节点

八:判断实例是否客观下线         当前哨兵一旦监测到某个主节点实例主观下线之后,就会向其他哨兵发送”is-master-down-by-addr”命令,询问其他哨兵是否也认为该主节点主观下线了。如果有超过quorum个哨兵(包括当前哨兵)反馈,都认为该主节点主观下线了,则当前哨兵就将该主节点实例标记为客观下线。         注意,客观下线的概念只针对主节点实例,而与从节点和哨兵

2016-06-05 10:24:00 3179 1

原创 Redis源码解析:21sentinel(二)定期发送消息、检测主观下线

六:定时发送消息         哨兵每隔一段时间,会向其所监控的所有实例发送一些命令,用于获取这些实例的状态。这些命令包括:”PING”、”INFO”和”PUBLISH”。         “PING”命令,主要用于哨兵探测实例是否活着。如果对方超过一段时间,还没有回复”PING”命令,则认为其是主观下线了。         “INFO”命令,主要用于哨兵获取实例当前的状态和信息,比

2016-05-29 13:05:59 3341

原创 Redis源码解析:20sentinel(一)初始化、建链

sentinel(哨兵)是redis的高可用解决方案。由一个或多个sentinel实例组成的分布式系统,可以监控任意多个主节点,以及它们属下的所有从节点。当某个主节点下线时,sentinel可以将下线主节点属下的某个从节点升级为新的主节点。 一:哨兵进程         哨兵,本质上是redis服务器的一种运行模式。也就是说它们共用大部分的代码,只是哨兵模式中有部分代码是自己特有的。

2016-05-29 12:34:39 3033

原创 Redis源码解析:19Hiredis异步API代码解析

Hiredis中的异步API函数需要与事件库(libevent,libev, ev)一起工作。因为事件循环的机制,异步环境中的命令是自动管道化的。因为命令是异步发送的,因此发送命令时,必要情况下,需要提供一个回调函数,以便在收到命令回复时调用该函数。         异步API涉及到的函数分别是:redisAsyncContext *redisAsyncConnect(const char *

2016-05-12 09:40:57 12401

原创 Redis源码解析:18Hiredis同步API和回复解析API代码解析

Redis的sentinel模式使用了Hiredis代码,Hiredis是redis数据库一个轻量级的C语言客户端库。它实现的向Redis发送命令的API函数redisCommand,使用方法类似于printf。因此只要熟悉redis命令,就可以很容易的使用该函数将redis命令字符串,转换成统一请求协议格式之后,发送给Redis服务器。         Hiredis库包含三类API:同步操

2016-05-08 09:55:22 5895 3

原创 Redis源码解析:17Resis主从复制之主节点的部分重同步流程及其他

本文主要讲解主节点部分重同步的实现,以及主从复制中的其他功能。本文是Redis主从复制机制的最后一篇文章。          主节点在收到从节点发来的PSYNC命令之前,主节点的部分重同步流程,与完全重同步流程是一样的。在收到PSYNC命令后,主节点调用masterTryPartialResynchronization函数,尝试进行部分重同步。         首先看一下部分重同步的实

2016-04-30 17:31:13 4800

原创 Redis源码解析:16Resis主从复制之主节点的完全重同步流程

主从复制过程中,主节点根据从节点发来的命令执行相应的操作。结合上一章中讲解的从节点在主从复制中的流程,本章以及下一篇文章讲解一下主节点在主从复制过程中的流程。         本章主要介绍完全重同步流程。 一:从节点建链和握手         从节点在向主节点发起TCP建链,以及复制握手过程中,主节点一直把从节点当成一个普通的客户端处理。也就是说,不为从节点保存状态,只是收到从节点

2016-04-25 12:20:54 4636 2

原创 Redis源码解析:15Resis主从复制之从节点流程

Redis的主从复制功能,可以实现Redis实例的高可用,避免单个Redis 服务器的单点故障,并且可以实现负载均衡。 一:主从复制过程         Redis的复制功能分为同步(sync)和命令传播(commandpropagate)两个操作:         同步操作用于将从节点的数据库状态更新至主节点当前所处的数据库状态;         命令传播操作则用于在主节点的

2016-04-17 10:43:46 5043 5

原创 03搭建docker私有仓库

搭建docker私仓,可以使用docker官方提供的registry镜像。该镜像目前有2.0,2.3和2.3.1版本。它只与1.6.0以上版本的docker兼容。搭建私仓的步骤如下: 一:无代理、无认证的registry1:下载registry镜像:docker pull registry:2         这里必须加上标签”:2”,否则的话,不加标签的registry,实际上下

2016-04-15 17:55:01 15680 7

原创 Redis源码解析:14Redis服务器与客户端间的交互

Redis服务器是典型的一对多服务器程序,通过使用由IO多路复用技术实现的文件事件处理器,Redis服务器使用单线程单进程的方式来处理命令请求,并与多个客户端进行网络通信。          Redis客户端与服务器之间通过TCP协议进行通信。TCP协议是一种流式协议,数据以字节流的形式进行传递,没有固有的"报文"或"报文边界"的概念,如果需要设置边界,需要应用层自行处理。     

2016-04-09 17:07:21 6118

原创 Redis源码解析:13Redis中的事件驱动机制

Redis中,处理网络IO时,采用的是事件驱动机制。但它没有使用libevent或者libev这样的库,而是自己实现了一个非常简单明了的事件驱动库ae_event,主要代码仅仅400行左右。         没有选择libevent或libev的原因大概在于,这些库为了迎合通用性造成代码庞大,而且其中的很多功能,比如监控子进程,复杂的定时器等,这些都不是Redis所需要的。

2016-04-03 10:55:30 3064 1

原创 Redis源码解析:12AOF持久化

除了RDB持久化功能之外,Redis还提供了AOF(AppendOnly File)持久化功能。与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。与RDB持久化相比,AOF持久化可能丢失的数据更少,但是AOF持久化可能会降低Redis的性能。         写人AOF文件的所有命令都是以Redis的统一请求协议

2016-03-29 12:55:55 1323 1

原创 Redis源码解析:11RDB持久化

Redis的RDB持久化的相关功能主要是在src/rdb.c中实现的。RDB文件是具有一定编码格式的数据文件,因此src/rdb.c中大部分代码都是处理数据格式的问题。 一:RDB文件格式                 上图就是一个完整RDB文件的格式。         RDB文件的最开头是REDIS部分,这个部分的长度为5字节,保存着"REDIS"五个字符。通过这个字符

2016-03-19 21:55:19 1988

原创 02docker简单使用和配置(网络、存储和Hub)

四:网络1:命名容器        在各种docker命令中,可以通过名字中找到对应的容器。之前创建的容器都是由docker自动命名的,可以在docker  run中,通过--name参数指定容器的名字。比如:$ docker run -d -P --name web training/webapp python app.py$ docker ps -lCONTAINER ID IM

2016-03-19 19:20:38 1878

原创 01docker简单使用和配置(容器、镜像)

一:容器中运行简单应用程序1:hello  world        使用docker可以在容器中运行应用程序,使用docker run命令即可。比如下面的命令:$ docker run ubuntu /bin/echo 'Hello world'Hello world         docker run命令用于运行一个新的容器,ubuntu指定了该容器运行基于的镜像是Ubuntu

2016-03-19 18:54:04 4100 1

柔性数组成员

C99中引入了柔性数组成员的概念。C99 中,结构体中的最后一个元素允许是未知大小的数组,称为柔性数组成员(flexible array member),柔性数组成员前面必须至少还有一个其他成员,而且柔性数组成员必须是结构体的最后一个成员。一个包含柔性数组成员的结构体或(递归的)包含这样结构体的联合体,不能成为一个结构体的成员或数组的元素。

2018-09-26

空空如也

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

TA关注的人

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