1 #include <set> 2 #include <ctime> 3 #include <queue> 4 #include <cstdio> 5 #include <utility> 6 #include <cstdlib> 7 #include <iomanip> 8 #include <iostream> 9 #include <fstream> 10 #define sec second 11 using namespace std; 12 typedef pair <int,int> PII; 13 int * Count; 14 typedef struct CMP { 15 bool operator () (int U,int V){ 16 return Count[U] < Count[V] ; 17 } 18 }CMP; 19 20 void Menu ( ); // 程序菜单 21 void Test ( int [] , int ); // 文件读入测试 22 void Random ( int [] , int ,int ); // 随机生成数组 23 void Print ( int [] ,int ,int); // 显示原数组的值 24 void Print ( int [] ,int ,int ,int ); // FIFO 展示过程 25 void Print ( set<PII> ); // LRU 展示过程 26 void Print ( set<int> ); // OPT 展示过程 27 void FIFO ( int ,int ) ; // "先进先出"(FIFO)页面置换算法 28 void LRU ( int ,int ) ; // "最近最久未使用"(LRU)页面置换算法 29 void OPT ( int ,int ) ; // "最佳"(OPT)页面置换算法 30 void Compute( int , int , int ); // 计算不同页面置换算法的命中率 31 32 int a[100050]; 33 int b[500][4]; 34 int Number = 0 ; 35 int main() 36 { 37 ifstream fin ("test.txt"); 38 //FILE *p=fopen("test.txt","r"); 39 int cnt = 0 ; 40 while ( fin >> a[cnt] ) { 41 cnt ++ ; 42 } 43 //fclose (p); 44 cout << "Cnt " << cnt << endl ; 45 46 /*Test 47 FIFO , LRU , OPT 48 */ 49 //Menu(); 50 51 // /* 52 ofstream fout("FIFO.txt"); 53 for( Number = 1 ; Number <= 100 ; Number ++ ){ 54 FIFO ( cnt , Number ); 55 fout << b[Number][1] << " " ; 56 } 57 fout.close(); 58 // */ 59 60 /* 61 ofstream fout("LRU.txt"); 62 for( Number = 1 ; Number <= 100 ; Number ++ ){ 63 LRU ( cnt , Number ); 64 fout << b[Number][2] << " " ; 65 } 66 fout.close(); 67 */ 68 69 /* 70 ofstream fout("OPT.txt"); 71 for( Number = 1 ; Number <= 100 ; Number ++ ){ 72 OPT ( cnt , Number ); 73 fout << b[Number][3] << " "; 74 } 75 fout.close(); 76 */ 77 /* 78 FIFO( cnt , 25 ); 79 LRU ( cnt , 25 ); 80 OPT ( cnt , 25 ); 81 */ 82 return 0; 83 } 84 85 void Compute(int Cnt , int n ,int Way ){ 86 //cout << "—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·" << endl ; 87 double res =( (double) Cnt / (double ) n ) * 100 ; 88 /* 89 cout<<setiosflags(ios::fixed)<<setprecision(2); 90 if( Way == 1 ){ 91 cout << "\"先进先出\"(FIFO)页面置换算法的命中率为: " ; 92 }else if( Way == 2 ){ 93 cout << "\"最近最久未使用\"(LRU)页面置换算法的命中率为" ; 94 }else { 95 cout << "\"最佳\"(OPT)页面置换算法的命中率为" ; 96 } 97 cout << res << "%" << endl; 98 */ 99 b[ Number ][Way] = res ; 100 101 } 102 void FIFO ( int n,int m ) { // "先进先出"(FIFO)页面置换算法 103 // 初始化 104 int *page = new int [n](); 105 int *Visit = new int [n](); 106 int *Queue = new int [m+1](); 107 int Q_Front = 0 , Q_Rear = 0 , Cnt = 0 ; 108 109 //Random( page , n , 500 ); 110 Test(page , n ); 111 //Print( page , n ,1); // 打印页面访问序列 112 113 for ( int i = 0 ; i < n ; i++ ){ 114 if( Visit[ page[i] ] == 0 ) { // 当前页面是否在内存中 115 Visit[ page[i] ] = 1 ; 116 // 如果当前的内存满,使用FIFO算法调出 117 if( ( Q_Rear + 1 )%( m+1 ) == Q_Front ){ 118 Visit[ Queue[Q_Front] ] = 0 ; 119 Q_Front = ( Q_Front + 1 ) % ( m+1 ) ; 120 } 121 Queue[ Q_Rear ] = page[i] ; // 调入访问的页面 122 Q_Rear = ( Q_Rear + 1 ) % ( m+1 ); 123 }else{ // 如果在内存中,统计命中次数 124 Cnt ++ ; 125 } 126 //Print( Queue , Q_Front , Q_Rear , m ); 127 } 128 Compute( Cnt, n , 1 ); // 计算命中率 129 } 130 void LRU ( int n , int m ) { // "最近最久未使用"(LRU)页面置换算法 131 // 初始化 132 int *page = new int[n](); 133 int *Visit = new int[n](); 134 int Cnt = 0 ; 135 set<PII> S; 136 137 //Random( page , n , 500 ); 138 Test(page , n ); 139 //Print(page, n ,2 ); // 打印页面访问序列 140 PII tmp; 141 for (int i = 0; i < n; i++) { 142 int Size = S.size(); 143 if ( Visit[page[i]] == 0 ) { // 当前页面是否在内存中 144 Visit[page[i]] = i + 1 ; 145 // 如果当前的内存满,使用LRU算法调出 146 if ( Size == m ) { 147 tmp = *(S.begin()); 148 Visit[ tmp.sec ] = 0; 149 S.erase(tmp); 150 } 151 tmp = make_pair(i + 1, page[i]); 152 S.insert(tmp); 153 } else { // 如果在内存中,统计命中次数 154 tmp = make_pair( Visit[page[i]], page[i] ); 155 S.erase(tmp); 156 tmp = make_pair( i + 1, page[i] ); 157 Visit[ page[i] ] = i+1 ; 158 S.insert(tmp); 159 Cnt ++ ; 160 } 161 //Print(S); 162 } 163 Compute( Cnt, n , 2 ); // 计算命中率 164 } 165 void OPT( int n , int m ){ // "最佳"(OPT)页面置换算法 166 // 初始化 167 int *page = new int [n](); 168 int Cnt = 0 ; 169 Count = new int [n+1](); 170 set < int > S ; 171 srand(time(0)); 172 priority_queue< int ,vector<int> , CMP > Q; 173 174 //Random( page , n , 500 ); 175 Test(page , n ); 176 //Print( page , n ,3 ); //打印页面访问序列 177 int tmp ; 178 for( int i = 0 ; i < n ; i++ ) { 179 int Size = S.size(); 180 Count[ page[i] ] -- ; 181 if( S.find(page[i]) == S.end() ){ //当前页面是否在内存中 182 if( Size == m ){ //如果当前的内存满,使用OPT算法调出 183 tmp = Q.top( ); 184 S.erase( tmp ); 185 Q.pop( ); 186 } 187 S.insert( page[i] ); 188 Q.push( page[i] ); 189 }else{ //如果在内存中,统计命中次数 190 S.insert( page[i] ); 191 Cnt ++ ; 192 } 193 //Print(S); 194 } 195 Compute( Cnt , n , 3 ); //计算命中率 196 } 197 void Random ( int a[] , int n , int m = 500 ){ 198 for (int i=0;i<n;i++){ 199 a[i] = rand()%m; 200 //cout << a[i] << endl ; 201 } 202 } 203 void Test ( int Page[] , int n ){ 204 //Page = new int [n](); 205 for ( int i=0 ; i<n ; i++ ){ 206 Page[i] = a[i] ; 207 } 208 } 209 210 void Menu(){ 211 int Ins , n , m ; 212 while(1){ 213 puts("\n\n#############################"); 214 puts("#\t\t\t\t\t\t\t#"); 215 puts("#\t存储管理之虚拟存储器实现\t#"); 216 puts("#\t1.执行先进先出算法\t\t\t#"); 217 puts("#\t2.执行最近最久未使用算法\t#"); 218 puts("#\t3.执行最佳算法\t\t\t#"); 219 puts("#\t4.退出程序\t\t\t\t#"); 220 puts("#\t\t\t\t\t\t\t#"); 221 puts("#############################"); 222 puts("请输入你需要执行的操作(序号):"); 223 scanf("%d",&Ins); 224 if( 1 <= Ins && Ins <= 3 ){ 225 cout << " Please input N : " << endl; 226 cin >> n ; 227 cout << " Please input M : " << endl; 228 cin >> m ; 229 } 230 switch ( Ins ){ 231 case 1 : FIFO(n,m); break; 232 case 2 : LRU(n,m); break; 233 case 3 : OPT(n,m); break; 234 case 4 : exit(0); 235 default: 236 puts("输入有误请重新输入");break; 237 } 238 } 239 } 240 241 void Print( int Q[] , int F , int R , int m )// FIFO 展示过程 242 { 243 244 cout << " ( " ; 245 for ( int i = F ; i != R ; i = (i+1) % (m+1) ){ 246 if( i != F ) cout << ","; 247 cout << Q[i] ; 248 } 249 cout << " ) " << endl; 250 } 251 252 void Print( set<PII> S) { // LRU 展示过程 253 int Size = S.size() ; 254 int i = 1 ; 255 cout << " ( "; 256 for( auto X : S ){ 257 cout << X.sec ; 258 if( i != Size ){ 259 cout <<","; 260 } 261 i++; 262 } 263 cout << " ) " << endl ; 264 } 265 266 void Print( set<int> S ){ // OPT 展示过程 267 int Size = S.size() ; 268 int i = 1 ; 269 cout << " ( "; 270 for( auto X : S ){ 271 cout << X ; 272 if( i != Size ){ 273 cout <<","; 274 } 275 i++; 276 } 277 cout << " ) " << endl ; 278 } 279 280 void Print( int A[] , int size ,int No){ // 显示原数组的值 281 cout << " 随机生成页面访问序列: " << endl ; 282 for(int i=0;i<size;i++) { 283 printf("%d%c",A[i],i==size-1?‘\n‘:‘ ‘); 284 } 285 if( No == 1 ) { 286 cout << "—·—·—·—·—·—·—\"先进先出\"(FIFO)页面置换算法·—·—·—·—·—·—·—·—·" << endl; 287 }else if ( No == 2 ){ 288 cout << "—·—·—·—·—·—·—\"最近最久未使用\"(LRU)页面置换算法·—·—·—·" << endl; 289 }else { 290 cout << "—·—·—·—·—·—·—\"最佳\"(OPT)页面置换算法·—··—·—·—·—·" << endl; 291 } 292 }
代码如上
原文地址:https://www.cnblogs.com/Osea/p/11049862.html
时间: 2024-10-11 12:09:14