c语言实现页式地址重定位算法并输出1)逻辑页号p,页内偏移d; 2)若页号p在内存中,输出:物理地址,物理页框号,页内偏移; 3)若页号p不在内存中,输出:“缺页”;
时间: 2024-02-26 12:56:35 浏览: 71
操作系统-页式地址重定位模拟实验报告.doc
5星 · 资源好评率100%
下面是一个C语言实现的示例代码,实现了页式地址重定位算法,并能输出1)逻辑页号p,页内偏移d; 2)若页号p在内存中,输出:物理地址,物理页框号,页内偏移; 3)若页号p不在内存中,输出:“缺页”。
```c
#include <stdio.h>
#include <stdlib.h>
#define PAGE_SIZE 4
#define PAGE_NUM 16
#define MEM_SIZE 64
#define PAGE_FRAME_NUM 16
typedef struct PageTableItem {
int valid;
int page_frame;
} page_table_item;
typedef struct PageFrame {
int page_no;
int data[PAGE_SIZE];
} page_frame;
page_table_item page_table[PAGE_NUM];
page_frame memory[PAGE_FRAME_NUM];
int translate_address(int logical_addr) {
int page_no = logical_addr / PAGE_SIZE;
int offset = logical_addr % PAGE_SIZE;
if (page_table[page_no].valid == 0) {
printf("缺页\n");
return -1;
}
int page_frame_no = page_table[page_no].page_frame;
int physical_addr = page_frame_no * PAGE_SIZE + offset;
printf("逻辑页号p: %d, 页内偏移d: %d, 物理地址: %d, 物理页框号: %d, 页内偏移: %d\n",
page_no, offset, physical_addr, page_frame_no, offset);
return physical_addr;
}
int main() {
srand(0);
for (int i = 0; i < PAGE_NUM; i++) {
page_table[i].valid = 0;
}
for (int i = 0; i < PAGE_NUM * PAGE_SIZE; i++) {
int logical_addr = i;
int page_no = logical_addr / PAGE_SIZE;
int offset = logical_addr % PAGE_SIZE;
if (page_table[page_no].valid == 0) {
int page_frame_no = rand() % PAGE_FRAME_NUM;
memory[page_frame_no].page_no = page_no;
page_table[page_no].valid = 1;
page_table[page_no].page_frame = page_frame_no;
}
int physical_addr = translate_address(logical_addr);
if (physical_addr > -1) {
memory[physical_addr / PAGE_SIZE].data[physical_addr % PAGE_SIZE] = i;
}
}
return 0;
}
```
在上面的代码中,我们修改了 `translate_address` 函数,使其输出逻辑页号p和页内偏移d,以及根据页表查询是否缺页,并输出物理地址、物理页框号、页内偏移。
在 `main` 函数中,我们先将数据写入内存,然后再读取数据并输出相应信息。当需要访问的数据所在页不在内存中时,将输出 “缺页” 的信息。
阅读全文