LRU算法的顺序栈实现

合集下载

lru近似淘汰算法

lru近似淘汰算法

lru近似淘汰算法1.引言1.1 概述近似淘汰算法是一种用于缓存管理的重要技术,其中最受欢迎和广泛使用的算法之一就是LRU(Least Recently Used)算法。

LRU算法的基本原理是根据最近使用的时间来决定何时淘汰掉缓存中的数据。

在计算机科学领域,缓存是一种用于存储临时数据的高速存储器。

由于其读写速度快、响应时间低等特点,缓存被广泛应用于各种系统中,如操作系统、数据库系统和网络应用等。

然而,缓存的大小是有限的,所以当缓存已满时,就需要采取一种淘汰策略来替换掉一部分旧的数据,以便为新的数据腾出空间。

LRU算法的思想是,当需要淘汰数据时,选择最近最久未使用的数据进行替换。

其基本操作是通过维护一个用于排序访问顺序的链表或者双向队列来实现的。

每当访问一个数据时,该数据就会被移动到链表的头部或者队列的头部,以表示这是最近被使用的数据。

当需要淘汰数据时,只需要将链表或者队列的尾部数据替换掉即可。

LRU近似淘汰算法相比于其他淘汰策略具有一些独特的优势。

首先,LRU算法能够充分利用最近的访问模式,因此能够相对准确地判断哪些数据是频繁访问的。

其次,LRU算法具有较高的缓存命中率,即能够更有效地将经常访问的数据保留在缓存中,从而提高系统的性能和响应速度。

另外,LRU算法的实现相对简单,容易理解和调试,因此广泛应用于实际系统中。

综上所述,本文将对LRU近似淘汰算法进行详细的介绍和探讨。

首先,将解释LRU算法的原理和基本操作。

然后,将探讨LRU近似淘汰算法相比其他淘汰策略的优势和适用性。

最后,将总结该算法的重要性和应用前景。

通过对LRU近似淘汰算法的深入理解,我们能够更好地应用该算法来提升系统的性能和效率。

文章结构部分的内容可以按照以下方式来撰写:1.2 文章结构本文将按照以下结构来展开介绍LRU近似淘汰算法:第一部分为引言,旨在概述本文的背景和目的。

首先,我们将对LRU 算法进行简要介绍,阐述其原理和应用场景。

详解页式管理置换算法FIFO_LRU_OPT

详解页式管理置换算法FIFO_LRU_OPT

页式管理OPT、LRU、FIFO置换算法详解指令:1,2,3,4,2,1,5,6,2,1,2,3,7,6,3,2,1,2,3,6若内存最多容纳4个页面,则……一、OPT(理想型淘汰)算法该算法无法实现。

置换规则:(1)淘汰内存中以后不再访问的页面;(2)如果没有(1),则淘汰将要访问指令之后的将来最迟被访问的指令的页面。

分析:(1)当访问5时,内存1,2,3,4,发生第5次中断,淘汰不再访问的4,换入5,内存1,2,3,5;(2)当访问6时,内存1,2,3,5,发生第6次中断,淘汰不再访问的5,换入6,内存1,2,3,6;(3)当访问7时,内存1,2,3,6,发生第7次中断,由于之后的指令(1、2、3、6)都是现在内存页面都存在的指令,无法淘汰,但可以根据指令访问顺序,先淘汰将来最迟被访问的1,换入7,置换后的内存7,2,3,6;(4)当访问1时,内存7,2,3,6,发生第8次中断,淘汰不再访问的7,换入1,内存1,2,3,6;即OPT算法一共会出现8次缺页中断。

二、LRU(最近最久未使用)算法该算法利用堆栈实现,每次访问都调整堆栈中页面顺序。

把被访问页面从栈移出再压入栈顶。

置换规则:(1)栈顶始终为最新访问过的页面;(2)栈底始终为最近最久未被访问的页面;(3)访问存在的页面要调到栈顶。

分析:(1)访问第5个指令2时,由于内存页面中已经存在2,所以不置换,但调整2在栈中顺序,即将2调到栈顶,其它页面依次后置。

调整前内存4,3,2,1,调整后内存2,4,3,1;(2)访问第7个指令5时,发生第5次中断,原内存1,2,4,3,淘汰栈底3,栈顶调入5,调整后内存5,1,2,4;(3)访问第8个指令6时,发生第6次中断,原内存5,1,2,4,,淘汰栈底4,栈顶调入6,调整后内存6,5,1,2;……即LRU算法一共会出现10次缺页中断。

三、FIFO(先进先出)算法该算法利用队列实现。

FIFO与LRU的区别是FIFO遇到内存中存在的页面不需要调换页面顺序。

lru算法堆栈类算法 -回复

lru算法堆栈类算法 -回复

lru算法堆栈类算法-回复什么是LRU算法?LRU算法是一种常用于缓存淘汰策略的算法,全名为Least Recently Used (LRU)。

这个算法的主要思想是,当缓存空间已满时,将最近最少使用的数据从缓存中淘汰出去,以便为新的数据留出空间。

为什么需要LRU算法?随着计算机技术的发展,数据访问的速度相对于数据存储的速度要快得多。

因此,使用缓存来存储经常需要访问的数据可以大大提高系统的性能。

但是,缓存空间是有限的,如何在有限的缓存空间中存储尽可能多的有用数据,并且尽量减少缓存的未命中率,成为了一项挑战。

这时就需要使用一种合适的缓存淘汰策略,而LRU算法就是其中一种。

LRU算法的实现原理是什么?LRU算法的实现原理相对简单。

它通过记录数据最近被访问的时间或次数,并在缓存空间已满时选择最近最少被访问的数据进行淘汰。

具体地说,LRU算法使用一个数据结构来维护当前缓存的数据顺序。

一般情况下,使用一个双向链表来实现这个数据结构。

链表的头部表示最近访问的数据,而链表的尾部表示最久未访问的数据。

当有一个新的数据需要存入缓存时,LRU算法会检查这个数据是否已经在缓存中。

如果在缓存中,就将这个数据从链表中删除,并将其移动到链表的头部,表示最近被访问。

如果不在缓存中,就将这个数据存入缓存,并将其插入链表的头部。

当缓存空间已满时,LRU算法会选择链表中最后一个数据进行淘汰,因为这个数据是最久未被访问的。

具体来说,LRU算法会将这个数据从链表中删除,并释放其在缓存中的空间。

总结起来,LRU算法的实现原理可以分为以下几个步骤:1. 当有新的数据需要存入缓存时,检查这个数据是否已经在缓存中。

2. 如果在缓存中,将这个数据从链表中删除。

3. 如果不在缓存中,将这个数据存入缓存,并插入链表的头部。

4. 当缓存空间已满时,选择链表中最后一个数据进行淘汰。

LRU算法的时间复杂度如何?LRU算法的时间复杂度主要取决于链表的操作。

在插入数据、删除数据和移动数据的过程中,需要对链表进行操作,这些操作的时间复杂度均为O(1)。

fifo算法和lru算法

fifo算法和lru算法

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算法的优点是能够较好地适应页面访问模式,并做出相应调整。

OPT、FIFO、LRU算法的实现

OPT、FIFO、LRU算法的实现

OPT、FIFO、LRU算法的实现⼀、实验⽬的1. 了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中⼏种基本页⾯置换算法的基本思想和实现过程,并⽐较它们的效率。

2. 了解程序设计技术和内存泄露的原因⼆、实验内容模拟实现请求页式存储管理的⼏种基本页⾯置换算法最佳淘汰算法(OPT)先进先出的算法(FIFO)最近最久未使⽤算法(LRU)三、实验原理1. 虚拟存储系统UNIX中,为了提⾼内存利⽤率,提供了内外存进程对换机制;内存空间的分配和回收均以页为单位进⾏;⼀个进程只需将其⼀部分(段或页)调⼊内存便可运⾏;还⽀持请求调页的存储管理⽅式。

当进程在运⾏中需要访问某部分程序和数据时,发现其所在页⾯不在内存,就⽴即提出请求(向CPU发出缺中断),由系统将其所需页⾯调⼊内存。

这种页⾯调⼊⽅式叫请求调页。

为实现请求调页,核⼼配置了四种数据结构:页表、页框号、访问位、修改位、有效位、保护位等。

2. 页⾯置换算法当CPU接收到缺页中断信号,中断处理程序先保存现场,分析中断原因,转⼊缺页中断处理程序。

该程序通过查找页表,得到该页所在外存的物理块号。

如果此时内存未满,能容纳新页,则启动磁盘I/O将所缺之页调⼊内存,然后修改页表。

如果内存已满,则须按某种置换算法从内存中选出⼀页准备换出,是否重新写盘由页表的修改位决定,然后将缺页调⼊,修改页表。

利⽤修改后的页表,去形成所要访问数据的物理地址,再去访问内存数据。

整个页⾯的调⼊过程对⽤户是透明的。

最佳淘汰算法(OPT):选择永不使⽤或在未来最长时间内不再被访问的页⾯予以替换。

先进先出的算法(FIFO):选择在内存中驻留时间最久的页⾯予以替换。

