操作系统实验指导书
}
q = q->next;
if(t->needtime!=0){ t->priority -=3; //每执行一次优先级降低三个单位 t->needtime --; t->process = execute; t->cputime++;
}
}
//优先级调度算法 void priority_cal(){ pcb *head;
head = get_process_priority(); int cpu = 0;
while(!process_finish(head)){ cpu++;
printf(\ cpuexe_priority(head); display_priority(head); set_state(head); sleep(2);
}
free_process(head);
printf(\
}
//创建进程--时间片轮转调度 pcb *get_process_round(){ pcb *q; pcb *head; pcb *tail; int i = 0;
printf(\
while (i
if(i==0){ 46
操作系统实验指导书
}
}
}
head = q; tail = q;
else{ } i++;
tail->next = q; tail = q;
return head;
/*从刚执行进程k 的下一个进程开始,查找第一个未执行完毕的 进程作为下一个要执行的进程,并将其返回,head为队列头指针。*/ pcb *get_next(pcb *k,pcb *head) { }
//为选择的进程分配一个时间片使之执行,并将其状态改为执行 //状态,同时修改count。时间片为两个时间单位。 void cpuexe_round(pcb *q) {
if(q->needtime==1) q->cputime++; else
q->cputime +=2; q->needtime -=2; if(t == NULL){ } return t;
t = head;
//k是刚刚被执行的节点,如果t->next=k,所明就绪队列除了k和t以外都已结束,按while(t->next!=k && t->process == finish){ }
if(t->state==finish && k->state == ready)
t = k; t = t->next;
pcb *t; t = k; do{
t =t->next;
}while ( t && t->process == finish);
照时间片轮转算法,该t执行
47
操作系统实验指导书
if(q->needtime<0){ q->needtime = 0;
}
q->count++; q->process = execute;
}
void display_round(pcb *p){ printf(\ cputime needtime count state\\n\
while(p){ printf(\ printf(\ \ printf(\ printf(\ \ printf(\ printf(\ \ printf(\ printf(\ \ switch(p->state){ case ready:printf(\ case execute:printf(\ case block:printf(\ case finish:printf(\
}
p = p->next;
}
}
//时间片轮转调度算法 void round_cal(){ pcb *head; pcb *r;
head = get_process_round(); int cpu = 0; r=head;
while(!process_finish(head)){ if(r->needtime==1) cpu+=1;
else
cpu+=2; cpuexe_round(r);
printf(\ display_round(head);
set_state(head);
48
操作系统实验指导书
r = get_next(r,head); } main(){ }
display_menu(); int k;
scanf(\switch(k){ }
case 1:priority_cal();break; case 2:round_cal();break; case 3:break;
default:printf(\ }
free_process(head);
sleep(2);
三、有关实验的改进意见 在实验操作过程中,发现用户输入的数据量太大且每次用户输入的大多数数据为重复数据,因此考虑采用文件输入方式,用户只需指定特定的输入文件的文件名来输入数据。另一方面,程序的输出量较大,可以考虑采用文件输出的方式来储存程序的运行结果。也可以用实时的输出界面来输出程序结果
四、思考题
1、在实际的进程调度中,除了按调度算法选择下一个执行的进程外,还应处理哪些工作?
2、为什么对进程的优先数可按上述原则进行修改?
49
操作系统实验指导书
实验五 存储管理 常用页面置换算法模拟实验
实验目的
通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。
实验内容
设计一个虚拟存储区和内存工作区,并使用下述算法计算访问命中率。 1、最佳(Optimal)置换算法 2、先进先出(FIFO)置换算法
3、最近最久未使用(LRU)置换算法
命中率=1-页面失效次数/页地址流长度
实验准备
本实验的程序设计基本上按照实验内容进行。即首先用srand( )和rand( )函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的命中率。
(1)通过随机数产生一个指令序列,共320条指令。指令的地址按下述原则生成: A:50%的指令是顺序执行的
B:25%的指令是均匀分布在前地址部分 C:25%的指令是均匀分布在后地址部分 具体的实施方法是:
A:在[0,319]的指令地址之间随机选取一起点m B:顺序执行一条指令,即执行地址为m+1的指令
C:在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m’ D:顺序执行一条指令,其地址为m’+1
E:在后地址[m’+2,319]中随机选取一条指令并执行 F:重复步骤A-E,直到320次指令 (2)将指令序列变换为页地址流 设:页面大小为1K;
用户内存容量4页到32页; 用户虚存容量为32K。
在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:
第 0 条-第 9 条指令为第0页(对应虚存地址为[0,9]) 第10条-第19条指令为第1页(对应虚存地址为[10,19]) ????????????
第310条-第319条指令为第31页(对应虚存地址为[310,319]) 按以上方式,用户指令可组成32页。
50