页式虚拟存储管理系统
‘壹’ 分页式虚拟存储系统中,页面大小与可能产生的缺页中断次数____。 A.成正比 B.成反比 C.无关 D.成固定比例
分页式虚拟存储系统中,页面大小与可能产生的缺页中断次数成固定比例;答案选择D;
若执行的程序占用内存很大或很多,则会导致内存消耗殆尽。为解决该问题,Windows中运用了虚拟内存技术,即匀出一部分硬盘空间来充当内存使用。当内存耗尽时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。
调度方式
调度方式有分页式、段式、段页式3种。页式调度是将逻辑和物理地址空间都分成固定大小的页。主存按页顺序编号,而每个独立编址的程序空间有自己的页号顺序,通过调度辅存中程序的各页可以离散装入主存中不同的页面位置,并可据表一一对应检索。
页表对程序员来说是透明的,地址变换快,调入操作简单;缺点是各页不是程序的独立模块,不便于实现程序和数据的保护。段式调度是按程序的逻辑结构划分地址空间,段的长度是随意的,并且允许伸长,它的优点是消除了内存零头,易于实现存储保护,便于程序动态装配;缺点是调入操作复杂。
将这两种方法结合起来便构成段页式调度。在段页式调度中把物理空间分成页,程序按模块分段,每个段再分成与物理空间页同样小的页面。段页式调度综合了段式和页式的优点。其缺点是增加了硬件成本,软件也较复杂。大型通用计算机系统多数采用段页式调度
‘贰’ 页式虚拟存储管理,过小的页会引起什么问题
会引起内存变小。在页式虚拟存储管理系统中,页面的大小是由计算机系统的地址结构所决定的,一般由软硬件共同决定。对于某一种系统一般采用一种大小穗简的页面,也有部分现代操芦皮作系统采用双页面系统的。在确定地址结构时,若选择的页面较小,一方面可使内碎片减小,并减少了内碎猜哗裤片的总空间,有利于提高内存利用率。另一方面,也会使每个进程要求较多的页面,从而导致页表过长,占用大量内存。此外还会降低页面换进换出的效率。
‘叁’ 关于在一个采用页式虚拟存储管理的系统问题
需要完成先来先服务调度算法和LRU调度算法,痛苦在于下面的程序只有主体部分只把先来先服务调度算法和LRU调度算法以空函数形式出现,要求把这两个算法填入空函数中使得整个程序能实现这两个算法,小弟是菜鸟,晕了几天了,望前辈们能帮帮小弟,给出源代码,小弟斗橘感激不尽!
#include "conio.h"
#include "iostream.h"
#include "fstream.h"
//---------------------Menu---------------------
#define KEY_EXIT '-'
typedef struct {
char ch ;
char *label;
void (*pfunc)();
} MenuItemDef ;
void clearscr() { cout<<"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\首数n\n\n\n";}
int waitakey() {return getch();}
class MenuDef {
public:
int nCount ;
MenuItemDef menu[24] ;
public:
MenuDef() { nCount=0 ;}
public:
void display()
{ for ( int i=0 ; i< nCount; i++)
cout << " "<< menu[i].ch << ". " << menu[i].label << endl ;
cout << " " << KEY_EXIT << ". " << "Exit" << endl ;
}
void run()
{ int ch ;
do {clearscr();
display();
ch = waitakey() ;
for ( int i=0; i < nCount ; i++)
if ( menu[i].ch == ch )
menu[i].pfunc() ;
} while ( ch != KEY_EXIT) ;
}
void add( char ch0, char *plabel,void ( * func)())
{ menu[nCount].ch = ch0 ;
menu[nCount].label = plabel ;
menu[nCount].pfunc = func ;
nCount ++ ;
}
} ;
//----------------Page---------------------------------------
class Page {
public:
Page() { SetNull(); }
public:
enum { kLFU=0, kFCFS, kLRU } ; //调度算法ID的定义
int nCurPage ; //当前页面指针
int nAlgID ; //调度算法者销首ID
int nCountPage ; //页面序列长度
int pages[128] ; //进程页面序列
int nCountFrame ; //进程分到的物理页个数
int nEmpty ; //进程分到的物理页中空闲数
int frames[32] ; // 物理页,最多32个
int counters[32] ; //页面计数器
int nCount1 ; //缺页中断次数
int nCount2 ; //缺页中断后页面调度次数
public:
void Input() ;
void Run() ;
int IsFinish() { return nCurPage >= nCountPage ; }
void SetAlgorithm( int kAlgId ) { nAlgID=kAlgId; }
void SetNull()
{ nCurPage=nCountPage=nCountFrame=nCount1=nCount2=nEmpty=0 ; nAlgID=kLRU; }
double IPercent() { return nCount1*1.0/nCurPage ; } //缺页中断率
double EPercent() { return nCount2*1.0/nCurPage ; } //缺页置换率
void FCFS(){}; //先来先服务调度算法
void LRU(){}; //LRU调度算法
void Display(){}; //系统状态
void DisplayAlg(){}; //算法执行状态
public:
friend istream& operator>> ( istream& stream, Page & p )
{ return stream ; }
friend ostream& operator<< ( ostream& stream, Page & p )
{ return stream ; }
} ;
void Page::Input()
{ cout << "Count of page-frames:" ;
cin >> nCountFrame ;
nEmpty = nCountFrame ;
cout << "Count of page:" ;
cin >> nCountPage ;
for ( int i=0;i<nCountPage;i++)
cin >> pages[i] ;
nCurPage = 0 ;
}
void Page::Run()
{ while ( ! IsFinish() ) {
waitakey();
if ( nAlgID == kFCFS)
FCFS() ;
else
LRU();
DisplayAlg();
nCurPage ++ ;
}
}
//-------------------global variables-----------------------------------------------------------------
//-
MenuDef menu ;
Page page ;
//-------------------call-back functions for menu-------------------------------------------------
void input()
{ clearscr();
page.SetNull();
page.Input();
}
void display()
{ clearscr();
page.Display();
}
void setalg1()
{ page.SetAlgorithm( Page::kFCFS );
}
void setalg2()
{ page.SetAlgorithm( Page::kLRU );
}
void run()
{ clearscr();
page.Run() ;
}
void load()
{ char fname[128] ;
cout << "\nLoad From file:" ;
cin >> fname ;
ifstream inFile ;
inFile.open( fname ) ;
page.SetNull() ;
inFile >> page ;
}
void save()
{ char fname[128] ;
cout << "\nSave to file:" ;
cin >> fname ;
ofstream outFile ;
outFile.open( fname ) ;
outFile << page ;
}
void main( int args, char *argv[] )
{ menu.add('1', "Input from keyboard" , input ) ;
menu.add('3', "Set Algorithm 2: FCFS", setalg1 ) ;
menu.add('4', "Set Algorithm 3: LRU", setalg2 ) ;
menu.add('5', "Display", display ) ;
menu.add('6', "Run", run ) ;
menu.add('7', "Load from file", load ) ;
menu.add('8', "Save to file", save ) ;
menu.run();
}
‘肆’ 求页式虚拟存储技术的原理。
虚拟存储器是根据程序的逻辑地址转换来的,也称线性地址空间。一般每个进程,甚至每个段都有一个,以32位为例,则每个最大可达4G。 而主存目前一般为百M。因此程序中所指的存储单元并不能都放到主存中,也就是并不是每个程序所用的存储单元,都有具体的物理的存储器单元与之对应。 但由于程序的两个局部性原理,在一个时刻,程序只在一个比较小的范围内运行。所以我们把程序可能用到的整个存储空间分成一个个相同大小的页(按页管理硬件上容易实现),只把其中的一些页放在主存中,而其它的页则等需要时再建,或放在辅存(磁盘)中。同时建立一个页表,对应于每一页,如果该页在主存中,则页表记录它在主存中的地址;如果不在主存中,则在页表上作不在主存的标记。 这样,当程序需要调用某个存储单元的内容时,先根据它的线性地址,算出其所在的页。查页表,看是不是在主存中?如果在,则直接存取。如果查到页表上是不在的标记,那就是一个page fault。要把主存中的某一页(LRU策略)换到磁盘上,把要访问的那个单元所在的页调入主存,再进行存取。 就象一个预计有一万学生的学校,理论上每个学生都应有一个位子上课(一万个虚拟位子),而学校只有一千个(物理)位子。但实际上,学校也不会一万个人同时上课,只要让上课的同学有位子(在主存中),而其它同学只要留下联系方法能找到就好。为了降低管理的复杂性,我们采用按学号分班(页)管理。每个班要么一起上课(主存),要么一起呆在寝室(磁盘)。而在学校保留一个动态表(页表)表明每个班在哪儿(物理地址)上课,或者没上课(不在主存)。现在假设我们想按学号找一个同学,而且是女同学,只能在教室说话,呵呵。那么: 先算出来是哪个班的,查动态表,看该班是否在教室。在,直接按位置找到(hit);不在(page fault),要先找个不上课的班赶回寝室,把要找女生所在的班调到教室,再按位置找那个同学。 动态表(页表)的大小=表项数*每个表项所需的位数。 表项数=虚拟班数=虚拟人数(虚拟地址空间)/每班人数(每页大小) 每个表项的位数=Log(教室数)+适当控制位数
麻烦采纳,谢谢!
‘伍’ 虚拟页式存储系统
二维数组在内存中表现为连续的数据,100行 150列数据,则有15000个数据,存放在100个页面中,因此,缺页中断为100次
‘陆’ 是虚拟存储器,在页式系统中如何实现虚拟存
由操作系统和硬件相配合完成主存和辅存之间的信息的动态调度,这样的计算机好像为用户提供了一个其存储容量比主存大得多的存储器,这个存储器称为虚拟存储器。
(实现虚拟存储技术需要有如下物质基础,相当容量的主存,一定容量的辅存,地址变换机构)
在页式系统中采用预调方式实现虚拟存储。(也就是说,只需将作业的一部分页面装入内存即可运行,并且当运行过程中需要的页面不在内存中再将其调入。)
‘柒’ 在一个采用页式虚拟存储管理的系统中,有一用户作业,它依次要访问的字地址序列是:115,228,120,88,44
(唤迹提示:由地址序列可知,依次访问的页面是1、2、1、0、4、1、3、4、2、1,因为页大小租链庆为100字,而分给的内存大小为300字,所以该程序在内存中只能存在弊握3个页面……)
‘捌’ 实现页式虚拟存储器需要哪些软件支持
不需要软件的支持。:页式虚拟存储器是把程序按逻辑结构分段、每段划分为固定大小的页,主存空间也划分为相等的页,程序对内存的调入、调出扔以页为基本传送单位,因此不许要软件的支持。虚拟存储器(VirtualMemory):在具有层次结构存储器的计算机系统中,自动实现部分装入和部分替换功能,能从逻辑上为用户提供一个比物理贮存容量大得多,可寻址的“主存储器”。
‘玖’ 在一个采用页式虚拟存储管理的系统中,有一用户作业,它依次要访问的字地址序列是:
分配给改作业春颤的共3页,刚开始已经把第0页装进去了,按照FIFO算法,
第一次寻找的字地址为115,在第一页,但是他不在该作业的内存中,发生一次缺页中断,将第一页调入内存;
第二次访问228,所在的第二页也不模森纳在内存中,发生缺页中断,并把第二页调入内存;
第三次访问88所在0页在内存中,所以就没发生缺页中断;
第四次访问446,所在的4页不在内存中,发生缺页中断,并把最早装进去的0页淘汰,用第四页替换;
第五次访问102,第一页在内存中,所以就不发生缺页中断;
。。。。。。
共访问10次,发生了5次缺页中断,所以0.5的旦没缺页中断率。
lru算法累似。。
‘拾’ 一个页式虚拟存储器的虚存空间大小为
4GB。页面大小为4KB,每个页基局表存储字要占用4个字节,一个页式虚拟存储器有4096个字节,也就是4096KB等于4GB,所以虚存空间大小为4GB。存储系统是两个或两个以上速度、容量和价格各不相同的存储器用态迹硬件、软件搏闭让、或软件与硬件相结合的方法连接起来成为一个存储系统。