模拟LRU算法&通道处理算法

最近写了两个程序,模拟操作系统的算法,只是基本实现了课本上的基本功能,实际应该是很复杂的。

 

模拟LRU页面置换算法:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 
  5 #define TN 3             //分配给该程序的主存页数
  6 #define PN 10             //地址流
  7 
  8 typedef struct PAGE{
  9     int kPage;   //the kth line 分配给该程序的主存页数的索引
 10     int aPage;   //address page 程序页号
 11     int cnt;     //到当前页地址的距离计数器
 12 }PAGE;
 13 
 14 PAGE pg[PN];     //页地址流
 15 int page[TN];    //主存页面表
 16 
 17 /*页面命中和替换页面时都需要初始化调入的页面*/
 18 void init(int k, int p){
 19     int i;
 20     for(i=0;i<k;i++){
 21         if(pg[i].aPage==p)
 22             pg[i].cnt=1;
 23     }   
 24 }
 25 
 26 /*查找页面表中最大的计数器,返回对应的索引*/
 27 int findMax(){
 28     int ans=0, max_cnt=-1, cnt, index;
 29     int i,j;
 30     for(i=0;i<TN;i++) {
 31         /*在主存页面表中查找与给定页地址流页面相等的页面*/
 32         for(j=0;j<PN;j++){
 33             if(page[i] == pg[j].aPage){
 34                 cnt = pg[j].cnt;
 35                 break;
 36             }
 37         }
 38         if(max_cnt < cnt) {  
 39             max_cnt = cnt;
 40             ans = i;
 41             index = j;
 42         }
 43     } 
 44     return ans;
 45 }
 46 
 47 void LRU(){
 48     int i,p,k=0;  /*p:当前页面,k:页地址流全局索引*/
 49     int replaceIndex;
 50     int old;
 51 
 52     while(~scanf("%d",&p)){
 53         int inserted=0, hit=0;
 54             
 55         pg[k].aPage=p;
 56         /*预处理*/
 57         for(i=0;i<=k;i++) {
 58             pg[i].cnt+=1;
 59         }
 60         if(k == 0){
 61             printf("\n输出结果:\n\n");
 62             printf("时间\t页地址\t操作\t主存索引\t源页面\t目标页面\n");    
 63         }
 64         printf("%d\t%d\t",k+1,p);
 65         for(i=0;i<TN;i++) {
 66             if(p == page[i]) {      //命中
 67                 pg[k].cnt=1;
 68                 inserted=1;         //相当于调进
 69                 hit=1;
 70                 printf("命中\t%d\t\t%d\t%d",i+1,p,p);
 71                 break;
 72             }
 73             if(!page[i]){           //有空余页
 74                 page[i]=p;
 75                 pg[k].kPage=i;
 76                 pg[k].cnt=1;
 77                 inserted=1;
 78                 printf("调进\t%d\t\t-\t%d",i+1,p);
 79                 break;
 80             }
 81         }
 82         if(hit == 1) init(k,p);
 83         
 84         /*替换操作,调进页面设置*/
 85         if(!inserted){
 86             init(k,p);
 87             replaceIndex=findMax();
 88             old=page[replaceIndex];
 89             page[replaceIndex]=p;     //置换
 90             printf("替换\t%d\t\t%d\t%d",replaceIndex+1,old,p);
 91         }
 92         printf("\n");
 93         k++;
 94     }
 95 }
 96 int main(){
 97     memset(page,0,sizeof(page));        
 98     memset(pg,0,sizeof(pg));        
 99     printf("输入页地址流:\n");
100     LRU();
101     return 0;
102 }

 测试结果:

