按时间片轮转调度算法(C++实现)

按时间片轮转调度算法(C++实现)算法思想 按时间片轮转调度算法 1 假设系统中有 5 个进程 每个进程有一个进程控制块 PCB 来标识 进程控制块内容包括 进程名 链接指针 到达时间 估计运行时间 进程状态 进程名即进程标识 链接指针 按照进程到达系统的时间将处于就绪状态的进程连接成一个就绪队列 指针指出下一个到达进程的进程控制块地址 最后一个进程的链接指针为 NULL 2 为每个进程任意确定一个到达时间和要求

算法思想:

按时间片轮转调度算法:

(1)假设系统中有5个进程,每个进程有一个进程控制块(PCB)来标识。进程控制块内容包括:进程名,链接指针,到达时间,估计运行时间,进程状态。

进程名即进程标识。

链接指针:按照进程到达系统的时间将处于就绪状态的进程连接成一个就绪队列。指针指出下一个到达进程的进程控制块地址。最后一个进程的链接指针为NULL。

(2)为每个进程任意确定一个到达时间和要求运行时间。

(3)设置一个队首指针head,用来指出最先进入系统的进程。各就绪进程通过链接指针连在一起构成一个循环队列。

(4)处理机调度时开始选择队首指针指向的进程投入运行。由于本实验是模拟试验,所以对被选中进程并不实际启动运行,而只是执行:估计运行时间减1。用这个操作来模拟进程的一次运行,而且省去进程的现场保护和现场恢复工作。

(5)进程运行一次后,以后的调度则将当前指针依次下移一个位置,指向下一个进程。同时还应判断该进程的剩余的运行时间是否为0,若不为0,则等待下一轮的运行;若该进程的剩余时间为0,则把它的状态改为完成态(C),并撤出就绪队列。

(6)若就绪队列非空,则重复上述的(4)和(5),直到所有进程为完成态。

(7)在所设计的程序中应有显示或打印语句,能显示或打印正运行进程的进程名、已运行时间、还剩时间、就绪队列中的进程等。

代码:

