python实现页表置换算法opt,fifo,lru

实现页表置换算法opt,fifo,lru

opt

"""
opt
请计算出页面置换次数和命中次数
"""

# 作业序列
data = (0, 3, 7, 0, 4, 0, 2, 2, 1, 7, 0, 1, 1, 2, 0, 2, 0, 3, 3, 1) 
# data = (4, 0, 3, 0, 0, 2, 2, 1, 7, 2, 0, 1, 0, 1, 3, 0, 1, 2, 3, 7) 
# 页表长度
NUM = 3 
cur = []   # 当前页面数据
times = 0      # 页面置换次数


# 计算从索引开始数据列表中最远的数字   在data中
# i: 从哪开始    
# return  最远的数字
def count_far_num(idx):
    global data
    global cur
    tmp = cur.copy()  # 决赛圈
    for i in range(idx, len(data)):
        if data[i] in tmp:
                tmp.remove(data[i])
        if len(tmp) <= 1:
            break
    return tmp[0]

for i in range(len(data)):
    print(cur)
    # 前三个数据
    if len(cur) < NUM :
        cur.append(data[i])
    else:
        # 新元素不在当前列表中
        if data[i] not in cur:
            far_num = count_far_num(i)
            cur[cur.index(far_num)] = data[i]
            times += 1

hit = len(data) - NUM - times        # 命中次数
print(times)
print(hit)

fifo 代码有误,期末考完重写

"""
fifo
请计算出页面置换次数和命中次数

注意:内存的页面中“最老“的页面,会被新的网页直接覆盖,
而不是“最老“的页面先出队,然后新的网页从队尾入队。

!!!这里偷懒先这么写
"""
'''
# 作业序列
data = (2, 3, 0, 2, 1, 2, 1, 7, 1, 0, 7, 4, 3, 2, 1, 3, 0, 0, 0, 0) 
# 页表长度
NUM = 3 
cur = []   # 当前页面数据
times = 0      # 页面置换次数

for i in data:
    # 前三个数据
    if len(cur) < NUM :
        cur.append(i)
    else:
        if i not in cur:
            cur.pop(0)
            cur.append(i) 
            times += 1

hit = len(data) - NUM - times        # 命中次数
print(times)
print(hit)
'''

lru

"""
lru
请计算出页面置换次数和命中次数
"""

# 作业序列
data = (2, 1, 4, 1, 7, 0, 2, 1, 0, 0, 3, 0, 2, 7, 2, 3, 3, 0, 0, 1) 
# 页表长度
NUM = 3 
cur = []   # 当前页面数据
cur_t = [] # 当前页面数据在列表中存在时间
times = 0      # 页面置换次数


for i in data:
    # 前三个数据
    if len(cur) < NUM :
        cur.append(i)
        cur_t.append(-1)
    else:
        # 新元素不在当前列表中
        if i not in cur:
            idx = cur_t.index(max(cur_t))  #最大时间的索引
            cur[idx] = i
            cur_t[idx] = -1 # 后面+1变成0
            times += 1
        else:
            idx = cur.index(i)
            cur_t[idx] = -1 # 后面+1变成0

    # 所有存在时间 + 1
    for j in range(len(cur_t)):
        cur_t[j] += 1

