zoukankan      html  css  js  c++  java
  • 操作系统页面置换算法之FIFO,LRU

    #include<iostream>
    #include<unistd.h>
    #include<vector>
    #include<wait.h>
    #include<iterator>
    #include<ctime>
    #include<cmath>
    #include<algorithm>
    
    using namespace std;
    
    const int total_i = 10;
    const int mf1 = 3;
    const int mf2 = 4;
    
    vector<int> access_series(total_i);
    
    int firstEmpty(vector<int>& v,int n)
    {
    	for(int i = 0;i < n;++i)
    		if(v[i] == -1)
    			return i;
    	return -1;
    }
    
    int getLen()
    {
    	int index = 0;
    	vector<int> v = access_series;
    	sort(v.begin(),v.end());
    	for(int i = 0;i < total_i;++i)
    	{
    		if (v[index] != v[i])
    			v[++index] = v[i];
    	}
    	return index + 1;
    }
    			
    int getLeast(vector<int>& v,int n)
    {
    	int min = v[0];
    	int position = 0;
    	for(int i = 0;i < n;++i)
    	{
    		if(v[i] != 0 && v[i] < min)
    		{
    			min = v[i];
    			position = i;
    		}
    	}
    	return position;
    }
    	
    void change(vector<int>& state,int size)
    {
    	for(int k = 0;k < size;++k)
    		if(state[k] != -1)
    			state[k] >>= 1;
    }
    
    void FIFO(int n)
    {
    	int miss = 0;
    	vector<int> v(n,-1);
    	for(int i = 0;i < total_i;++i)
    	{
    		bool flag = false;
    		for(int j = 0;j < n;++j)
    		{
    			if(v[j] == access_series[i])
    			{
    				flag = true;
    				break;
    			}
    		}
    		if(!flag)
    		{
    			++miss;
    			for(int k = 0;k < n - 1;++k)
    				v[k] = v[k + 1];
    			v[n - 1] = access_series[i];
    		}
    		copy(v.begin(),v.end(),ostream_iterator<int>(cout," "));
    		cout<<endl;
    	}
    	cout<<"
    page miss:"<<miss * 1.0 / total_i<<"
    ";
    }
    
    void LRU(int n)
    {
    	int miss = 0;
    	vector<int> v(n,-1);
    	int size = getLen();
    	vector<int> state(size,0);
    	for(int i = 0;i < total_i;++i)
    	{
    		int pos = -1;
    		for(int j = 0;j < n;++j)
    		{
    			if(v[j] == access_series[i])
    			{
    				pos = j;
    				break;
    			}
    		}
    		if(pos == -1)//not found
    		{
    			++miss;
    			int p = firstEmpty(v,n);
    			if(p != -1)//has empty position
    			{
    				change(state,size);
    				v[p] = access_series[i];
    				state[p] = pow(2,size - 1);	
    			}
    			else
    			{
    				change(state,size);
    				int p1 = getLeast(state,size);
    				v[p1] = access_series[i];
    				state[p1] = pow(2,size - 1);
    			}
    		}
    		else 
    		{
    			change(state,size);
    			//state[pos] >>= 1; 
    			state[pos] += pow(2,size - 1); 
    		}
    		copy(v.begin(),v.end(),ostream_iterator<int>(cout," "));
    		cout<<endl;
    	}
    	cout<<"
    page miss:"<<miss * 1.0 / total_i<<"
    ";
    }
    
    int main()
    {
    	int p1,p2,p3;
    	srand((unsigned)time(0));
    	for(int i = 0;i < total_i;++i)
    		access_series[i] = rand() % 6;
    		//cin>>access_series[i];
    	copy(access_series.begin(),access_series.end(),ostream_iterator<int>(cout," "));
    	cout<<endl;
    	while((p1 = fork()) == -1);
    	if(p1 == 0)
    	{
    		cout<<"
    FIFO:
    ";
    		FIFO(mf1);
    	}
    	else
    	{
    		wait(0);
    		while((p2 = fork()) == -1);
    		if(p2 == 0)
    		{
    			cout<<"
    FIFO:
    ";
    			FIFO(mf2);
    		}
    		else
    		{
    			wait(0);
    			while((p3 = fork()) == -1);
    			if(p3 == 0)
    			{
    				cout<<"
    LRU:
    ";
    				LRU(mf1);
    			}
    		}
    	}
    	return 0;
    }
    		

  • 相关阅读:
    Service Discovery
    Spring security框架原理
    Redis作者谈Redis应用场景
    redis持久化RDB和AOF-转载
    MongoDB树形结构表示法
    Tomcat Connector
    ActiveMQ 负载均衡与高可用(转载)
    JS选取DOM元素的方法
    IObit Driver Booster 无法更新驱动的解决办法
    python 学习备忘
  • 原文地址:https://www.cnblogs.com/deepspace/p/10260725.html
Copyright © 2011-2022 走看看