㈠ 操作系統題目
1A.為內外存容量之和
㈡ 在一個採用頁式虛擬存儲器管理的系統中,有一個450字的程序的內存訪問序列,10,79,110,17
o
㈢ 求頁式虛擬存儲技術的原理。
虛擬存儲器是根據程序的邏輯地址轉換來的,也稱線性地址空間。一般每個進程,甚至每個段都有一個,以32位為例,則每個最大可達4G。 而主存目前一般為百M。因此程序中所指的存儲單元並不能都放到主存中,也就是並不是每個程序所用的存儲單元,都有具體的物理的存儲器單元與之對應。 但由於程序的兩個局部性原理,在一個時刻,程序只在一個比較小的范圍內運行。所以我們把程序可能用到的整個存儲空間分成一個個相同大小的頁(按頁管理硬體上容易實現),只把其中的一些頁放在主存中,而其它的頁則等需要時再建,或放在輔存(磁碟)中。同時建立一個頁表,對應於每一頁,如果該頁在主存中,則頁表記錄它在主存中的地址;如果不在主存中,則在頁表上作不在主存的標記。 這樣,當程序需要調用某個存儲單元的內容時,先根據它的線性地址,算出其所在的頁。查頁表,看是不是在主存中?如果在,則直接存取。如果查到頁表上是不在的標記,那就是一個page fault。要把主存中的某一頁(LRU策略)換到磁碟上,把要訪問的那個單元所在的頁調入主存,再進行存取。 就象一個預計有一萬學生的學校,理論上每個學生都應有一個位子上課(一萬個虛擬位子),而學校只有一千個(物理)位子。但實際上,學校也不會一萬個人同時上課,只要讓上課的同學有位子(在主存中),而其它同學只要留下聯系方法能找到就好。為了降低管理的復雜性,我們採用按學號分班(頁)管理。每個班要麼一起上課(主存),要麼一起呆在寢室(磁碟)。而在學校保留一個動態表(頁表)表明每個班在哪兒(物理地址)上課,或者沒上課(不在主存)。現在假設我們想按學號找一個同學,而且是女同學,只能在教室說話,呵呵。那麼: 先算出來是哪個班的,查動態表,看該班是否在教室。在,直接按位置找到(hit);不在(page fault),要先找個不上課的班趕回寢室,把要找女生所在的班調到教室,再按位置找那個同學。 動態表(頁表)的大小=表項數*每個表項所需的位數。 表項數=虛擬班數=虛擬人數(虛擬地址空間)/每班人數(每頁大小) 每個表項的位數=Log(教室數)+適當控制位數
麻煩採納,謝謝!
㈣ 採用頁式虛擬存儲管理方式頁大小為8KB,主存塊大小為64B,為什麼物理地址的頁內偏移量不等於主存塊大小
物理地址的頁偏移量等於對應虛擬地址的頁偏移量,虛擬地址的頁偏移量與頁大小有關,這里頁大小8KB,2的13次方,所以頁偏移量為13位。
㈤ 在一個採用頁式虛擬存儲管理的系統中,有一用戶作業,它依次要訪問的字地址序列是:
分配給改作業的共3頁,剛開始已經把第0頁裝進去了,按照FIFO演算法,
第一次尋找的字地址為115,在第一頁,但是他不在該作業的內存中,發生一次缺頁中斷,將第一頁調入內存;
第二次訪問228,所在的第二頁也不在內存中,發生缺頁中斷,並把第二頁調入內存;
第三次訪問88所在0頁在內存中,所以就沒發生缺頁中斷;
第四次訪問446,所在的4頁不在內存中,發生缺頁中斷,並把最早裝進去的0頁淘汰,用第四頁替換;
第五次訪問102,第一頁在內存中,所以就不發生缺頁中斷;
。。。。。。
共訪問10次,發生了5次缺頁中斷,所以0.5的缺頁中斷率。
lru演算法累似。。
㈥ 關於在一個採用頁式虛擬存儲管理的系統問題
需要完成先來先服務調度演算法和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();
}
㈦ 為什麼說請求頁式管理可以實現虛擬存儲器
請求分頁式存儲管理的基本思想是:操作系統按照存儲塊的尺寸,把用戶作業地址空間劃分成頁,全部存放在磁碟上。作業運行時,只先裝入若干頁。運行過程中遇到不在內存的頁時,操作系統就把它從磁碟調入內存。這樣一來,用戶的作業地址空間無需顧及內存的大小。這與虛擬存儲器的思想是完全吻合的。所以,請求分頁式存儲管理能夠向用戶提供虛擬存儲器。
㈧ 是虛擬存儲器,在頁式系統中如何實現虛擬存
由操作系統和硬體相配合完成主存和輔存之間的信息的動態調度,這樣的計算機好像為用戶提供了一個其存儲容量比主存大得多的存儲器,這個存儲器稱為虛擬存儲器。
(實現虛擬存儲技術需要有如下物質基礎,相當容量的主存,一定容量的輔存,地址變換機構)
在頁式系統中採用預調方式實現虛擬存儲。(也就是說,只需將作業的一部分頁面裝入內存即可運行,並且當運行過程中需要的頁面不在內存中再將其調入。)
㈨ 某虛擬存儲器系統採用頁式內存管理,假定內存容量為3個頁面,開始時是空的,虛擬頁面訪問地址流
解答:
㈩ 請求頁式管理是一種常用的虛擬存儲管理技術。
14、虛擬存儲器:是由主存、輔寸、存儲管理單元及操作系統中存儲管理軟體組成的存儲系統。 分類: 頁式虛擬存儲器(以頁為信息傳送單 優點:頁表硬體少,