自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

FreeeLinux's blog

没有迷路的人

  • 博客(412)
  • 资源 (3)
  • 收藏
  • 关注

原创 Effective C++ 第六章--继承与面向对象设计笔记

条款32确定你的public继承塑模处is-a关系 条款32:确定你的public继承塑模处is-a关系”public继承“意味着is-a。

2017-01-19 18:48:28 491

转载 设计模式之代理模式

软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》(DP)两本书。本文介绍代理模式的实现。 [DP]上的定义:为

2017-01-18 15:23:52 345

转载 auto_ptr源码分析

By SmartPtr(http://www.cppblog.com/SmartPtr/)auto_ptr是当前C++标准库中提供的一种智能指针,或许相对于boost库提供的一系列眼花缭乱的智能指针, 或许相对于Loki中那个无所不包的智能指针,这个不怎么智能的智能指针难免会黯然失色。诚然,auto_ptr有这样那样的不如人意,以至于程序员必须像使用”裸“指针那样非常小心的使用它才能保证不出错,以至

2017-01-18 15:14:46 617

原创 slab机制总结篇

唔,花了一个星期看完了slab机制的源码,不愧是linux内核源码,和我当初看libevnt源码有一拼。两者都是资料比较少,只有零散的博客,没有成文的书,因此加大了自己理解的难度。如果有书籍的话,那么根本不需要一个星期。下面要开始总结了。  一: slab是为了解决内部碎片提出的,还是外部碎片? 为了解决内部碎片。 内部碎片的产生:因为所有的内存分配必须起始于可被 4

2017-01-16 16:55:41 7453

原创 slab源码分析--销毁函数

这次来谈一下slab机制中的所有销毁函数。释放对象注意释放对象仅仅是回收回slab,并不会将内存还给伙伴系统。回收对象时有以下原则:本地高速缓存的空间还可以容纳空闲对象,则直接将对象放回本地高速缓存。本地高速缓存的空间已满,则按batchcount的值将对象从本地高速缓存转移到本地共享缓存shared中,如果没有设置本地共享缓存,那么就转移到slab三链中。转移时基于先进先出原则的,也就是转移e

2017-01-16 15:45:30 1612 1

原创 slab源码分析--kmalloc函数分析

这次来说一个关键函数,kmalloc()函数。  函数原型#include Linux/slab.h> void *kmalloc(size_t size, int flags); size是要分配内存的大小,不过内核会对大小进行适配,比如取32,64等等,是和缓存行等体系结构有关系的,总之可能会比你要申请的内存大一些。 flags是与伙伴系统交互的标记,虽说kmalloc()是从slab分配

2017-01-16 14:49:37 1941

原创 slab源码分析--setup_cpu_cache函数

之前剖析过了 slab 的初始化,以及 kmem_cache_create() 函数,留下了一个 setup_cpu_cache() 函数没有处理,今天来分析一下。说明:本文缓存器指 kmem_cache 结构,slab 三链即 kmem_list3,又称 slab 分配器。setup_cpu_cache() 函数和 slab 分配器的初始化状态是息息相关的。我们知道,slab 分配器初始化会经历以

2017-01-16 13:56:17 1727 1

原创 slab源码分析--缓存器的创建

这篇博客来剖析一下 kmem_cache_create() 函数,就是所谓合成缓存器函数。这个函数通常是在内核初始化时进行的,或者在首次加载模块时进行的。struct kmem_cache *kmem_cache_create(const char* name, size_t size, size_t align, unsigned long flags, void (*ctor)(voi

2017-01-15 21:32:58 878

原创 slab源码分析--从slab初始化说起

上次说了 slab 的主要数据结构,这次从初始化开始进行源码剖析。   slab 的初始化,当然是从内核启动就开始了。内核启动的 start_kernel() 函数://内核的启动程序啊:)asmlinkage void __init start_kernel(void){ ... mem_init(); //内存相关初始化 kmem_cache

2017-01-14 14:24:44 2403

原创 slab源码分析--主要数据结构分析

基本原理管理机构图示kmem_cache 缓冲区slab 结构体 基本原理Linux 保护模式下,内存管理采用分页机制,由伙伴系统负责,分配内存的单位是页。在伙伴系统之上,Linux 又增加了 slab 机制,其工作是针对一些经常分配并释放的对象,如 task_struct 结构体等,这种对象的大小一般比较小,如果直接采用伙伴系统来进行分配和释放,不仅会造成大量的内部碎片,而且处理速度也太慢。

2017-01-13 22:36:32 1178

原创 Linux-2.6 所有版本内核源码下载

在这里分享给大家一个链接,链接里面有Linux-2.6所有版本的下载链接,可以复制到迅雷上面一件下载,2.6版本还是比较适合用来剖析的,往上就有点难了。   下载地址:https://www.kernel.org/pub/linux/kernel/v2.6/   拿走 :)

2017-01-11 16:18:11 16715 1

转载 Linux-2.6.32 NUMA架构之内存和调度

http://blog.chinaunix.net/uid-7295895-id-3076420.htmlLinux-2.6.32 NUMA架构之内存和调度 本文将以XLP832通过ICI互连形成的NUMA架构进行分析,主要包括内存管理和调度两方面,参考内核版本2.6.32.9;NUMA架构常见配置选项有:CONFIG_SMP, CONFIG_NUMA,

2017-01-10 17:30:38 874

转载 剖析Disruptor:为什么会这么快?(二)神奇的缓存行填充

原文地址:http://ifeve.com/disruptor-padding/作者:Trisha  译者:方腾飞 校对:丁一我们经常提到一个短语Mechanical Sympathy,这个短语也是Martin博客的标题(译注:Martin Thompson),Mechanical Sympathy讲的是底层硬件是如何运作的,以及与其协作而非相悖的编程方式。我在上一篇文

2017-01-09 15:17:10 500

原创 内核中各种同步机制(自旋锁大内核锁顺序锁等)

原子操作自旋锁读写自旋锁信号量读写信号量互斥量完成变量大内核锁顺序锁禁止抢占顺序和屏障如何选择 原子操作  原子操作是由编译器来保证的,保证一个线程对数据的操作不会被其他线程打断。  自旋锁  原子操作只能用于临界区只有一个变量的情况,实际应用中,临界区的情况要复杂的多。对于复杂的临界区,Linux 内核提供了多种方法,自旋锁就是其一。自旋锁的特点就是当一个线程获取了锁之

2017-01-09 01:13:35 3597 1

原创 中断下半部的三种机制

中断下半部的处理实现下半部中断的三种机制软中断Tasklet工作队列各种机制的比较  之前提到过,之所以中断会分成上下两部分,Linux 的上半部就是中断处理程序,下半部采用三种机制来实现,这样分两部执行的策略有利于缩短响应硬件的时限。  中断下半部的处理  对于一个中断,如何划分出上下两部分呢?哪些处理放在上半步,哪些放在下半部? 这里有一些经验可供借鉴:如果一个任务对时间十分

2017-01-09 01:08:45 6562

转载 Linux中断机制分析

目录目录中断的类型中断的上半部和下半部中断相关函数注册中断的函数释放中断的函数中断程序的声明中断处理机制 中断的类型  中断一般分为异步中断(一般由硬件引起)和同步中断(一般由处理器本身引起)。   异步中断:CPU 处理中断的时间过长,所以先将硬件复位,使硬件可以继续做自己的工作。然后再适当时候处理中断请求中耗时的部分。举个例子:网卡的工作原理网卡收到数据包后,向 CPU 发

2017-01-08 16:27:00 1026

原创 Linux进程调度内核实现分析

进程选择 使用红黑树存放进程队列,以 vruntime 为键值,每次选择 vruntime 最小的进程。这里有用到了一个 trick,使用 leftmost 缓存了红黑树的最左叶子节点,提高效率(STL也这么干了)。调度器入口 schedule() 函数调用 pick_next_task() 函数,按照优先级从大到小一次检查每一个调度类,从最高优先级调度类中,选择最高优先级进

2017-01-08 11:11:55 894

原创 Linux进程管理、进程创建、线程实现、僵尸进程

目录目录概述进程描述符及任务结构分配进程描述符进程描述符的存放进程状态进程家族树进程创建写时拷贝forkvfork线程实现创建线程内核线程进程终结删除进程描述符如何处理僵尸进程 概述  在 Linux 系统中,通过复制一个现有的进程来创建一个全新的进程。调用 fork() 的进程称为父进程,新产生的进程称为子进程。调用结束时,在返回点这个相同位置上,父进程恢复执行,

2017-01-08 10:08:56 655

转载 linux内存管理--用户空间和内核空间

有用户进程进行系统调用(代表用户进程在内核态执行)等时刻可以访问到内核空间。用户空间对应进程,所以每当进程切换,用户空间就会跟着变化;而内核空间是由内核负责映射,它并不会跟着进程变化,是固定的。内核空间地址有自己对应的页表,用户进程各自有不同的页表。

2017-01-07 20:21:17 530

原创 操作系统内存管理概述

概述存储器分为内存和外存。主存就是内存,外存也称为辅存,就是磁盘,磁带机等外部设备。主存是和CPU通过总线相连的,CPU执行指令需要从内存(即主存,后文同理)从中访问指令和数据。内存被分为了两部分,一部分是系统区(内核子程序占用),一部分是用户区(用户程序、数据)。通常主存的低地址段分给操作系统,高地址段分给用户。我们今天的问题是,操作系统磁盘中的数据怎么装载进内存中呢?对于系统区,当机器开机时,系

2017-01-06 16:03:43 1498

转载 Linux下逻辑地址、线性地址、物理地址详细总结

Linux中逻辑地址等于线性地址。为什么这么说呢?因为Linux所有的段(用户代码段、用户数据段、内核代码段、内核数据段)的线性地址都是从 0x00000000 开始,长度4G,这样 线性地址=逻辑地址+ 0x00000000,也就是说逻辑地址等于线性地址了。

2017-01-06 12:11:44 4351

转载 【汇编】计算机寄存器介绍

计算机寄存器分类简介: 32位CPU所含有的寄存器有: 4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个

2017-01-06 12:07:05 1363

转载 linux中的分段机制

将物理内存划分为多个段,让操作系统可以使用大于其地址线对应的物理内存(比如正常情况下32位地址线可以访问4G大小的内存,但是有分段后则可访问大于4G的内存)。权限控制,将每个段设置权限位,让不同的程序访问不同的段。  对于linux内核来说,它仅仅只使用了分段机制中的权限控制功能,具体我们可以一起看看是如何做的。

2017-01-06 12:04:58 818

原创 多线程编程的锁问题解析(锁竞争死锁活锁及Date Race等)

为了防止例1中的数据竞跑现象,我们可以使用锁来保证每个线程对counter++操作的独占访问(即保证该操作是原子的)。在例3的程序中,我们使用mutex锁将counter++操作放入临界区中,这样同一时刻只有获取锁的线程能访问该临界区,保证了counter++的原子性:即只有在线程1执行完counter++的三条指令之后线程2才能执行counter++操作,保证了counter的最终值必定为2。

2017-01-05 12:28:21 4395 1

原创 STL源码之rotate函数结合图和实例分析

__gcd是求两个数的最大公约数,也是循环位移的遍数。举个例子来说明算法过程,数组123456789,把123翻转到右边,*first=1,*last=9,*middle=4;要旋转字符串(123)的长度为3,字符串长度为9,3和9的最大公约数为3,因此需要翻转3遍;第一遍从*(initial+shift)=6开始,6移到3的位置,9移到6的位置,下一个位置是ptr2 = first + (shift - (last - ptr2))=0+(3-(8-8))=3,不满足ptr2 != initial的

2017-01-04 17:44:44 924 2

转载 Zookeeper监控的原理

此时,需要一个能够动态注册和获取服务信息的地方。来统一管理服务名称和其对应的服务器列表信息,称之为服务配置中心,服务提供者在启动时,将其提供的服务名称、服务器地址注册到服务配置宗新,服务消费者通过服务配置中心来获得需要调用的服务的机器列表。通过相应的负载均衡算法,选取其中一台服务器进行调用。当服务器宕机或者下线时,相应的机器需要能够动态地从服务配置中心里面溢出,并通知相应的服务消费者,否则服务消费者就有可能因为调用到已经失效服务而发生错误,在这个过程中,服务消费者只有在第一次调用服务时需要查询服务配置中心,

2017-01-03 09:55:05 2100

原创 求数组中最小的k个数以及海量数据最大堆、multiset解决方案

【题目】输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。【方案一】主要有两种方案。第一是利用我们熟知的 partition 算法,它是快速排序的核心,相信每个人都会。它可以用来求取数组的任意第 k 大的数,时间复杂度是O(n)。我们不断对数据 partition,当它返回的 index 为第 k-1

2017-01-02 20:29:32 2361

原创 数组中出现次数超过一半的数字

【题目】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。【分析】采用阵地攻守的思想:第一个数字作为第一个士兵,守阵地;count = 1;遇到相同元素,count++;遇到不相同元素,即为敌人,同归于尽

2017-01-02 14:04:16 432

原创 设计模式之--迭代器模式(自定义迭代器与STL::find()配合查找链表元素)

以前看了好多STL的源码,总以为自己对STL的迭代器理解够深刻了,今天试着写了一下,因为刚开始没有重载operator==一直编译不过,唉,代码还是敲过一遍好,并不是眼睛看多了自己真的就熟悉了。首先说下什么是迭代器模式:提供一种方法,使之能够依次巡防某个容器内的各个元素,而又无需暴露该容器内部数据的表述方式不管是泛型思维还是STL的实际运用,迭代器(iter

2017-01-01 17:48:20 1068

转载 STL源码剖析——list容器的排序算法sort()

前言    由于STL本身的排序算法sort接受的输入迭代器是随机访问迭代器,但是双向list链表容器的访问方式是双向迭代器,因此,不能使用STL本身的排序算法sort,必须自己定义属于自己访问的排序算法。我们从源码的剖析中,可以看到该排序算法思想类似于归并排序。list容器之排序算法sort    在该排序算法的实现过程中,定义了一个类似于搬运作用的链表carry和具有中

2017-01-01 15:28:13 1103

原创 C++模板之trait与模板技巧

一:trait1.Fixed Traits主要是构造适应各种类型的函数Fixed主要指,一旦定义了这个分离的 trait,则无法在算法中进行改写。value trait 是用于针对型别进行 value 方面的操作,如 zero(),它是 fixed trait 和下面的另外一种参数化萃取的一部分。template class accumulation_traits;t

2016-12-31 20:12:31 2270

原创 《深度探索C++对象模型》读书笔记第七章:站在对象模型的尖端

模板:对于类来说,只有成员函数在被使用的时候,才会被具现出来。之所以如此,主要有两个原因:空间和事件的考虑。可能只使用少数成员函数,不需要具现全部。尚未实现的机能。并不是一个 template 具现出来的所有类型一定能够完整支持一组成员函数所需要的运算符。如果只具现真正用到的成员函数,编译器就能够支持哪些对于其他成员函数可能造成编译错误的类型。(比如T t = 1024,t 或

2016-12-31 13:35:53 463

原创 《深度探索C++对象模型》读书笔记第六章:执行期语意学

C++保证一定会在 main() 函数之前构造出全局对象,在 main() 函数结束之前把全局对象摧毁掉。这是静态的初始化操作和内存释放操作。C++中所有的全局对象都放在程序的 data segment 中。如果明确给它一个值,对象将以该值为初值,否则对象所配置到的内存内容全为 0。包括 POD类型,这个C语言不一样。在C中专门有 .bss 段来存放未初始化的全局变量。cfront

2016-12-31 12:37:08 646

转载 动态内存管理详解:malloc/free/new/delete/brk/mmap

c 内存获取和释放 malloc/free, calloc/realloc上述8个函数/操作符是c/c++语言里常用来做动态内存的申请和释放的,要理解这些接口,大概需要下面几个维度的了解:1. 了解OS的进程空间模型,一个进程的地址空间,一般划分为内核区、用户区,用户区又划分为栈区、堆区、数据区、代码区。这里的‘堆区’,‘栈区’,‘数据区’,‘内核区’,其实就是一个

2016-12-31 11:28:01 507 1

转载 C++ 的 new 关键字深入理解

new”是C++的一个关键字,同时也是操作符。关于new的话题非常多,因为它确实比较复杂,也非常神秘,下面我将把我了解到的与new有关的内容做一个总结。new的过程当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。当然,如果我们创建的是简单类型的变量,那么第二步会被省略。假如我们定义了如下一个类A:

2016-12-31 11:02:49 1594

原创 《深度探索C++对象模型》读书笔记第五章:构造、解构、拷贝语意学

纯虚基类尽量不要定义数据成员,如果定义了就需要在构造函数或其他成员函数设定初值,不过这通常是一种不好的设计。纯虚基类的纯虚函数可以在派生类中以静态方式调用。声明了纯虚析构函数就一定得定义它,为什么?因为每一个派生类析构函数都会被编译器扩展,以静态调用方式调用其每一个虚基类以及上一层基类的析构函数。因此,只要缺乏任何一个基类析构函数的定义,就会导致链接失败。如果某个函数其函数定义内容不与类型有关,不

2016-12-31 02:36:48 714

原创 《深度探索C++对象模型》读书笔记第四章:Function语意学

C++中类的非静态成员函数和一般函数具有相同的效率,编译器内部会将成员函数转化为对等的普通函数实体,比如加上 this 指针。一般而言,编译器对函数会用 ”mangling“ 手法进行命名处理,这也是函数重载的支持手段。独立于 class object 之外的存取操作,在某个时候特别重要。比如说 static 成员函数,它的主要特性是没有 this 指针,因此差不多等同于非成员函数,所以它可以成为

2016-12-30 21:44:54 534

原创 《深度探索C++对象模型》读书笔记第三章:Data语意学

这是第三章,第三章当时我的博客: C++对象模型Data语意学分析、虚继承底层实现机制 写的比较详细,所以这次可能总结会少一些。关于 class 的大小分析上面提到的博客有详细分析。对于 origin.x=0.0 和 pt->x=0.0 两种方式存取数据有什么重大差异?答案是:当调用类是一个派生类,而且在其继承体系中有一个虚基类,并且被存取的成员(如本例的x)是一个从该虚基类继

2016-12-30 17:05:55 631

转载 关于NRV优化详细分析

在C++中,函数返回整数或指针是通过eax寄存器进行传递的,理解起来比较简单。    但是返回对象或结构体一直是令人感到困惑的问题。今天我整理了一下,将整个返回过程写下来,以作备用。     还是先通过一个例子来理解这个问题:首先,定义一个类Vector:class Vector{public: int x,y;};然后定义函数add(

2016-12-30 12:11:12 1657

原创 《深度探索C++对象模型》读书笔记第二章:构造函数语意学

第二章主要分析编译器什么情况下为我们合成默认构造函数,我的这篇博客已经写得很详细了: C++编译器默认构造函数合成机制分析,这次只写一些其他要点。编译器在四种情况下会为未声明构造函数的类合成默认(nontrival)构造函数。被合成出来的构造函数只能满足编译(而非程序)的需要,分别是:(1)包含的成员对象有默认构造函数。(2)继承的基类有默认构造函数。(3)该类含有虚函数,需要

2016-12-30 02:15:03 689

muduo网络库

如果你用其他的编译不通过,就用这个吧。

2016-12-01

MySQL-python-1.2.5.win64-py2.7.exe

有效解决安装mysql-python时遇到的error: Unable to find vcvarsall.bat问题,以及 %1 win 32 问题

2016-09-20

valgrind-3.10.1

Linux内存泄漏检测工具

2016-08-11

空空如也

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

TA关注的人

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