自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySql(一) InnoDB存储引擎

目录一.InnoDB体系架构二.MySql后台线程1.MasterThread1.1)主循环 loop一.InnoDB体系架构InnoDB的总体结构主要由三部分组成:负责各个功能的线程,介于线程与磁盘间的内存缓冲(用于提高数据库允许速度),存于磁盘的文件。 二.MySql后台线程1.MasterThreadMasterThread是核心线程,具有最高线程优先级,主要负责数据异步刷新到磁盘,包括:脏页的刷新、插入缓冲的合并、UNDO页的回收。Master...

2020-07-02 19:07:44 1710

原创 汇编语言(寄存器)

一.概述一个典型的CPU主要由运算器,控制器,寄存器等器件构成,它们靠内部总线相连(内部总线实现CPU内部各机器件间的联系,外部总线实现CPU和主板上其他器件之间的联系)。本篇博文叙述CPU中的寄存器,程序员可以通过指令读写寄存器,从而实现对CPU的控制。不同的CPU其寄存器的个数与结构也不相同,以8086CPU为例,其有14各寄存器,每个寄存器有一个名称,且所有寄存器都是16位的,可以存...

2020-02-26 21:54:50 2167

原创 汇编笔记(基础知识)

一.机器语言机器语言是机器指令的集合,所谓机器指令就是一列二进制数字,计算机将其转化为一列高低电平,以驱动计算机的电子器间。【问】:为什么每一种微处理器(CPU)都有自己的机器指令集。【答】:由于不同硬件设计和内部结构的不同,就需要用不同的电平脉冲来控制,所有每一种微处理器都有自己的机器指令集,也就是机器语言。【背景故事】:早期程序员将用0、1编写的程序打在纸带或卡片上,1打孔,0...

2019-09-03 19:16:29 335

原创 数据库基础

一.索引1.索引简介当在数据库中搜索一条数据时,若对整张表进行查询效率会很低,为了提高搜索速度,可以为数据表中的一个或多个字段添加索引。所谓索引就是将数据表中的记录按某个顺序进行排序,以便可以快速找到需要查找的数据。每个索引都是依赖数据表建立的,一个数据表在磁盘上的存储文件由两部分组成:一部分是用来存储数据的数据页,而另一部分是用来存放索引的索引页(会占磁盘空间)。当查询数据时,会先搜索索...

2019-08-08 14:16:27 144

原创 redis(十三)集群

一.概述redis集群是Redis提供的分布式数据库方案,它通过将数据进行分片存储来实现,并提供复制和故障转移功能。redis集群由多个节点组成,每个节点都是一个运行在集群模式下的redis服务器。二.集群的节点1.节点redis集群中的每个节点都是一个运行在集群模式下的redis服务器,redis服务器在启动时会根据cluster-enabled配置选项是否为yes来决定是...

2019-07-22 15:07:54 151

原创 redis(十二)Sentinel

一.概述redis使用哨兵系统保证redis的稳定性与可靠性。每个哨兵系统由一个或多个sentinel实例组成,每个哨兵系统都可以监视任意多个主服务器,以及其属下的从服务器,并在主服务器下线时(如由于网络异常等导致主服务器掉线),自动将下线主服务器属下的某个从服务器升级为新的主服务器,以代替下线主服务器处理命令请求。当下线的主服务器重新上线时,会成为新主服务器的从服务器。二.Sent...

2019-07-17 11:19:51 251

原创 redis(十一) 服务器的复制

一.复制的概念当执行SLAVEOF命令时,那么发送复制命令的服务器将复制接收该命令的服务器,之后这两个服务器将保存相同的数据。我们称被复制的服务器为主服务器,而对主服务器进行复制的服务器称为从服务器。二.旧版复制功能1.总体过程总体复制过程由两部分组成。第一部分称为同步,用于将从服务器状态更新至主服务器的当前状态,即同步用于达到一致状态。第二部分称为命令传播,用于当主服务器状...

2019-07-04 18:56:35 431

原创 Redis(十)Redis的事件循环

【源码位置】:redis中关于事件循环的API位于ae.h及ae.c文件中一.文件事件1.什么是文件事件redis中将套接字和管道产生的通信事件称为文件事件,并使用事件回调处理这些文件事件,如可读回调,可写回调,连接成功回调等等。2.文件事件结构redish中每个文件事件都以一个aeFileEvent结构表示,其结构如下所示:typedef void aeFileProc...

