- 博客(27)
- 资源 (3)
- 收藏
- 关注
翻译 linux进程管理 - 核心调度器
linux内核进程调度器基于两个函数:周期性调度器函数和主调度器函数.周期性调度器所谓周期性调度器就是scheduler_tick中实现。如果系统正在活动中,内核会按照HZ自动调用这个函数。实际上在每个滴答的handler中会调用这个函数。如果在没有进程等待调度,那么在计算机电力供应不足的情况下,也可以关闭该调度器以减少电能消耗。该函数会激活负责当前进程的调度类的周期性调度方法。
2013-07-31 16:19:41 1593 2
翻译 Linux 进程调度
CFS调度器传统的调度器使用时间片的概念,对系统中的进程分别计算时间片,使得进程运行至时间片结束。在所有的进程时间片都以用尽后,重新计算时间片。而CFS调度器完全摒弃了时间片,会重点考虑进程的等待时间。CFS调度器的目的是,向系统中每个激活的进程提供最大的公正性,或者说确保没有进程被亏待。CFS引入了虚拟时钟的概念,该时钟的流逝速度小于实时时钟,精确的速度依赖于当前等待
2013-07-30 17:32:56 1873
转载 Linux 文件系统 - Ext4 Howto
去年就发现项目Android系统中已经用上了Ext4文件系统,当时并没有深究为什么要使用Ext4文件系统,使用ext4带来的优点和缺点。最近有时间,正好整理下Ext4对于Ext2/Ext3带来的变化。网上关于Ext4的文章并不多,只找到了来自http://kernelnewbies.org/Ext4/的Ext4 Howto,是一篇概括性的文章。1. 介绍Ext4是Linux操作
2013-07-29 10:14:12 7209
原创 理解linux虚拟文件系统VFS - 路径查找 path_lookup
VFS的一个主要操作,是给定一个文件名,获取该文件名的inode。路径查找是VFS中相当繁琐的一部分,主要是符号链接,文件系统装载点,已经. ..和//等奇怪路径带来了一些额外处理。nameidata数据结构查找过程涉及到很多函数调用,在这些调用过程中,nameidata起到了很重要的作用:1. 向查找函数传递参数;2. 保存查找结果。struct nameidata {
2013-07-27 16:06:50 10869 1
原创 理解linux虚拟文件系统VFS - 数据结构
file_system_type1406 struct file_system_type {1407 const char *name;1408 int fs_flags;1409 int (*get_sb) (struct file_system_type *, int,1410 const
2013-07-25 17:24:00 4855
原创 理解linux虚拟文件系统VFS - 概述
当前,除了linux标准的文件系统Ext2/Ext3/Ext4外,存在很多种文件系统,比如reiserfs, xfs, Windows的vfat NTFS,网络文件系统nfs 以及flash 文件系统jffs2, yaffs/yaffs2 ubifs。linux通过叫做VFS的中间层最这些文件系统提供了完美的支持。对于用户来说,这些文件系统是几乎透明的,在大部分情况下(比如fat vfat不支
2013-07-25 14:43:07 21382 3
原创 进程地址空间 - 地址空间布局
虚拟地址空间包含了若干区域,其分布方式是特定于体系结构的。但是基本都包含下列共同的成分。当前运行代码的二进制代码,代码段又称为text,所处的地址空间由称为text段。程序使用的动态库的代码存储全局变量和动态产生的数据的堆。用于保存局部变量和实现函数/过程调用的栈环境变量和命令行参数的段将文件内容映射到虚拟地址空间的内存映射。是由elf标准确定。每个体系结构都指定了一个特定起始
2013-07-22 21:40:15 2888
原创 内核映射 - 持久内核映射
持久内核映射 permanent kernel mappings内核提供了其他函数用于把Highmem内存映射到内核地址空间:持久内核映射和临时内核映射。而这些函数和vmalloc无关。因此网络上对持久内核映射和临时内核映射的理解非常的混乱持久内核映射允许内核建立高端物理内存帧到内核地址空间的长期映射。和其他kernel地址空间一样,持久内核映射使用kernel一个pte页表来
2013-07-14 17:32:21 2900 2
原创 内核分配不连续页 - vmalloc
当buddy系统还有大量的连续物理内存时,我们可以通过__pages_alloc成功分配很大的一块连续物理内存空间,随着系统运行时间加长,buddy系统内很难中找到一块大的连续物理内存空间,因此__pages_alloc可能会失败,即便通过kswapd进行页面的回收和交换,buddy仍然不可避免的碎片化首先我们要明确的是,连续物理内存的分配并不是必要的。对于大部分DMA操作,我们的确需
2013-07-14 11:42:09 8962
原创 linux 内存管理中的PG_Compound和GFP_COMP
当__alloc_pages分配的gfp_flags制定了__GFP_COMP,那么内核必须将这些页组合成复合页compound page。第一个页称为head page,其余所有的页称为tail page。复合页的尺寸要远大于当前分页系统支持的页面大小。并且一定是2^order * PAGE_SIZE大小。复合页主要用在HugeTLB相关的代码。复合页的引入是因为随着计算机物理内存容量不断增
2013-07-13 11:38:14 4335
原创 伙伴系统分配器 - buffered_rmqueue
在__alloc_pages过程中,操作分为两个部分,第一部分是找到适当的内存域,接下来的一部分就是按照伙伴系统的分配方式,从free_lists中移除这些页。buffered_rmqueue就是用来完成第二部分工作的。1. 首先判断要分配的页面数是否为 1,如果为1 的情况下,那么并不需要从buddy系统获取,因为per-CPU的页缓存提供了更快的分配和释放机制。per-CPU cach
2013-07-12 10:33:21 3394
翻译 内存管理中的cold page和hot page, 冷页 vs 热页
所谓冷热是针对处理器cache来说的,冷就是页不大可能在cache中,热就是有很大几率在cache中。网上还有一种说法:冷页就是冷的页,热页就是热点的页,解释的真好 :)cold page和hot page的概念可以参考LWN的一片文章http://lwn.net/Articles/14768/2.5.45内核,Martin Bligh和Andrew Morton以及其他人提交
2013-07-12 09:46:03 5083 1
原创 伙伴系统分配器 - PF_MEMALLOC 标志位
这是一个进程标记位,除了在内存管理子系统中使用外,还在其他的内核子系统中使用。之所以在伙伴系统分配器中讨论,是因为这个标记和内存管理密不可分。当一个进程被设置PF_MEMALLOC后,那么对进程会有如下影响:1. 当进程进行页面分配时,可以忽略内存管理的水印进行分配,这是告诉内存管理系统,给我一点紧急内存使用,我将会释放更多的内存给你。2. 如果忽略水印分配仍然失败,那么直接返回ENO
2013-07-11 20:15:51 6757 2
原创 伙伴系统分配器 - __alloc_pages
kernel可以通过几个分配函数从伙伴系统分配页面:alloc_pagesget_zeroed_pageget_dma_pages这几个函数都是通过alloc_pages来实现页面分配的,而alloc_pages的核心实现就是__alloc_pages。alloc_pages在gfp.h中定义#define alloc_pages(gfp_mask, ord
2013-07-10 10:14:10 6807
原创 伙伴系统分配器 分配掩码
kernel伙伴系统分配的函数,只能分配2的整数幂个页,更细力度的分配只能借助与slab或者slub分配器常见的分配函数是:alloc_pages(mask, order) 分配2的order幂次个页面,如果成功返回第一个页框对应的page结构,失败则返回NULLget_zeroed_page(mask)分配一个页面,成功则返回这个页框对应的page结构,失败返回NUL
2013-07-09 19:06:38 1981
原创 线程栈和进程栈 区别
要搞清线程栈和进程栈的区别,首先要弄清线程和进程之间的关系。线程和进程有很多类似的地方,人们习惯上把线程称为轻量级进程,这个所谓的轻量级是指线程并不拥有自己的系统资源,线程依附于创建自己的进程。我们可以从三个方面来理解线程的轻量级1. 调度由于进程之间的线程共享同一个进程地址空间,因此在进程的线程之间做进程切换,并不会引起进程地址空间的切换,从而避免了昂贵的进程切换。当然不
2013-07-09 10:07:55 15377 3
翻译 避免物理内存碎片化 - 内存紧缩
原文地址 http://lwn.net/Articles/368869/长期存在的内存碎片问题,已经有多篇文章提及了。简单的说:当系统运行一段时间后,空闲页面趋向于散落在不连续的空间,很难再有足够长的连续物理内存页面分配。内核开发者已经下了很多工夫,减少大块连续物理内存的分配,因此大部分内核功能并不会受到页面碎片化的影响。但是仍然存在对大块连续物理内存的需要,在内存碎片化系统上的内存分
2013-07-03 19:10:57 5854
原创 mlock对page MOVABLE和RECLAIMABLE特性的影响
系统调用mlock允许应用进程锁住某一个地址空间,这将阻止Linux内存回收进程回收这个地址空间的页面。mlock仅仅在kernel层对给定地址范围所在的VMA增加 VM_LOCKED标记,当linux kernel进行内存回收时,会首先判断VMA是否有VM_LOCKED标记,如果存在,那么不会对这个地址范围内的页面进行回收锁定后,这个地址范围内的物理页面,就从RECLAIMABL
2013-07-03 10:33:18 1467
原创 避免物理内存碎片化
以前的项目碰到了buddy内存分配失败的情况,最近面试的两家公司也提到了这个问题。物理内存碎片化,是指系统空闲物理内存被使用过的物理内存分割开,导致buddy系统无法满足page分配申请,尤其是申请的连续空间较大的情况下。一般情况下,出错信息如下:[ 3308.564000] lowmem_reserve[]: 0 0 0[ 3308.564000] Normal: 7
2013-07-01 13:55:26 14910 3
原创 内核线程和普通进程的区别
内核线程的主要作用1. 周期性的将dirty内存页同步到磁盘设备上。 比如 bpflush线程周期性的把dirty数据写回磁盘2. 内存页很少的情况下,把内存page 交换到磁盘空间。 比如kswapd,系统会为每一个NUMA创建一个kswapd进程,但是在非NUMA系统上,则仅有一个kswapd3. 管理延时动作4. 实现文件系统的事物日志有两种类型的线程:
2013-07-01 11:03:03 4482
A COMPACT GUIDE TO LEX & YACC
2010-10-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人