#include 
  
    #include 
   
     using namespace std; typedef struct pcb { string pName;//进程名 struct pcb *next;//指向下一个进程 float arriveTime;//到达时间 float serviceTime;//服务时间 float estimatedRunningtime;//估计运行时间 float startTime;//开始时间 float finishTime;//完成时间 float turnaroundTime;//周转时间 float weightedTuraroundTime;//带权周转时间 char state;//进程的状态 }PCB; void createProcess(PCB *p, int n) {//创建n个进程,带头结点 cout << endl << endl << "创建进程" << endl; PCB *q = p;//工作指针的前一个结点指针 PCB *r = new PCB;//工作指针 for (int i = 0; i 
    
      > r->pName; cin >> r->arriveTime; cin >> r->serviceTime; r->startTime = 0; r->finishTime = 0; r->estimatedRunningtime = r->serviceTime; r->turnaroundTime = 0; r->weightedTuraroundTime = 0; r->state = 'R'; q->next = r; q = r; r->next = new PCB; r = r->next; } r->next = NULL; q->next = NULL; q = NULL; delete q; delete r; cout << endl << endl; } void sortOfArriveTime(PCB *p, int n) {//按到达时间对进程排序 PCB *t = new PCB; PCB *q = new PCB; PCB *m = new PCB; for (int i = 0; i 
     
       next;//q指向链表中的第一个进程 for (int j = 0; j 
      
        next; if (q->arriveTime>m->arriveTime) {//结点信息进行交换 t->pName = q->pName; t->arriveTime = q->arriveTime; t->serviceTime = q->serviceTime; t->estimatedRunningtime = q->estimatedRunningtime; q->pName = m->pName; q->arriveTime = m->arriveTime; q->serviceTime = m->serviceTime; q->estimatedRunningtime = m->estimatedRunningtime; m->pName = t->pName; m->arriveTime = t->arriveTime; m->serviceTime = t->serviceTime; m->estimatedRunningtime = t->estimatedRunningtime; } q = q->next; } } t = NULL; m = NULL; q = NULL; delete t; delete m; delete q; } void runProcess(PCB *p, int n) {//运行进程 PCB *q = new PCB; PCB *m = new PCB; PCB *s = new PCB; int a = n; sortOfArriveTime(p, n); q = p; m = p->next; int currentTime = 0;//当前时间 int i = 0; int number = 0; while (true) { currentTime++; if (i == 0 && m->arriveTime>currentTime)//首次运行进程 continue; number = 0; while (m&&m->state == 'C' || m&&m->arriveTime>currentTime) {//寻找应该访问的进程 number++; q = m; m = m->next; if (m == NULL) { q = p; m = p->next; } if (number>n) break; } if (number>n)//所有进程都不能进行访问 continue; cout << "正在运行的进程" << endl; cout << "当前时间:" << currentTime << endl; cout << "进程名\t到达时间 服务时间 已运行时间 还剩运行时间" << endl;//输出当前正在运行的进程 cout << m->pName << "\t" << m->arriveTime << "\t " << m->serviceTime << "\t "; cout << m->serviceTime - m->estimatedRunningtime << "\t " << m->estimatedRunningtime << endl; m->estimatedRunningtime--; m->finishTime = currentTime + 1; if (m->estimatedRunningtime == 0) m->state = 'C'; cout << "进程" << m->pName << "执行一次之后就绪队列中的进程" << endl; cout << "进程名\t到达时间 服务时间 已运行时间 还剩运行时间" << endl; s = p->next; while (s) {//输出就绪队列 if (s->estimatedRunningtime != 0) { cout << s->pName << "\t" << s->arriveTime << "\t " << s->serviceTime << "\t "; cout << s->serviceTime - s->estimatedRunningtime << "\t " << s->estimatedRunningtime << endl; } s = s->next; } cout << endl << endl << endl; q = m; m = m->next;//q、m指针后移 if (m == NULL) {//回到链表头部 q = p; m = p->next; } s = p->next; while (s&&s->state == 'C') s = s->next; if (s == NULL)//若所有进程已完成,则退出循环 break; i++; } q = p; m = p->next; for (int i = 0; i 
       
         startTime = m->arriveTime; m->turnaroundTime = m->finishTime - m->arriveTime; m->weightedTuraroundTime = m->turnaroundTime*1.0 / m->serviceTime; } else { m->startTime = q->startTime + 1>m->arriveTime ? q->startTime + 1 : m->arriveTime; m->turnaroundTime = m->finishTime - m->arriveTime; m->weightedTuraroundTime = m->turnaroundTime*1.0 / m->serviceTime; } m = m->next; } q = NULL; m = NULL; s = NULL; delete q; delete m; delete s; cout << endl; } void printProcess(PCB *p) {//输出所有进程的信息 PCB *q = p->next; cout << endl << "所有进程运行完成后进程的相关信息" << endl; cout << "进程名\t到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间" << endl; while (q) { cout << q->pName << "\t" << q->arriveTime << "\t " << q->serviceTime << "\t "; cout << q->startTime << "\t " << q->finishTime << "\t " << q->turnaroundTime << "\t " << q->weightedTuraroundTime << endl; q = q->next; } cout << endl << endl; } int main() { PCB *p = new PCB; int n; cout << "请输入进程的个数:"; cin >> n; createProcess(p, n); runProcess(p, n); printProcess(p); getchar(); getchar(); return 0; } 
        
       
      
     
    
  

实验结果:

按时间片轮转调度算法(C++实现)

按时间片轮转调度算法(C++实现)

按时间片轮转调度算法(C++实现)

按时间片轮转调度算法(C++实现)

按时间片轮转调度算法(C++实现)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/206589.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午3:24
下一篇 2026年3月19日 下午3:24


相关推荐

  • [总结]视音频编解码技术零基础学习方法

    [总结]视音频编解码技术零基础学习方法一直想把视音频编解码技术做一个简单的总结,可是苦于时间不充裕,一直没能完成。今天有着很大的空闲,终于可以总结一个有关视音频技术的入门教程,可以方便更多的人学习从零开始学习视音频技术。需要注意的是,本文所说的视音频技术,指的是理论层面的视音频技术,并不涉及到编程相关的东西。

    2022年7月13日
    20
  • JVM成神之路-类加载机制-双亲委派,破坏双亲委派

    概述概念虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接时候用的Java类型。类的生命周期类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用、卸载。其中验证、准备、解析统称为连接上图中,加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须严…

    2022年4月16日
    38
  • 云服务器和虚拟主机有什么区别?区别大吗?

    云服务器和虚拟主机有什么区别?区别大吗?云服务器和虚拟主机有什么区别?区别大吗?如今云服务器和虚拟主机已经成为众多企业和个人建站的必选之一,两者其实各有各的优点,云服务器是一种简单高效、安全可靠、处理能力可弹性伸缩的计算服务,用户无需提前购买硬件,即可迅速创建或释放任意多台云服务器。它的好处是可独立分配CPU、内存、带宽等资源。而虚拟主机,是将一台服务器分割成若干相对独立的主机的技术。每台切割出的主机在功能上都可以实现WWW、FTP、Mail等基本的Internet服务,跟独立的主机几乎一样,但是这台服务器上所有的用户共享一个IP。下面赵一

    2022年6月25日
    23
  • 网络天才网页版在线玩无需下载(中国破解网络的天才)

    网络天才这是一款解谜问答类的娱乐游戏,用独具色彩的画面风格,以阿拉丁为故事背景,可以用几个问题来猜出你心中所想,并体验多种思维导向与解谜挑战,非常适合闲暇时间里休闲娱乐一下。感兴趣的快来下载吧!游戏特色释放你的创造力由于Geniz,你可以解锁,并玩转新的背景,随意定制Akinator。这个精灵将变成一个吸血鬼、牛仔或迪斯科舞者。继续猜每天尝试找出5个神秘人物,赢得特别的天才,用来定制你最喜欢的妖怪…

    2022年4月18日
    5.6K
  • 腾讯元宝再更新!支持上传、导出腾讯文档

    腾讯元宝再更新!支持上传、导出腾讯文档

    2026年3月12日
    3
  • itextpdf 二维码[通俗易懂]

    itextpdf 二维码[通俗易懂]itextpdf二维码

    2022年6月26日
    53

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号