处理机调度操作系统实验报告
if(i==0){
p = q;
t = q;
}
else{
t->next = q;
t = q;
}
i++;
}
return p;
}
void free_process(pcb *p){
pcb *q;
while(p!= NULL){
q = p;
p = p->next;
free(q);
}
}
void display(pcb *p){
printf("2 ROUNDROBIN\n");
printf("3 EXIT\n");
}
pcb* get_process(){
pcb *q;
pcb *p; //头指针
pcb *t; //尾指针
int i = 0;
printf("input name and time\n");
while (i < P_NUM){
{
int time;
int averageTime;
int priority;
struct link *next;
}linknode;
linknode *creat()
{
int n,m;
linknode *head,*r,*s;
head=r=(linknode *)malloc(sizeof(linknode));
int needtime; //执行时间
int count;
enum state process;
struct pcbb *next;
};
typedef struct pcbb pcb;
void display_menu(){
printf("CHOOSE THE ALGORITHM:\n");
printf("1 PRIORITY\n");
default:printf("YOU HAVE NOT CHOOSE ANY ALGORITHM!\n");
}
}
(2)编辑程序先来先服务调度算法fcfs.c,编译并执行。
#include <stdio.h>
#include <stdlib.h>
int SUM=0,K=0;
typedef struct link
printf("输入各进程的处理时间和优先级并以两个0为结束标志:\n");
while(scanf("%d %d",&n,&m)&&ammalloc(sizeof(linknode));
K++;
s->time=n;
s->priority=m;
s->averageTime=0;
case finish:printf("finish\n"); break;
}
p = p->next;
}
}
int process_finish(pcb *q){
int b1 = 1;
while(b1&&q){
b1 = b1&&q->needtime==0;
q = q->next;
}
return b1;
}
main()
{
linknode *head;
head=creat();
seekAverageTime(head);
print(head);
printf("平均处理时间为:%d\n",(SUM/K));
}
实
验
结果
(1)优先级调度
(2)时间片轮转调度
(3)先来先服务调度
遇到问题及解决方法
实
验
内
容
1、程序说明:
(1)先来先服务算法:如果早就绪的进程排在就绪队列的前面,迟就绪的进程排在就绪队列的后面,那么先来先服务(FCFS:first come first service)总是把当前处于就绪队列之首的那个进程调度到运行状态。
(2)轮转法就是按一定时间片(记为q)轮番运行各个进程。如果q是一个定值,则轮转法是一种对各进程机会均等的调度方法。
(3)优先级调度的基本思想是,把当前处于就绪队列中优先级最高的进程投入运行,而不管各进程的下一个CPU周期的长短和其他因素。
2、具体步骤:
(1)分析问题,提出解决问题的算法
(2)编制程序
(3)程序调试
(4)记录实验结果,以及思考是否能够改善算法
(1)编辑程序jcdd.c,编译并执行。
#include <stdio.h>
sleep(2);
}
free_process(p); //释放所有进程
}
main(){
display_menu();
int k;
scanf("%d",&k);
switch(k){
case 1:priority_cal();break;
case 2:round_cal();break;
case 3: break;
}
}
void display_round(pcb *p){
printf("name cputime needtimecountstate\n");
while(p){
printf("%s",p->name);
printf("");
printf("%d",p->cputime);
printf("");
printf("%d",p->needtime);
学年第学期
操作系统课程
实验报告
学院:
专业:
班级:
姓名:
学号:
任课教师:
实验题目
处理机调度
实验地点
实验目的
1.通过编写程序实现进程或作业先来先服务、高优先权、按时间片轮转调度算法,进一步掌握进程调度的概念和算法,加深对处理机分配的理解。
2.了解Linux中进程(线程)的调度机制。
3.学习使用Linux中进程(线程)调度算法,掌握相应的与调度有关的函数。
}
void cpuexe(pcb *q){
pcb *t = q;
int tp = 0;
while(q){ //让t指向优先级最高的进程
if (q->process!=finish){
q->process = ready;
if(q->needtime==0){
q->process = finish;
}
int i = 0;
printf("input name and time\n");
while (i<P_NUM){
q=(pcb *)malloc(sizeof(pcb));
scanf("%s",q->name);
scanf("%d",&q->needtime);
q->cputime = 0;
q->count = 0;
}while ( t && t->process == finish);
if(t == NULL){
t = head;
//k是刚刚被执行的节点,如果t->next=k,所明就绪队列除了k和t以外都已结束,按照时间片轮转算法,该t执行
while(t->next!=k && t->process == finish){
r->next=s;
r=s;
}
r->next=NULL;
return head;
}
linknode *seekAverageTime(linknode *head)
{
int sum=0;
linknode *p;
p=head->next;
while(p)
{
sum=sum+p->time;
p->averageTime=sum;
printf("");
printf("%d",p->count);
printf("");
switch(p->process){
case ready:printf("ready\n");break;
case execute:printf("execute\n"); break;
case block:printf("block\n"); break;
display(p); //每调度一次就显示次
sleep(2);
}
free_process(p); //释放所有进程
printf("All processes have finished\n");
}
pcb *get_process_round(){
pcb *q;
pcb *p; //头指针
pcb *t; //尾指针
#include <stdlib.h>
#define P_NUM 5
#define P_TIME 50
enum state{
ready,
execute,
block,
finish
};