操作系统FIFO算法简化版
- 格式:docx
- 大小:323.53 KB
- 文档页数:11
FIFO 页面置换算法什么是页面置换算法?在操作系统中,进程需要使用内存来进行运行。
但是内存并不是无限的,所以操作系统需要管理内存的分配和释放。
当进程需要使用内存时,操作系统会将必要的数据和指令从硬盘上加载到内存中。
但是当内存被占满时,操作系统需要使用一种称为“页面置换算法”的技术来更好地管理内存。
页面置换算法的主要作用是在内存占满的情况下将最少使用的页面(或者是内存块)替换出去,以便其他进程可以使用内存。
页面置换算法是现代操作系统中非常重要的一部分。
什么是FIFO页面置换算法?FIFO是一种古老的页面置换算法,也是最简单的一种页面置换算法之一。
FIFO的全称是First In First Out,中文名叫做先进先出算法。
FIFO算法的核心思想是,先进入内存的页面(或内存块)是最先被替换出去的。
这就好比是一个排队等车的现象,先来的人先上车,后来的人只能等待。
FIFO页面置换算法的工作原理数据结构FIFO算法依赖于一个叫做FIFO队列的数据结构。
FIFO队列是一种先进先出的队列。
当一个页面进入内存时,它就被加入到FIFO队列的队尾。
当需要替换页时,页表中列出的第一个页面就是队列的第一个(最早加入)页面,这个页面就是要替换出去的页面。
工作流程FIFO页面置换算法的工作流程可以分为以下几个步骤:1.算法初始化。
在FIFO算法使用前,需要初始化一个FIFO队列来记录进入内存的各个页面的顺序。
2.操作系统请求内存。
当操作系统需要加载新的页面或内存块时,检查内存是否已经满了。
如果内存已满,则需要使用页面置换算法来选择要替换掉的页面。
3.根据FIFO队列来选择将要替换的页面。
从FIFO队列中选择最早加入的页面来替换。
这个页面就是队列中的第一个元素。
4.更新FIFO队列。
因为要替换掉一个页面,所以我们需要更新FIFO队列。
将新进入内存的页面加入到FIFO队列的队尾。
5.将替换出的页面写回到硬盘上。
在进行页面置换之前,需要将要替换出去的页面的数据写回到硬盘上。
fifo算法和lru算法FIFO算法和LRU算法是计算机领域中两种常用的置换算法,它们被广泛应用于操作系统和缓存管理中。
本文将详细介绍FIFO算法和LRU算法的原理、应用场景以及优缺点,并比较它们在不同场景下的性能表现。
一、FIFO算法FIFO算法(First-In-First-Out)是一种简单直观的置换算法,它根据页面调入内存的先后顺序,选择最早进入内存的页面进行置换。
具体而言,当系统需要为新的页面腾出空间时,FIFO算法会选择最早进入内存的页面进行替换,以此保证内存空间的有效利用。
FIFO算法的工作原理如下:1. 系统维护一个页面队列,用于记录页面进入内存的顺序。
2. 当新的页面需要调入内存时,系统将其加入页面队列的末尾。
3. 当页面置换发生时,FIFO算法选择队列中最早进入内存的页面进行替换,即选择队列中的第一个页面。
FIFO算法的优点是简单且易于实现,适用于实时应用场景和对页面访问顺序没有严格要求的场景。
然而,FIFO算法也存在一些缺点。
首先,它无法利用页面的访问频率信息进行优化,导致可能会把频繁被访问的页面置换出去。
其次,FIFO算法对于长时间保留在内存中的页面和短时间仅被访问一次的页面一视同仁,无法根据页面的使用模式进行智能调整。
二、LRU算法LRU算法(Least Recently Used)是一种基于页面访问模式的置换算法,它根据页面最近被访问的时间顺序,选择最长时间未被访问的页面进行置换。
具体而言,当系统需要为新的页面腾出空间时,LRU算法会选择最长时间未被访问的页面进行替换,以此提高缓存命中率。
LRU算法的工作原理如下:1. 系统维护一个页面访问历史链表,用于记录页面的访问顺序。
2. 当页面被访问时,系统将其移动到链表的末尾。
3. 当页面置换发生时,LRU算法选择链表中最早进入的页面进行替换,即选择链表中的第一个页面。
LRU算法的优点是能够较好地适应页面访问模式,并做出相应调整。
FIFO算法模拟实验总结操作系统中的页面置换算法是为了有效管理计算机内存空间而设计的。
FIFO (First-In, First-Out)是最简单和最常见的页面置换算法之一。
通过对FIFO算法进行模拟实验,我们可以更好地理解其工作原理,评估其性能,并进一步探讨其局限性和优化方向。
重要观点1.FIFO算法的基本原理:FIFO算法按照页面进入内存的先后顺序进行置换,即最早进入内存的页面将最先被淘汰。
这一原理确保了页面的公平访问,但可能导致较低的缓存命中率。
2.页面置换的开销问题:无论使用哪种页面置换算法,都需要进行页面调度和数据迁移,这涉及到CPU和内存之间频繁的数据传输。
因此,算法的开销也需考虑在内。
3.缺页中断的处理:当CPU请求的页面不在内存中时,会发生缺页中断。
FIFO算法需要将最早进入内存的页面替换出去,为新页面腾出位置来处理缺页中断。
这需要涉及读取磁盘上的页面数据,带来了较高的I/O开销。
4.FIFO算法的局限性:FIFO算法没有考虑页面的重要性和访问频率,只单纯按照进入内存的顺序进行页面置换。
这种简单的先进先出策略可能会导致较低的缓存命中率和较大的开销。
关键发现通过对FIFO算法进行模拟实验,我们得出了一些关键发现:1.FIFO算法的缓存命中率与页面引用模式密切相关。
在连续引用的页面中,若页面较大且请求频繁,FIFO算法的缓存命中率可能会较低。
2.长作业更容易导致缺页中断。
FIFO算法可能更频繁地替换长时间运行的作业所需的页面,因为长作业往往具有更大的作业集。
3.FIFO算法对缓存容量的依赖。
当缓存容量较大时,FIFO算法可以维持较高的命中率。
然而,当缓存容量有限时,FIFO算法的性能可能急剧下降。
进一步思考通过对FIFO算法模拟实验的总结,我们可以进一步思考如下问题:1.如何提高FIFO算法的性能?可以尝试引入更智能的页面置换算法,如LRU(Least Recently Used)算法,根据页面的访问频率和重要性进行置换,以提高缓存命中率。
操作系统页⾯置换算法(opt,lru,fifo,clock )实现选择调出页⾯的算法就称为页⾯置换算法。
好的页⾯置换算法应有较低的页⾯更换频率,也就是说,应将以后不会再访问或者以后较长时间内不会再访问的页⾯先调出。
常见的置换算法有以下四种(以下来⾃操作系统课本)。
1. 最佳置换算法(OPT)最佳(Optimal, OPT)置换算法所选择的被淘汰页⾯将是以后永不使⽤的,或者是在最长时间内不再被访问的页⾯,这样可以保证获得最低的缺页率。
但由于⼈们⽬前⽆法预知进程在内存下的若千页⾯中哪个是未来最长时间内不再被访问的,因⽽该算法⽆法实现。
最佳置换算法可以⽤来评价其他算法。
假定系统为某进程分配了三个物理块,并考虑有以下页⾯号引⽤串: 7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1进程运⾏时,先将7, 0, 1三个页⾯依次装⼊内存。
进程要访问页⾯2时,产⽣缺页中断,根据最佳置换算法,选择第18次访问才需调⼊的页⾯7予以淘汰。
然后,访问页⾯0时,因为已在内存中所以不必产⽣缺页中断。
访问页⾯3时⼜会根据最佳置换算法将页⾯1淘汰……依此类推,如图3-26所⽰。
从图中可以看出⾤⽤最佳置换算法时的情况。
可以看到,发⽣缺页中断的次数为9,页⾯置换的次数为6。
图3-26 利⽤最佳置换算法时的置换图2. 先进先出(FIFO)页⾯置换算法优先淘汰最早进⼊内存的页⾯,亦即在内存中驻留时间最久的页⾯。
该算法实现简单,只需把调⼊内存的页⾯根据先后次序链接成队列,设置⼀个指针总指向最早的页⾯。
但该算法与进程实际运⾏时的规律不适应,因为在进程中,有的页⾯经常被访问。
图3-27 利⽤FIFO 置换算法时的置换图这⾥仍⽤上⾯的实例,⾤⽤FIFO 算法进⾏页⾯置换。
进程访问页⾯2时,把最早进⼊内存的页⾯7换出。
然后访问页⾯3时,再把2, 0, 1中最先进⼊内存的页换出。
fifo算法c语言FIFO算法C语言实现FIFO(First In First Out)算法是一种简单的页面置换算法,也称为先进先出算法。
该算法的核心思想是将最先进入内存的页面最先淘汰,即将页表中最早调入内存的页面移出内存。
本文将介绍如何使用C语言实现FIFO算法。
一、FIFO算法原理1.1 页面置换在操作系统中,为了提高程序运行效率,会将程序需要用到的数据和指令从硬盘上加载到内存中。
但是内存有限,无法容纳所有程序需要用到的数据和指令。
当内存不足时,就需要进行页面置换。
页面置换就是将当前正在使用但又不常用的页面从内存中移出,并将新的页面调入内存。
在进行页面置换时,需要选择一个合适的页面置换算法。
1.2 FIFO算法FIFO算法是一种简单而常用的页面置换算法。
它以队列为基础,将最早进入队列的页面作为被淘汰的对象。
具体来说,在FIFO算法中,操作系统会维护一个队列来记录当前正在使用的所有页面。
当需要进行页面置换时,操作系统会选择队头元素对应的页面进行淘汰,并将新调入内存中的页面插入队尾。
二、FIFO算法C语言实现2.1 算法流程FIFO算法的实现流程如下:1. 初始化页面队列,将所有页面按照调入内存的时间顺序依次插入队列;2. 当需要进行页面置换时,将队头元素对应的页面移出内存,并将新调入内存中的页面插入队尾;3. 重复执行步骤2。
2.2 代码实现下面是使用C语言实现FIFO算法的示例代码:```c#include <stdio.h>#include <stdlib.h>#define MAX_PAGE_NUM 100 // 最大页面数#define MAX_MEM_SIZE 10 // 最大内存容量int page_queue[MAX_PAGE_NUM]; // 页面队列int mem[MAX_MEM_SIZE]; // 内存int queue_head = 0; // 队头指针int queue_tail = -1; // 队尾指针// 初始化页面队列void init_page_queue(int page_num) {for (int i = 0; i < page_num; i++) {page_queue[i] = i % MAX_MEM_SIZE;}}// 页面置换函数void page_replace(int new_page) {int old_page = page_queue[queue_head]; // 获取被淘汰的页面mem[old_page] = new_page; // 将新页面调入内存中queue_tail = (queue_tail + 1) % MAX_PAGE_NUM; // 更新队尾指针queue_head = (queue_head + 1) % MAX_PAGE_NUM; // 更新队头指针}int main() {int page_num = 20; // 页面数int miss_count = 0; // 缺页次数init_page_queue(page_num);for (int i = 0; i < page_num; i++) {int page = page_queue[i];if (mem[page] == 0) { // 页面不在内存中miss_count++;page_replace(page);}}printf("缺页次数:%d\n", miss_count);return 0;}```2.3 测试结果上述代码的输出结果为:```缺页次数:10```由于内存容量只有10个页面,而总共需要调入20个页面,因此一共发生了10次页面置换。
fifo法FIFO法是一种常见的调度算法,全称是First In First Out,即先进先出。
它在计算机科学领域中被广泛应用于多种场景,如操作系统中的进程调度、计算机网络中的数据包传输等。
本文将从FIFO法的定义、原理、应用以及优缺点等方面进行阐述。
我们来了解一下FIFO法的定义和原理。
FIFO法是一种按照任务或数据的到达顺序进行处理的调度算法。
当有多个任务或数据需要处理时,FIFO法会按照它们的到达顺序进行排队,并按照队列中的先后顺序进行处理。
也就是说,先到达的任务或数据会被先处理,后到达的任务或数据会被后处理。
FIFO法的应用非常广泛。
在操作系统中,FIFO法被用于进程调度。
当有多个进程需要执行时,操作系统会将它们按照到达的顺序排列成一个队列,然后按照队列中的先后顺序依次执行。
这样可以保证每个进程都有机会被执行,而不会因为某个进程一直占用CPU而导致其他进程无法执行。
此外,在计算机网络中,FIFO法也被用于数据包的传输。
当多个数据包需要从发送端传输到接收端时,它们会按照到达的顺序排列成一个队列,并按照队列中的先后顺序依次传输。
这样可以保证数据包的顺序不会被打乱,从而保证数据的完整性和准确性。
FIFO法的优点是实现简单,适用于大多数场景。
由于FIFO法只需要按照到达的顺序进行排队和处理,不需要考虑其他复杂的因素,因此其实现非常简单。
此外,FIFO法适用于大多数场景,无论是进程调度还是数据包传输,只要是按照到达的顺序进行处理即可。
因此,FIFO法是一种常用的调度算法。
然而,FIFO法也存在一些缺点。
最主要的缺点是不考虑任务或数据的优先级。
由于FIFO法只按照到达的顺序进行处理,无法根据任务或数据的优先级进行调度。
这就可能导致一些紧急任务或重要数据被延迟处理,从而影响系统的性能和效率。
此外,FIFO法也无法应对一些特殊情况,比如某个任务或数据需要立即处理,而不是等待其他任务或数据处理完毕。
在这种情况下,FIFO法可能无法满足需求。
操作系统:FIFO算法详解及代码演⽰FIFO算法FIFO算法是最简单的页⾯置换算法。
FIFO算法为每个页⾯记录了调到内存的时间。
当必须置换页⾯的时候,选择最旧的页⾯。
通俗来说,每次进⼊主存的时候如果主存中不存在这个页⾯,那么最先进⼊的页⾯出队。
如果主存存在这个页⾯,那么内存不动。
下⾯是C++⾯向对象写法代码。
这个说明⼀下为什么不⽤容器Queue。
是因为queue并没有迭代器,所以⽆法去寻找⾥⾯是否含有某块页⾯。
直接使⽤线性表即可,⽅便简单且快速。
// 在分页式虚拟存储管理中,要求通过键盘输⼊分配给⼀个作业的物理块数和作业依次访问的10个页⾯号,// 采⽤先进先出(FIFO)页⾯置换后// ,顺序输出缺页中断时所淘汰的页⾯号,并计算缺页中断率。
#include <iostream>using namespace std;#define MAX 20class Work{public:void seta(){int c, i = 1;cout << "输⼊10个页⾯号,以任意符号结尾" << endl;cin >> c;a[0] = c;while (cin >> c){a[i] = c;i++;}}void geta(){cout << "10个页⾯号分别为: ";for (int i = 0; i < 10; i++){cout << a[i] << " ";}cout << endl;}int index(int i){return a[i];}~Work(){cout<<"work 已被释放"<<endl;}private:int a[10];};class space{public:// 初始化构造函数,把除了物理块⼤⼩的其他空间都设置成其他值// 将初始化空间设置成-1space(int i){size=i;for (int j = 0; j < i; j++){s[j] = -1;}}// 显⽰物理块现在的状态void getSpace(){int i=0;cout<<"-------------物理块现在的状态是-------------"<<endl; while(s[i]!=-999){if(s[i]==-1){cout<<"NaN"<<" -||- ";i++;continue;}cout<<s[i]<<" -||- ";i++;}cout<<endl;cout<<"------------------------------------------"<<endl;}int find(int n){for(int i=0;i<size;i++){if(s[i]==n){return i;}}return -1;}// 先进先出,去掉第⼀个物理块,改变最后⼀个物理块。
概述fifo,opt,lru算法一、算法简介FIFO(FirstInFirstOut,先进先出)、OPT(OptimalPageReplacement)和LRU(LeastRecentlyUsed)算法是三种常见的页面替换算法,用于计算机中的虚拟内存管理。
这些算法在处理内存中数据块的替换时,需要考虑内存的容量、程序的需求以及数据的历史访问情况等因素。
二、算法原理1.FIFO算法:此算法将页面按照进入的顺序依次存放在内存中。
当有新的页面需要被加载时,如果内存中没有该页面,就需要从磁盘上加载。
当所有的页面都按照进入的顺序被加载完毕后,再按照同样的顺序将页面从内存中逐出,以腾出空间存放新的页面。
这种算法简单易行,但过于依赖页面的进入顺序,如果页面进入的顺序不合理,可能会导致频繁的页面替换。
2.OPT算法:此算法在每次需要加载新页面时,会根据一些准则(如最大错误率、最小错误率、最坏情况等)选择一个最优的页面进行替换。
相比于FIFO算法,OPT算法能更好地适应不同的页面访问情况,从而减少页面的替换频率。
然而,由于需要考虑到各种复杂的因素,OPT算法的实现难度相对较高。
3.LRU算法:此算法将最近最少使用的页面替换出内存,以腾出空间存放新的页面。
当有新的页面需要被加载时,如果内存中没有该页面,就需要从磁盘上加载。
而在加载完成后,会将该页面标记为最近最少使用的状态。
这种算法能够有效地提高内存的使用效率,减少页面的替换次数。
三、应用场景这三种算法在许多实际应用场景中都有应用,如操作系统中的虚拟内存管理、缓存系统等。
不同的应用场景可能需要不同的算法来满足特定的需求,如对于需要频繁访问的页面,可能更适合使用LRU算法;而对于访问模式较为固定的场景,可能更适合使用OPT算法。
四、总结FIFO、OPT和LRU算法是虚拟内存管理中常用的页面替换算法,它们各自具有不同的原理和应用场景。
在实际应用中,需要根据具体的需求和场景选择合适的算法,以实现最优的内存管理效果。
fifo页面置换算法例题详解FIFO(First In, First Out)页面置换算法是一种最简单的页面置换算法,它根据页面调入内存的顺序进行页面置换。
当发生页面缺失时,选择最早调入内存的页面进行置换。
下面是一个使用FIFO页面置换算法解决页面置换问题的例题:假设一个系统的物理内存容量为3个页面,而作业需要访问9个页面。
作业在以下指令序列中运行:1,2,3,4,1,2,5,1,2。
假设在开始时,物理内存中没有页面。
使用FIFO页面置换算法,计算缺页次数。
解题步骤如下:1. 创建一个长度为3的队列,用于保存当前在内存中的页面。
2. 从指令序列中取出第一个页面1。
由于物理内存中没有页面,将页面1调入物理内存,并将1加入队列中。
3. 继续从指令序列中取出页面2。
由于物理内存中只有页面1,将页面2调入物理内存,并将2加入队列中。
4. 继续从指令序列中取出页面3。
由于物理内存中有页面1和2,将页面3调入物理内存,并将3加入队列中。
5. 继续从指令序列中取出页面4。
由于物理内存中已满,需要进行页面置换。
由于页面1是最早调入内存的页面,所以选择页面1进行置换。
将页面4调入物理内存,并将4加入队列中。
6. 继续从指令序列中取出页面1。
由于物理内存中已满,需要进行页面置换。
由于页面2是最早调入内存的页面,所以选择页面2进行置换。
将页面1调入物理内存,并将1加入队列中。
7. 继续从指令序列中取出页面2。
由于物理内存中已满,需要进行页面置换。
由于页面3是最早调入内存的页面,所以选择页面3进行置换。
将页面2调入物理内存,并将2加入队列中。
8. 继续从指令序列中取出页面5。
由于物理内存中已满,需要进行页面置换。
由于页面4是最早调入内存的页面,所以选择页面4进行置换。
将页面5调入物理内存,并将5加入队列中。
9. 继续从指令序列中取出页面1。
由于物理内存中已满,需要进行页面置换。
由于页面1是最早调入内存的页面,所以选择页面1进行置换。
FIFO(先进先出算法)先进先出算法(First In, First Out,简称FIFO)是一种常见的调度算法,也是操作系统和计算机网络中广泛应用的一种策略。
该算法使用队列的数据结构来管理和调度任务,按照任务的到达顺序进行处理,最先到达的任务先被处理,后到达的任务则等待在队列中。
在操作系统中,FIFO算法常用于内存管理和磁盘调度。
在内存管理中,操作系统根据进程的到达时间将其放入内存中的任务队列。
而在磁盘调度中,操作系统按照文件请求的到达顺序来访问硬盘。
这样可以保证任务按照顺序进行处理,不会出现任务被跳过或产生乱序的情况。
FIFO算法的原理非常简单,每个任务到达时加入队列的尾部,任务执行时从队列的头部取出。
这样可以确保先到达的任务先被执行,队列中的任务按照FIFO的顺序依次进行处理。
例如,有三个任务A、B、C按照顺序到达队列,从头部开始取出任务进行处理,则A、B、C依次被处理,保证了任务执行的顺序性。
FIFO算法的优点是实现简单,性能稳定。
由于只需要维护一个任务队列,不需要根据任务的优先级或其他因素进行排序和调度,所以实现相对较简单。
同时,由于保证了任务的先后顺序,不会出现任务等待时间过长或任务被忽略的情况,因此性能相对稳定。
然而,FIFO算法也存在一些不足之处。
首先,FIFO算法对任务的响应时间和完成时间没有考虑或优化,导致任务的等待时间可能很长。
如果队列中有一个优先级较低但是任务大小较大的任务排在前面,后面的优先级较高但是任务大小较小的任务将长时间等待。
其次,FIFO算法不适用于长任务和短任务相互混合的场景,可能导致响应时间变长,影响系统的实时性和用户体验。
为了解决FIFO算法的一些不足,人们在实际应用中通常会对其进行一些改进。
例如,引入优先级调度算法,给不同的任务设置优先级,按照优先级高低进行任务调度。
另外,也可以通过时间片轮转算法,将任务划分为多个时间片,在每个时间片内循环进行任务调度,以提高任务的响应速度。
操作系统(2014年秋季学期) Array实验报告
系别:计算机学院
班级:
姓名:
学号:
实验名称:存储管理
总成绩:
评语:
日期:
四、程序代码
#include<stdio.h>
#include<stdlib.h>
/*全局变量*/
int mSIZE; /*物理块数*/
int pSIZE; /*页面号引用串个数*/
static int memery[10]={0}; /*物理块中的页号*/
static int page[100]={0}; /*页面号引用串*/
static int temp[100][10]={0};
void FIFO();/*置换算法函数*/
void print(unsigned int t);
void designBy();
/*主函数*/
void main()
{
int i,k,code;
system("color 0A");
designBy();
printf("欢迎使用,请按任意键进行初始化操作... \n");
//printf(" >>>");
getchar();
system("cls");
system("color 0A");
printf("请输入物理块的个数(M<=10):");
scanf_s("%d",&mSIZE);
printf("请输入页面号引用串的个数(P<=100):");
scanf_s("%d",&pSIZE);
puts("请依次输入页面号引用串:");
for(i=0;i<pSIZE;i++)
scanf_s("%1d",&page[i]);
system("cls");
system("color 0A");
do{
puts("输入的页面号引用串为:");
for(k=0;k<=(pSIZE-1)/20;k++)
{
for(i=20*k;(i<pSIZE)&&(i<20*(k+1));i++)
{
if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1)))
printf("%d\n",page[i]);
else
printf("%d ",page[i]);
}
}
printf("* * * * * * * * * * * * * * * * * * * * * * *\n");
printf("* 1.演示(FIFO)算法 2.退出(EXIT) *\n");
printf("* * * * * * * * * * * * * * * * * * * * * * *\n");
printf("请选择操作:[ ]\b\b");
scanf_s("%d",&code);
switch(code)
{
case 1:
FIFO();
getchar();
break;
case 2:
printf("\n退出完成\n");
getchar();
break;
default:
printf("输入错误,请重新输入:");
getchar();
}
printf("按任意键继续:>>>");
getchar();
system("cls");
}while (code!=2);
getchar();
}
//显示设计者信息
void designBy()
{
printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf("┃实验:页面置换算法┃\n");
printf("┃班级:信安12 ┃\n");
printf("┃姓名:┃\n");
printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━┫\n"); }
void print(unsigned int t)
{
int i,j,k,l;
int flag;
for(k=0;k<=(pSIZE-1)/20;k++)
{
for(i=20*k;(i<pSIZE)&&(i<20*(k+1));i++)
{
if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1)))
printf("%d\n",page[i]);
else
printf("%d ",page[i]);
}
for(j=0;j<mSIZE;j++)
{
for(i=20*k;(i<mSIZE+20*k)&&(i<pSIZE);i++)
{
if(i>=j)
printf(" |%d|",temp[i][j]);
else
printf(" |0|");
}
for(i=mSIZE+20*k;(i<pSIZE)&&(i<20*(k+1));i++)
{
for(flag=0,l=0;l<mSIZE;l++)
if(temp[i][l]==temp[i-1][l])
flag++;
if(flag==mSIZE)/*页面在物理块中*/
printf(" | |");
else
printf(" |%d|",temp[i][j]);
}
/*每行显示20个*/
if(i%20==0)
continue;
printf("\n");
}
}
printf("----------------------------------------\n");
printf("缺页次数:%d\t\t",t+mSIZE);
printf("缺页率:%d/%d\n",t+mSIZE,pSIZE);
printf("置换次数:%d\t\t",t);
printf("\n---------------------------------------\n"); }
/*先进先出页面置换算法*/
void FIFO()
{
int memery[10]={0};
int time[10]={0}; /*记录进入物理块的时间*/
int i,j,k,m;
int max=0; /*记录换出页*/
int count=0; /*记录置换次数*/
for(i=0;i<mSIZE;i++)/*前mSIZE个数直接放入*/
{
memery[i]=page[i];
time[i]=i;
for(j=0;j<mSIZE;j++)
temp[i][j]=memery[j];
}
for(i=mSIZE;i<pSIZE;i++)
{
/*判断新页面号是否在物理块中*/
for(j=0,k=0;j<mSIZE;j++)
{
if(memery[j]!=page[i])
k++;
}
if(k==mSIZE) /*如果不在物理块中*/
{
count++;
/*计算换出页*/
max=time[0]<time[1]?0:1;
for(m=2;m<mSIZE;m++)
if(time[m]<time[max])
max=m;
memery[max]=page[i];
time[max]=i; /*记录该页进入物理块的时间*/ for(j=0;j<mSIZE;j++)
temp[i][j]=memery[j];
}
else
{
for(j=0;j<mSIZE;j++)
temp[i][j]=memery[j];
}
}
print(count);
}
五、编译过程截图
实验中使用visual studio 2013
六、实验结果
1、FIFO
四个内存块,十二个引用串个数:
进行FIFO运算:
2014-12-29
NORTH CHINA UNIVERSITY OF TECHNOLOGY
2014-12-29
11/11。