最近最久未使⽤算法(LRU):选择过去最长时间未被访问的页⾯予以替换。

3. ⾸先⽤srand( )和rand( )函数定义和产⽣指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的命中率。

(1)通过随机数产⽣⼀个指令序列,共320条指令。

概述fifo,opt,lru算法

概述fifo,opt,lru算法

概述fifo,opt,lru算法一、算法简介FIFO(FirstInFirstOut,先进先出)、OPT(OptimalPageReplacement)和LRU(LeastRecentlyUsed)算法是三种常见的页面替换算法,用于计算机中的虚拟内存管理。

这些算法在处理内存中数据块的替换时,需要考虑内存的容量、程序的需求以及数据的历史访问情况等因素。

二、算法原理1.FIFO算法:此算法将页面按照进入的顺序依次存放在内存中。

当有新的页面需要被加载时,如果内存中没有该页面,就需要从磁盘上加载。

当所有的页面都按照进入的顺序被加载完毕后,再按照同样的顺序将页面从内存中逐出,以腾出空间存放新的页面。

这种算法简单易行,但过于依赖页面的进入顺序,如果页面进入的顺序不合理,可能会导致频繁的页面替换。

2.OPT算法:此算法在每次需要加载新页面时,会根据一些准则(如最大错误率、最小错误率、最坏情况等)选择一个最优的页面进行替换。

相比于FIFO算法,OPT算法能更好地适应不同的页面访问情况,从而减少页面的替换频率。

然而,由于需要考虑到各种复杂的因素,OPT算法的实现难度相对较高。

3.LRU算法:此算法将最近最少使用的页面替换出内存,以腾出空间存放新的页面。

当有新的页面需要被加载时,如果内存中没有该页面,就需要从磁盘上加载。

而在加载完成后,会将该页面标记为最近最少使用的状态。

这种算法能够有效地提高内存的使用效率,减少页面的替换次数。

三、应用场景这三种算法在许多实际应用场景中都有应用,如操作系统中的虚拟内存管理、缓存系统等。

不同的应用场景可能需要不同的算法来满足特定的需求,如对于需要频繁访问的页面,可能更适合使用LRU算法;而对于访问模式较为固定的场景,可能更适合使用OPT算法。

四、总结FIFO、OPT和LRU算法是虚拟内存管理中常用的页面替换算法,它们各自具有不同的原理和应用场景。

在实际应用中,需要根据具体的需求和场景选择合适的算法,以实现最优的内存管理效果。

LRU算法C语言实现

LRU算法C语言实现

LRU算法C语言实现LRU(Least Recently Used)算法是一种常见的缓存替换算法,它根据数据最近被访问的时间进行缓存替换。

当缓存满时,LRU算法将替换最长时间未被访问的数据。

下面是使用C语言实现LRU算法的代码:```c#include <stdio.h>#include <stdlib.h>typedef struct nodeint key;int value;struct node *prev;struct node *next;} Node;typedef struct lru_cacheint capacity;int count;Node *head;Node *tail;Node **hashmap;} LRUCache;LRUCache *createCache(int capacity)LRUCache *cache = (LRUCache *)malloc(sizeof(LRUCache)); cache->capacity = capacity;cache->count = 0;cache->head = NULL;cache->tail = NULL;cache->hashmap = (Node **)malloc(sizeof(Node *) * capacity); // 初始化hashmap为NULLfor (int i = 0; i < capacity; i++)cache->hashmap[i] = NULL;}return cache;void addNodeToHead(LRUCache *cache, Node *node)//将节点添加到链表头部node->next = cache->head;node->prev = NULL;if (cache->head != NULL)cache->head->prev = node;}cache->head = node;if (cache->tail == NULL)cache->tail = node;}void removeNode(LRUCache *cache, Node *node) //移除节点if (node->prev != NULL)node->prev->next = node->next;} elsecache->head = node->next;}if (node->next != NULL)node->next->prev = node->prev;} elsecache->tail = node->prev;}void moveToHead(LRUCache *cache, Node *node)//将节点移动到链表头部removeNode(cache, node);addNodeToHead(cache, node);void removeTail(LRUCache *cache)//移除链表尾部的节点if (cache->tail != NULL)Node *node = cache->tail;cache->tail = node->prev;if (node->prev != NULL)node->prev->next = NULL;} elsecache->head = NULL;}free(node);}int get(LRUCache *cache, int key)//根据键值获取缓存值,并将节点移动到链表头部int hash = abs(key) % cache->capacity;Node *node = cache->hashmap[hash];while (node != NULL)if (node->key == key)moveToHead(cache, node);return node->value;}node = node->next;}//如果节点不存在,返回-1return -1;void put(LRUCache *cache, int key, int value)//添加或更新缓存键值对int hash = abs(key) % cache->capacity;Node *node = cache->hashmap[hash];//如果缓存中已存在该键值对,更新节点的值并移动到链表头部while (node != NULL)if (node->key == key)node->value = value;moveToHead(cache, node);return;}node = node->next;}// 如果缓存已满,移除链表尾部的节点,同时更新hashmap if (cache->count >= cache->capacity)int tailKey = cache->tail->key;removeTail(cache);cache->hashmap[abs(tailKey) % cache->capacity] = NULL; cache->count--;}// 创建新的节点,并添加到链表头部和hashmapNode *newNode = (Node *)malloc(sizeof(Node)); newNode->key = key;newNode->value = value;newNode->prev = NULL;newNode->next = NULL;addNodeToHead(cache, newNode);cache->hashmap[hash] = newNode;cache->count++;void destroyCache(LRUCache *cache)//销毁缓存Node *node = cache->head;while (node != NULL)Node *temp = node;node = node->next;free(temp);}free(cache->hashmap);free(cache);```上述代码中,我们定义了两个数据结构,`Node`表示缓存中的节点,`LRUCache`表示整个缓存。

