自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySQL索引优化

  在上文中,我们介绍了MySQL中的两种主要的索引–B-Tree索引和Hash索引。虽然使用索引会带来很大程度上的性能优化。但是,索引的不当使用同时也会引起性能的急剧下降。今天我们就来聊聊索引的优化问题。   首先讨论两个问题:问题1、为什么要使用索引?  谈到为什么要使用索引,大家第一时间想到的就是提升查询效率吧。那除了这个用途之外索引还有其他的用途吗?下面我们就来聊一聊...

2018-09-05 00:54:32 656

原创 MySQL支持的索引类型(B-Tree索引、hash索引)

  索引,是存储引擎用于快速找到记录的一种数据结构。尤其是在表中的数据量越来越大时,索引对于性能的提升非常关键。今天先聊一聊MySQL支持的两种主要的索引类型。      在MySQL中,存储引擎在使用索引时,会先在索引中找到对应值,然后根据所匹配的索引记录找到对应的数据行。例如:select name from user where id = 10;  若在id列上建有索引...

2018-09-03 01:12:01 17735 1

原创 MySQL查询过程剖析

  数据库的性能问题是我们一直需要考虑的一个问题。有人可能说建立最好的索引,设计最有的库表结构。但是这些在没有合理的设计查询的基础上,都无法实现高性能。   今天,我们就先聊一聊MySQL的查询过程。下图就是MySQL的查询过程图:MySQL的查询过程    首先,对其中的各个模块做一简单分析:    1、客户端/服务端通信协议  首先,需要说明的是:MySQL客户...

2018-08-31 22:15:29 3519

原创 MySQL逻辑架构及工作流程

  MySql并不完美,但是却足够灵活,能够适应高要求的环境。同时,MySql既可以嵌入到应用程序中,也可以支持数据仓库、内容索引和部署软件、高可用的冗余系统、在线事务处理系统等各种应用类型。   为了更心如的理解MySql服务器,我们需要理解MySql各部件之间如何协同工作。需要我们去理解它的逻辑架构。下面我们就来介绍一下MySql的逻辑架构:MySQL的逻辑架构  MySQL的最重要...

2018-08-31 18:43:02 8810 3

原创 MySql数据库存储引擎(MyISAM与InnoDB)

  MySql可以将数据以不同的技术存储在文件(内存)中,这种技术就称为存储引擎。而每一种存储引擎也使用不同的存储机制、索引技巧、锁定水平,最终提供广泛且不同的功能。常见的存储引擎有MyISAM,InnoDB,Memory,Archive等。   本文主要介绍的是:MyISAM与InnoDB。在5.5版本之前,MyISAM是MySQL的默认数据库引擎。虽然性能极佳,但却有一个缺点:不支持事务处理...

2018-08-21 23:54:27 2814

原创 MySQL删除表操作(delete、truncate、drop的区别)

  本文主要讲mysql中三种删除表的操作,delete语句、truncate语句以及drop语句的区别:简介delete1、删除整张表的数据:delete from table_name;2、删除部分数据,添加where子句:delete from table_name where...;3、说明   1)、属于DML语言,每次删除一行,都在事务日志中为所删除...

2018-08-21 19:53:57 87252 2

原创 C函数的调用过程原理和栈分析

  在编程中,相信每个人对函数都不陌生,那么你真正理解函数的调用过程吗?当一个c函数被调用时,一个栈帧(stack frame)是如何被建立,又如何被消除的。本文主要就是来解决这些问题的,不同的操作系统和编译器可能有所不同,本文主要介绍在linux下的gcc编译器。栈帧  我们先来看一下,一个典型的栈帧的样子:       首先介绍一下这里面非两个重要的指针:ebp和esp;  ...

2018-07-13 12:01:57 4201

