您的当前位置:首页正文

进程控制-os实验报告

来源:一二三四网


安徽师范大学

学院实验报告 数学计算机科学

专业名称 实 验 室 实验课程 实验名称 姓 名 学 号 同组人员 实验日期

物联网工程

2060403

计算机操作系统

进程调度

郎瑶

120706018

2014/10/16

一、 实验目的 在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。 二、 实验内容 利用高级语言模拟进程的时间片轮转调度算法,响应比高者优先调度算法。 本次实验具体内容: 设计一个按时间片轮转法实现处理器调度的程序。 三、 实验仪器设备、工具软件 1.PC微机。 2.Linux 操作系统。 3.Gcc开发环境。 四、 程序设计思路及其主要函数模块说明 1. 按时间片轮转法实现处理器调度: (1) 定义两个数据结构,一个存储进程控制块信息,一个用于指向控制块节点的首尾指针,如下: typedef struct PCB { char processname; //进程名 int needtime; //要求运行时间 int usedtime; //已运行时间 char state; //进程状态标记,就绪为R,结束为E struct PCB *next; //指向下一进程 }Process, *ProcessPtr; typedef struct { ProcessPtr front; //队头指针 ProcessPtr rear; //队尾指针 } LinkProcess; (2) 队列的初始化和进程入队函数 void InitProcess(LinkProcess &Q) { //初始化进程队列 Q.rear=Q.front=(ProcessPtr)malloc(sizeof(PCB)); if(!Q.front) exit(OVERFLOW); void addProcess(LinkProcess &Q,char processname,int needtime,int usedtime) { //添加进程 ProcessPtr p; p=(ProcessPtr)malloc(sizeof(PCB)); if (!p) exit (OVERFLOW); p->processname=processname; Q.front->next=NULL; } p->needtime=needtime; p->usedtime=usedtime; p->state='R'; Q.rear->next=p; (3)主要函数如下: Q.rear=p; Q.rear->next=Q.front->next; }//入队 InputProcess(Q); //数据初始化 五、 实验程序 按时间片轮转法实现处理器调度 #include #include #define OVERFLOW -1 typedef struct PCB { char processname; //进程名 int needtime; //要求运行时间 int usedtime; //已运行时间 char state; //进程状态标记,就绪为R,结束为E OutProcess(Q); //输出进程信息 time_round(Q); // 时间片轮转法 struct PCB *next; //指向下一进程 }Process, *ProcessPtr; typedef struct { ProcessPtr front; //队头指针 ProcessPtr rear; //队尾指针 } LinkProcess; void InitProcess(LinkProcess &Q); // //初始化进程队列 void addProcess(LinkProcess &Q,char processname,int needtime,int usedtime) //添加进程 void InputProcess(LinkProcess &Q); //输入进程 void OutProcess(LinkProcess Q) ; //输出运行时的进程 void time_round( LinkProcess Q); // 时间片轮转法 int main() { //主函数 LinkProcess Q; InputProcess(Q); //数据初始化 OutProcess(Q); //输出此刻的进程状态 time_round(Q); // 时间片轮转法 return 0; } void InitProcess(LinkProcess &Q) { //初始化进程队列 Q.rear=Q.front=(ProcessPtr)malloc(sizeof(PCB)); if(!Q.front) exit(OVERFLOW); Q.front->next=NULL; } void addProcess(LinkProcess &Q,char processname,int needtime,int usedtime) { //添加进程 ProcessPtr p; p=(ProcessPtr)malloc(sizeof(PCB)); if (!p) exit (OVERFLOW); p->processname=processname; p->needtime=needtime; p->usedtime=usedtime; p->state='R'; Q.rear->next=p; Q.rear=p; Q.rear->next=Q.front->next; }//入队 void InputProcess(LinkProcess &Q) { //输入进程 int i; char processname; int needtime,usedtime; printf(\"******************时间片轮转函数**2014年10月16号***120706018-郎瑶***************\\n\"); InitProcess(Q); //以下创建五个进程 for(i=1;i<=5;i++) { printf(\"请输入第%d个进程名,运行所需时间,已运行时间:\ scanf(\"%c %d %d\ getchar(); addProcess(Q,processname,needtime,usedtime); } printf(\"\\n\\n\"); } void OutProcess(LinkProcess Q) {//输出运行时的进程 int m=5; ProcessPtr p; p=Q.front->next; printf(\"*******************进程信息如下:*********************\\n\\n\"); do { m--; if(p->state!='E') { printf(\"进 程 名:%c 需 要 时间:%d 已运行时间:%d 当前状态:%c\\n\ } p=p->next; } while(m); //当进程不为空 printf(\"\\n\\n\"); } void time_round( LinkProcess Q) { // 时间片轮转法 ProcessPtr p; p=Q.front->next; int round=0; //轮转计数 int flag=5; //记录剩余进程数 while(flag) { if(p->needtime>p->usedtime) { p->usedtime++; round++; printf(\"...............轮转数:%d 正在运行程:%c\\n\ OutProcess(Q); } else if(p->needtime==p->usedtime) { p->state='E'; printf(\"...........进程%c运行结束,已删除!\\n\ flag--; } p=p->next; } } 进 六、 实验结果 时间片轮转算法: 成绩评定: 1、 根据实验情况和实验报告质量作出写事性评价 2、 评分 综合评分 折合成等级 指导教师签名: 时间: 年 月 日

因篇幅问题不能全部显示,请点此查看更多更全内容

Top