【操作系统】页面置换算法(最佳置换算法)(C语言实现)

(编码水平较菜,写博客也只是为了个人知识的总结和督促自己学习,如果有错误,希望可以指出)

1.页面置换算法:

在地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断。当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。

一个好的页面置换算法,应具有较低的页面更换频率。从理论上讲,应该保留最近重复访问的页面,将以后都不再访问或者很长时间内不再访问的页面调出。----百度百科

2.具体的页面置换算法:

2.1 最佳置换算法:一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不再被访问的,那么如果发生缺页中断时,就将该页面换出,以便存放后面调入内存中的页面。

1.这是计算机操作系统(第四版)中的一个例子。系统首先为进程分配了三个物理块。上面一排数字是作业号。在转满三个物理块后,要访问2号作业,2号作业不在内存,所以会发生缺页中断,然后系统需要将2号作业调入内存,但是此时物理块已经装满。
2.依据最佳置换算法,会将7号页换出(0号页在2号页后第1个就会被访问,1号页在2号页后第10个会被访问,7号页在2号页后第14个会被访问,7号页在已经装入内存的作业中是未来最长时间不会被访问的,所以换出7号页)。
3.后面依次类推。

2.2 先进先出算法:如果发生缺页中断,需要换出一个页面的时候,总是选择最早进入内存的页面,即选择在内存中驻留时间最久的页面进行换出。



有点不清楚。。。。。就是每次发生缺页就将最早进入内存的页面换出,然后将刚调入的页面换入该物理块。

2.3 最近最久未使用(LRU)置换算法:LRU算法是缺页中断发生时选择最久未使用的页面进行换出。



这个算法其实也很好判断。分享一个小技巧。内存分配了k个物理块,发生缺页中断将要往内存调入某个页面的时候,在该页面往前面数K个物理块最前面的那个就会是要换出的,因为该页面最长时间未被使用过。(可能前面会有重复的页面,有几个重复的页面就再往前面多数几个)

例如:装入7,0,1,之后访问2号页面的时候会发生缺页中断。此时物理块有三个,2号页面前面有三个页面,最前面的是7号页面所以将7号页面换出。

2.4Clock置换算法(没有动图,不太形象,就不举例子了,如果不太清楚,可以私信我。)

2.4.1简单的Clock置换算法:将所有页面通过链接指针连接成一个循环队列。然后需要为每一个页面设置一个访问位。当某页被访问的时候,将访问位置为1。选择页面换出的时候,需要检查页面的访问位。如果是0,就将页面换出,如果是1,那么就将访问位置为0。

简单的Clock算法最多访问两轮:

最坏情况就是所有的页面访问位都是1,访问1轮之后,全部访问位都会被置为0,那么肯定会找到一个页面换出。

2.42改进型Clock算法:将所有页面通过链接指针连接成一个循环队列。然后需要为每一个页面设置一个访问位和一个修改位。访问位为0表示未访问过,为1表示访问过。修改位为0表示未修改过,为1表示修改过。

此时页面会有四种情况:

1.未被访问,未被修改,最佳淘汰。

2.未被访问,被修改过。

3.被访问过,未被修改。

4.被访问过,被修改过。

换出页面的时候:

1.寻找未被访问,未被修改的页面,不修改访问位。找到则换出,找不到进行第二步。

2.寻找未被访问,但是被修改过的页面。此时,每次扫描页面的时候,将所有访问位置为0。找到就返回,找不到就进行第三步。

3.重复第一次步骤,寻找未被访问,未被修改的页面,不修改访问位。找到则换出,找不到进行第四步。

4.重复第二步。寻找未被访问,但是被修改过的页面。此时一定可以找到。

也就是说,改进型Clock算法,最多扫描四轮队列。因为最坏的情况就是全部页面的访问位和修改位都是1的情况。在经过第二轮扫描之后页面的访问位已经都是0。所以第四轮一定可以找到一个页面换出。

3.最佳置换算法运行截图:

首先是前面三个装入,就省略掉了直接从第四次之后开始打印的。

4.代码

#include<stdio.h>
#include<stdlib.h> #define MAX 20 // 定义作业序列的最大长度
#define num_alloacte 3 //内存分配给进程的物理块数 , 也就是同一时刻最多有几个页面可以在内存中 int work_list [MAX]; //存储作业序列
int num; //存储要输入的序列的长度 int memory_alloacte [num_alloacte]; // 现在在进程中的页面序列 int current; // 记录已经分配的作业的下标 void input(){ //初始化作业序列 , 以及内存分配给进程的物理块数
printf("请输入作业的个数:");
scanf("%d",&num);
if (num > MAX) {
printf("序列过长");
return;
}
printf("请输入作业序列:\n");
for(int i = 0;i < num; i ++){
scanf("%d",&work_list[i]);
}
for(int i = 0;i < MAX ; i ++){
memory_alloacte[i] = -1;
}
for(int i = 0;i < num_alloacte;i ++){
memory_alloacte[i] = work_list[i];
current = i;
}
} void print(int* work_list,int* memory_alloacte ){
printf("\t现在进程中的页面序列:");
for(int i = 0; i < num_alloacte; i ++){
printf("%3d\t",*(memory_alloacte+i));
}
printf("\t\t当前剩余的作业序列:");
for(int i = current+1; i < num;i ++){
printf("%3d",*(work_list+i));
}
printf("\n");
} int judge(){
int temp [num_alloacte]; //赋值一个临时变量 记录此时物理框中的作业号
int count = num_alloacte; //记录临时变量物理框中还剩下的个数
for(int i = 0;i < num_alloacte; i ++){
temp[i] = memory_alloacte[i];
}
int cur = current + 1;
while (cur < num)
{
for (int i = 0; i < num_alloacte; i++)
{
if(work_list[cur] == temp[i]){ //如果剩下的工作序列中 现有内存中的作业还会调用的话, 就将其的值置为 -1
if(count == 1){ //此时内存中剩下的那个作业号肯定是最长时间没有调用过的,后者是以后再也不会调用
return i;
}
temp[i] = -1;
count --;
break;
}
}
cur ++;
}
//此时再来遍历这个 临时的物理块中作业号的 数组 , 如果他的值不是 -1,就说明后面需要调用的作业中再也没有这个作业了,所以 就可以直接返回。
for(int i = 0;i < num_alloacte;i ++){
if(temp[i] != -1){
return i;
}
else
{
continue;
} }
return 0;
} void change(){
int index;
int flag = 0;
for (int i = current + 1; i < num; i++)
{ for (int j = 0; j < num_alloacte; j++) //来判断下一个作业是否已经在内存中
{
if(work_list[i] == memory_alloacte[j]){
flag = 1; //是的话让标志位置为1
break;
}
}
if(flag == 0){ //说明不在内存中,会出现页面中断。需要进行换页。
index = judge();
if(memory_alloacte[index] != work_list[i]){
memory_alloacte[index] = work_list[i];
}
current ++;
print(work_list,memory_alloacte); }
else
{
flag = 0;
current ++;
print(work_list,memory_alloacte);
continue;
} }
}
int main(){ input(); change(); system("pause");
}