hit = len(data) - NUM - times        # 命中次数
print(times)
print(hit)
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C语言代码实现OPTFIFOLRU和Clock页面置换算法: ```c #include <stdio.h> #include <stdlib.h> #define FRAME_NUM 3 // 物理帧数 #define REFERENCE_LEN 12 // 引用串长度 int reference[REFERENCE_LEN] = {1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5}; // 引用串 // OPT页面置换算法 void opt() { int frames[FRAME_NUM] = {-1, -1, -1}; // 物理帧 int faults = 0; // 缺页数 int i, j, k, max, flag; for (i = 0; i < REFERENCE_LEN; i++) { flag = 0; for (j = 0; j < FRAME_NUM; j++) { if (frames[j] == reference[i]) { // 命中 flag = 1; break; } } if (!flag) { // 未命中 faults++; if (frames[FRAME_NUM - 1] == -1) { // 物理帧未满 for (j = 0; j < FRAME_NUM; j++) { if (frames[j] == -1) { frames[j] = reference[i]; flag = 1; break; } } } if (!flag) { // 物理帧已满,进行页面置换 int future[FRAME_NUM] = {0}; for (j = 0; j < FRAME_NUM; j++) { for (k = i + 1; k < REFERENCE_LEN; k++) { if (frames[j] == reference[k]) { future[j] = k - i; break; } } } max = future[0]; flag = 0; for (j = 0; j < FRAME_NUM; j++) { if (future[j] == 0) { frames[j] = reference[i]; flag = 1; break; } if (future[j] > max) { max = future[j]; k = j; } } if (!flag) { frames[k] = reference[i]; } } } // 输出物理帧情况 for (j = 0; j < FRAME_NUM; j++) { printf("%d ", frames[j]); } printf("\n"); } printf("OPT页面置换算法缺页数:%d\n", faults); } // FIFO页面置换算法 void fifo() { int frames[FRAME_NUM] = {-1, -1, -1}; // 物理帧 int faults = 0; // 缺页数 int i, j, index = 0, flag; for (i = 0; i < REFERENCE_LEN; i++) { flag = 0; for (j = 0; j < FRAME_NUM; j++) { if (frames[j] == reference[i]) { // 命中 flag = 1; break; } } if (!flag) { // 未命中 faults++; if (frames[FRAME_NUM - 1] == -1) { // 物理帧未满 frames[index++] = reference[i]; } else { // 物理帧已满,进行页面置换 frames[index++] = reference[i]; if (index == FRAME_NUM) { index = 0; } } } // 输出物理帧情况 for (j = 0; j < FRAME_NUM; j++) { printf("%d ", frames[j]); } printf("\n"); } printf("FIFO页面置换算法缺页数:%d\n", faults); } // LRU页面置换算法 void lru() { int frames[FRAME_NUM] = {-1, -1, -1}; // 物理帧 int faults = 0; // 缺页数 int i, j, k, min, flag; int used[FRAME_NUM] = {0}; // 页表,记录物理帧最近使用情况 for (i = 0; i < REFERENCE_LEN; i++) { flag = 0; for (j = 0; j < FRAME_NUM; j++) { if (frames[j] == reference[i]) { // 命中 flag = 1; used[j] = i + 1; break; } } if (!flag) { // 未命中 faults++; if (frames[FRAME_NUM - 1] == -1) { // 物理帧未满 for (j = 0; j < FRAME_NUM; j++) { if (frames[j] == -1) { frames[j] = reference[i]; used[j] = i + 1; flag = 1; break; } } } if (!flag) { // 物理帧已满,进行页面置换 min = used[0]; flag = 0; for (j = 0; j < FRAME_NUM; j++) { if (used[j] < min) { min = used[j]; k = j; } if (frames[j] == -1) { frames[j] = reference[i]; used[j] = i + 1; flag = 1; break; } } if (!flag) { frames[k] = reference[i]; used[k] = i + 1; } } } // 输出物理帧情况 for (j = 0; j < FRAME_NUM; j++) { printf("%d ", frames[j]); } printf("\n"); } printf("LRU页面置换算法缺页数:%d\n", faults); } // Clock页面置换算法 void clock() { int frames[FRAME_NUM] = {-1, -1, -1}; // 物理帧 int faults = 0; // 缺页数 int i, j, index = 0, flag; int used[FRAME_NUM] = {0}; // 页表,记录物理帧最近使用情况 int hand = 0; // 指针,指向下一个要替换的物理帧 for (i = 0; i < REFERENCE_LEN; i++) { flag = 0; for (j = 0; j < FRAME_NUM; j++) { if (frames[j] == reference[i]) { // 命中 flag = 1; used[j] = 1; break; } } if (!flag) { // 未命中 faults++; if (frames[FRAME_NUM - 1] == -1) { // 物理帧未满 frames[index++] = reference[i]; used[index - 1] = 1; } else { // 物理帧已满,进行页面置换 while (used[hand] == 1) { used[hand] = 0; hand++; if (hand == FRAME_NUM) { hand = 0; } } frames[hand] = reference[i]; used[hand] = 1; hand++; if (hand == FRAME_NUM) { hand = 0; } } } // 输出物理帧情况 for (j = 0; j < FRAME_NUM; j++) { printf("%d ", frames[j]); } printf("\n"); } printf("Clock页面置换算法缺页数:%d\n", faults); } int main() { printf("引用串:"); int i; for (i = 0; i < REFERENCE_LEN; i++) { printf("%d ", reference[i]); } printf("\n\n"); printf("OPT页面置换算法:\n"); opt(); printf("\n"); printf("FIFO页面置换算法:\n"); fifo(); printf("\n"); printf("LRU页面置换算法:\n"); lru(); printf("\n"); printf("Clock页面置换算法:\n"); clock(); return 0; } ``` 这个程序模拟了一个长度为12的引用串,分别使用了OPTFIFOLRU和Clock四种页面置换算法,并输出了每次页面置换后的物理帧情况和最终的缺页数。其中,FRAME_NUM和REFERENCE_LEN可以根据需要自行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值