一、课程设计题目及内容
设计一个按照时间片轮转法实现处理机调度的程序
时间片轮转法实现处理机调度的程序设计提示如下:
(1) 假设系统有n个进程,每个进程用一个进程控制块(PCB)来代表。进程控制块的格式如下表所示,且参数意义也相同。

进程名
链接指针
到达时间
估计运行时间
进程状态

(2) 按照进程到达的先后顺序排成一个循环队列,设一个队首指针指向第一个到达进程的首址。另外再设一个当前运行进程指针,指向当前正运行的进程。
(3) 执行处理机调度时,首先选择队首的第一个进程运行。
(4) 由于本题目是模拟实验,所以对被选中的进程并不实际启动运行,而只是执行如下操作:1)估计运行时间减1;
2)输出当前运行进程的名字。
用这两个操作来模拟进程的一次运行。
(5) 进程运行一次后,以后的调度则将当前指针依次下移一个位置,指向下一个进程,即调整当前运行指针指向该进程的链接指针所指进程,以指示应运行进程,同时还应判断该进程的剩余运行时间是否为0,若不为0,则等待下一轮的运行,若该进程的剩余运行时间为0,则将该进程的状态置为完成状态“C”,并退出循环队列。
(6) 若就绪队列不为空,则重复上述的步骤(4)和(5)直到所有进程都运行完为止。
(7) 在所设计的调度程序中,应包含显示或打印语句,以便显示或打印每次选中进程的名称及运行一次后队列的变化情况。
二、程序中使用的数据结构及主要符号说明

int Num; //定义总进程数
int Time = 0;   //定义系统时间
int slice = 1; //定义时间片长度
#define MAXSIZE 20     //定义就绪队列最大长度
#define false 0
#define true 1
//定义PCB结构
typedef struct PCB
{char process;     //定义进程名      int come_time;    //定义到达时间int runtime;      //定义运行时间char state;       //定义进程状态(A:就绪,B:运行,C:完成)
}PCB;//队列的顺序存储结构
typedef struct
{PCB* base;           //存储空间基地址int front;           //头指针int rear;            //尾指针
}SqQueue;
PCB* pcb = new PCB[Num];         //定义数组存放随机生成的进程

源代码:

