基于优先级的时间片轮转调度算法(C语言实现) |
您所在的位置:网站首页 › c语言实现时间片轮转 › 基于优先级的时间片轮转调度算法(C语言实现) |
先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。 既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化! 由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新 如果你需要这些资料,可以添加V获取:vip1024b (备注go) 已剪辑自: http://www.demodashi.com/demo/15341.html 基于优先级的时间片轮转调度算法 1. PCB结构(Block)由此定义如下结构体: typedef struct Block { int processID; // 进程号 int priority; // 优先级 int status; // 状态 double arrivalTime; // 到达时间 double serviceTime; // 服务时间 double runTime; // 已运行时间 struct Block *next; // Next Block } Block; 2. 数据结构(队列)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pvXuaPmI-1669459048842)(/contentImages/image/jianshu/13373683-fc06e9117b622d3e.png)] ]( ) typedef struct Link { struct Block *first; // 指向队头 struct Block *last; // 指向队尾 } Link; 队列操作函数: initLink:初始化队列void initLink(Link *l) { // 分配空间并检测是否成功 l->first = l->last = (Block *)malloc(sizeof(Block)); if (!l->first) { fprintf(stderr, “Malloc Error!\n”); exit(-1); } // 空队列 l->first->next = NULL; l->last->next = NULL; } isEmpty:判断队列是否为空int isEmpty(Link *l) { return l->first->next == NULL? 1: 0; } printLInk:输出队列中所有元素的信息void printLink(Link *l) { Block *p = l->first->next; // 遍历队列并输出 printf (“\nProcess ID\tPriority\tArrival Time\tService Time\tRun Time\tStatus\n”); while (p != NULL) { printf(“\t%d\t%d\t\t%.2lf\t\t%.2lf\t\t%.2lf\t\t%s\n”, p->processID, p->priority, p->arrivalTime, p->serviceTime, p->runTime, p->status == 0? “ready”: “finished”); p = p->next; } } removeFirst:将队列中第一个元素中的数据复制到给定参数中(用于返回),并删除void removeFirst(Link *l, Block *b) { Block *t; // 空队列则直接返回 if (isEmpty(l)) { return ; } // t指向第二个Block,用于之后将队列接上 t = l->first->next->next; // 将第一个Block中的内容复制到b中,用于返回 b->processID = l->first->next->processID; b->priority = l->first->next->priority; b->arrivalTime = l->first->next->arrivalTime; b->serviceTime = l->first->next->serviceTime; b->runTime = l->first->next->runTime; b->status = l->first->next->status; // 释放第一个Block,并把队列接上 free (l->first->next); l->first->next = t; } append:将新的元素添加到队尾void append(Link *l, Block *b) { Block *t; // 分配空间,并检测是否成功 t = (Block *)malloc(sizeof(Block)); if (t == NULL) { fprintf(stderr, “Malloc Error!\n”); exit(-1); } // 将b中的内容复制到t中 t->processID = b->processID; t->priority = b->priority; t->arrivalTime = b->arrivalTime; t->serviceTime = b->serviceTime; t->runTime = b->runTime; t->status = b->status; // 将t接到队尾 t->next = NULL; l->last->next = t; l->last = t; } deleteLinkItem:删除队列中指定的元素void deleteLinkItem(Link *l, Block *target) { Block *p, *t; // 遍历队列,寻找目标Block p = l->first; while (p != NULL && p != target) { t = p; p = p->next; } // 若存在,则释放 if (p != NULL) { t->next = p->next; free§; } } sortByArrivalTime:根据进程到达时间将队列排序(从小到大)void sortByArrivalTime(Link *l, int order) { Block *p, *q, *tp, *tq; Block *temp, *min, *tmin; int minArrivalTime; // 这里使用了选择排序 tp = tq = l->first; p = q = l->first->next; while (p != NULL) { // 这个数字可以修改的大一点。。。 minArrivalTime = 9999; while (q != NULL) { // 寻找最小到达时间的Block 网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。 需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go) 一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长! 果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。** 需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go) [外链图片转存中…(img-fghWD6b1-1713206036662)] 一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长! |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |