CLOCK页面置换算法

本文详细介绍了一种改进的时钟置换算法,通过优化内存管理策略来降低缺页率。代码实现包括了CLOCK算法的升级版ClockPlus,展示了如何通过访问位和修改位来跟踪页面替换过程。核心内容涉及循环链表操作和缺页判断。
摘要由CSDN通过智能技术生成

页面置换算法

1 时钟置换算法 CLOCK

在这里插入图片描述

1.1 代码实现

原谅我的无聊,偏要写一下代码实现以下

  • 给定驻留集大小
  • 访问串
    计算每次内存中页面,并最终计算缺页率
BLOCKS = 3  # 驻留集大小
PAGE_ACCESS = [3, 4, 2, 6, 4, 3, 7, 4, 3, 6, 3, 4, 8, 4, 6]  # 输入串


class Clock(object):
    def __init__(self, BLOCKS, PAGE_ACCESS):
        self.BLOCKS = BLOCKS
        self.PAGE_ACCESS = PAGE_ACCESS
        self.CList = [None for i in range(self.BLOCKS)]  # 循环链表
        self.index = 0  # 指针
        self.access = [0 for i in range(self.BLOCKS)]  # 访问位

    def fix_index(self):
        if self.index >= self.BLOCKS:
            self.index = 0

    def run(self):
        counter = 0
        for outer_index, page in enumerate(self.PAGE_ACCESS):
            have_page = None
            have_page_index = None
            for _index, exist_page in enumerate(self.CList):
                if exist_page == page:
                    have_page = exist_page
                    have_page_index = _index

            # 如果不缺页
            if have_page:
                # 指针不变
                # 对应页的访问位置为 1
                self.access[have_page_index] = 1
            else:  # 缺页的情况
                print(outer_index)
                counter += 1
                # # 如果内存中的页表修改为全为 1,则需要全部置为 0,指针指向第一个页面
                # 这个做法是错误的,当内存中两个页面为 1,一个页面为 0 时,若此时进来的页面不导致缺页,
                # 把 0 的位置进行了换页,那么指针的位置不一定会指向第一个页面
                # if all(self.access):
                #     self.access = [0 for i in range(self.BLOCKS)]
                #     self.index = 0

                # 问题在于,如果 self.index 为 2的时候,只跑一遍,可以设置一个值,每一轮必须找到一个页面
                flag = 0

                for inner_index in range(self.index, len(self.CList)):
                    # 经过的访问位为 1 则修改为 0
                    if self.access[inner_index] == 1:
                        self.access[inner_index] = 0
                        self.index = inner_index + 1
                        self.fix_index()
                    else:  # 经过的访问位为 0 则进行换页
                        self.CList[inner_index] = page
                        self.access[inner_index] = 1
                        self.index = inner_index + 1  # 指针指向下一个
                        self.fix_index()  # 修正指针的值
                        flag = 1
                        break

                if not flag:
                    for inner_index in range(self.index, 3):
                    # 经过的访问位为 1 则修改为 0
                        if self.access[inner_index] == 1:
                            self.access[inner_index] = 0
                            self.index = inner_index + 1
                            self.fix_index()
                        else:  # 经过的访问位为 0 则进行换页
                            self.CList[inner_index] = page
                            self.access[inner_index] = 1
                            self.index = inner_index + 1  # 指针指向下一个
                            self.fix_index()  # 修正指针的值
                            break
            print(self.CList)
        print(f"缺页率 -> {counter/len(self.PAGE_ACCESS)}")


class ClockPlus(object):
    def __init__(self, BLOCKS, PAGE_ACCESS):
        self.PAGE_ACCESS = PAGE_ACCESS
        self.BLOCKS = BLOCKS
        # (访问位, 修改位)
        self.site = [(0, 0) for i in range(self.BLOCKS)]
        

    def run(self):
        # 四次遍历 --> 写成两次
        for index in range(len(self.data)):
            tup = self.data[index]
            if tup[0] == 0 and tup[1] == 0:
                pass    


if __name__ == '__main__':
    clock = Clock(BLOCKS, PAGE_ACCESS)
    clock.run()

2 改进型时钟置换算法

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值