#include <iostream>
#include<ctime>
using namespace std;
int Num; //定义总进程数
int Time = 0;   //定义系统时间
int slice = 1; //定义时间片长度
#define MAXSIZE 20     //定义就绪队列最大长度
#define false 0
#define true 1//定义PCB结构
typedef struct PCB
{char process;     //定义进程名      int come_time;    //定义到达时间int runtime;      //定义运行时间char state;       //定义进程状态(A:就绪,B:运行,C:完成)
}PCB;//队列的顺序存储结构
typedef struct
{PCB* base;           //存储空间基地址int front;           //头指针int rear;            //尾指针
}SqQueue;void init(PCB pcb[]);   //初始化函数
void sort(PCB pcb[]);   //根据到达时间对进程排序
void Time_slice(SqQueue& sq, PCB pcb[]);   //时间片轮转法主函数
void show(SqQueue& sq);   //输出就绪队列void init(PCB pcb[])
{PCB temp;for (int i = 0; i < Num; i++)      //随机生成进程信息{temp.process = 'A' + i;         //进程名字从A开始temp.come_time = rand() % 8;  //到达时间1~8temp.runtime = rand() % 9 + 1;  //运行时间1~10temp.state = 'A';         //进程为就绪状态pcb[i] = temp;            //初始化数组}
}void sort(PCB pcb[])  //冒泡排序
{for (int i = 0; i < Num; i++){for (int j = 0; j < Num - 1 - i; j++){if (pcb[j].come_time > pcb[j + 1].come_time){PCB temp;temp = pcb[j];pcb[j] = pcb[j + 1];pcb[j + 1] = temp;}}}
}void Time_slice(SqQueue& sq, PCB pcb[])
{int count = 0;           //计算完成运行的进程数int* record = new int[Num];   //为标志数组分配空间for (int i = 0; i < Num; i++){record[i] = false;         //初始化标志数组}while (count != Num)     //进程是否全部运行完毕{for (int i = 0; i < Num; i++)              //判断是否有新进程到达{if (Time >= pcb[i].come_time && record[i] == false)           //系统时间大于等于进程到达时间{sq.base[sq.rear] = pcb[i];                  //进程进入就绪队列sq.rear = (sq.rear + 1) % MAXSIZE;          //队尾指针+1record[i] = true;                           //标志true}}if (sq.rear != sq.front)      //当就绪队列不为空{if (sq.base[sq.front].runtime <= slice)     //如果队头进程估计运行时间小于或等于时间片大小{printf("*************************系统时间:%d*************************\n\n", Time);printf("当前运行的是进程%c,该进程将运行完毕,系统时间过去%d\n", sq.base[sq.front].process, sq.base[sq.front].runtime);sq.base[sq.front].state = 'C';           //进程状态置为CTime += sq.base[sq.front].runtime;       //系统时间经过该进程运行时间长度sq.base[sq.front].runtime = 0;           //进程运行完毕,估计运行时间为0show(sq);                                //输出就绪队列sq.front = (sq.front + 1) % MAXSIZE;     //进程出队count++;                                 //完成运行的进程数+1}else if (sq.base[sq.front].runtime > slice)  //如果队头进程估计运行时间大于时间片大小{printf("*************************系统时间:%d*************************\n\n", Time);printf("当前运行的是进程%c,估计运行时间减%d,系统时间过去%d\n", sq.base[sq.front].process, slice, slice);sq.base[sq.front].state = 'B';            //进程状态置为Bsq.base[sq.front].runtime -= slice;       //估计运行时间减去一个时间片show(sq);                                 //输出就绪队列   sq.base[sq.front].state = 'A';            //运行后进程状态置为BTime += slice;                            //系统时间经过一个时间片长度for (int i = 0; i < Num; i++)             //再次判断是否有新进程到达,新进程先插入队尾{if (Time >= pcb[i].come_time && record[i] == false)           //系统时间等于进程到达时间{sq.base[sq.rear] = pcb[i];                  //进程进入就绪队列sq.rear = (sq.rear + 1) % MAXSIZE;          //队尾指针+1record[i] = true;                           //标志true}}PCB e = sq.base[sq.front];                //队头进程出队sq.front = (sq.front + 1) % MAXSIZE;      //队头指针+1sq.base[sq.rear] = e;                     //再插入队尾sq.rear = (sq.rear + 1) % MAXSIZE;        //队尾指针+1}}else     //队列为空{printf("*************************系统时间:%d*************************\n", Time);printf("当前就绪队列为空!\n\n");Time++;   //系统时间+1}}
}void show(SqQueue& sq)
{printf("\n");int flag = sq.front;              if (flag == sq.rear){printf("队列为空!");}while (flag != sq.rear)    //遍历进程队列{printf("进程名:%c\t到达时间:%d\t运行时间:%d\t 进程状态:%c\n",sq.base[flag].process, sq.base[flag].come_time, sq.base[flag].runtime, sq.base[flag].state);flag = (flag + 1) % MAXSIZE;}printf("\n");
}int main()
{SqQueue sq;srand(unsigned int(time(NULL)));Num = rand() % 3 + 4;            //随机生成进程个数PCB* pcb = new PCB[Num];         //定义数组存放随机生成的进程sq.base = new PCB[MAXSIZE];      //为队列分配数组空间if (!sq.base)                    //初始化队列exit(1);sq.front = sq.rear = 0;printf("进程个数为%d个,时间片大小为%d,进程状态(A:就绪,B:运行,C:完成)\n", Num, slice);init(pcb);                 //初始化进程信息printf("以下为初始化的进程信息:\n");for (int i = 0; i < Num; i++)                 //打印初始化的进程信息{printf("进程名:%c\t到达时间:%d\t运行时间:%d\t进程状态:%c\n",pcb[i].process, pcb[i].come_time, pcb[i].runtime, pcb[i].state);}printf("\n");sort(pcb);                 //根据到达时间对进程排序printf("以下为排序后的进程信息:\n");for (int i = 0; i < Num; i++)                 //打印排序后的进程{printf("进程名:%c\t到达时间:%d\t运行时间:%d\t进程状态:%c\n",pcb[i].process, pcb[i].come_time, pcb[i].runtime, pcb[i].state);}printf("\n");Time_slice(sq, pcb);       //时间片轮转法
}

实验结果截图比较多,就不放上来了,可以直接复制代码到vs上运行即可看到结果

