//1.存储管理。 #define TRUE 1 #define FALSE 0 #define INVALID -1 #define NULL 0 #define total_instruction 320 /*指令流长*/ #define total_vp 32 /*虚页长*/ #define clear_period 50 /*清0周期*/ typedef struct /*页面结构*/ { int pn; //页号 logic number int pfn; //页面框架号 physical frame number int counter; //计数器 int time; //时间 }pl_type; pl_type pl[total_vp]; /*页面线性结构---指令序列需要使用地址*/ typedef struct pfc_struct /*页面控制结构,调度算法的控制结构*/ { int pn; int pfn; struct pfc_struct *next; }pfc_type; pfc_type pfc[total_vp], *freepf_head, *busypf_head, *busypf_tail; int diseffect, a[total_instruction]; /* a[]为指令序列*/ int page[total_instruction], offset[total_instruction];/*地址信息*/ int initialize(int); int FIFO(int); int LRU(int); int LFU(int); int NUR(int); //not use recently int OPT(int); int main( ) { int s,i,j; srand(10*getpid()); /*由于每次运行时进程号不同,故可用来作为初始化随机数队列的“种子”*/ s=(float)319*rand( )/32767/32767/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]=(float)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); LRU(i); LFU(i); NUR(i); OPT(i); } return 0; } /*初始化相关数据结构 total_pf表示内存的块数 */ int initialize(int total_pf) { int i; diseffect=0; for(i=0;i<total_vp;i++) { pl[i].pfn=INVA
时间: 2024-03-15 08:42:51 浏览: 148
LID; /*将所有页面初始化为无效*/ pl[i].counter=0; pl[i].time=0; } for=0;i<total_pf-1;i++) /*形成空闲页面链表*/ { pfc[i].next=&pfc[i+1]; pfc[i].pn=INVALID; } pfc[total_pf-1].next=NULL; pfc[total_pf-1].pn=INVALID; freepf_head=&pfc[0]; /*初始化空闲页面头指针*/ busypf_head=NULL; /*初始化忙页面头指针*/ busypf_tail=NULL; /*初始化忙页面尾指针*/ return 0; }
这段代码是一个简单的页面置换算法的模拟程序,主要是模拟了FIFO、LRU、LFU、NUR、OPT等五种页面置换算法。其中,FIFO是按照先进先出的原则置换页面;LRU是按照最近最少使用的原则置换页面;LFU是按照最少使用次数的原则置换页面;NUR是按照最近未使用的原则置换页面;OPT是按照最优置换
相关问题
#define DATA_1 1 #define DATA_2 2 #define DATA_3 3 // ... #define DATA_100 100能用简单一点的方法吗
可以使用宏定义的方式来简化这个过程。你可以定义一个宏来生成这些数据宏定义,如下所示:
```c
#define GENERATE_DATA_MACRO(n) \
#define DATA_##n n
GENERATE_DATA_MACRO(1)
GENERATE_DATA_MACRO(2)
GENERATE_DATA_MACRO(3)
// ...
GENERATE_DATA_MACRO(100)
```
这样,宏定义`GENERATE_DATA_MACRO`会根据传入的参数生成对应的数据宏定义。例如,`GENERATE_DATA_MACRO(1)`会生成`#define DATA_1 1`,`GENERATE_DATA_MACRO(2)`会生成`#define DATA_2 2`,以此类推。
这种方式可以简化代码,避免手动编写大量的宏定义。同时,如果需要修改数据宏定义的范围,只需要修改一次`GENERATE_DATA_MACRO`的调用即可。
#ifndef GLOBAL_H #define GLOBAL_H #define FALSE 0 #define TRUE 1 #define CARDPATH "datecard.txt" #define CHARGE 5 #endif
这是一个C/C++的头文件,通常用于定义全局变量和常量等。该文件包含了以下内容:
1. #ifndef 和 #define:这两个宏定义是为了避免头文件被重复引用而引发错误,具体来说,它们定义了一个标识符,如果该标识符未被定义过,则执行后面的代码,否则忽略该代码段。
2. #define FALSE 0 和 #define TRUE 1:这两个宏定义分别表示逻辑上的“假”和“真”,在程序中可以直接使用。
3. #define CARDPATH "datecard.txt":这个宏定义定义了一个字符串常量,表示卡片数据的存储路径。
4. #define CHARGE 5:这个宏定义定义了一个整型常量,表示每次充值的金额。
如果其他文件需要使用这些全局变量或常量,只需要在开头引用该头文件即可。
阅读全文