操作系统 页面置换算法实现
import java. util. Scanner;
public class page_change {
final int M = 3 ;
final int N = 20 ;
class block
{
int iPageNum;
int iBlockFlag;
public block ( int iPageNum, int iBlockFlag ) {
this . iPageNum = iPageNum;
this . iBlockFlag = iBlockFlag;
}
public int getiPageNum ( ) {
return iPageNum;
}
public void setiPageNum ( int iPageNum ) {
this . iPageNum = iPageNum;
}
public int getiBlockFlag ( ) {
return iBlockFlag;
}
public void setiBlockFlag ( int iBlockFlag ) {
this . iBlockFlag = iBlockFlag;
}
} ;
public void pageChange ( )
{
Scanner in = new Scanner ( System. in) ;
block [ ] myBlock= new block [ M ] ;
int [ ] iPageString= { 7 , 0 , 1 , 2 , 0 , 3 , 0 , 4 , 2 , 3 , 0 , 3 , 2 , 1 , 2 , 0 , 1 , 7 , 0 , 1 } ;
int [ ] iTempPage = new int [ N ] ;
int [ ] flag= new int [ N ] ;
int i;
boolean bExitFlag= true ;
char ch;
while ( bExitFlag)
{
System. out. println ( "请选择页面置换算法:" ) ;
System. out. println ( "f:FIFO置换算法 \to:OPT置换算法 \tl:LRU置换算法 \tx:退出置换算法程序." ) ;
ch= ( in . next ( ) ) . charAt ( 0 ) ;
if ( ( ch== 'f' ) || ( ch== 'o' ) || ( ch== 'l' ) )
{
for ( i= 0 ; i< N ; i++ )
{
iTempPage[ i] = iPageString[ i] ;
flag[ i] = 0 ;
}
}
switch ( ch)
{
case 'f' :
System. out. println ( "FIFO置换算法的结果是:" ) ;
FIFO ( iTempPage, flag, myBlock) ;
System. out. println ( "\n缺页次数为" + PageNum ( flag) ) ;
break ;
case 'o' :
System. out. println ( "OPT置换算法的结果是:" ) ;
Optimal ( iTempPage, flag, myBlock) ;
System. out. println ( "\n缺页次数为" + PageNum ( flag) ) ;
break ;
case 'l' :
System. out. println ( "LRU置换算法的结果是:" ) ;
LRU ( iTempPage, flag, myBlock) ;
System. out. println ( "\n缺页次数为" + PageNum ( flag) ) ;
break ;
case 'x' :
System. out. println ( "退出置换算法。" ) ;
bExitFlag= false ;
break ;
default :
System. out. println ( "输入有误,请重新选择置换算法:" ) ;
}
}
}
int PageNum ( int array[ ] )
{
int num= 0 ;
for ( int j= 0 ; j< N ; j++ )
num= num+ array[ j] ;
return num;
}
int allocate ( int iPage, int iLoc, int [ ] iTempPage )
{
int i;
for ( i= iLoc; i< N ; i++ )
{
if ( iPage== iTempPage[ i] )
return i;
}
return N ;
}
int reverse_allocate ( int iPage, int iLoc, int [ ] iTempPage )
{
int i;
for ( i= iLoc; i>= 0 ; i-- )
{
if ( iPage== iTempPage[ i] )
return i;
}
return 0 ;
}
int max_sign ( block [ ] array )
{
int j, loc;
int temp= array[ 0 ] . iBlockFlag;
loc= 0 ;
for ( j= 1 ; j< M ; j++ )
{
if ( temp< array[ j] . iBlockFlag)
{
temp= array[ j] . iBlockFlag;
loc= j;
}
}
return loc;
}
int little_sign ( block [ ] array )
{
int j, loc;
int temp= array[ 0 ] . iBlockFlag;
loc= 0 ;
for ( j= 1 ; j< M ; j++ )
{
if ( temp> array[ j] . iBlockFlag)
{
temp= array[ j] . iBlockFlag;
loc= j;
}
}
return loc;
}
void output ( int iPage, int flag, block [ ] myBlock, int blockNum )
{
int j;
if ( flag== 1 )
System. out. print ( "\n " + flag) ;
else
System. out. println ( "" ) ;
System. out. print ( "\t " + iPage) ;
for ( j= 0 ; j< blockNum; j++ )
System. out. print ( "\t " + myBlock[ j] . iPageNum) ;
}
void InitialBlock ( int [ ] iTempPage, int [ ] flag, block [ ] myBlock )
{
int i;
for ( i= 0 ; i< M ; i++ )
{
myBlock[ i] = new block ( iTempPage[ i] , ( M - 1 ) - i) ;
flag[ i] = 1 ;
}
System. out. println ( "\n缺页\t引用串\t物理块1\t物理块2\t物理块3" ) ;
for ( i= 0 ; i< M ; i++ )
output ( iTempPage[ i] , flag[ i] , myBlock, i+ 1 ) ;
}
void FIFO ( int [ ] iTempPage, int [ ] flag, block [ ] myBlock )
{
int i, j, k, loc;
boolean ExistFlag= false ;
InitialBlock ( iTempPage, flag, myBlock) ;
for ( i= 3 ; i< N ; i++ )
{
ExistFlag= false ;
for ( j= 0 ; j< M ; j++ )
{
if ( myBlock[ j] . iPageNum== iTempPage[ i] )
{
for ( k= 0 ; k< M ; k++ )
myBlock[ k] . iBlockFlag++ ;
ExistFlag= true ;
flag[ i] = 0 ;
break ;
}
}
if ( ! ExistFlag)
{
loc= max_sign ( myBlock) ;
myBlock[ loc] . iPageNum= iTempPage[ i] ;
flag[ i] = 1 ;
for ( k= 0 ; k< M ; k++ )
if ( k!= loc)
myBlock[ k] . iBlockFlag++ ;
else
myBlock[ k] . iBlockFlag= 0 ;
}
output ( iTempPage[ i] , flag[ i] , myBlock, M ) ;
}
System. out. println ( "" ) ;
}
void Optimal ( int [ ] iTempPage, int [ ] flag, block [ ] myBlock )
{
boolean ExistFlag= false ;
InitialBlock ( iTempPage, flag, myBlock) ;
for ( int i= 3 ; i< N ; i++ )
{
ExistFlag= false ;
for ( int j= 0 ; j< M ; j++ )
{
if ( iTempPage[ i] == myBlock[ j] . iPageNum)
{
ExistFlag= true ;
flag[ i] = 0 ;
break ;
}
}
if ( ! ExistFlag)
{
for ( int j= 0 ; j< M ; j++ )
{
myBlock[ j] . iBlockFlag= allocate ( myBlock[ j] . iPageNum, i, iTempPage) ;
}
int item= max_sign ( myBlock) ;
myBlock[ item] . iPageNum= iTempPage[ i] ;
flag[ i] = 1 ;
}
output ( iTempPage[ i] , flag[ i] , myBlock, M ) ;
}
}
void LRU ( int [ ] iTempPage, int [ ] flag, block [ ] myBlock )
{
boolean ExistFlag= false ;
InitialBlock ( iTempPage, flag, myBlock) ;
for ( int i= 3 ; i< N ; i++ )
{
ExistFlag= false ;
for ( int j= 0 ; j< M ; j++ )
{
if ( iTempPage[ i] == myBlock[ j] . iPageNum)
{
ExistFlag= true ;
flag[ i] = 0 ;
break ;
}
}
if ( ! ExistFlag)
{
for ( int j= 0 ; j< M ; j++ )
{
myBlock[ j] . iBlockFlag= reverse_allocate ( myBlock[ j] . iPageNum, i, iTempPage) ;
}
int item= little_sign ( myBlock) ;
myBlock[ item] . iPageNum= iTempPage[ i] ;
flag[ i] = 1 ;
}
output ( iTempPage[ i] , flag[ i] , myBlock, M ) ;
}
}
public static void main ( String[ ] args ) {
new page_change ( ) . pageChange ( ) ;
}
}