进程调度之时间片轮转调度算法(实验三)

进程调度之时间片轮转调度算法(实验三)在分时系统中 最简单最常用的就是基于时间片轮转调度算法 时间片轮转调度算法是非常公平的处理机分配方式 让就绪队列的每个进程每次仅运行一个时间片 1 时间片轮转调度算法的基本原理 nbsp nbsp 在时间片轮转调度算法中 系统根据先来先服务的原则 将所有的就绪进程排成一个就绪队列 并且每隔一段时间产生一次中断 激活系统中的进程调度程序 完成一次处理机调度 把处理机分配给就绪队列队首进程 让其执行指令 当时

在分时系统中,最简单最常用的就是基于时间片轮转调度算法,时间片轮转调度算法是非常公平的处理机分配方式,让就绪队列的每个进程每次仅运行一个时间片。

1.时间片轮转调度算法的基本原理

   在时间片轮转调度算法中,系统根据先来先服务的原则,将所有的就绪进程排成一个就绪队列,并且每隔一段时间产生一次中断,激活系统中的进程调度程序,完成一次处理机调度,把处理机分配给就绪队列队首进程,让其执行指令。当时间片结束或进程执行结束,系统再次将cpu分配给队首进程。

2.进程切换时机

      时间片尚未结束,进程已经执行结束,立即激活调度程序,将其从就绪队列中删除,在调度就绪队列的队首进程执行,开启新的时间片(计数器置0)。

    时间片已经结束,进程尚未结束,立即激活进程调度程序,未执行完的进程放到就绪队列的队尾。

3.时间片大小的确定

   在轮转调度算法中时间片的大小对系统的性能有很大的影响。若时间片很小,将有利于短作业,其能够在这个时间片内完成。时间片过小意味着会进行频繁的进程切换,这将增大系统的开销。若时间片选择太长,时间片轮转调度算法将退化为先来先服务的进程调度算法。

时间片轮转调度算法的C语言模拟

#include 
  
    #include 
   
     #include 
    
      //#define OUTALLINFO //若要输出详细的进程描述信息则打开宏 #define Max 256 #define time 2 //时间片大小 enum pathread_attr{ //进程的状态信息 runing = 1, wait, finsih }; struct Pthread{ //描述进程信息 char *name; int come_time; int need_time; int runing_time; double zz_time; double dqzz_time; enum pathread_attr attr; struct Pthread *next; Pthread() //默认构造函数 { name = NULL; come_time = 0; runing_time = need_time = 0; zz_time = 0; dqzz_time = 12.66; attr = wait; next = NULL; } void get_info(int end_time) //计算周转时间,带权周转时间 { #ifndef OUTALLINFO printf("pathread:%s over time:%d\n",name,end_time); #endif // OUTALLINFO this->zz_time = (end_time - this->come_time) * 1.0; dqzz_time = zz_time / need_time; } void copy_queue(struct Pthread *temp) //拷贝进程信息 { name = (char*)malloc(sizeof(char) * strlen(temp->name)); strcpy(name,temp->name); come_time = temp->come_time; need_time = temp->need_time; runing_time = temp->runing_time; attr = temp->attr; } }; int run_sum = 0; //统计进程的个数 void init_pthread(struct Pthread *head,const char *name,const int come_time,const int need_time) //初始化进程信息 { struct Pthread *temp = new Pthread(); temp->name = (char *) malloc(sizeof(char) * strlen(name)); strcpy(temp->name,name); temp->come_time = come_time; temp->need_time = need_time; temp->runing_time = need_time; temp->attr = wait; temp->next = head->next; head ->next = temp; return; } void out_one(struct Pthread *temp) //输出一个进程信息 { #ifdef OUTALLINFO printf("%s pathread info:\n",temp->name); printf("come_time: %d\n",temp ->come_time); printf("need_time: %d\n",temp ->need_time); switch(temp->attr){ case 1: printf("attr: waiting \n"); break; case 2: printf("attr: runing \n"); break; case 3: printf("attr: finsih \n"); break; } #endif // OUTALLINFO printf("周转时间: %0.2f\n",temp->zz_time); printf("带权周转时间: %0.2f\n",temp->dqzz_time); return; } void out_all(struct Pthread *head) //输出所有进程信息 { for(struct Pthread *p = head->next; p; p = p->next) out_one(p); return; } void add_queue(struct Pthread *head_temp,struct Pthread *head_queue) //添加进程到就绪队列 { struct Pthread *temp = new Pthread(); temp->copy_queue(head_temp); if(!head_queue->next) temp->attr = runing; else temp->attr = wait; struct Pthread *p = NULL; for(p = head_queue; p ->next; p = p->next); p->next = temp; return; } void queue_del(struct Pthread *head_queue) //从就绪队列删除一个进程 { if(!(head_queue ->next)) return; head_queue ->next->attr = finsih; out_one(head_queue ->next); struct Pthread *p = head_queue ->next; head_queue->next = p->next; delete p; return; } void sqrt_queue(struct Pthread *head_queue) //将时间片结束还未完成的进程放到队尾 { struct Pthread *p = head_queue->next; head_queue->next = p->next; p->next = NULL; struct Pthread *q = NULL; for(q = head_queue; q ->next; q = q->next); q ->next = p; return; } void mo_ni(struct Pthread *head,struct Pthread *head_queue) //模拟时间片轮转调度算法 { int run_i = 0,run_over = 0,time_runing = 0; while(time_runing >= 0){ for(struct Pthread *p = head ->next; p; p = p->next) //检查此时刻是否有进程到达 if(time_runing == p->come_time) add_queue(p,head_queue); if(head_queue ->next){ //如果就绪队列非空 if(run_i == time && head_queue->next->runing_time){ //时间片结束&&进程未完成 sqrt_queue(head_queue); //把进程放到就绪队列队尾 run_i = 0; //时间片置0 } if(!head_queue->next->runing_time){ //如果进程执行结束 head_queue->next->get_info(time_runing); queue_del(head_queue); //从就绪队列中删除该进程 run_i = 0; //时间片置0 run_over++; //统计已经结束的进程个数 } if(head_queue ->next) //如果有进程正在执行,服务时间减1 head_queue->next->runing_time--; run_i++; //时间片加1 } time_runing++; if(run_over == run_sum) //如果处理完所有进程则结束模拟 return; } return; } int main(int argc,char *argv[]) { struct Pthread *head = new Pthread(); //进程链表 struct Pthread *head_queue = new Pthread(); //就绪态进程链表队列 char name[Max]; int come_time,need_time; FILE *input_file = fopen("C:\\Users\\chenhongyu\\Desktop\\test.txt","r"); //读取测试信息 printf("plase input name come_time need_time priority,if over,plase input [Ctrl + Z]\n\n"); while(fscanf(input_file,"%s%d%d",name,&come_time,&need_time) != EOF){ init_pthread(head,name,come_time,need_time); //初始化进程链表 run_sum++; //统计总共有多少个进程 } mo_ni(head,head_queue); //模拟时间片轮转调度算法 return 0; } 
     
    
  




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

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

