标签:页面 算法 置换 管理 命中率 生成 fstream sed com
1 #include set>
2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 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 ); // LRU 展示过程
26 void Print ( setint> ); // 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 " 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 1] " " ;
56 }
57 fout.close();
58 // */
59
60 /*
61 ofstream fout("LRU.txt");
62 for( Number = 1 ; Number 63 LRU ( cnt , Number );
64 fout 65 }
66 fout.close();
67 */
68
69 /*
70 ofstream fout("OPT.txt");
71 for( Number = 1 ; Number 72 OPT ( cnt , Number );
73 fout 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
87 double res =( (double) Cnt / (double ) n ) * 100 ;
88 /*
89 cout 90 if( Way == 1 ){
91 cout 92 }else if( Way == 2 ){
93 cout 94 }else {
95 cout 96 }
97 cout 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 ){
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 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 ) {
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_queueint ,vectorint> , 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 ) {
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){
199 a[i] = rand()%m;
200 //cout
201 }
202 }
203 void Test ( int Page[] , int n ){
204 //Page = new int [n]();
205 for ( int i=0 ; 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 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 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( setint> 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) {
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 }
View Code
代码如上
FIFO、LRU、OPT三种置换算法之间的性能比较
标签:页面 算法 置换 管理 命中率 生成 fstream sed com
原文地址:https://www.cnblogs.com/Osea/p/11049862.html