内容简介:究其原因,是因为对于内存的访问,可能是CPU发起的,也可以是DMA设备发起的。如果是CPU发起的,在CPU的硬件缓存中,就会保存相应的页内容。如果这个页本来没有存在于硬件缓存中,那么它的到来,势必会将原本为其他的页缓存的内容挤出硬件缓存。但是,如果对于内存的访问是由DMA设备发起的,那么该页不会被CPU访问,就不需要在CPU的硬件缓存中进行缓存,也不会对已经缓存在硬件缓存中的页内容造成伤害。
缓存为什么会有冷热?
究其原因,是因为对于内存的访问,可能是CPU发起的,也可以是DMA设备发起的。
如果是CPU发起的,在CPU的硬件缓存中,就会保存相应的页内容。如果这个页本来没有存在于硬件缓存中,那么它的到来,势必会将原本为其他的页缓存的内容挤出硬件缓存。
但是,如果对于内存的访问是由DMA设备发起的,那么该页不会被CPU访问,就不需要在CPU的硬件缓存中进行缓存,也不会对已经缓存在硬件缓存中的页内容造成伤害。
在 Linux 操作系统中,每个内存区域(Zone)都分配了hot cache和cold cache,hot cache用来缓存那些很可能被CPU的硬件缓存收纳了的页。
hot/cold cache只处理单页分配的情况。
1: /* 2: * Really, prep_compound_page() should be called from __rmqueue_bulk(). But 3: * we cheat by calling it from here, in the order > 0 path. Saves a branch 4: * or two. 5: */ 6: static inline 7: struct page *buffered_rmqueue(struct zone *preferred_zone, 8: struct zone *zone, int order, gfp_t gfp_flags, 9: int migratetype) 10: { 11: unsigned long flags; 12: struct page *page; 13: int cold = !!(gfp_flags & __GFP_COLD); 14: 15: again: 16: if (likely(order == 0)) { 17: struct per_cpu_pages *pcp; 18: struct list_head *list; 19: 20: local_irq_save(flags); 21: pcp = &this_cpu_ptr(zone->pageset)->pcp; 22: list = &pcp->lists[migratetype]; 23: if (list_empty(list)) { 24: pcp->count += rmqueue_bulk(zone, 0, 25: pcp->batch, list, 26: migratetype, cold); 27: if (unlikely(list_empty(list))) 28: goto failed; 29: } 30: 31: if (cold) 32: page = list_entry(list->prev, struct page, lru); 33: else 34: page = list_entry(list->next, struct page, lru); 35: 36: list_del(&page->lru); 37: pcp->count--; 38: } else { 39: if (unlikely(gfp_flags & __GFP_NOFAIL)) { 40: /* 41: * __GFP_NOFAIL is not to be used in new code. 42: * 43: * All __GFP_NOFAIL callers should be fixed so that they 44: * properly detect and handle allocation failures. 45: * 46: * We most definitely don't want callers attempting to 47: * allocate greater than order-1 page units with 48: * __GFP_NOFAIL. 49: */ 50: WARN_ON_ONCE(order > 1); 51: } 52: spin_lock_irqsave(&zone->lock, flags); 53: page = __rmqueue(zone, order, migratetype); 54: spin_unlock(&zone->lock); 55: if (!page) 56: goto failed; 57: __mod_zone_page_state(zone, NR_FREE_PAGES, -(1 << order)); 58: } 59: 60: __count_zone_vm_events(PGALLOC, zone, 1 << order); 61: zone_statistics(preferred_zone, zone, gfp_flags); 62: local_irq_restore(flags); 63: 64: VM_BUG_ON(bad_range(zone, page)); 65: if (prep_new_page(page, order, gfp_flags)) 66: goto again; 67: return page; 68: 69: failed: 70: local_irq_restore(flags); 71: return NULL; 72: }
buffered_rmqueue用于从冷热分配器中分配单页的缓存页。
如果gfp_flags中指定的__GFP_COLD,则从冷缓存中分配一页,否则,从热缓存中分配。
Linux公社的RSS地址 : https://www.linuxidc.com/rssFeed.aspx
本文永久更新链接地址: https://www.linuxidc.com/Linux/2019-01/156597.htm
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- cache server: 冷热数据切换
- 记一次操蛋的方案降级(云上冷热分离的坎坷之路)
- 轻松学会HTTP缓存(强缓存,协商缓存)
- 常见面试题之缓存雪崩、缓存穿透、缓存击穿
- HTTP缓存 - 强缓存/协商缓存/浏览器刷新
- mybatis教程--查询缓存(一级缓存二级缓存和整合ehcache)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
群智能优化算法及其应用
雷秀娟 / 2012-8 / 85.00元
《群智能优化算法及其应用》编著者雷秀娟。 《群智能优化算法及其应用》内容提要:本书以群智能优化算法中的粒子群优化(]Particle Swarm Optimization,PSO)算法为主线,着重阐述了PSO算法的基本原理、改进策略,从解空间设计、粒子编码以及求解流程等方面进行了详细设计与阐述,对蚁群优化(Ant Colony Optimization,AC0)算法、人工鱼群(Art......一起来看看 《群智能优化算法及其应用》 这本书的介绍吧!