| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 511 人关注过本帖
标题:求助关于unix平台先的C程序如何更改才能在VC下运行???
只看楼主 加入收藏
sanop
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-5-6
结帖率:0
收藏
已结贴  问题点数:20 回复次数:2 
求助关于unix平台先的C程序如何更改才能在VC下运行???
设计一个虚拟存储区和内存工作区,并使用FIFO和LRU算法计算机访问命中率。
<程序设计>
    先用srand()函数和rand()函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算相应的命中率。
<程序1>
#define TRUE 1
#define FALSE 0
#define INVALID -1
#define NULL 0

#define total_instruction 320/*共320条指令*/
#define total_vp 32/*虚存页共32*/
#define clear_period 50

typedef struct{/*页面类型*/
    int pn, pfn, counter, time;/*页号、页面号、一个周期内访问该页面的次数、访问时间*/
}pl_type;
pl_type pl[32];

typedef struct pfc_struct{/*页面控制结构*/
    int pn, pfn;
    struct pfc_struct *new;
}pfc_type;
pfc_type pfc[32];
pfc *freepf_head,*busypf_head,*busypf_tail;/*空闲页头指针,忙页头指针,忙页尾指针*/

int disaffect; /*缺页次数*/
int a[total_instruction];/*指令流数组*/
int page[total_instruction], offset[total_instruction];/*每条指令的页和页内偏移*/

void initialize( );
void FIFO( );
void LRU( );
/*void OPT( );根据需要可选*/

void main(){
    int s,i,j;
    int s,i,j;
    srand(10*getpid());/*用进程号作为初始化随机数队列的种子*/
    s=(float)319*rand()/32767/3267/2+1;
    for(i=0;i<total_instruction;i+=4){/*产生指令队列*/
        if(s<0||s>319){
            printf("when i==%d,error,s==%d\n",i,s);
            exit(0);
        }
        a[i]=s;/*任意选一指令访问点m*/
        a[i+1]=a[i]+1;/*顺序执行下一条指令*/
        a[i+2]=(fload)a[i]*rand()/32767/32767/2;/*执行前地址指令m'*/
        a[i+3]=a[i+2]+1;/*顺序执行一条指令*/
        s=(float)(318-a[i+2])*rand()/32767/32767/2+a[i+2]+2;
        if((a[i+2]>318)||(s>319)) printf("a[%d+2,a number which is:%d and s=%d\n",i,a[i+2],s);        
    }
    for(i=0;i<total_instruction;i++){/*将指令序列变成页地址流*/
        page[i]=a[i]/10;
        offset[i]=a[i]%10;
    }
    for(i=4;i<=32;i++){/*用户内存工作区从4个页面到32个页面*/
        printf("%2d page frames",i);
        FIFO(i);/*计算用FIFO置换时第i个页面时的命中率*/
        LRU(i);/*计算用LRU置换时第i个页面时的命中率*/
        /*此处也可添加其它函数,如OPT()*/
        printf("\n");
    }
}

void initialize(total_pf)/*初始化相关数据结构*/
int total_pf;/*用户进程的内存页面数*/
{
    int i;
    disfeffect=0;
    for(i=0;i<total_vp;i++){
        pl[i].pn=i;
        pl[i].pfn=INVALID;/*置页面控制结构中的页号、页面号为空*/
        pl[i].counter=0;/*置页面控制结构中的访问次数为0*/
        pl[i].time=-1;    /*置页面控制结构中的时间为-1*/
    }
    for(i=0;i<total_pf-1;i++){
        pfc[i].next=&pfc[i+1];
        pfc[i].pfn=i;
    }
    pfc[total_pf-1].next=NULL;
    pfc[total_pf-1].pfn=total_pf-1;
    freef_head=&pfc[0];   
}

void FIFO(total_pf)
int total_pf;/*用户进程的内存页面数*/
{
    int i,j;
    pfc_type *p;
    initialize(total_pf);/*初始化相关数据结构*/
    busypf_head=busypf_tail=NULL;
    for(i=0;i<total_instruction;i++){
        if(pl[page[i]].pfn==INVALID){/*页面失效*/
            diseffect+=1;/*失效次数*/
            if(freef_head==NULL){/*无空闲页面*/
                p=busypf_head->next;
                p1[busypf_head->pn].pfn=INVALID;
                freepf_head=busypf_head;/*释放忙页面队列的第一个页面*/
                freepf_head->next=NULL;
                busypf_head=p;
            }
            p=freepf_head->next;/*按FIFO方式调新页面入内存*/
            freepf_head->next=NULL;
            freepf_head->pn=page[i];
            pl[page[i]].pfn=freepf_head->pfn;
            if(busypf_tail==NULL) busypf_head=busypf_tail=freepf_head;
            else{
                busypf_tail->next=freepf_head;/*free页面减少一个*/
                busypf_tail=freepf_head;
            }
            freepf_head=p;
        }   
    }
    printf("FIFO:%6.4f",1-(float)diseffect/320);   
}

void LRU(total_pf)
int total_pf;
{
    int min,minj,i,j,present_time;
    initialize(total_pf);
    present_time=0;
    for(i=0;i<total_instruction;i++){
        if(pl[page[i]].pfn==INVALID){/*页面失效*/
            diseffect++;
            if(freepf_head==NULL){/*无空闲页面*/
                min=32767;
                for(j=0;j<total_vp;j++)/*找出time的最小值*/
                    if(min>pl[j].time&&pl[j].pfn!=INVALID){
                        min=pl[j].time;
                        minj=j;
                    }
                freepf_head=pfc[pl[minj].pfn];/*腾出一个单元*/
                pl[minj].pfn=INVALID;
                pl[minj].time=-1;
                free_head->next=NULL;
            }
            pl[page[i]].pfn=freepf_head->pfn;/*有空闲页面,改为有效*/
            pl[page[i]].time=present_time;
            freepf_head=freef_head->next;/*减少一个free页面*/
        }
        else pl[page[i]].time=present_time;/*命中,则增加该单元的访问次数*/
        present_time++;
    }
    printf("LRU:%6.4f",1-(float)diseffect/320);
}
<分析>
从结果可知,在内存页面数较少(小于15)时,两种算法的命中率差别不大,都是60%左右;在内存页面数为16~28之间时,两者的命中率有了一定的差别,LRU的命中率更高;当内存页面数大于28个页面时,由于用户进程的所有指令基本上都已经装入内存,从而命中率大增,故算法之间的差别不大。

请问如何把它改在VC 环境下来运行??
搜索更多相关主题的帖子: 计算机 命中率 
2011-05-06 11:27
long361800
Rank: 2
等 级:论坛游民
帖 子:33
专家分:37
注 册:2010-8-23
收藏
得分:10 
哇,大哥,你哪个专业的啊??写这么牛逼的程序啊??
2011-05-06 11:33
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:10 
以下是引用long361800在2011-5-6 11:33:25的发言:

哇,大哥,你哪个专业的啊??写这么牛逼的程序啊??


土B
2011-05-06 13:01
快速回复:求助关于unix平台先的C程序如何更改才能在VC下运行???
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.055553 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved