BZOJ1206:[HNOI2005]虚拟内存

news/2024/7/20 15:44:22 标签: 操作系统, 数据结构与算法, 内存管理

Description

操作系统中一种重要的存储管理技术就是虚拟内存技术。操作系统中允许进程同时运行,也就是并行。每个进程都有其相对独立的数据块(进程运行的过程中将对其进行读写操作)。理想的情况下,这些数据块都应该存放在内存中,这样才能实现高效的读写操作。但事实上,内存的容量有限,每个进程只能把一部分数据放在内存中,为了解决这个矛盾,提出了虚拟内存技术。虚拟内存技术的基本原理是:对进程而言,内存空间是无限大的,进程可以随意地读写数据,而对操作系统内部而言,利用外存来模拟扩充的内存空间,进程要求访问某个内存单元时,交由操作系统处理,操作系统首先在内存中查找该单元是否存在,如果存在,查找成功,否则转入外存查找(一定存在于外存中)。就存储介质的物理性质而言,内存的访问速度相对于外存要快得多,因此对于每个进程来说操作系统应该把那些访问次数较多的数据存放在内存中,而把那些访问次数很少的数据放在外存中。如何选择内存中暂留的数据是一个很值得研究的问题,下面介绍一个内存管理中比较常用的算法:内存中的数据以页为基本存储单位,进程的读写操作都针对页来进行。实际内存空间被分割成n页,虚拟内存空间的页数往往要多得多。

某一时刻,进程需要访问虚存编号为P的页,该算法的执行步骤如下:

a. 首先在内存中查找,如果该页位于内存中,查找成功,转d,否则继续下面的操作;

b. 寻找内存中是否存在空页(即没有装载任何数据页的页面),若有,则从外存中读入要查找页,并将该页送至内存中的空页进行存储,然后转d,否则继续下面的操作;

c. 在内存中寻找一个访问次数最少的页面(如果存在多个页面的访问次数同时为最少,则选取最早读入数据进入内存的那个页面),从外存中读入要查找页,替换该页。

d. 结束

所谓访问次数是指从当前页面进入内存到该时刻被访问的次数,如果该页面以前进入过内存并被其它页面替换,那么前面的访问次数不应计入这个时刻的访问次数中。你的任务是设计一个程序实现上述算法。测试数据将会提供m条读写内存的命令,每条命题提供要求访问的虚拟内存页的编号P。你的程序要求能够模拟整个m条命令的全部执行过程,所有的命令是按照输入的先后执行的,最开始的时候内存中的n页全为空。

Input

第1行为n和m,分别表示内存页数和读写内存命令条数。接下来有m行,其中第i+1行有一个正整数Pi<=10^9,表示第i条读写内存命令需要访问的虚拟内存页的编号。

Output

仅包含一个正整数,表示在整个模拟过程中,在内存中直接查找成功的次数(即上面的算法只执行步骤a的次数)。

Sample Input

3 8
1
1
2
3
4
2
5
4

Sample Output

1

HINT

n<10000,m<1000000

 

题解:

题面巨长无比,就是要让你按照给出的规则去维护一个堆,支持插入、删除、修改等操作。

stl练习题,操作可以用set与map解决。

 

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 struct yuansu
 4 {
 5   int a,b,c;
 6   bool operator<(const yuansu &thr)const{return (a<thr.a)or((a==thr.a)and(b<thr.b));};
 7 };
 8 struct yuansu2
 9 {
10   int a,b,c;
11 };
12 map<int,yuansu2> hash;
13 multiset<yuansu> dui;
14 int tot,ans,n,m;
15 int main()
16 {
17   scanf("%d%d",&n,&m);
18   for(int i=1;i<=m;i++)
19   {
20       int a; scanf("%d",&a);
21       if(hash[a].c==1)
22       {
23         ans++;
24         multiset<yuansu>::iterator t=dui.find((yuansu){hash[a].a,hash[a].b,a});
25         yuansu e=(*t); dui.erase(t); hash[a].a++; e.a++; dui.insert(e);
26     }
27       else if(tot==n)
28       {
29         yuansu e=(*dui.begin()); dui.erase(dui.begin()); hash[e.c].c=0;
30         dui.insert((yuansu){1,i,a}); hash[a].c=1; hash[a].a=1; hash[a].b=i;
31       }
32       else
33     { 
34         dui.insert((yuansu){1,i,a}); hash[a].c=1; hash[a].a=1; hash[a].b=i; tot++;
35       }
36   }
37   printf("%d\n",ans);
38 }
View Code

转载于:https://www.cnblogs.com/GhostReach/p/6402094.html


http://www.niftyadmin.cn/n/1091463.html

相关文章

mysql交叉表查询,VFP-SQL select实现交叉表查询(修改)

交叉表查询分为两种&#xff1a;(1)静态交叉表(2)动态交叉表准备测试数据CREATE CURSOR test (ksh c(12),xm c(8),km c(8),fs n(3,0))INSERT INTO test value(13001,张三,语文,45)INSERT INTO test value(13001,张三,数学,48)INSERT INTO test value(13001,张三,英语,65)INSERT…

游戏AI(二)—行为树优化之内存优化

上一篇我们讲到了AI架构之一的行为树&#xff0c;本篇文章和下一篇文章我们将对行为树进行优化&#xff0c;在本篇文章中我们讲到的是内存优化 问题 上一篇中我们设计的行为树由于直接采用new进行动态内存分配&#xff0c;没有自己进行管理。因此行为树各节点的存储位置会散布在…

linux输出到 dev nul,Linux篇:输出重定向

一、前言最近发布一篇文章&#xff0c;有朋友在评论区问道&#xff1a; >/dev/null 2>&1 是什么意思&#xff0c;发现我自己还真不能很清楚的跟别人讲明白这茬&#xff0c;于是在网上查了一些大神的博客&#xff0c;自己照着命令敲&#xff0c;总结如下&#xff1a;二…

GDUFE ACM-1059最大连续子序列(DP)

最大连续子序列 Time Limit: 1000ms Problem Description: 给定K个整数的序列{ N1, N2, ..., NK }&#xff0c;其任意连续子序列可表示为{ Ni, Ni1, ..., Nj }&#xff0c;其中 1 < i < j < K。最大连续子序列是所有连续子序列中元素和最大的一个&#xff0c; 例如给…

C语言指针结构的应用实例,C语言指针应用简单实例

C语言指针应用简单实例这次来说交换函数的实现&#xff1a;1、#include #include void swap(int x, int y){int temp;temp x;x y;y temp;}int main(){int a 10, b 20;printf("交换前&#xff1a;\n a %d, b %d\n", a, b);swap(a, b);printf("交换后&…

springboot 零xml集成mybatis

maven依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0…

tcp三次握手和syn 洪水攻击

1. 连接后&#xff0c;所有的 ack 为1才有效&#xff08;连接后&#xff0c;ack 也一般都是1&#xff09; 2. 建立连接3次握手&#xff0c; 如何确认对方收到了你发的包&#xff0c; seq 是自己发出去的&#xff0c;自己知道seq的值。所以怎么确认对方收到了自己的包呢&#xf…

流水灯c语言程序tm,51单片机用定时器实现流水灯左右移动?

满意答案haozi82882017.01.10采纳率&#xff1a;49% 等级&#xff1a;9已帮助&#xff1a;1365人#includeunsigned char a0xfe;bit flag0;bit k0;unsigned char n0;void main(){EA1;ET11;TR11;TH10x3c;TL10xb0;TMOD0x10;while(1){if(flag1){P0a;flag0;if (k0){a<<1;a|…