自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(26)
  • 资源 (9)
  • 收藏
  • 关注

原创 内核线程的退出

内核线程的退出要从创建开始,下面是kernel_thread的创建过程上图中regs.ip = kernel_thread_helper,也就是说新建的内核线程从kernel_thread_helper开始运行,kernel_thread_helper函数定义如下:其中的关键是,call *%rsi,调用的是kernel_thread中的fn参数(函数指针),调用结束后

2011-10-27 16:11:39 2509

转载 Linux内核线程之父pid=2的kthreadd线程

转自http://embexperts.com/viewthread.php?tid=30因为所涉及的话题在代码的实现上是体系架构相关的,所以本贴基于ARM架构。这里所谓的内核线程,实际上是由kernel_thread函数创建的一个进程,有自己独立的task_struct结构并可被调度器调度,这种进程的特殊之处在于它只在内核态运行。在Linux source code中, in

2011-10-27 14:51:39 5438

原创 Linux内核线程和普通进程区别

最近在看2.6.34的代码,根据以前的说法 init 进程1是除进程0以外的所有进程的父进程 但是在rest_init()函数中,实际上担负后续内核线程建立的kthread_add线程是在线程0中创建的,也就是说kthread_add以及通过ktread_add建立的其他内核线程,父进程应该都是进程0,不知道我的理解是不是正确的?另外我查过2.6.11的代码,开始的描述便是正确的,

2011-10-27 13:00:13 340

转载 linux内核的idle进程分析

1. idle是什么 简单的说idle是一个进程,其pid号为0。其前身是系统创建的第一个进程,也是唯一一个没有通过fork()产生的进程。在smp系统中,每个处理器 单元有独立的一个运行队列,而每个运行队列上又有一个idle进程,即有多少处理器单元,就有多少idle进程。系统的空闲时间,其实就是指idle进程 的"运行时间"。既然是idle是进程,那我们来看看idle是如何被创建,又具体做了

2011-10-27 12:57:09 509

原创 COW同步机制解析

COW(CopyOnWrite,写时复制)机制是一种无锁的快速数据访问机制,使用场景多个线程读取并且读取操作压力比较大,写操作只发生在一个线程中,并且写的次数与读相比比较小,也就是说COW应用于只存在读写冲突,不存在写写冲突,并且读的压力大的环境下。        具体的过程我以BtrFS对文件系统元数据的操作过程来解释。Btrfs 简介文件系统似乎是内核中比较稳定的部分,

2011-10-20 17:04:42 1958

转载 Linux SMP启动过程

1.        SMP 硬件体系结构:对于 SMP 最简单可以理解为系统存在多个完全相同的 CPU ,所有 CPU 共享总线,拥有自己的寄存器。对于内存和外部设备访问,由于共享总线,所以是共享的。 Linux 操作系统多个 CPU 共享在系统空间上映射相同,是完全对等的。 由于系统中存在多个 CPU ,这是就引入一个问题,当外部设备产生中断的时候,具体有哪一个 CPU 进行处理?

2011-10-20 16:56:03 793

转载 基数(radix)树

Linux基数树(radix tree)是将指针与long整数键值相关联的机制,它存储有效率,并且可快速查询,用于指针与整数值的映射(如:IDR机制)、内存管理等。IDR(ID Radix)机制是将对象的身份鉴别号整数值ID与对象指针建立关联表,完成从ID与指针之间的相互

2011-10-12 20:37:24 3337 1

转载 tc_malloc过程涉及到这些关键的数据结构

以上主要是tc_malloc过程,在这里涉及到这些关键的数据结构:1、CentralFreeListPadded Static::central_cache_[kNumClasses]central_cache_其实是一个CentralFreeList通过pad的方式保证

2011-10-12 20:36:49 766

转载 tcmalloc do_free过程分析(2)

ReleaseToCentralCache将某个freelist中的obj全部释放回centralcache,函数比较简单,如下所示,主要是通过一个while循环将freelist中的obj按照num_objects_to_move一批批的通过PopRange pop出来,然

2011-10-12 20:36:25 564

转载 tcmalloc do_free过程分析

下面我们开始free过程的分析,tcmalloc的free函数主要为tc_free,tc_delete,他们主要调用的还是do_free函数。do_free函数调用do_free_with_callback(ptr, &InvalidFree)并以需要释放的指针和Invali

2011-10-12 20:35:52 1166

转载 Tcmalloc源码简单分析(14)

解释到这里基本完成了size的malloc过程,下面我们继续回到do_malloc分析当size>=kMaxSize的情况,这时候do_malloc调用do_malloc_pages函数。do_malloc_pages首先将size通过tcmalloc::pages转换为num_

2011-10-12 20:35:12 1048

转载 Tcmalloc源码简单分析(13)

我们在看看Carve函数,Carve函数将span从normal list中切出,返回给Populate。首先将span的location为置位为Span::IN_USE,然后判断这个span的长度是否真好为n,如果大于n那么将span切割成两个span,新切出来的span叫做l

2011-10-12 20:34:39 697

转载 Tcmalloc源码简单分析(12)

下面我们来看看FetchFromSpans和Populate两个函数。FetchFromSpans首先判断CentralFreeList的nonempty_列表中是否有可用的span如果没有则返回NULL,否则取nonempty_第一个span,然后将span中切出一个obj,并