2019-07-03 15:35:08 284

原创 背包问题

一.0-1背包1.问题描述0-1背包问题即给定n个大小为s1,s2,s3,s4...sn的物品,每个物品的价值为c1,c2,c3,c4...cn,背包总大小为V,问在不超过背包容量的情况下,背包能装下物品的最大价值是多少。2.动态规划解决0-1背包假设由一个容量为5的背包,总共有四件物品,它们的大小为:1,2,3,2。它们的价值为:3,4,7,5。我们制作一张表格,第i行...

2019-07-01 21:42:57 131

原创 Google Protocol Buffers学习笔记

一.安装PtotocolBuf的安装,找不到动态链接库错误解决二.ProtocolBuf的作用ProtocolBuf是谷歌提供的一种序列化解决方案。序列化常用于持久化存储与网络通信,假设在进行网络通信时需要传输一个数据结构,那么我们可以使用的最简单的方式是,服务器与客户端使用相同的方式进行内存布局(字节对齐,元素顺序),但这种方式不利于扩展也容易出现错误,比如:若在服务器程序在某次...

2019-06-26 14:22:48 407

原创 并行编程——从缓存一致性到内存屏障与volatile

一.CPU高速缓存1.为什么需要高速缓存现代CPU的速度比现代内存系统的速度快得多,比如在一个主频为1.8GHZ的CPU上,每秒有1.8*10^9个时钟周期,假设每条指令平均需要数个周期,那每秒可执行的指令数亦是相当惊人的,而在这样一个始终周期内,光在真空钟只能传播8cm,在一个5GHZ的时钟周期内更是降低到了3cm,更糟糕的是,电子在硅钟的传播速度是真空钟光速的1/30到1/3,而一个1...

2019-06-23 14:08:12 372

原创 Linux内核——进程的地址空间

一.概述 当内核函数请求内存时,内核不会对该请求进行推迟,会立刻得到。而对于用户态进程,内核会认位其请求不是十分紧迫的(因为进程开始运行时并不会立刻访问其地址空间中的全部内存),且内核不信任用户代码,需要捕获并处理用户态进程引起的寻址错误,因而当用户进程请求动态内存时,并未获得请求的页框,而仅仅获得对一个新的线性地址区间的使用权,即这一线性地址成为进程地址空间的一部分,真正分配页框会推...

2019-06-20 14:24:59 397

原创 Linux内核——进程通信