栈与队列实现先进先出和后进先出的数据结构

栈与队列实现先进先出和后进先出的数据结构

栈与队列实现先进先出和后进先出的数据结构数据结构是计算机科学中一门重要的基础课程,其中栈(Stack)和队列(Queue)是常用的数据结构。

栈和队列都具有不同的特点和应用场景,能够满足先进先出(FIFO)和后进先出(LIFO)的要求。

一、栈的实现先进先出栈是一种线性数据结构,具有后进先出(LIFO)的特点。

在栈中,只能在栈的一端进行操作,称为栈顶。

栈的基本操作包括入栈(Push)和出栈(Pop)。

1. 入栈(Push)操作:当要向栈中添加元素时,将新元素放置在栈顶,并将栈顶指针向上移动一位。

该操作保证了后添加的元素会处于栈顶的位置。

2. 出栈(Pop)操作:当要从栈中移除元素时,将栈顶的元素弹出,并将栈顶指针向下移动一位。

该操作保证了最后添加的元素会最先被移除。

栈的实现可以使用数组或链表来存储元素。

使用数组实现时,需要指定栈的最大容量。

使用链表实现时,栈的容量可以动态扩展。

二、队列的实现先进先出队列是一种线性数据结构,具有先进先出(FIFO)的特点。

在队列中,元素从队尾入队,从队头出队。

队列的基本操作包括入队(Enqueue)和出队(Dequeue)。

1. 入队(Enqueue)操作:当要向队列中添加元素时,将新元素放置在队尾,并将队尾指针向后移动一位。

该操作保证了后添加的元素会处于队列的尾部。

2. 出队(Dequeue)操作:当要从队列中移除元素时,将队头的元素弹出,并将队头指针向后移动一位。

该操作保证了最早添加的元素会最先被移除。

队列的实现也可以使用数组或链表。

与栈不同的是,队列的实现更适合使用链表,因为链表可以实现在队头和队尾高效地执行插入和删除操作。

三、使用栈和队列实现先进先出和后进先出为了实现先进先出和后进先出的数据结构,可以使用一种特殊的数据结构:双端队列(Double-ended Queue),也称为双端栈(Deque)。

双端队列具有栈和队列的特点,既可以在队尾插入和删除元素,也可以在队头插入和删除元素。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

LRU算法的顺序栈实现
一、需求分析
1、本演示程序是对页面置换算法中的最近最久未使用的置换算法(LRU)的顺序栈的实现,并计算缺页率。

2、演示程序以用户和计算机对话的方式执行,即在计算机终端上显示“提示信息”下,用户可输入模拟缓存的大小(即cache值),并输入由文件的模拟页面流,最终进行计算缺页率。

3、最后对结果做出简单分析,包括对各组数据得出的结果的简单分析和对算法的进一步改进给予解释。

