一、【实验目的】
①理解有关进程控制块、进程队列的概念。
②掌握进程优先权调度算法和时间片轮转调度算法的处理逻辑。
二、【实验内容】
①设计进程控制块PCB的结构,分别适用于优先权调度算法和时间片轮转调度算法。
②建立进程就绪队列。
③编制两种进程调度算法:优先权调度和时间片轮转调度。
三、【实验步骤】
数据结构:
struct pcb //进程控制块数据结构
{
char name [4];//进程名
int priority;//优先权
int cpuTime;//CPU运行时间
int needTime;//进程运行所需时间
int count;//进程执行次数
int round;//时间片轮转轮次
enum state process;//进程状态
struct pcb* next; //链表指针
};//定义进程PCB

struct pcb* getProcess()
{
struct pcb* q = NULL;
struct pcb* t = NULL;
struct pcb* p = NULL;

struct pcb* getProcessRound()
{
struct pcb* q = NULL;
struct pcb* t = NULL;
struct pcb* p = NULL;

struct pcb* GetNext(struct pcb* k, struct pcb* head)
{
struct pcb* t;

实验代码:

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<windows.h>
#define RNUM 5 //5个进程,可改变
#define PTIME 50 //优先级初始值 enum state //枚举类型
{ready, //就绪 execute, //执行 block, //阻塞 finish //完成
};//定义进程状态struct pcb //进程控制块数据结构
{char name [4];//进程名int priority;//优先权int cpuTime;//CPU运行时间int needTime;//进程运行所需时间int count;//进程执行次数int round;//时间片轮转轮次enum state process;//进程状态struct pcb* next; //链表指针
};//定义进程PCBstruct pcb* getProcess()
{struct pcb* q = NULL;struct pcb* t = NULL;struct pcb* p = NULL;int  i = 0;printf("请输入进程的名称和运行时间!\n");while(i < RNUM){q=(struct pcb* )malloc(sizeof(struct pcb));scanf("%s", &q->name);scanf("%d", &q->needTime);q->cpuTime = 0;q->priority = PTIME - q->needTime; q->process = ready;q->next = NULL;if(i == 0){p = q;t = q;} else{t->next = q;//创建就绪进程队列t = q;}i++;} return p;}//输入模拟测试的进程名和执行所需时间,初始设置可模拟5个进程的调度void display(struct pcb* p)
{printf("名称\t进程运行时间\t进程所需时间\t\t优先级\t\t状态\n");while(p){printf("%s\t", p->name);  //输出进程名printf("        ");printf("%d\t", p->cpuTime); //输出cpu执行时间printf("        "); printf("%d\t", p->needTime);//输出进程执行所需时间printf("        "); printf("%d\t", p->priority);//输出优先级printf("         "); switch(p->process)//输出进程状态 {case ready:printf("就绪\n");break;case execute:printf("执行\n");break;case block:printf("阻塞\n");break;case finish:printf("完成\n");break;default:break;}p = p->next;//指向下一个进程 }//显示模拟结果,包含进程名、CPU时间、运行所需时间以及优先级
}int processFinish(struct pcb* q)//进程是否结束,当还有进程没有结束时返回0
{int bl = 1;while(bl && q){bl = bl && (q->needTime == 0);q = q->next;}return bl; }//结束进程,即将队列中各进程的所需时间设置为0void couExe(struct pcb* q)
{struct pcb* t = q;int maxPriority = 0; //设最大优先级为0 while(q){if(q->process != finish){q->process = ready;if(q->needTime == 0){q->process = finish;}}if(maxPriority < q->priority && q->process != finish){maxPriority = q->priority;t = q;}q = q->next; //指向下一个进程 }if(t->needTime != 0)//如果q的所需时间不为0 {t->priority -= 3;//优先级=优先级-3 t->needTime--;//所需时间-1 t->process = execute;//进程阻塞 t->cpuTime++; //cup执行时间+1 }
}
//选择某一进程,给它分配CPU
//计算进程优先级void priorityCal(void)  //优先数调度
{struct pcb* p = NULL;system("cls");p = getProcess();int cpu = 0;system("cls");while(!processFinish(p)){cpu++;printf("cpuTime:%d\n",cpu);//输出cpu运行时间 couExe(p);display(p);Sleep(2);//system("cls");//clrscr();}printf("所有进程已经执行完毕,按任意键退出!");getchar();
}void displayMenu(void)
{printf("请选择一个算法:\n\n");printf("1 动态优先级算法\n\n");printf("2 时间片轮转算法\n\n");printf("3 退出\n\n");
}//显示调度算法菜单,可供用户选择优先权调度算法和时间片轮转调度算法struct pcb* getProcessRound()
{struct pcb* q = NULL;struct pcb* t = NULL;struct pcb* p = NULL;int i = 0;printf("请输入进程名称和进程运行时间:\n");while(i < RNUM) //5个进程进行轮转 {q = (struct pcb* )malloc(sizeof(struct pcb)); //分配空间 scanf("%s", &(q->name));//输入进程名 scanf("%d", &(q->needTime));//输入进程执行所需时间 q->cpuTime = 0;q->priority = PTIME - (q->needTime);q->process = ready; //让进程处于就绪状态 q->round = 0;q->count = 0;q->next = NULL;  if(i == 0){p = q;t = q;}else{t->next = q;t = q;}i++;}return p;}//时间片轮转调度算法创建就绪进程队列void cpuRound(struct pcb* q)
{q->cpuTime += 2;q->needTime -= 2;if(q->needTime < 0){q->needTime = 0;}q->count++;q->round++;q->process = execute; //进程进入执行状态
}//采用时间片轮转调度算法执行某一进程struct pcb* GetNext(struct pcb* k, struct pcb* head)
{struct pcb* t;t = k;do{t = t->next;}while(t && t->process == finish);if(t == NULL){t = head;while(t->next != k && t->process == finish){t = t->next;}}return t;}//获取下一个进程void setState(struct pcb* p)
{while(p){if(p->needTime == 0){p->process = finish;//如果所需执行时间为0,则设置运行状态为结東}if(p->process == execute){p->process = ready;//如果为执行状态则设置为就绪}p = p->next;}
}//设置队列中进程执行状态void displayRound(struct pcb* p)
{printf("进程名称\t进程运行时间\t进程所需时间\t进程执行次数\t轮转次数\t状态\n");while(p){printf("%s\t\t",p->name);printf("      ");printf("%d\t\t",p->cpuTime);printf("      ");printf("%d\t\t",p->needTime);printf("      ");printf("%d\t\t",p->count);printf("      ");printf("%d\t\t",p->round);printf("      ");switch(p->process){case ready:printf("就绪\n");break;case execute:printf("执行\n");break;case finish:printf("完成\n");break;}p = p->next; //跳向下一个进程 }
}//时间片轮转调度算法输出调度信息void roundCal() //循环轮转调度
{struct pcb* p;struct pcb* r;p = getProcessRound();int cpu = 0;r = p;while(!processFinish(p)){cpu += 2;cpuRound(r);r = GetNext(r, p);printf("cpu %d\n", cpu);displayRound(p);setState(p);Sleep(5);}
}//时间片轮转调度算法计算轮次及输出调度信息int main()
{displayMenu();int userInput = 0;scanf("%d", &userInput);switch(userInput){case 1:priorityCal();break;case 2:roundCal();break;case 3:break;displayMenu();scanf("%d", &userInput);}
}

结果自行运行~

操作系统实验(二):进程调度(c实现优先权调度和时间片轮转调度)相关推荐

  1. 计算机操作系统实验之进程调度(一)轮转调度法(C语言)

    计算机操作系统实验之进程调度(一)轮转调度法(C语言) 实验目的 实验内容与基本要求 轮转调度法的基本原理 实现思路及功能分析 算法流程图 全部代码 工程图 ProcessScheduling.h P ...

  2. 操作系统实验二(调度算法模拟-先进先出-时间片轮转法-优先服务调度算法)

    实验二 进程调度 一.     实验目的 1.       理解进程运行的并发性. 2.       理解处理器的三级调度. 3.       掌握先来先服务的进程调度算法. 4.       掌握短 ...

  3. 操作系统实验(进程调度)

    操作系统实验(进程调度) 一.实验目的 二.实验内容 三.实验准备 3.1优先权算法 3.2时间片轮转调度算法 四.实验 一.实验目的   1.1理解有关进程控制块.进程队列的概念.   1.2掌握进 ...

  4. 操作系统实验二:物理内存管理系统

    操作系统实验二:物理内存管理系统 一. 实验目的 二. 实验内容 三. 实验准备 [实验概述] [关键数据结构] [执行流程] 四. 实验步骤 (一) 练习0:填写已有实验 (二) 练习1:实现 fi ...

  5. 广州大学2020操作系统实验二:银行家算法

    相关资料 广州大学2020操作系统实验一:进程管理与进程通信 广州大学2020操作系统实验二:银行家算法 广州大学2020操作系统实验三:内存管理 广州大学2020操作系统实验四:文件系统 广州大学2 ...

  6. 操作系统 实验三 进程调度模拟程序

                                                          实验三 进程调度模拟程序                                   ...

  7. 2020 操作系统 实验二 进程通信

    实验二.进程通信 一.实验名称 进程通信 二.实验目的 掌握用邮箱方式进行进程通信的方法,并通过设计实现简单邮箱理解进程通信中的同步问题以及解决该问题的方法. 三.实验原理 邮箱机制类似于日常使用的信 ...

  8. 操作系统——实验二 进程管理

    1.实验目的 (1)加深对进程概念的理解,明确进程和程序的区别. (2)进一步认识并发执行的实质. (3)分析进程竞争资源现象,学习解决进程互斥的方法. 2.实验预备内容 (1)阅读Linux的sch ...

  9. 南京邮电大学操作系统实验二:线程的互斥与同步

    实验原理及内容 基于互斥锁的临界区管理 使用编辑器gedit 2_1.c,新建一个2_1.c源文件,创建双线程并发完成订票操作,输入后面的范例代码: #include <stdio.h> ...

最新文章

  1. Android开发--图形图像与动画(二)--Animation实现图像的 渐变 缩放 位移 旋转
  2. DataFountain训练赛 | 用户逾期行为预测
  3. mysql中使用like模糊查询时如何转义%
  4. LeetCode 526. 优美的排列(回溯)
  5. 一组关于女生的秘密数据!
  6. 配置SCCM 2012 SP1(七)操作系统部署
  7. 苹果 5G 掉队?!
  8. UnityShader例子:边缘检测
  9. 深入探索 Android 网络优化(三、网络优化篇)下
  10. 英雄联盟一直连接服务器win10,win10上玩英雄联盟无法连接服务器是怎么回事
  11. 仿9GAG制作过程(一)
  12. 【建议收藏】你还不知道平面设计有哪些风格?掌握这20种就够了
  13. 专访|带着问题去学习,Apache DolphinScheduler 王福政
  14. RESTORE 还原数据库
  15. shell softech 面料_MAMMUT猛犸象的黑科技大军(服装篇)
  16. php的表达爱意的一句代码,一句表达爱意的古词 最能表达爱的一句话
  17. eMMC格式化及烧录
  18. python自动化第三天-python3
  19. DataStream API:Overview
  20. 第5.2节 应用工具包得到幅相加权

热门文章

  1. 蓝桥杯——使用烧录软件快速写中断
  2. 群体智能算法之蚁群算法初探(一)
  3. 文件IO编程之学习总结
  4. Oralce EBS R12 订单行状态:实施,工作流状态: 发票连接,错误处理办法
  5. 微信小程序之实时聊天系统——页面介绍
  6. 苏州企业认定为高新技术企业后就可以享受所得税优惠吗
  7. WiFi基础学习到实战(二:WiFi网络“数据链路层”)
  8. 【计算机网络-自顶向下方法第7版】学习笔记分享
  9. 小程序模板消息报47001错误
  10. 安卓 动画的深入分析