一.概述 进程间通信的基本机制有:管道,FIFO(命名管道),信号量,消息队列,共享内存以及套接字。此篇博文不说明其使用,而是说明在linux内核中的实现原理,关于如何使用可以参考博文《进程间通信(IPC)》。二.管道1.管道数据结构 无名管道没有对应的磁盘映像,而是通告pipefs特殊文件系统加以处理的,有了pipefs便可以将管道完全整合到vfs(虚拟文...

2019-06-18 14:45:38 746

原创 Linux内核 ——内存寻址

一.概述 平时我们在进行高级语言编程时,总会遇到地址这个概念,在32位程序中,其范围一般在0x00000000至0xffffffff之间,这就是虚拟地址,也称为线性地址。而当我们编写汇编程序时,会遇到段(如:代码段)与偏移的概念来指示一个地址,这种寻址方式称为逻辑地址。然而,内存芯片(如RAM随机存储器)并不认识这些地址,为此需将上述两种地址转化为物理地址以供内存芯片寻址。 ...

2019-06-10 22:21:38 154

原创 几种cast转换

一.dynamic_cast 其作用是在基类和派生类之间安全的进行指针或引用转换,若不能成功转换则会返回NULL(转化指针时,若是转化引用则会报错)。其工作原理其实是在运行时检查虚函数表中存储的指针类型信息,因此dynamic_cast只能用于有虚函数的类(即dynamic_cast<type*>(&obj)中的obj对象必须是有虚函数的类的对象)。clas...

2019-06-05 16:38:38 1132

原创 装饰者模式

一.概述 装饰者模式动态的对对象进行扩展(如:功能的扩展附加等),装饰者模式比继承更加灵活,可以灵活的扩展组合。其实际应用时,装饰者类中包含被装饰者的引用或指针,这样的逐层嵌套过程便是装饰的过程(即功能扩展的过程)。二.举例说明 比如:要实现一组IO功能类,要求可以选择有无缓冲,字符转换(如大小写转换),字符过滤等等功能,这些功能不仅可以灵活组合,而且之后功能还可...

2019-05-18 16:04:16 97

原创 观察者模式及其注意事项与缺点

一.概述 观察者模式定义了对象之间的一对多依赖关系,其中的“一”称为主题,而“多”称为观察者,若某个对象希望关注某个主题,则在该主题中进行注册,待有变化时便会通知(或更新)观察者。 各个观察者只要都继承自同一基类或接口,而该主题种只需保存该基类或接口对象的集合,当发生事件时,逐一调用各观察者事先约定好的函数即可(利用多态)。二.观察者模式的优点 观察者模式可以让...

2019-05-16 21:32:15 2231

原创 Redis(九) AOF持久化介绍及部分源码解析

一.概述 AOF持久化不同于RDB的存储整个数据结构,AOF是通过记录redis执行的服务器所执行的写命令来记录数据库状态的。二.AOF持久化的实现 AOF持久化操作分为三个步骤,分别是:命令追加,文件写入,文件同步。具体如下:redis在每次执行写命令时(比如增删改),都会将该条命令加入到服务器结构redisServer的AOF缓冲区中,redis向muduo一样是...

2019-03-06 14:51:55 702

原创 Redis(八)RDB持久化介绍及部分源码解析

一.概述 由于Redis数据库是在内存中进行操作的,当出现意外时,内存中的数据将会丢失,因此需要进行持久化操作,所谓持久化操作即将内存中的数据库通过某种方式保存到磁盘中,Redis有两种存储方式,一个是RDB文件,另一种是AOF文件,一般会优先使用AOF。本篇博文介绍的是RDB持久化文件,RDB是一种压缩的二进制文件,它保存了某一时刻下内存中的数据库。二.RDB文件的创建与载入1...

2019-03-04 19:23:40 253

原创 Redis(七)数据库介绍及部分源码解析

一.服务器与数据库结构概述Redis服务器以struct redisServer结构表示,其中以一些成员一起维护了服务器属的数据库,如:用于存储描述数据库结构(redisDB)的数组,数组大小等等,如下图所示:// 服务器结构struct redisServer{ //... redisDb *db; // 数据库数组 int dbnum; // 数据库数...

2019-02-02 14:45:51 178

原创 Redis(六)redis对象介绍及部分源码解析

一.概述 Redis中包含各种数据结构,但为了提高灵活性,针对不同的情况下选择合适的数据结构,Redis在数据结构之上增加了一层对象系统,其中包括五种对象类型:字符串对象,列表对象,哈希对象,集合对象和有序集合对象。每种对象可以根据情况自动选择和更改底层数据结构,以提高效率及空间利用率,比如:列表对象可以使用压缩列表实现,亦可使用双向链表实现。Redis中使用结构体redisObje...

2019-01-31 21:32:22 148

原创 Redis(五)压缩列表介绍及部分源码解析

一.概述 压缩列表(ziplist)是列表和哈希对象中用于存储数据的底层实现之一,一般用于存储少量数据,且元素大小较小,如:较小整数,较短字符串,因为压缩列表可以使用较少的内存存储多种不同类型的数据,且有着平均性能为O(N)的增删性能。二.压缩列表结构 一个压缩列表可以包含任意多个节点,其总体结构为:列表头 + 数据节点 + 列表尾节点(不含数据)。列表...

2019-01-17 09:57:20 161

原创 Redis(四)整数集合介绍及源码解析

一.概述 整数集合(intset)与hash表,跳跃表等一样是集合键的底层实现之一,一般用于保存数量不多的整数,这是由于其实现机制导致的不能存储过多元素,否则会造成效率问题。集合键的内部结构可以使用Redis命令OBJECT ENCODING获取二.整数集合结构 整数集合可以用于保存int16_t,int32_t或int64_t的整数值,并且从小到大排序且保证不...

2019-01-15 20:40:03 300

原创 Redis(三)跳跃表介绍及源码

一.理想跳跃表 查询链表的时间复杂度O(n),即使该链表的是有序的,但若我们在链表上在加一层链,且每次跳过一个节点(即进行一次二分),如下图所示: 如此一来,从L2链开始搜索,要查询8只需4次即可,而查询7时,在搜锁到节点6后可知下一个节点8大于7因此必在节点6和节点8之间,从而进入L1链继续查询,总共需4次即可。 若在L2链的基础上增加一层链...

2019-01-10 18:18:51 447

原创 Redis(二)字典介绍及部分源码刨析

一.概述 Redis中使用字典这种数据结构作为数据库的底层实现,对数据库的增删改查也是基于对字典的操作之上进行的,当进行持久化时再将字典中的数据保存至磁盘中。二.Redis中的字典结构 Redis中的字典是使用hashtable实现的,因为当hash表的负载因子不高且hash算法可以较均匀分配时,hashtable可以在常数时间内查找到数据,且若采用链式地址法处理...

2019-01-09 16:43:26 153

原创 Redis(一) 简单动态字符串SDS

一.概述       在Redis中只将C字符串用于一些无需对字符串值进行修改的地方(常量),如日志打印,而其它需要修改(比如底层的键-值对存储)的地方都使用了自己构建的SDS(简单动态字符串)进行存储。 二.SDS结构      SDS是一种对C字符串的封装,其结构体如下:struct sdshdr{ // 记录buf数组中已使用的字节数(不含末尾的空字节'\0')...

2019-01-07 16:20:27 176

原创 进程间通信(IPC)

一.管道(未命名管道)       管道是一种IPC方式,它具有两点局限性,第一点是由于管道在最初是一种半双工的进程间通信方式,虽然有的系统允许通过管道进行全双工通信,但是为了可移植性不应做这种假设。第二点是管道只能在具有公共祖先的两个进程之间通信(那用户创建的进程不都有公共祖先init进程?所以该公共祖先还应该创建了管道,这样子进程才能继承引用该管道的文件描述符)。1.管道的创建pipe...

2018-12-07 08:47:35 410 2

原创 高级I/O

一.非阻塞I/O 非阻塞I/O可以防止在进行慢系统调用时被阻塞,当这种操作不能立即完成时将立即返回,并设置相关错误码。如在一个非阻塞的描述符上调用read,若无数据可读,则read返回-1,errno设置为EAGAIN。 可以通过以下几种方式设置非阻塞描述符:调用open时指定O_NONBLOCK标志。 调用socket时指定SOCK_NONBLOCK创建套接...

2018-12-05 17:03:26 302

原创 线程

一.概述 Linux中用进程标识符process ID(PID)来唯一的标识一个进程或轻量级进程(Linux中没有真正的线程,而是通过线程组或可以称为轻量级进程组实现的多线程进程)。PID被存放在进程描述符的pid字段中,还有一个字段较tgid用于标识一个进程组,即该组中的所有轻量级进程的线程组ID相同,其值等于领头轻量级进程的PID。我们常用的getpid函数返回的便是进程的tg...

2018-12-01 21:07:58 198

原创 信号

一.概述       信号是一种软件中断,它提供了一种处理异步事件的方法。LInux中定有了31种不同的信号,且支持应用程序定义信号。1.产生信号的几种情况        有很多条件可以产生信号,以下便是常见的几种。当用户按下某些中断按键时,会引发终端产生信号。比如在终端上使用ctrl + c 通常会产生中断信号(SIGINT),这可以停止一个程序 硬件异常产生信号。比如:除数为...

2018-12-01 14:16:26 270

原创 进程关系

一.终端登录1.终端登录(硬件相连的终端)Linux系统管理者可以创建名为/etc/inittab的文件,其中每一行对应了一个终端设备,当系统启动时,init进程会为每一个允许登陆的终端设备都调用一次fork,并exec getty程序,该程序会调用open函数打开终端设备,并等待用户输入用户名。当用户输入用户名后,getty程序调用execle,执行login程序。该程序等待用户输入正确...

2018-11-30 09:26:27 201

原创 进程控制

一.进程标识 Linux中用进程标识符process ID(PID)来唯一的标识一个进程或轻量级进程(Linux中没有真正的线程,而是通过线程组或可以称为轻量级进程组实现的多线程进程)。PID被存放在进程描述符的pid字段中,还有一个字段较tgid用于标识一个进程组,即该组中的所有轻量级进程的线程组ID相同,其值等于领头轻量级进程的PID。我们常用的getpid函数返回的便是进程的t...

2018-11-29 19:24:09 211

原创 进程环境

一.程序的启动与终止1.程序的启动          当内核要指向一个C程序时,会先启动一个启动例程,启动例程从内核取得命令行参数和环境变量的值,然后准备调用main函数。启动例程一般为会变语言编写,但若以C代码描述则为以下形势:exit(main(argc,argv));由此亦可看出当程序中main函数中以return num退出,则会回到启动例程,并根据终止码调用exit。2.进程...

2018-11-28 15:56:17 231

原创 系统数据文件和系统信息

一.口令文件       口令文件(/etc/passwd)包含了用户的信息,如用户名,用户ID,登陆密码等。由于该文件人人可见,因此,登陆密码只是一个占位符x,真正的登陆密码在其他文件中。可通过vi查看口令文件,如下图所示:                                                 为了阻止某用户登录系统,可以将/bin/bash改为bin/fa...

2018-11-27 21:44:40 302

原创 标准I/O

一.流的概念与FILE     当我们使用标准I/O库打开或创建一个文件时,便会将一个流与该文件相关联。那么什么是流呢?流这个词可以让我们联想到河道里的流水,其实这可以很形象的比喻出我们要讨论的流。标准在输入与文件之间增加了一个缓冲区,这就相当于是河道,而数据便是河道中的流水。而这个河道的宽度,长度,目的地便是通过FILE对象来维护的,FILE结构中包含:文件描述符,指向该流的缓冲区的指针,缓...

2018-11-27 19:09:43 360

原创 文件访问

一.文件的创建 创建文件一般使用open/openat,这两个函数比crate更加灵活,因为这两个函数可以指定打开标志,而create以只写方式打开创建的文件。在众多打开标志中选取4个标志进行说明,O_CLOEXEC选项用于将FD_CLOEXEC置为文件描述符标志,即当执行exec函数启动某程序后是否关闭该描述符;O_SYNC 选项启用时,在该文件描述符上调用write函数会等待物...

2018-11-27 14:34:24 423

原创 HTTP 超文本传送协议

一.概述       HTTP协议规定了浏览器如何与万维网服务器进行通信,比如申请文档的格式,提交数据的格式等。而我们所说的HTML(超文本标记语言)是描述如何解释万维网上的页面文档的。HTTP协议中,由客户建立起一条同服务器进程的TCP链接,之后发出请求并读取服务器进程的响应。当服务器将客户请求的资源发回后,便会关闭连接以结束本次响应。上述过程也可以称为短连接。这个过程再HTTP1.1中进行...

2018-11-25 13:40:29 190

原创 DNS域名系统

一.DNS概述 域名系统的功能只有一个便是进行域名与IP地址之间的转换。如果我们从DNS产生的历史来说起应该会更便于我们理解DNS系统及所谓的域名。在ARPANET时期,由于网络上主机较少,也为了便于人们记忆,因此为每个主机进行了命名,并将主机名与IP地址的映射写在了一张表中。随着网络的不断扩充,更多机构(如大学,政府部门)的加入,显然使用文件来一一映射是不明智的。因此根据机构组织...

2018-11-23 17:01:06 147

原创 TCP/IP实现(十二) TCP 传输控制协议

一.TCP首部 TCP首部结构如下图所示: TCP协议中用序号来标识每一个字节,连接的每一端都维护着自己的序号,起始序号是主机选择的,称为ISN(随时间变化,每个连接都具有不同的ISN)。除每个数据字节消耗序号外,SYN和FIN也会消耗序号。确认序号用于表示发送确认的一端所期望收到的下一个序号,即以成功接收的最后一个字节的序号加1,要注意T...

2018-11-22 21:55:15 368

原创 TCP/IP实现(十一) UDP用户数据报协议

一.已连接UDP      我们可以对UDP套接字调用connect进行连接,但与TCP连接的差别很大。UDP进行连接并不进行三次握手,内核只是内核只是检查一些立即可知的错误(如一个显然不可达的目的地),并将对端的IP地址和端口号记录在PCB协议控制块中,之后立即返回到调用进程1.与未连接UDP的区别    a) 不能在给输出操作指定目的IP和端口号,否则将返回错误EISCONN。b)...

2018-11-21 18:36:51 214

空空如也

空空如也

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

TA关注的人

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