进程与线程
进程之间如何通讯
用户态与核心态
进程空间
操作系统内存管理
TBL
TBL
多级页表虽然解决了空间上的问题,但是我们发现这种方式需要走多道转换才能找到映射的物理内存地址,经过的多道转换造成了时间上的开销。
程序是局部性的,即在一段时间内,整个程序的执行仅限于程序的某一部分。相应的,执行所访问的存储空间也局限于某个内存区域。
操作系统就利用这一特性,把最多使用的几个页表项放到TBL缓存, CPU 在寻址时,会先查 TLB,如果没找到,才会继续查常规的页表,TLB 的命中率其实很高的,因为程序最常访问的页就那么几个。
页面置换算法 FIFO 、LRU
LinkedHashMap实现LRU
/**
* @program: Java
* @description: LRU最近最久未使用置换算法,通过LinkedHashMap实现 * @author: Mr.Li
* @create: 2020-07-17 10:29
**/
public class LRUCache {
private LinkedHashMap<Integer, Integer> cache;
private int capacity; //容量大小
/**
* 初始化构造函数
*
* @param capacity
*/
public LRUCache(int capacity) {
cache = new LinkedHashMap<>(capacity);
this.capacity = capacity;
}
public int get(int key) {
//缓存中不存在此key,直接返回
if (!cache.containsKey(key)) {
return -1;
}
int res = cache.get(key);
cache.remove(key); //先从链表中删除 cache.put(key,res); //再把该节点放到链表末尾处 return res;
}
public void put(int key, int value) {
if (cache.containsKey(key)) {
cache.remove(key); //已经存在,在当前链表移除 }
if (capacity == cache.size()) { //cache已满,删除链表头位置
Set<Integer> keySet = cache.keySet();
Iterator<Integer> iterator = keySet.iterator();
cache.remove(iterator.next());
}
cache.put(key, value); //插入到链表末尾 }
}
}
}