【操作系统】页面置换算法(最佳置换算法)(C语言实现)的更多相关文章

  1. 页面置换算法(最佳置换算法、FIFO置换算法、LRU置换算法、LFU置换算法)

    页面置换产生的原因是:分页请求式存储管理(它是实现虚拟存储管理的方法之一,其中一个特性是多次性-->多次将页面换入或换出内存) 效果最好的页面置换算法:最佳置换算法 比较常用的页面置换算法有:F ...

  2. 操作系统页面置换算法(opt,lru,fifo,clock)实现

    选择调出页面的算法就称为页面置换算法.好的页面置换算法应有较低的页面更换频率,也就是说,应将以后不会再访问或者以后较长时间内不会再访问的页面先调出. 常见的置换算法有以下四种(以下来自操作系统课本). ...

  3. 操作系统 页面置换算法LRU和FIFO

    LRU(Least Recently Used)最少使用页面置换算法,顾名思义,就是替换掉最少使用的页面. FIFO(first in first out,先进先出)页面置换算法,这是的最早出现的置换 ...

  4. 页面置换算法之Clock算法

    1.前言 缓冲池是数据库最终的概念,数据库可以将一部分数据页放在内存中形成缓冲池,当需要一个数据页时,首先检查内存中的缓冲池是否有这个页面,如果有则直接命中返回,没有则从磁盘中读取这一页,然后缓存到内 ...

  5. [Spark内核] 第34课:Stage划分和Task最佳位置算法源码彻底解密

    本課主題 Job Stage 划分算法解密 Task 最佳位置算法實現解密 引言 作业调度的划分算法以及 Task 的最佳位置的算法,因为 Stage 的划分是DAGScheduler 工作的核心,这 ...

  6. c模拟内存分配算法(首次适应算法,最佳适应算法,最坏适应算法)

    #include<bits/stdc++.h> using namespace std; /*定义内存的大小为100*/ #define MEMSIZE 100 /*如果小于此值,将不再分 ...

  7. Stage划分和Task最佳位置算法源码彻底解密

    本课主题 Job Stage 划分算法解密 Task 最佳位置算法实现解密 引言 作业调度的划分算法以及 Task 的最佳计算位置的算法,因为 Stage 的划分是DAGScheduler 工作的核心 ...

  8. Levenshtein Distance算法(编辑距离算法)

    编辑距离 编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符, ...

  9. [算法]检测空间三角形相交算法(Devillers & Guigue算法)

    #pragma once //GYDevillersTriangle.h /* 快速检测空间三角形相交算法的代码实现(Devillers & Guigue算法) 博客原地址:http://bl ...

随机推荐

  1. Python_selenium_WebDriver API,ActionChains鼠标, Keys 类键盘

    WebDriver 提供的八种定位方法: find_element_by_id() find_element_by_name() find_element_by_class_name() find_e ...

  2. “三剑客”之sed手中有剑

    一.sed介绍 sed是Stream Editor(字符流编辑器)的缩写,简称流编辑器.sed是操作.过滤和转换文本内容的强大工具.常用功能包括对文件实现快速增删改查(增加.删除.修改.查询),其中查 ...

  3. [转载]Redis 持久化之RDB和AOF

    原文链接:https://www.cnblogs.com/itdragon/p/7906481.html 温馨提示 在正式数据(当然是非生产环境啦)练习以下操作时,一定一定一定记得备份dump.rdb ...

  4. 两种方式教你搞定在mac中格式化磁盘的问题

    mac怎么格式化u盘?想必这是大部分苹果用户都会关心的一个问题.格式化u盘在我们日常工作中算是一个比较常规的操作了.但是在mac中随着系统版本不一样,格式化的方式也略有差别.今天,小编将以Mac OS ...

  5. day007|python基础回顾7

    文件处理 目录 文件处理 1 文件打开模式补充 2.1 文件操作之读操作 2.2 文件操作之写操作 3 控制文件指针移动 3.1 前提 3.2 f.seek() 4 文件修改的两种方式 4.1 方式一 ...

  6. Java基础知识面试题(最详细版)

    刚刚经历过秋招,看了大量的面经,顺便将常见的Java常考知识点总结了一下,并根据被问到的频率大致做了一个标注.一颗星表示知识点需要了解,被问到的频率不高,面试时起码能说个差不多.两颗星表示被问到的频率 ...

  7. G - Pyramid 题解(打表)

    题目链接 题目大意 t组数据,给你一个n(n<=1e9)求高度为n的等边三角形,求里面包含了多少个等边三角形 题目思路 打表找规律,然而我一直没找到规律. 看到题解恍然大悟,答案就是C(n+3, ...

  8. asp.net core 集成 Prometheus

    asp.net core 集成 prometheus Intro Prometheus 是一个开源的现代化,云原生的系统监控框架,并且可以轻松的集成 PushGateway, AlertManager ...

  9. 【mq读书笔记】mq事务消息

    关于mq食物以什么样的方式解决了什么样的问题可以参考这里: https://www.jianshu.com/p/cc5c10221aa1 上文中示例基于mq版本较低较新的版本中TransactionL ...

  10. LaTeX文档的基本结构

    正文提纲的构建代码及注释: 显示效果: 目录结构与换行的代码及注释: 显示效果: 具体的有关的信息可以具体查看ctex文档,可以在导言区进行全局的设置,比如标题居中设置等.