二、概要设计
1、本程序中顺序栈的抽象数据类型定义:
ADT Stack{
数据对象:D={a[i]|a[i]∈ElemSet,i=1,2,3,..,n,n>0}
数据关系: R1={<a[i-1],a[i]>|a[i-1],a[i]∈D,i=1,2..n }
约定a[n]端为栈顶,a[1]端为栈底
基本操作:
InitStack(&s)
操作结果:构造一个空栈
Push(&s,e)
初始条件:栈s已存在
操作结果:将元素e压入栈顶
Pop(&s,p)
初始条件:栈s已存在
操作结果:将栈s中指针p所指向的元素删去,(注:p不一定指向栈底)
}ADT Stack
2、本程序包括以下几个模块
Ⅰ、栈的操作模块,包括
InitStack(&s) //初始化栈操作
Push(&s,e) //元素压入栈顶操作
Pop(&s,p) //删除栈中元素操作
Ⅱ、主程序模块
void main()
{
初始化
While(页号未结束)
{
For循环查找是否在栈内
If处理页号不在栈内的情况
{
If来解决在栈未满的情况
Else if 来解决栈已满的情况
}
}
输出缺页率
}
三、详细设计
根据LRU算法的特点,进行栈的顺序实现,并在实现在c源文件中/*------------------------------基本操作的函数原型-----------------------------*/ #define STACK_INIT_SIZE 100 //栈的初始化大小
typedef int ElemType;
typedef struct{ //顺序栈的结构定义
ElemType *base;
ElemType *top;
int stacksize; //栈的大小
}SqStack;
InitStack(SqStack *s) //初始化栈
{
s->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
//if(!s->base) exit(0);
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
}
Push(SqStack *s,ElemType e) //元素压入栈顶
{
//本算法忽略栈满追加栈元素的情况,因为不会发生
*(s->top)=e;
s->top++;
}
Pop(SqStack *s,int *p) //删除栈中某个元素,并一定为栈底
{
while(p<s->top)
{
*p=*(p++);
p++;
}
s->top--;
}
四、用户手册

五、测试结果
新建文本文件barry.txt,内存放页号的流文件,是基于随机的页号数,如图所示:
而当cache为12时,运行结果如下:缺页率为0.373
而当cache为24时,运行结果如下:缺页率为0.255
六、算法分析及改进
首先本算法的删除操作和传统的顺序栈的删除操作不一样,这里的删除不一定只是删除栈底的元素,可以是栈中的任意一个元素,所以对于顺序的存储数据会存在删除时教复杂的问题。

也就是说本算法是基于顺序栈的数据结构实现的,所以会存在在删除栈中元素时会有时间复杂度较高的问题,由于本算法是有大量的删除和添加操作,所以还是用链式的栈实现在时间复杂度方面会更加的小一点,这也是本算法的一个可以改进的地方和不足。

从实验的结果可以看到,文件的缺页率比较高,可能的影响因素是该缓存cache的大小,当cache过小时,缺页率会变的很高,如调试运行结果中当cache 为12时,缺页率为0.373;而当cache为24时,缺页率为0.255。

还有一个原因就是该页号并非真实的模拟情况,只是一些随机产生的模拟数,与实际调用的页号有很大的差异性,这也是导致缺页率过高的另一个原因。

附:顺序栈实现的代码
#include <stdio.h>
#include <malloc.h>
#define STACK_INIT_SIZE 100 //初始化的栈最大值
typedef int ElemType;
typedef struct{ //栈的定义
ElemType *base;
ElemType *top;
int stacksize;
}SqStack;
InitStack(SqStack *s) //初始化栈
{
s->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
//if(!s->base) exit(0);
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
}
Push(SqStack *s,ElemType e) //元素e压入栈顶,这里不存在栈元素满溢出的情况
{
*(s->top)=e;
s->top++;
}
Pop(SqStack *s,int *p) //删除栈中元素,这里不仅仅只是栈底元素{
while(p<s->top)
{
*p=*(p++);
p++;
}
s->top--;
}
void main()
{
SqStack s;
int cache,i=0,*p,sum=0,part=0;
FILE *fp;
int ch;
char filename[20];
printf("请输入文件名:\n");
scanf("%s",filename);
fp=fopen(filename,"r");
ch=fgetc(fp);
InitStack(&s);
printf("请输入cache的值:\n");
scanf("%d",&cache);
while(ch!=EOF)
{
for(p=s.base;p<s.top;p++) //查询栈中元素
{
if(*p==(ch-48)) //找到了,将元素放置到栈顶
{
Pop(&s,p);
Push(&s,(ch-48));
break;
}
}
if(p==s.top) //没找到
{
if((s.top-s.base)<cache) //栈未满,元素压入栈顶
{
Push(&s,(ch-48));
}
else if((s.top-s.base)==cache) //栈已满,删除栈底元素,将新元素压入栈顶
{
Pop(&s,s.base);
Push(&s,(ch-48));
}
part++;
}
i++;
sum++;
ch=fgetc(fp);
}
printf("part和sum分别为%d,%d\n",part,sum); //计算缺页率
printf("缺页率约为%.3f\n",(float)part/(float)sum);
}。

相关文档
最新文档