时间:2015-03-03 来源:

Linux内核源代码情景分析-内存管理之用户页面的分配【编程语言】

    首先介绍几个重要的数据结构.

    1、page

    rmqueue函数如下web切图报价,使用了伙伴算法.

    实际上,web切图报价绝大多数的分配页面操作都是在分配策略所规定的第一个页面管理区就成功了.不过,psd转html flags); do { head = &area->free_list; curr = memlist_next(head); if (curr != head) {//首先在恰好满足大小要求的队列里分配 unsigned int index; page = memlist_entry(curr, list); if (BAD_RANGE(zone, curr_order, page, order, area);//如果已经试了更大的队列web前端制作, flags); set_page_count(page,page)) BUG(); DEBUG_ADD_PAGE return page; } curr_order++;// 如果不行web切图报价, flags); return NULL; }

typedef struct zonelist_struct { zone_t * zones [MAX_NR_ZONES+1]; // NULL delimited int gfp_mask; } zonelist_t;    __alloc_pages函数如下:

    3、free_area_t

typedef struct page { struct list_head list; struct address_space *mapping; unsigned long index; struct page *next_hash; atomic_t count; unsigned long flags; /* atomic flags, some possibly updated asynchronously */ struct list_head lru; unsigned long age; wait_queue_head_t wait; struct page **pprev_hash; struct buffer_head * buffers; void *virtual; /* non-NULL if kmapped */ struct zone_struct *zone; } mem_map_t;    其中virtual指向实际的页面内存地址.

    alloc_pages分配内存,符合w3c标准如下:

typedef struct zone_struct { /* * Commonly accessed fields: */ spinlock_t lock; unsigned long offset; unsigned long free_pages; unsigned long inactive_clean_pages; unsigned long inactive_dirty_pages; unsigned long pages_min, pages_high; /* * free areas of different sizes */ struct list_head inactive_clean_list; free_area_t free_area[MAX_ORDER]; /* * rarely used fields: */ char *name; unsigned long size; /* * Discontig memory support fields. */ struct pglist_data *zone_pgdat; unsigned long zone_start_paddr; unsigned long zone_start_mapnr; struct page *zone_mem_map; } zone_t; #define ZONE_DMA 0 #define ZONE_NORMAL 1 #define ZONE_HIGHMEM 2 #define MAX_NR_ZONES 3

    2、zone_struct

static inline struct page * alloc_pages(int gfp_mask, order); }  

    空闲区free_area_struct结构中用来维持双向链队列的结构list_head是一个通用的数据结构.回到上面的page结构承接网页制作,其中的第一个成分就是一个list_head结构,承接网页制作物理页面的page结构正是通过它进入free_area_struct结构中的双向链队列的.

    系统中的每一个物理页面都有一个page结构(或者mem_map_t).系统在初始化时根据物理内存的大小建立起一个page结构数组mem_map,里面的每个page数据结构都代表着系统中的一个物理页面.每个物理页面的page结构在这个数组里的下标就是该物理页面的序号.    “仓库”里的物理页面划分为ZONE_DMA和ZONE_NORMAL两个管理区.每个管理区都有一个数据结构符合w3c标准,即zone_struct数据结构.在zone_struct数据结构中有一组“空闲区间”(free_area_t)队列.为什么是“一组”队列,html切图制作而不是"一个"队列呢?这也是因为常常需要成“块”地分配在物理空间内连续的多个页面网页外包接活,所以要按块的大小分别加以管理.因此,wap前端外包在管理区数据结构中既要有一个队列来保持一些离散(连续长度为1)的物理页面web前端制作,还要有一个队列来保持一个连续长度为2的页面块,web前端制作以及连续长度为4、8、16 ... 直到2 ^ MAX_ORDER的页面块.常数MAX_ORDER定义为10,也就是说最大的连续页面块可以达到2 ^ 10=1024个页面,div前端切图即4M字节.

    其中contig_page_data.node_zonelists如下:

    __alloc_pages_limit函数web切图报价, unsigned long order) { zone_t **zone; int direct_reclaim = 0; unsigned int gfp_mask = zonelist->gfp_mask; struct page * page; ...... memory_pressure++; ...... if (order == 0 && (gfp_mask & __GFP_WAIT) && !(current->flags & PF_MEMALLOC)) direct_reclaim = 1;//如果要求分配的只是单个页面符合w3c标准,并且要等待分配完成,符合w3c标准又不是用于管理目的网页外包接活,表示可以从相应页面管理区的"不活跃干净页面"缓冲队列中回收 ...... if (inactive_shortage() > inactive_target / 2 && free_shortage()) wakeup_kswapd(0);//唤醒kswapd内核线程 ...... else if (free_shortage() && nr_inactive_dirty_pages > free_shortage() && nr_inactive_dirty_pages >= freepages.high) wakeup_bdflush(0);//唤醒bdflush内核线程 try_again: ...... zone = zonelist->zones; for (;;) { zone_t *z = *(zone++); if (!z) break; if (!z->size) BUG(); if (z->free_pages >= z->pages_low) { page = rmqueue(z, order, direct_reclaim);//不断降低水位 if (page) return page; ...... page = __alloc_pages_limit(zonelist, PAGES_LOW, direct_reclaim);//不断降低水位 if (page) return page; ...... wakeup_kswapd(0);//唤醒内核线程kswapd if (gfp_mask & __GFP_WAIT) { //如果当前分配策略表明对于要求分配的页面时志在必得,符合w3c标准分配不到时宁愿等待网页外包接活,就让系统来一次调度. __set_current_state(TASK_RUNNING); current->policy |= SCHED_YIELD; schedule();//让系统来一次调度,wap前端外包这样一来让kswapd有可能立即被调度运行web前端制作, order, direct_reclaim);//当再次被调度时web切图报价,或者分配策略表明不允许等待时,web切图报价就以参数PAGES_MIN再调用一次_alloc_pages_limit() if (page) return page; //如果再失败符合w3c标准,本身就是"内存分配工作者",要求分配内存页面的目的是执行公务,wap前端外包是要更好地分配内存页面web前端制作,这当前比一般进程重要了,web前端制作这些进程的task_struct结构中flags字段的PF_MEMALLOC标志位为1. if (!(current->flags & PF_MEMALLOC)) {//对于非kswapd或者kreclaimd的进程 ...... if (order > 0 && (gfp_mask & __GFP_WAIT)) {//分配页面数大于1,且如果分配不到页面,div前端切图宁愿等待 zone = zonelist->zones; /* First, 1);//把不活跃脏的页面变成不活跃干净的页面 current->flags &= ~PF_MEMALLOC; for (;;) { zone_t *z = *(zone++); if (!z) break; if (!z->size) continue; while (z->inactive_clean_pages) { struct page * page; /* Move one page to the free list. */ page = reclaim_page(z);//把不活跃干净的页面符合w3c标准,所有的链表关系都清除,符合w3c标准但使用计数仍然为1 if (!page) break; __free_page(page);//使用计数减为0,下次alloc_page就能分配到了 /* Try if the allocation succeeds. */ page = rmqueue(z,则try_again goto try_again; ...... } else if (gfp_mask & __GFP_WAIT) { try_to_free_pages(gfp_mask); memory_pressure++; if (!order)//如果分配的页面数为1,或者虽然不是执行公务web切图报价,但已想尽了一切方法,网站div+css采取了一切措施符合w3c标准, order);//这次是不惜血本了网页外包接活,就试图从管理区分配 if (page) return page; } /* No luck.. */ printk(KERN_ERR "__alloc_pages: %lu-order allocation failed.\n", order); return NULL; }     调用时有两个参数.第一个参数gfp_mask是一个整数,div+css制作表示采用哪一种分配策略;第二个参数order表示所需的物理块大小承接网页制作,可以是1、2、4 ...、直到2 ^ MAX_ORDER个页面.

typedef struct free_area_struct { struct list_head free_list; unsigned int *map; } free_area_t;

    管理区结构中的offset表示该分区在mem_map中的起始页面号.一旦建立起管理区,承接网页制作每个物理页面便永久地属于某一个管理区web切图报价,具体取决于页面的起始地址,web切图报价就好像一幢建筑物属于哪一个派出所管辖取决于其地址一样.

static struct page * __alloc_pages_limit(zonelist_t *zonelist, int limit, reclaim a page directly. */ if (direct_reclaim && z->free_pages < z->pages_min + 8)//如果要求分配的页面是1个 page = reclaim_page(z); /* If that fails, order);//试图从缓冲区分配 if (page) return page; } } /* Found nothing. */ return NULL; }

点击次数:9177
作者:
web前端行业资讯
Web new NewsList
英特尔宣布与法拉利跨界合作欲将AI技术用于赛车运动 ,,2018年01月11日甲骨文服务器出漏洞:攻击者用漏洞挖矿获取加密货币 ,,2018年01月11日用深度学习设计图像视频压缩算法:更简洁、更强大 ,,2018年01月11日Ubuntu内核和NVIDIA更新:修复Meltdown和Spectre两处漏洞 ,,2018年01月11日AntDesign3.1.1发布,阿里企业级UI设计语言 ,,2018年01月11日微信「跳一跳」带火小游戏,开发者如何快速上手? ,,2018年01月11日谷歌公布最新安卓系统份额:你用上奥利奥了么? ,,2018年01月11日腾讯开发出“3D音效”算法:普通耳机实现3D实时语音效果 ,,2018年01月11日谷歌工程师点赞中国程序员实现Node.js启动超4倍提速 ,,2018年01月11日三星电子总裁兼CE部门负责人金炫奭:万物互联时代到来 ,,2018年01月11日NVIDIA和大众合作建立智能驾驶助手 ,,2018年01月11日GIMPS项目报告发现已知最大素数 ,,2018年01月11日微软与生物技术公司开展AI驱动的血液检测同时诊断数十种疾病 ,,2018年01月11日微软跨平台移动开发工具套件HockeyApp宣布免费 ,,2018年01月11日《硅谷》里神乎其神的压缩技术,AI正在一点点做出来 ,,2018年01月11日LinuxMint19代号敲定为“Tara”预计2018年5月至6月期间发布 ,,2018年01月11日Facebook发布wav2letter工具包,用于端到端自动语音识别 ,,2018年01月11日开源数据库ArangoDB正进行约1156万美元股权融资 ,,2018年01月11日IntelCPU漏洞闹大:腾讯云紧急升级 ,,2018年01月11日2018年1月全球数据库排名:Redis夺回第八 ,,2018年01月11日Lyft将联手无人驾驶公司于CES上展示无人驾驶汽车 ,,2018年01月11日京东X无人超市首家社会门店开业:刷脸进、微信自动结算 ,,2018年01月11日担心被AI取代是杞人忧天?高晓松跨年演讲说的有几分对 ,,2018年01月11日免费授权技术许可Intel宣布在未来CPU中集成雷电3 ,,2018年01月11日算法决定你在社交媒体上看到的信息 ,,2018年01月11日谷歌安全博客披露“英特尔内核漏洞”更多细节 ,,2018年01月04日Postgres10开发者新特性 ,,2017年12月28日阿里巴巴、狗尾草、苏大联合论文:基于对抗学习的众包标注用于中文命名实体识别 ,,2017年12月28日柯洁的2017:20岁,与AI斗与人类斗,其乐无穷 ,,2017年12月28日如果机器人拥有痛觉,这个世界会有哪些不一样? ,,2017年12月28日一种JavaScript的设计模式2014年01月29日CodeforcesRound#289(Div.2,ACMICPCRules)B.PaintingPebbles 【编程语言】2015年02月02日QML的property支持的类型 【编程语言】2015年01月04日hdu1037 【编程语言】2015年06月24日惰性函数定义模式使用方法2014年01月29日Unabletoboot:pleaseuseakernelappropriateforyourcpu【系统运维】2015年03月18日PHPURL路由类实例2014年01月29日使用JQuery进行跨域请求2014年01月29日【Ps磨皮教程】梦幻柔肤磨皮2014年01月28日Android再按一次完全退出程序代码 【移动开发】2015年01月12日jquery实现隐藏与显示动画效果输入框字符动态递减导航按钮切换2014年01月29日01串---南阳OJ 【编程语言】2015年05月13日LeetCode--SameTree&SymmetricTree【编程语言】2015年07月30日Gridview使用CheckBox全选与单选采用js实现同时高亮显示选择行2014年01月29日如何找到java对应的cc++源码 【系统运维】2015年01月12日ASPXMLMakerv3.0英文非汉化注册特别版2014年01月29日unity3D之《天龙八部3D》台湾3月流水破亿元 【编程语言】2015年03月16日javascipt匹配单行和多行注释的正则表达式2014年01月29日LeetCodeUniquePaths【移动开发】2015年01月07日Spring框架分为哪七大模块 【综合】2015年04月29日Vue中过度动画效果应用2017年05月24日贪吃蛇之一维数组实现 【综合】2015年07月06日C++stringcopy的追根挖底!看看你理解的层度是那层 【编程语言】2015年07月23日frameset如何实现整个页面的跳转【编程语言】2014年11月14日必须掌握的八个DOS网络命令 【移动开发】2015年03月26日iOSUI11_UITabBar 【编程语言】2015年08月14日unity3d参考坐标系 【编程语言】2015年03月09日JavanewFixedThreadPool线程池实例及讲解 【编程语言】2015年01月09日const变量探究 【综合】2015年07月23日维基百科请求捐款 ,,2016年06月23日
我们保证
We guarantee
> psd效果文件手工切图,保证图片效果最好体积最小利于传输
> 100%手写的HTML(DIV+CSS)编码,绝对符合W3C标准
> 代码精简、css沉余量小、搜索引擎扫描迅速,网页打开快捷
> 应用Css Sprite能够减少HTTP请求数,提高网页性能
> 跨浏览器兼容(IE6、7、8、9,Firefox火狐,Chrome谷歌)