#include <stdio.h>
// 定义一页的大小
#define PAGE_SIZE 4096
// 定义缓存大小
#define CACHE_SIZE 4
// 缓存结构体
typedef struct cache_s {
unsigned int page[CACHE_SIZE]; // 缓存列表
int count[CACHE_SIZE]; // 计数器:记录每个缓存块最后一次被访问的时间
} cache_t;
// 初始化缓存
cache_t init_cache() {
cache_t cache;
int i;
for (i = 0; i < CACHE_SIZE; i++) {
cache.page[i] = -1;
cache.count[i] = 0;
}
return cache;
}
// 查找缓存
int find_page(cache_t cache, unsigned int page) {
int i;
for (i = 0; i < CACHE_SIZE; i++) {
if (cache.page[i] == page) {
return i; // 返回缓存块的下标
}
}
return -1; // 没有找到
}
// 获取最久未使用的缓存块的下标
int get_least_used_page(cache_t cache) {
int i, least_used_page = 0;
for (i = 0; i < CACHE_SIZE; i++) {
if (cache.count[i] < cache.count[least_used_page]) {
least_used_page = i;
}
}
return least_used_page; // 返回最久未使用的缓存块的下标
}
// 参考一个页面
int refer(cache_t *cache, unsigned int page) {
int i, index;
int page_fault = 0; // 缺页计数器
// 查找页面是否已经在缓存中
index = find_page(*cache, page);
if (index != -1) {
// 页面在缓存中,更新计数器
cache->count[index] = 0;
for (i = 0; i < CACHE_SIZE; i++) {
if (i != index) {
cache->count[i]++;
}
}
} else {
// 页面不在缓存中,需要进行页面置换
page_fault++;
index = get_least_used_page(*cache);
cache->page[index] = page;
cache->count[index] = 0;
for (i = 0; i < CACHE_SIZE; i++) {
if (i != index) {
cache->count[i]++;
}
}
}
return page_fault;
}
// 打印缓存
void display_cache(cache_t cache) {
int i;
printf("Cache: ");
for (i = 0; i < CACHE_SIZE; i++) {
if (cache.page[i] == -1) {
printf("[ ] ");
} else {
printf("[%d] ", cache.page[i]);
}
}
printf("\n");
}
// 主函数,模拟访问页面
int main() {
cache_t cache = init_cache();
unsigned int page_list[] = {1, 3, 5, 9, 3, 6, 8, 2, 4, 7, 5, 0};
int page_count = sizeof(page_list) / sizeof(page_list[0]);
int i, page_faults = 0;
printf("Page List: ");
for (i = 0; i < page_count; i++) {
printf("%d ", page_list[i]);
page_faults += refer(&cache, page_list[i]);
display_cache(cache);
}
// 计算缺页率
float page_fault_rate = (float) page_faults / page_count;
printf("Page Fault Rate: %.2f%%\n", page_fault_rate * 100);
return 0;
}