logo资料库

操作系统实验报告.docx

第1页 / 共21页
第2页 / 共21页
第3页 / 共21页
第4页 / 共21页
第5页 / 共21页
第6页 / 共21页
第7页 / 共21页
第8页 / 共21页
资料共21页,剩余部分请下载后查看
实验1《CPU Scheduling》
实验2《Allocation & Reclaim》
《操作系统概念》 实验报告 项目名称 CPU Scheduling Allocation & Reclaim 专业班级 软件工程 1203 班 学 姓 号 3901120316 名 孙俊萍 实验成绩: 批阅教师:胡志刚 2013 年 12 月 16 日
实验 1《CPU Scheduling》 实验学时: 4 实验地点: 二综 实验日期: 一、实验目的 多道系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进程优先占 用处理机。本实验模拟实现处理机调度,加深了解处理机调度的工作过程 二、实验内容 选择或者自行设计一个调度算法,实现处理机调度。 1、设计一个按优先权调度算法实现处理机调度的程序 2、设计一个按时间片轮转实现处理机调度的程序 三、实验方法 按优先权调度算法实现处理机调度的程序 四、实验步骤 构建 PCB,内容至少涵盖: 进程名/PID; 要求运行时间(单位时间); 优先权; 状态: PCB 指针; 1、可随机输入若干进程,并按优先权排序 2、采用动态优先权调度,从就绪队首选进程运行: 优先权-1/要求运行时间-1 要求运行时间为 0 时,撤销该进程 3、重新排序,进行下轮调度 五、实验要求: 最好采用图形界面 可动态增加进程 规定道数,设置后备队列和挂起状态 如果内存中进程数少于规定道数,可自动从后备队列通过作业调度选择一作业进入, 作业调度算法可自行选择 被挂起进程入挂起队列,设置解挂功能用于将指定挂起进程解挂并入就绪队列 每次调度后,显示各进程状态。 六、实验代码:
typedef struct node { /*进程的名字*/ /*进程的优先级*/ /*CPU 执行时间*/ /*进程执行所需要的时间*/ char name[20]; int prio; int cputime; int needtime; char state;/*进程的状态,W--就绪态,R--执行态,F--完成态*/ int count; struct node *next; }PCB; /*记录执行的次数*/ /*链表指针*/ //要创建的进程数目 PCB *ready=NULL,*run=NULL,*finish=NULL; /*定义三个队列,ready 就绪队列,run 执行队列和 finish 完成队列*/ int num; void GetFirst(); void Output(); void InsertPrio(PCB *in);//创建优先级队列规定优先数越小优先级越高 void PrioCreate(); void Priority(); /*从就绪队列取得第一个节点*/ /*输出队列信息*/ /*优先级输入函数*/ /*按照优先级调度*/ int main(void) { cout<<"请输入要创建的进程数目:"<>num; getchar(); cout<<"优先级调度算法: "<
if(ready!=NULL) { run ->state = 'R'; ready = ready ->next; run ->next = NULL; } } /*输出队列信息*/ void Output() { PCB *p; p = ready; cout<<"进程名\t 优先级\tcpu 时间\t 需要时间\t 进程状态\t 计数器\n"; while(p!=NULL) { cout<name<<"\t"<prio<<"\t"<cputime<<"\t"<needtime<<"\t"< state<<"\t"<count<next; } p = finish; while(p!=NULL) { cout<name<<"\t"<prio<<"\t"<cputime<<"\t"<needtime<<"\t"< state<<"\t"<count<next; } p = run; while(p!=NULL) {
cout<name<<"\t"<prio<<"\t"<cputime<<"\t"<needtime<<"\t"< state<<"\t"<count<next; } } //创建优先级队列,规定优先数越小,优先级越低 void InsertPrio(PCB *in) { PCB *fst,*nxt; fst = nxt = ready; if(ready == NULL) { in->next = ready; ready = in; /*如果队列为空,则为第一个元素*/ } else { /*查到合适的位置进行插入*/ if(in ->prio >= fst ->prio)/*刚进入的进程比第一个还要大,则插入到队头*/ { in->next = ready; ready = in; } else { while(fst->next != NULL) /*移动指针查找第一个别它小的元素的位置 进行插入*/ { nxt = fst; fst = fst->next; } if(fst ->next == NULL) /*已经搜索到队尾,则其优先级数最小,将其插入 到队尾即可*/ { in ->next = fst ->next; fst ->next = in;
/*插入到队列中*/ nxt = in; in ->next = fst; } else { } } } } void InsertTime(PCB *in)/*将进程插入到就绪队列尾部*/ { PCB *fst; fst = ready; if(ready == NULL) { in->next = ready; ready = in; } else{ while(fst->next != NULL) { fst = fst->next; in->next = fst->next; fst->next = in; } } } /*将进程插入到完成队列尾部*/ void InsertFinish(PCB *in) { PCB *fst; fst = finish; if(finish == NULL) { in->next = finish;
finish = in; } else { while(fst->next != NULL) { fst = fst->next;} in ->next = fst ->next; fst ->next = in; } } /*优先级调度输入函数*/ void PrioCreate() { PCB *tmp; int i; cout<<"输入进程名字和进程所需时间:\n"; for(i = 0;i < num; i++) { if((tmp = (PCB *)malloc(sizeof(PCB)))==NULL) { perror("malloc"); exit(1); } /*吸收回车符号*/ cin>>tmp->name ; getchar(); cin>>tmp->needtime; tmp ->cputime = 0; tmp ->state ='W'; tmp ->prio = 50 - tmp->needtime; /*设置其优先级,需要的时间越多,优先级越低 tmp ->count = 0; InsertPrio(tmp); /*按照优先级从高到低,插入到就绪队列*/ */ }
} /*按照优先级调度,每次执行一个时间片*/ void Priority() { int flag = 1; GetFirst(); while(run != NULL)//当就绪队列不为空时,则调度进程如执行队列 { Output(); /*输出每次调度过程中各个节点的状态*/ while(flag) { run->prio -= 3; /*优先级减去三*/ run->cputime++; /*CPU 时间片加一*/ run->needtime--;/*进程执行完成的剩余时间减一 1*/ if(run->needtime == 0)/*如果进程执行完毕,将进程状态置为 F,将其插 入到完成队列*/ { run ->state = 'F'; run->count++; /*进程执行的次数加一*/ InsertFinish(run); flag = 0; /*将进程状态置为 W,入就绪队列*/ run->state = 'W'; run->count++; /*进程执行的次数加一*/ InsertTime(run); flag = 0; } else { } } flag = 1; GetFirst();/*继续取就绪队列队头进程进入执行队列*/ } }
分享到:
收藏