操作系统课程设计报告 进程调度的模拟实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统
课程设计报告
专业计算机科学与技术学生姓名
班级
学号
指导教师
完成日期
博雅学院
题目:进程调度的模拟实现的模拟实现一、设计目的
本课程设计是学习完“操作系统原理”课程后进行的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。
在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个。也就是说能运行的进程数大于处理机个数。为了使系统中的进程能有条不紊地工作,必须选用某种调度策略,选择一进程占用处理机。要求学生设计一个模拟处理机调度算法,以巩固和加深处理机调度的概念。
二、设计内容
1)概述
选择一个调度算法,实现处理机调度。
设计要求:
1)进程调度算法包括:时间片轮转法,短作业优先算法,动态优先级算法。
2)可选择进程数量
3)本程序包括三种算法,用C或C++语言实现,执行时在主界面选择算法(可用函数实现),进入子页面后输入进程数,(运行时间,优先数由随机函数产生),执行,显示结果。
调度时总是选取优先数最大的进程优先运行
2.每个进程的优先数,运行时间,由程序任意指定。
3.为了调度方便,把进程按给定优先级(动态优先级算法中)从小到大排成一个队列。按给定运行时间(短作业优先)从小到大排成一个队列用一个变量作为队首指针,指向队列的第一个进程。
4.处理机调度总是选队首进程运行。由于本实验是模拟处理机调度,所以被选中的进程并不实际的启动运行,而是执行:
优先数-1(动态优先级算法中)
要求运行时间-1
来模拟进程的一次运行。
5.进程运行一次后,若要求运行时间不等于0,则再将它加入队列(动态优先级算法中:按优先数大小插入。),且改变队首指针:若要求运行时间=0,则把它的状态改为完成(C)状态,且退出队列。
2. 实验分析
(1)PCB结构通常包括以下信息:进程名,进程优先数,轮转时间片,进程已占用的CPU时间,进程还需要的CPU时间,进程的状态,当前队列指针等。可根据实验的不同,PCB结构的内容可以作适当的增删
(2)本程序用两种算法对五个进程进行调度,每个进程可有三个状态:就绪、执行、完成。并假设初始状态为就绪状态。
(3)为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。
(4)在优先数算法中,优先数可以先取值为一个常数减去进程所需要的时间片数目,进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。在轮转算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了2个单位),这时,CPU时间片数加2,进程还需要的时间片数减2,并排列到就绪队列的尾上。
(5)对于遇到优先数一致的情况,采用FIFO策略解决。
3.概要设计
(1)本程序用两种算法对五个进程进行调度,每个进程可有三个状态,并假设初始状态为就绪状态。
(2)为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。
(3)在优先数算法中,优先数的值为50与运行时间的差值,即P_TIME-process->needtime。进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。在轮转算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了2个单位),这时,CPU时间片数加2,进程还需要的时间片数减2,并排列到就绪队列的尾上。
(4)对于遇到优先数一致的情况,采用FIFO策略解决
4.详细设计
(1)struct pcb()定义pcb块
(2)Void display()显示结果信息函数
(3)int process_finish(pcb *q) 进程完成标示
(4)void display_round()显示循环轮转调度算法运行结果
(5)priority_cal() 优先数调度算法
(6)void cpu_round()处理器的工作状态
5.源程序代码
#include
#include
#include
#include
#include
#include
#define P_NUM 5
#define P_TIME 50
enum state
{
ready,
execute,
block,
finish
};
struct pcb
{
char name[4];
int priority;
int cputime;
int needtime;
int count;
int round;
state process;
pcb * next;
};
pcb * get_process();
pcb * get_process()
{
pcb *q;
pcb *t;
pcb *p;
int i=0;
cout<<"input name and time"< while (i q=(struct pcb *)malloc(sizeof(pcb)); cin>>q->name; cin>>q->needtime; q->cputime=0; q->priority=P_TIME-q->needtime; q->process=ready; q->next=NULL; if (i==0){ p=q; t=q;} else{t->next=q;t=q; } i++; } //while return p; } void display(pcb *p) { cout<<"name"<<" "<<"cputime"<<" "<<"needtime"<<" "<<"priority"<<" "<<"state"< while(p) { cout< cout<<" "; cout< cout<<" "; cout< cout<<" "; cout< cout<<" "; switch(p->process)