页面设置与LRU

来源:互联网 发布:程序员是一个年轻人的 编辑:程序博客网 时间:2024/06/15 23:16


虚拟地址由操作系统维护,由MMU可以进行转换,扩大了内存空间分页管理。大多数使用虚拟存储器的系统都使用一种称为分页(paging)机制。虚拟地址空间划分成称为页(page)的单位,而相应的物理地址空间也被进行划分,单位是页帧(frame),一个在磁盘,一个在内存,页和页桢的大小必须相同。在32位地址的机器,它的虚拟地址范围从0~0xFFFFFFFF(4G),而这台机器只有256M的物理地址,因此他可以运行4G的程序,但该程序不能一次性调入内存运行。这台机器必须有一个达到可以存放4G程序的外部存储器(例如磁盘或是FLASH),以保证程序片段在需要时可以被调用。在这个例子中,页的大小为4K,页桢大小与页相同——这点是必须保证的,因为内存和外围存储器之间的传输总是以页为单位的。对应4G的虚拟地址和256M的物理存储器,他们分别包含了1M个页和64K个页帧。
      页表就像一个函数,输入是页号,输出是页桢,实现从页号到物理地址的映射。操作系统给每一个进程维护一个页表。所以不同进程的虚拟地址可能一样。页表给出了进程中每一页所对应的页帧的位置。
      页面置换:把一个页面从内存调换到磁盘的对换区中
      抖动:在具有虚存的计算机中,由于频繁的调页活动使访问磁盘的次数过多而引起的系统效率降低的一种现象.
      在地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断。当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法
      常用的页面置换算法:
      先进先出法FIFO(置换次数比较多) ;最佳置换法OPT:选择将来不再使用或在最远的将来才被访问的页调换出去(不便于实现);最近最久未使用LRU:选择在最近一段时间里最久没有使用过的页面予以淘汰 ;Clock置换算法(LRU算法的近似实现); 最少使用(LFU)置换算法;页面缓冲置换算。
页式可以分为:
1 静态页式管理。静态分页管理的第一步是为要求内存的作业或进程分配足够的页面。系统通过存储页面表、请求表以及页表来完成内存的分配工作。静态页式管理解决了分区管理时的碎片问题。但是,由于静态页式管理要求进程或作业在执行前全部装入内存,如果可用页面数小于用户要求时,该作业或进程只好等待。而且作业和进程的大小仍受内存可用页面数的限制。
2 动态页式管理。动态页式管理是在静态页式管理的基础上发展起来的。它分为请求页式管理和预调入页式管理。 优点: 没有外碎片,每个内碎片不超过页大小。一个程序不必连续存放。便于改变程序占用空间的大小(主要指随着程序运行而动态生成的数据增多,要求地址空间相应增长,通常由系统调用完成而不是操作系统自动完成)。 缺点:程序全部装入内存。 要求有相应的硬件支持。例如地址变换机构,缺页中断的产生和选择淘汰页面等都要求有相应的硬件支持。这增加了机器成本。增加了系统开销,例如缺页中断处理机,请求调页的算法如选择不当,有可能产生抖动现象。 虽然消除了碎片,但每个作业或进程的最后一页内总有一部分空间得不到利用果页面较大,则这一部分的损失仍然较大。

leetcode上面的题

Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set.

get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
set(key, value) - Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.

struct node{    int key;    int value;    node(int k,int v):key(k),value(v){}};class LRUCache{    int size;    list<node> values;    unordered_map<int,list<node>::iterator> positions;public:    LRUCache(int capacity) {        size=capacity;    }        int get(int key) {        if(positions.find(key)!=positions.end())        {            values.splice(values.begin(),values,positions[key]);            positions[key]=values.begin();            return values.begin()->value;        }        else            return -1;    }        void set(int key, int value) {        if(positions.find(key)!=positions.end())        {            values.splice(values.begin(),values,positions[key]);            positions[key]=values.begin();            values.begin()->value=value;        }        else if(values.size()<size)        {            values.push_front(node(key,value));            positions[key]=values.begin();        }        else        {            node last=values.back();            values.pop_back();            positions.erase(last.key);            values.push_front(node(key,value));            positions[key]=values.begin();        }    }};

0 0
原创粉丝点击