- 博客(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
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人