A. 操作系统页式存储管理的问题
存储管理的基本原理内存管理方法 内存管理主要包括内存分配和回收、地址变换、内存扩充、内存共享和保护等功能。 下面主要介绍连续分配存储管理、覆盖与交换技术以及页式与段式存储管理等基本概念和原理。 1. 连续分配存储管理方式 连续分配是操作系统页式存储管理的问题
B. 页式管理的页式管理的优缺点
1、由于它不要求作业或进程的程序段和数据在内存中连续存放,从而有效地解决了碎片问题。
2、动态页式管理提供了内存和外存统一管理的虚存实现方式,使用户可以利用的存储空间大大增加。这既提高了主存的利用率,又有利于组织多道程序执行。 1、要求有相应的硬件支持。例如地址变换机构,缺页中断的产生和选择淘汰页面等都要求有相应的硬件支持。这增加了机器成本。
2、增加了系统开销,例如缺页中断处理机,
3、请求调页的算法如选择不当,有可能产生抖动现象。
4、虽然消除了碎片,但每个作业或进程的最后一页内总有一部分空间得不到利用果页面较大,则这一部分的损失仍然较大。
C. 在页式虚拟存贮器中,什么叫页面失效什么叫页面争用什么时候两者同时发生
页面失效是该页未装入主存,需要从辅存中调页。页面争用(冲突)是两个以上的虚页想要进入主存中同一页面位置的现象。页面失效不一定发生页面冲突,页面争用一定由页面失效引起。
D. 什么事虚拟活页式存储管理中的抖动问题
在虚拟存储的页式存储的换页过程中,如果选用了一个不合适的调度算法,就会出现这样的现象:刚被淘汰了的页面又立即要用,又要把它调入进来,而调入不久又被调出,调出不久再次被调入,如此反复,使得调度非常频繁,以至于大部分时间都花费在来回调度上。这种现象叫“抖动”。一个好的调度算法应减少和避免抖动现象
E. 内存的段页式管理到底是如何管理的是为了解决什么问题
页式管理的基本原理将各进程的虚拟空间划分成若干个长度相等的页(page),页式管理把内存空间按页的大小划分成片或者页面(page frame),然后把页式虚拟地址与内存地址建立一一对应页表,并用相应的硬件地址变换机构,来解决离散地址变换问题。页式管理采用请求调页或预调页技术实现了内外存存储器的统一管理。
1 静态页式管理。静态分页管理的第一步是为要求内存的作业或进程分配足够的页面。系统通过存储页面表、请求表以及页表来完成内存的分配工作。静态页式管理解决了分区管理时的碎片问题。但是,由于静态页式管理要求进程或作业在执行前全部装入内存,如果可用页面数小于用户要求时,该作业或进程只好等待。而且作业和进程的大小仍受内存可用页面数的限制。
2 动态页式管理。动态页式管理是在静态页式管理的基础上发展起来的。它分为请求页式管理和预调入页式管理。
优点: 没有外碎片,每个内碎片不超过页大小。一个程序不必连续存放。便于改变程序占用空间的大小(主要指随着程序运行而动态生成的数据增多,要求地址空间相应增长,通常由系统调用完成而不是操作系统自动完成)。
缺点:程序全部装入内存。
要求有相应的硬件支持。例如地址变换机构,缺页中断的产生和选择淘汰页面等都要求有相应的硬件支持。这增加了机器成本。增加了系统开销,例如缺页中断处理机,请求调页的算法如选择不当,有可能产生抖动现象。 虽然消除了碎片,但每个作业或进程的最后一页内总有一部分空间得不到利用果页面较大,则这一部分的损失仍然较大。
F. 操作系统里的请求页式存储管理的优缺点
具有段式和页式管理的优点。但是系统的复杂性和开销也随之增加。
必须要采用联想寄存器才能提高CPU的访内速度。
段式与页式的比较
段式:
分段由用户设计自己划分,每段对应的程序模块,有完整的逻辑意义
段面是信息的逻辑单位便于段的共享,执行时按需动态链接装入
段长不等,可动态装入,有利于新数据的增长
二维地址空间:段名、段中地址;段号、段内单元号
管理形式上象页式,但概念不同
页式:
分页用户看不见,由操作系统为内存管理划分
页面是信息的物理单位。页一般不能共享页面大小相同,位置不能动态增加
一维地址空间
往往需要多次缺页中断才能把所需的信息完整地调入内存。
G. 页式虚拟存储管理中快表有问
在一个采用页式
虚拟存储
管理的系统中,有一用户作业,它依次要访问的字地址序列是:115,228,120,88,446,102,321,432,260,167,若该作业的第0页已经装入主存,现分配给该作业的主存共300字,页的大小为
100字
,请回答下列问题:
1)按FIFO调度算法将产生
次
缺页中断
,依次淘汰的页号为
,缺页中断率为
。
2)按LRU调度算法将产生
次缺页中断,依次淘汰的页号为
,缺页中断率为
。
H. 操作系统问题(页式存储管理问题)
1.5000B约等于4.88KB 每个页面有2KB 所以占用3个页面
页表
页号 块号
0
3
1
7
2
9
2.页内地址为11位【块内地址(也叫块内位移)长度与页内地址相等 也是11位】 则每页大小为2^11=2KB 逻辑地址长16位 所以页号有16-11=5位 那么最多有2^5=32页
你给的逻辑地址4500应该是十进制数 转换成二进制即
1000110010100 (数一下 总共13位)
后面11位是页内地址 那么页号就是前面的两位了 是10 也就是二进制的2
那么根据页表 对应的块号是9 转换成二进制即1001 即块号是1001 而块内地址是逻辑地址的页内地址(4500的后11位)
那么物理地址是1001+00110010100(这里+表示连接 而不是逻辑加)
即100100110010100 转换成十进制就是18836 十六进制就是4994
多加点分
I. 关于在一个采用页式虚拟存储管理的系统问题
需要完成先来先服务调度算法和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();
}