字节多路通道响应和设备处理:

  1 #include <iostream>
  2 using namespace std;
  3 
  4 #define N 5        //设备数目
  5 #define GAP 10       //通道处理时间
  6 
  7 struct Device{
  8     int cycle;       //设备周期
  9     int start;     //起始时间
 10     int priority;  //优先级
 11     bool applied;  //是否提出申请
 12 }d[N];
 13 
 14 /*初始化各设备起始状态*/
 15 void init() {
 16     for(int i=0; i < N; i++) {
 17         d[i].applied = false;
 18         cin>>d[i].start>>d[i].cycle>>d[i].priority;
 19     }
 20 }
 21 
 22 int cmp(const void *a, const void *b){
 23     int c=((Device *)b)->priority - ((Device *)a)->priority;        //按优先级排序
 24     if(c == 0) return ((Device *)a)->start - ((Device *)b)->start;  
 25     else if(c > 0) 
 26             return 1;
 27     else return -1;
 28 }
 29 
 30 void swap(Device **a, Device *b){
 31     Device tmp;
 32     tmp.cycle = (*a)->cycle;
 33     tmp.priority = (*a)->priority;
 34     tmp.start = (*a)->start;
 35     tmp.applied = (*a)->applied;
 36 
 37     (*a)->cycle = b->cycle;
 38     (*a)->priority = b->priority;
 39     (*a)->start = b->start;
 40     (*a)->applied = b->applied;
 41     
 42     b->cycle = tmp.cycle;
 43     b->priority = tmp.priority;
 44     b->start =tmp.start;
 45     b->applied = tmp.applied;
 46 }
 47 
 48 /*p最终指向通道选中的设备,selected是选中设备的索引*/
 49 void Quicksort(Device **p, int &selected) {
 50     for(int i=0; i<N; i++) {
 51         if(d[i].applied == true && selected!=i) {                       //只对申请的设备排序
 52             if(d[i].priority > (*p)->priority) {
 53                 swap(p, &d[i]); 
 54                 selected=i;
 55             }
 56             else if(d[i].priority == (*p)->priority){
 57                 if(d[i].start < (*p)->start)
 58                     swap(p, &d[i]);
 59                     selected=i;
 60             }
 61         }
 62     }
 63 }
 64 
 65 void check_lose(int handle_time,int selected){
 66     for(int i=0; i<N; i++) {
 67         if(i!=selected) {
 68             int next_t=d[i].start+d[i].cycle; //下次申请时间
 69             if(handle_time>=next_t){
 70                 int cnt=(handle_time-d[i].start)/d[i].cycle;  //连续cnt次丢失信息
 71 
 72                 /*判断并输出第几号设备在第几次申请未得到响应*/
 73                 printf("      %d号设备第",i);
 74                 int k=0;
 75                 int c=d[i].start/d[i].cycle;  //起始计数器
 76                 while(k<cnt){
 77                     printf("%d ",c++);
 78                     k++;
 79                 }
 80                 printf("次申请未得到响应!\n");
 81                 d[i].start+=cnt*d[i].cycle;
 82             }
 83         }
 84     }
 85 }
 86 
 87 void handle(int end_time){
 88     int t,j,i=0;
 89     int selected;                  //选中设备的索引
 90     Device *p;                      //应选中的设备
 91     for(t = 0; t<end_time; t+=GAP){
 92         int k=0;
 93         printf("第%d周期: ",++i);
 94         for(j = 0; j<N; j++) {
 95             selected=0;
 96             if(d[j].start <= t) { 
 97                 d[j].applied=true;  //申请
 98                 if(k==0) {
 99                     p=&d[j];   //暂存第一个提交申请的设备
100                     selected=j;
101                 }
102                 k++;
103             }
104         }
105 
106         if(k == 0) {
107             printf("无设备提出申请!\n");
108         }
109         else{
110             Quicksort(&p,selected);
111             printf("%d号设备被选中\n",selected);
112             check_lose(t,selected);
113 
114             /*选中的设备的后处理*/
115             p->applied = false;
116             p->start+=p->cycle;            
117         }
118     }
119 }
120 
121 int main(){
122     init();
123     int end_time;
124     scanf("%d",&end_time);
125     printf("\nresult:\n");
126     handle(end_time);
127     return 0;
128 }

 



原文地址:https://www.cnblogs.com/Seiyagoo/p/2437136.html