2011-10-12 20:34:11 1052

转载 Tcmalloc源码简单分析(11)

到此为止ThreadCache::GetCache函数分析完毕,那么我们返回do_malloc函数,首先判断size是否小于kMaxSize(8u * kPageSize),这个是区分要分配的是large object还是small obj。如果是small obj,那么首先

2011-10-12 20:33:45 807

转载 Tcmalloc源码简单分析(10)

Static::InitStaticVars()最后将调用Sampler::InitStatics()函数,此函数主要初始化sampler的采样间隔之类的。到此Static::InitStaticVars介绍完毕,我们返回ThreadCache::InitModule(),接着s

2011-10-12 20:33:12 592

原创 Tcmalloc源码简单分析(9)

以上过程是span_allocator_.Init()函数的行为,到此已经分析完毕,下面我们继续看Static::InitStaticVars函数,次函数接着将会调用函数stacktrace_allocator_.Init();stacktrace_allocator_的定义如下

2011-10-12 20:32:43 568

转载 Tcmalloc源码简单分析(8)

MmapSysAllocatorvoid* MmapSysAllocator::Alloc(size_t size, size_t *actual_size,                              size_t alignment) {#ifnde

2011-10-12 20:32:15 587

转载 Tcmalloc源码简单分析(7)

下面我们开始分析三个malloc函数分别是DevMemSysAllocator,MmapSysAllocator,以及SbrkSysAllocator(./src/system-alloc.cc)。首先分析SbrkSysAllocator(./src/system-alloc

2011-10-12 20:31:55 901

转载 Tcmalloc源码简单分析(6)

New中的MetaDataAlloc函数定义在common.cc中,通过调用TCMalloc_SystemAlloc来分配内存,维护一个全局变量metadata_system_bytes用来存储已经分配的内存数。TCMalloc_SystemAlloc首先通过变量system_a

2011-10-12 20:31:05 729

转载 Tcmalloc源码简单分析(5)

SizeMap初始化完成后,initStaticVars()开始初始化span_allocator_.Init(),并调用两次,主要目的应该是为了能够成功初始化,并保证cache不会存在冲突。;span_allocator_是一个PageHeapAllocator(page_he

2011-10-12 20:30:24 741

转载 Tcmalloc源码简单分析(4)

在initStaticVars()里面首先会调用SizeMap.init。SizeMap是一个非常关键的数据结构,下面我们对他先进行分析。关于SizeMap结构(common.cc和common.h)SizeMap里面涉及到几个关键的数据结构class_array_,cl

2011-10-12 20:29:57 953

转载 Tcmalloc源码分析-3

下面我们具体分析一下malloc和free过程。tc_malloc的代码如下所示:extern "C" PERFTOOLS_DLL_DECL void* tc_malloc(size_t size) __THROW {  void* result = do_malloc_

2011-10-12 20:29:28 1447

转载 Tcmalloc源码简单分析(2)

Free过程1、             首先free根据提供的ptr指针,获得此ptr所在的页面,然后利用页面号,获取需要释放的obj的size,这个size首先从pagemap_cache_中拿,如果不在pagemap_cache_中那么直接通过页面好获取所在的span,

2011-10-12 20:28:27 1475

Tcmalloc源码简单分析(2)

Free过程1、             首先free根据提供的ptr指针,获得此ptr所在的页面,然后利用页面号,获取需要释放的obj的size,这个size首先从pagemap_cache_中拿,如果不在pagemap_cache_中那么直接通过页面好获取所在的span,

2011-10-12 20:27:30 157

转载 Tcmalloc源码分析-1

Tcmalloc源码简单分析(1) (2011-10-08 15:36)分类: linux这段时间由于工作中涉及到内存疯长的事情,工作之余就对比分析了tcmalloc和ptmalloc的一些工作方式,关于ptmalloc代码的分析,已经有前人做了不少的工作,我这边主要

2011-10-12 20:26:47 2797

转载 Tcmalloc源码分析-1

Tcmalloc源码简单分析(1) (2011-10-08 15:36)分类: linux这段时间由于工作中涉及到内存疯长的事情,工作之余就对比分析了tcmalloc和ptmalloc的一些工作方式,关于ptmalloc代码的分析,已经有前人做了不少的工作,我这边主要

2011-10-12 20:26:30 203

Introduction to Distributed Algorithms(Second Edition

分布式系统的经典数据,各种分布式算法和系统架构时需要考虑的问题

2011-10-27

glibc内存管理ptmalloc源代码分析

详尽解析glibc ptmalloc代码的详尽读物

2011-10-27

gcc-inline-assembly

GCC 内嵌汇编的语法 详细解析,解压之后是一个HTML文件

2011-10-20

Professional Linux Kernel Architecture

非常好的关于Linux内核的书籍,很详尽,是已知最新的书籍

2011-10-20

Intel系列CPU的保护模式

详细讲解Intel X86CPU的实模式和保护模式,讲解保护模式的分段机制

2009-08-25

深入理解Linux内核

深入理解Linux内核第三版,英文版 深入介绍了Linux内核的结构和关键的数据结构 很经典

2009-07-14

DiretX入门教程

介绍游戏编程的入门级教程,介绍DirectX的使用。

2009-07-14

空空如也

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

TA关注的人

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