原创 深度剖析c语言main函数---main函数的执行顺序

  在之前的文章中,介绍了main函数的返回值 和 main函数的传参,本文主要介绍一下main函数的执行顺序。可能有的人会说,这还用说,main函数肯定是程序执行的第一个函数。那么,事实果然如此吗?相信在看了本文之后,会有不一样的认识。为什么说main()是程序的入口  linux系统下程序的入口是”_start”,这个函数是linux系统库(Glibc)的一部分,当我们的程序和Gl...

2018-07-10 14:09:37 8683 1

原创 深度剖析c语言main函数---main函数的参数传递

  在上文中,我们主要讲了c语言main函数的返回值问题,本文主要将main函数的参数传递。main函数传参  首先说明的是,可能有些人认为main函数是不可传入参数的,但是实际上这是错误的。main函数可以从命令行获取参数,从而提高代码的复用性。函数原形  为main函数传参时,可选的main函数原形为:int main(int argc , char* argv[],cha...

2018-07-10 00:20:38 18385 4

原创 深度剖析c语言main函数---main函数的返回值

  在接下来的几篇博文中,我将对c语言的main函数进行深入的剖析,分别从函数返回值,函数参数,以及函数的执行顺序对main函数作一总结。本文主要聊聊main函数的返回值。main函数的返回值  main函数的返回值用于说明程序的退出状态。如果返回0,则代表程序正常退出。返回其它数字的含义则由系统决定。通常,返回非零代表程序异常退出。void main()  有一些书上的,都使...

2018-07-09 23:19:06 31532

原创 网络编程的三个重要信号(SIGHUP ,SIGPIPE,SIGURG)

  对于信号的介绍,我再前面的一篇博客中做过专门的总结,感兴趣的可以看看。本文主要介绍在网络编程中几个密切相关的函数:SIGUP,SIGPIPE,SIGURG。SIGHUP信号  在介绍SIGHUP信号之前,先来了解两个概念:进程组和会话。进程组  进程组就是一系列相互关联的进程集合,系统中的每一个进程也必须从属于某一个进程组;每个进程组中都会有一个唯一的 ID(process...

2018-07-07 16:25:19 45364 3

原创 两种高效的并发模式

前言  我们都知道,并发编程的目的是让程序“同时”执行多个任务,提高效率。当一个程序是计算密集型的时,并发编程并没有优势,反而由于任务的切换时效率降低。但是,当一个程序是IO密集型时,采用并发编程会极大地提高cpu的利用率。因为IO操作的速度远远小于cpu的计算速度,所以让程序阻塞与IO操作上会浪费大量的CPU时间。而并发编程可以让阻塞于IO操作的线程主动放弃CPU,将执行权转移到其他线程。 ...

2018-07-06 18:38:58 2528

原创 Linux网络编程--两种高效的事件处理模式

前言  今天,我们主要介绍一下网络设计模式中的两种事件处理模式,Reactor和Proactor模式。通常使用同步I/O模型(select,poll,epoll等)用来实现Reactor模式,而异步(aio_read或aio_write等)用来实现Proactor模式,不过还可以使用同步来模拟Proactor模式。Reactor模式设计思路  主线程(I/O处理单元)只负责对I...

2018-07-04 18:14:52 2336

原创 IO复用的总结及一些问题

  在前面的文章中,分别介绍了常用的三种实现IO多路复用的函数:select、poll、epoll今天对主要是对这三个函数的总结,以及对一些io复用的问题的总结。总结 系统调用 select poll epoll 事件集合 用户通过3个参数(readset、writeset,exceptset)分别传入感兴趣的可读、可写及异常等事件,内核通过对这些参数...

2018-07-04 12:33:18 1974

原创 IO复用(epoll)

  在前面的文章中讲了实现IO复用的两种方式:select和poll。今天主要讲一个更为高效的函数epoll。epoll  epoll能显著提高在大量链接中,只有少量活跃连接时的cpu利用率。因为,首先epoll可以复用监听的文件描述符集合,而不用每次在等待事件之前重新准备被监听的文件描述符集合。其次是因为epoll获取就绪事件时,不用遍历整个监听事件的集合,而是只需要遍历那些被内核I...

2018-07-03 23:47:03 1022

原创 I/O复用(poll)

  上文说到的实现IO复用的函数中的select,本文接着介绍第二种poll。poll  Poll相对于select来说突破了监听的文件描述符上限1024,最大文件描述符是系统所能允许的最大值,可以通过查看proc/sys/fs/file-max文件查看,这个值也可以改(通过limits.conf)。另一方面是实现了监听和就绪事件的分离。其他和select类似,也是在指定时间内轮询一定数量...

2018-07-02 21:27:05 2317 1

原创 I/O多路复用(select)

  在之前写过一篇五种I/O模型,感兴趣的可以去看一下,今天主要讲其中的一种,那就是I/O多路复用。因为I/O多路复用可以使一个进程同时处理多个连接。这对提高程序的性能至关重要。对于IO复用的概念与理解在上文说的挺清楚了。本文主要说实现IO复用的系统调用。   在linux下,实现IO复用的系统调用主要有三个:select、poll 和 epoll,下面我们将对其进行逐一讲解。selec...

2018-07-02 21:18:47 5146 5

原创 linux五种IO模型

  为了更好的理解五种IO模型,我们先来说一下几个概念:同步,异步,阻塞和非阻塞。同步和异步  这两个概念与消息的通知机制有关。同步  所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。比如,调用readfrom系统调用时,必须等待IO操作完成才返回。 异步  异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个...

2018-07-01 12:43:36 13955 2

转载 详解二叉树的非递归遍历

本文转载自:http://blog.csdn.net/zhangxiangdavaid/article/details/37115355前言  对于二叉树的递归遍历比较简单,所以本文主要讨论的是非递归版。其中,中序遍历的非递归写法最简单,后序遍历最难。 节点的定义://Binary Tree Nodetypedef struct node{ int data; ...

2018-06-29 11:18:20 99016 20

原创 浅析dup()和dup2()函数

前言  在linux下,一切皆文件。当文件被打开时,会返回文件描述符用于操作该文件,从shell中运行一个进程,默认会有3个文件描述符存在(0、1、2);)0表示标准输入,1表示标准输出,2表示标准错误。一个进程当前有哪些打开的文件描述符可以通过/proc/进程ID/fd目录查看。  今天,我们主要说两个用于复制文件描述符的函数dup()和dup2()。dup()、dup2()函数...

2018-06-29 09:05:24 13058 1

原创 frok 与 vfork

一、首先看一个程序:#include <stdio.h>#include <sys/wait.h>#include <unistd.h>Int main(){Int i = 0;For(i = 0 ; i < 2 ; i++){Fork();Printf(“-”);}Wait(NULL);Wait(NULL);Retur...

2018-06-25 19:04:40 1175

原创 部分重要的SOCKET选项

  首先介绍两个专门用来读取和设置socket文件描述符属性的系统调用getsockopt() && setsockopt()函数原形://读取socket文件描述符的属性int getsockopt(int sockfd , int level , int option_name , void* option_value , socklen_t* rest...

2018-05-28 17:58:05 1020

原创 malloc的底层实现(ptmalloc)

前言  本文主要介绍了ptmalloc对于内存分配的管理。结合网上的一些文章和个人的理解,对ptmalloc的实现原理做一些总结。内存布局  介绍ptmalloc之前,我们先了解一下内存布局,以x86的32位系统为例:      从上图可以看到,栈至顶向下扩展,堆至底向上扩展, mmap 映射区域至顶向下扩展。 mmap 映射区域和堆相对扩展,直至耗尽虚拟地址空间中的剩余区域,...

2018-04-15 16:54:44 29209 5

原创 简单剖析B树(B-Tree)与B+树

注意:首先需要说明的一点是:B-树就是B树,没有所谓的B减树引言  我们都知道二叉查找树的查找的时间复杂度是O(log N),其查找效率已经足够高了,那为什么还有B树和B+树的出现呢?难道它两的时间复杂度比二叉查找树还小吗?   答案当然不是,B树和B+树的出现是因为另外一个问题,那就是磁盘IO;众所周知,IO操作的效率很低,那么,当在大量数据存储中,查询时我们不能一下子将所有数据加载到...

2018-03-25 11:30:09 70461 27

原创 线程控制原语小结

在本篇博客中主要总结一下linux下,线程的一些控制原语。   在Linux环境下,所有线程特点,失败均直接返回错误号。所以我们可以利用strerror()将错误信号所代表的具体错误打印出来。参数为发生错误所返回的错误信号。例如:   ret = pthread_create(&tid ,NULL ,thrd_func ,NULL);if(ret != 0){ fpri...

2018-03-20 21:39:53 1259

原创 线程与进程的简单比较

  本篇文章主要对线程与进程之间的区别作一简单总结,从内核实现的区别,双方的地址空间、共享的数据、操作原语的比较和多线程与多进程的区别这几方面,做一简单说明。1、Linux内核线程实现原理   Unix系统中,早期是没有“线程”概念的,80年代才引入,借助进程机制实现出了线程的概念。因此在这类系统中,进程和线程关系密切。   1. 轻量级进程(light-weight process),也...

2018-03-20 20:32:03 1457

原创 C++中的“浅拷贝”与“深拷贝”

浅拷贝问题的提出  首先,我们先看一段代码:#include<string.h>using namespace std;class test{private: char* p; int len;public: test(const char* p) { len = strlen(p); this-&g...

2018-03-19 19:29:31 1242

原创 剖析linux下的零拷贝技术(zero-copy)

背景  大多数的网络服务器是基于server-client模式的。在这当中,下载是一个很常见的功能。此时服务器端需要将主机磁盘上的文件发送到客户端上去。传统的 Linux 操作系统的标准 I/O 接口是基于数据拷贝操作的,即 I/O 操作会导致数据在操作系统内核地址空间的缓冲区和应用程序地址空间定义的缓冲区之间进行传输。那么传统的I/O操作过程是咋样的呢?(下面是具体说明,以read和writ...

2018-03-18 20:47:52 9489 1

原创 字符串分割函数--strtok与strsep

在c/c++中,字符串分割函数主要有两种:一是strtok函数,另一个就是strsep函数。下面我们对这两个函数作一个详细解释说明。1、strtok原形:  char* strtok(char *str, const char *delim);功能:  分解字符串为一组字符串;str为要分割的字符串,delim为分隔符;返回值:   从str开头开始的一

2018-02-04 14:02:06 3603 2

原创 str系列源码小结

1、strcmp  ①、原形:int strcmp(const char * str1, const char * str2)   ②、功能:比较两个字符串的大小   ③、代码#include#includeint my_strcmp(const char* str1,const char* str2);int main(){ int ret = 0; ch

2018-02-03 23:11:45 1338

原创 mem系列函数源码实现

1、memcmp  ①、原形:int memcmp(const void *buffer1, const void ,*buffer2, int count);   ②、功能:比较内存区中指定count个字符的大小;   ③、代码#include#includeint my_memcmp(const void *buf1,const void *buf2,int n);int

2018-02-03 22:26:38 1522

原创 linux基础之vim编辑器快捷键

在linux下,vim编辑器无疑是个神器。在全命令行下编辑时,为了提高效率,快捷键就变得必不可少。在本文中,主要介绍了vim的快捷键。vim编辑器的三种状态模式启动与退出 命令 释意 $vim 直接进入编辑环境 $vim filename 进入编辑环境并打开文件 :q 退出vim编辑环境 :w 保存对文件的修改

2018-01-29 15:05:05 320

原创 linux基础之常用命令总结

命令格式1、目录切换  1、ls:查看当前目录中的文件。 参数 作用 示例 -a 列出目录下所有文件(包括隐藏文件) ls -a -l 列出目长数据串,包括文件属性与权限数据等 ls -l或ll -i 列出文件的inode号 ls -i -t 以文件修改时间排列 ls -t -s 以块大小

2018-01-29 13:21:41 251

原创 linux基础之目录结构

在linux下,一切皆文件。我们打开电脑后,会发现都是文件夹而不是在windows下的盘符(c盘,d盘等)。windows分区在盘符下面,而linux分区挂在文件目录下面。在本文中,我们就来介绍以下linux的目录结构。1、系统目录 下面,我们利用一个表格来详细介绍一下这些目录: 目录 描述 / 根目录 /bin 作为基础系统所需要的最基础的命

2018-01-28 15:52:44 273

原创 一致性hash详解

需求  我们都知道,任何一种算法的的出现都源于需求。人们需要用它来更好的解决问题。那么,一致性hash算法的出现是源于什么需求呢?例如:在使用n台缓存服务器时,一种常用的负载均衡方式是,对资源o的请求使用hash(o)=o mod n 来映射到某一台缓存服务器。当增加一台服务器时,其hash函数相应就得变为:hash(o)=o mod (n + 1);反之,当 减少一台缓存服务器时,其hash

2018-01-25 19:35:53 1391

原创 c语言中的各种“零”

在c语言中,存在各种各样的“零”。例如:0,‘0’,NULL等。下面我们就具体介绍一下这些”零“:零的含义 零值 意义 备注 0 整型数据的0 0.0 实型数据的0 NULL 指针型数据的0 内存的0地址,用于初始化暂时不用的指针。或是标识已经被释放堆内存的指针。 ‘\0’ 转义字符型(ASCII值为0)

2018-01-24 21:41:07 9319

原创 c程序编译全过程解析

前言  当我们编写好c程序之后,经过编译便可运行得出结果。但是,我们所编写的程序别人可以看懂,但是机器却看不懂。为了在系统上运行这个程序,该源程序需要被其他程序转化为一系列低级机器语言指令,然后将这些指令按照可执行目标程序的格式打包并以二进制磁盘文件形式存储起来。这个过程就是编译过程。从源程序到可执行文件  源程序经过编译成为可执行文件。具体经历了以下几个过程:预处理–>编译–>汇编–

2018-01-23 17:40:41 1665

原创 大小端及网络字节序

什么是大端模式、小端模式  “大端”和”小端”表示多字节值的哪一端存储在该值的起始地址处;小端存储在起始地址处,即是小端字节序;大端存储在起始地址处,即是大端字节序;具体的说:    ①大端字节序(Big Endian):最高有效位存于最低内存地址处,最低有效位存于最高内存处;    ②小端字节序(Little Endian):最高有效位存于最高内存地址,最低有效位存于最低内存处。

2018-01-22 23:58:21 30476 7

原创 柔性数组(变长数组)

前言  我们平时在写C程序时,我们经常会使用数组来存放一些字符串或者其他数据。但是,在使用数组之前,我们都必须指定数组的大小。当我们知道所要存放数据的大小时还好,但是当我们还无法预先知道存放数据的大小时,我们必须指定足够大的空间来存放数据。这样往往会浪费许多空间;   有人说,我们可以利用指针,额外开辟空间存放数据,这样形式上之战有那个一个指针的空间,但是,使用指针的话,需要多次分配, 多

2018-01-22 22:30:03 1289

原创 信号

1、概念  提及信号我们首先想到的是什么?有人想到赛场上裁判的信号枪,有人想到路口的红绿灯……;信号在我们生活中随处可见。在计算机中,信号是信息的载体,Linux/UNIX 环境下,古老、经典的通信方式, 现下依然是主要的通信手段。在这篇文章中我们就主要聊聊信号。基本属性  信号的基本属性可以总结为两方面,即:软中断和时延性。   例如:A给B发送信号,B收到信号之前执行自己的代

2018-01-22 18:23:41 2379 1

空空如也

空空如也

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

TA关注的人

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