内存冷热标记
2025-11-11 本文已影响0人
何以解君愁
现代计算机系统中通常存在多级的存储设备,针对海量workload的优化的一种思路是将热点内存页优先放到快速存储层级,这就需要对内存页进行冷热标记。
一种典型的方案是基于内存页的访问频次进行标记,如果统计窗口内访问次数大于等于设定阈值,则认为是热内存页,否则是冷内存页。
对于统计窗口内跟踪到的访存序列和阈值,现在需要实现基于频次的冷热标记。内存页使用页框号作为标识。输入描述:
第一行为输入为N,表示访存序列的记录条数,0 < N < 10000。
第二行为访存序列,空格间隔的N个内存页框号,页框号范围0-65535,同一页框号可能重复出现,出现的次数即为对应页框号的频次。
第三行为热内存页的频次阈值T,正整数,范围1< T < 10000
输出描述
第一行输出标记为热内存的内存页个数,如果没有被标记为热内存的,则输出0。
如果第一行>0,则接下来按照访问频次降序输出内存页框号,一行一个,频次一样的页框号,页框号小的排前面。
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int length = sc.nextInt();
int[] nums = new int[length];
for(int i = 0;i < length;i++){
nums[i] = sc.nextInt();
}
int checkCount = sc.nextInt();
Map<Integer,Integer> numMap = new HashMap<>();
Map<Integer,Integer> resMap = new HashMap<>();
int hotCount = 0;
for(int i = 0;i < length;i++){
int number = numMap.getOrDefault(nums[i],0)+1;
numMap.put(nums[i],number);
}
for(int i = 0;i < length;i++){
int number = numMap.getOrDefault(nums[i],0);
int number1 = resMap.getOrDefault(nums[i],0);
if(number1 != 0){
continue;
}
if(number >= checkCount){
resMap.put(nums[i],number);
}
}
System.out.println(resMap.size());
List<Integer> ans = new ArrayList<>(resMap.keySet());
ans.sort((a, b) -> {
int freqCompare = resMap.get(b).compareTo(resMap.get(a));
if (freqCompare == 0) {
return a.compareTo(b);
}
return freqCompare;
});
for (int num : ans) {
System.out.println(num);
}
}
}