操作系统课程设计-时间片轮转法相关推荐

  1. 操作系统课程设计——时间片轮转算法模拟

    代码实现: #include <iostream> #include <stdio.h> #include <malloc.h>typedef struct nod ...

  2. 操作系统课程设计——进程调度模拟程序(JAVA语言实现)

    本科期间的一些学习回忆记录(自己用) 一.课程设计的任务和要求 本次课程设计的题目是,时间片轮转调度算法的模拟实现.要求在充分理解时间片轮转调度算法原理的基础上,编写一个可视化的算法模拟程序.  具体 ...

  3. java时间片轮转调度(操作系统课程设计)

    操作系统课程设计之时间片轮转调度算法模拟(Java版本可视化) 1. 课程设计要求 本次课程设计的题目是,时间片轮转调度算法的模拟实现.要求在充分理解时间片轮转调度算法原理的基础上,编写一个可视化的算 ...

  4. linux课程设计死锁避免,linux操作系统课程设计—车辆死锁.doc

    linux操作系统课程设计-车辆死锁.doc 键入文字"操作系统原理"课程设计BX090709吴沛儒操作系统原理课程设计报告姓名吴沛儒班级BX0907学号9指导老师胡静二〇一一年十 ...

  5. 计算机操作实践的课程描述,计算机操作系统课程设计实践报告-Read.DOC

    计算机操作系统课程设计实践报告-Read <计算机操作系统>课程设计实践报告 班级:计科31班第二组 组长:吕岭 小组成员:邢自成.叶林.张鹰 [问题描述] 模拟二级以上的多级文件目录管理 ...

  6. 操作系统课程设计geekos project1-3

    概述 实验环境 GeekOS-0.3.0 Bochs和Vmware介绍 开发过程 编译运行 配置文件 前导知识 一.全局描述符表GDT(Global Descriptor Table) 二.段选择子( ...

  7. 华南理工大学计算机操作系统课程设计大作业银行家死锁避免算法模拟,2016春操作系统大作业银行家死锁避免算法模拟.doc...

    文档介绍: 2016春操作系统大作业银行家死锁避免算法模拟20160501华南理工大学"计算机操作系统"课程设计大作业计算机科学与技术专业:春2015班级:号:2015047420 ...

  8. 操作系统课程设计--使用多线程模拟时间片轮转法调度

    本篇博文分享操作系统课程设计–使用多线程模拟时间片轮转法调度的思路及代码. 实验环境:虚拟机ubuntu18.04 ,VS Code 博主分享仅为互相学习之用,不懂的地方可以留言提问,谨防抄袭!!!谢 ...

  9. 计算机操作系统课设总结,计算机操作系统课程设计

    <计算机操作系统课程设计>由会员分享,可在线阅读,更多相关<计算机操作系统课程设计(36页珍藏版)>请在人人文库网上搜索. 1.操作系统课程设计实验报告姓 名: 李文孝 班 级 ...

最新文章

  1. Java异常处理12条军规
  2. PostSharp AOP编程:3.PostSharp的LocationInterceptionAspect类基本组成
  3. mysql存储过程获取sqlstate message_text
  4. jsp 使用base标签 没有作用_JSP学习篇
  5. 【web实战2】基于源码搭建小说自动采集网站
  6. Python开发基础 day5 函数的定义与使用
  7. java and dsl_Groovy语法糖以及DSL
  8. Hibernate 与 Mybatis 如何共存?打破你的认知!
  9. Jquery中BlockUI的详解
  10. 203.移除链表元素
  11. 气压传动PLC控制机械手臂实验实训台,QY-QDSY01
  12. [面试系列]牛客网前端社招面试
  13. 学习大数据,为大家推荐几本好书
  14. 通过Frp内网穿透和Nginx反向代理实现不带端口号访问家里内网服务器网站
  15. 蛋白质结构预测的意义、方法、数据库
  16. 微信小程序完成简单的模仿抖音点赞效果动画wx.createAnimation
  17. java购物车设计_Java简单购物车设计
  18. DHCP服务的配置与使用
  19. mysql 慢日志 逻辑读_运维日记| MySQLOracle深度解析之一:逻辑读
  20. 部分期刊的缩写(计算机方向)、期刊缩写及其影响因子的查询方法

热门文章

  1. new String 详解
  2. CSDN发表文章后总是待审核的原因
  3. 张益唐零点问题论文会是什么结果?
  4. [CISCN2019 华北赛区 Day1 Web2]ikun
  5. windows 网管总结
  6. 深度学习平台使用文档
  7. 在MATLAB中手动安装MinGW64详细教程
  8. 【STM32F767】使用RTThread和TouchGFX实现DIY数字仪表(四)——同步网络时间
  9. 前端学习 星星评分的设计。
  10. React中antd日期选择框,指定区间禁用时间