(0)
上一篇 2026年3月16日 下午7:32
下一篇 2026年3月16日 下午7:32


相关推荐

  • CGLIB(Code Generation Library)详解[通俗易懂]

    CGLIB(Code Generation Library)详解[通俗易懂]什么是CGLIBCGLIB是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架(Spring、dynaop)中,用以提供方法拦截操作。Hibernate作为一个比较受欢迎的ORM框架,同样使用CGLIB来代理单端(多对一和一对一)关联(延迟提取集合使用的另一种机制)。CGLIB作为一个开源项目,其代码托管在github,地址为:https://github.com/cglib/cglib为什么

    2022年5月1日
    52
  • VS2015 密钥_vs离线激活2015

    VS2015 密钥_vs离线激活2015企业版:HM6NR-QXX7C-DFW2Y-8B82K-WTYJV (一般我们都是安装的企业版)专业版:HMGNV-WCYXV-X7G9W-YCX63-B98R2

    2022年8月22日
    9
  • 私网ip和公网ip_详解

    私网ip和公网ip_详解备注:此博客为转载,原作者地址请点击此处 版权声明:本文为小小呆原创文章,转载请注明出处! https://blog.csdn.net/gui951753/article/details/79210535  IP可以分为PublicIP和Privat…

    2022年6月11日
    41
  • dojo加载树错误

    dojo加载树错误

    2022年1月8日
    47
  • RSA的公钥和私钥区别

    RSA的公钥和私钥区别一 公钥加密 nbsp 假设一下 我找了两个数字 一个是 1 一个是 2 我喜欢 2 这个数字 就保留起来 不告诉你们 私钥 然后我告诉大家 1 是我的公钥 我有一个文件 不能让别人看 我就用 1 加密了 别人找到了这个文件 但是他不知道 2 就是解密的私钥啊 所以他解不开 只有我可以用数字 2 就是我的私钥 来解密 这样我就可以保护数据了 我的好朋友 x 用我的公钥 1 加密了字符 a 加密后成了 b 放在网上 别人偷到了

    2026年3月18日
    2
  • 【转载】WebService相关概念

    【转载】WebService相关概念

    2021年11月18日
    66

发表回复

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

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