目录

  • 代码编写
  • 运行结果

代码编写

// Author: Elin.Liu
// Date: 2022-11-01 10:37:20
// Last Modified by:   Elin.Liu
// Last Modified time: 2022-11-01 10:37:20#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define ready 0
#define running 1
#define blocking 2
#define nProcess 5
#define done 3/*初始化总线进程时间*/
int busTime = 0;struct Process
{int ID;          /*进程标识数ID*/int ARRIVE_TIME; /*进程到达时间*/int PRIORITY;    /*进程优先数PRIORITY*/int CPU_TIME;    /*进程已经占用CPU时间CPU_TIME*/int ALL_TIME;    /*进程总共需要占用CPU时间ALL_TIME*/int START_BLOCK; /*进程开始阻塞时间START_BLOCK*/int BLOCK_TIME;  /*进程阻塞时间BLOCK_TIME*/int STATE;       /*进程状态STATE*/int NEXT;        /*进程下一个状态NEXT*/
};void createProcess(int n, struct Process *p)
{int i;for (i = 0; i < n; i++){p[i].ID = i;                       /*初始化ID为序列化ID*/p[i].ARRIVE_TIME = rand() % 100;   /*初始化到达时间为0-100随机数*/p[i].PRIORITY = rand() % 10;       /*初始化优先数为0-9的随机数*/p[i].CPU_TIME = 0;                 /*初始化CPU时间为0*/p[i].ALL_TIME = rand() % 10 + 1;   /*初始化总共需要占用CPU时间为1-10的随机数*/p[i].START_BLOCK = rand() % 10;    /*初始化开始阻塞时间为0-9的随机数*/p[i].BLOCK_TIME = rand() % 10 + 1; /*初始化阻塞时间为1-10的随机数*/p[i].STATE = ready;                /*初始化状态为就绪态*/p[i].NEXT = i + 1;                 /*初始化下一个状态为下一个进程*/}
}/*定义进程处理函数*/
void scheduling(int id, struct Process *p)
{int i;/*获取当前进程的CPU时间*/int cpuTime = p[id].CPU_TIME;/*获取当前进程的总共需要占用CPU时间*/int allTime = p[id].ALL_TIME;/*获取当前进程的开始阻塞时间*/int startBlock = p[id].START_BLOCK;/*开始执行该进程*/printf("进程%d开始执行!\n", id);for (i = p[id].CPU_TIME; i < allTime; i++){/*总时间开始进行推移*/busTime++;/*在进程生命周期内增加CPU时间*/p[id].CPU_TIME++;/*如果当前进程的CPU时间节点到了阻塞时间点*/if (p[id].CPU_TIME == startBlock && p[id].ALL_TIME != startBlock){/*则将进程的状态转换为阻塞状态*/p[id].STATE = blocking;printf("进程%d已被阻塞!\n", id);break;}}if (p[id].CPU_TIME == p[id].ALL_TIME){p[id].STATE = done;printf("进程%d已经完成!\n", id);}
}/*定义进程转换函数*/
void block2ready(int id, struct Process *p)
{/*如果当前的进程状态为阻塞状态,且CPU时间已经到了可释放的时间*/if (busTime >= 0 + p[id].START_BLOCK + p[id].BLOCK_TIME && p[id].STATE == blocking){p[id].STATE = ready;printf("进程%d已被释放!\n", id);}else{printf("无法解锁当前进程:%d!\n", id);}
}/*初始化先来先服务排序*/
void FCFS(struct Process *p, struct Process *FCFCP)
{int i, j;for (i = 0; i < nProcess; i++){for (j = 0; j < nProcess; j++){if (p[i].ARRIVE_TIME < p[j].ARRIVE_TIME){FCFCP[i] = p[j];}}}
}/*初始化短作业优先排序*/
void SJF(struct Process *p, struct Process *SJFP)
{int i, j;for (i = 0; i < nProcess; i++){for (j = 0; j < nProcess; j++){if (p[i].ALL_TIME < p[j].ALL_TIME){SJFP[i] = p[j];}}}
}/*初始化优先级排序*/
void PRIORITY_FIRST(struct Process *p, struct Process *PRIORITYP)
{int i, j;for (i = 0; i < nProcess; i++){for (j = 0; j < nProcess; j++){if (p[i].PRIORITY < p[j].PRIORITY){PRIORITYP[i] = p[j];}}}
}/*定义运行函数*/
void runningFunc(struct Process *p)
{/*调用执行函数*/for (int i = 0; i <= nProcess; i++){/*如果当前的进程状态为就绪状态*/if (p[i].STATE == ready){/*则调度当前进程*/scheduling(i, p);}}/*再检索一遍当前的进程列表*/for (int i = 0; i <= nProcess; i++){/*如果当前的进程状态为阻塞状态*/if (p[i].STATE == blocking){/*则解锁当前进程*/block2ready(i, p);}}/*最后检索一遍进程列表,以执行最后未完成的进程*/for (int i = 0; i <= nProcess; i++){if (p[i].STATE == ready){scheduling(i, p);}}
}void main(void)
{/*初始化随机种子*/srand((unsigned)time(NULL));/*初始化进程*/struct Process *process = (struct Process *)malloc(sizeof(struct Process) * nProcess);/*创建进程*/createProcess(nProcess, process);/*使用先来先服务重新排序*/struct Process *FCFSProcess = (struct Process *)malloc(sizeof(struct Process) * nProcess);FCFS(process, FCFSProcess);/*使用短作业优先重新排序*/struct Process *SJFProcess = (struct Process *)malloc(sizeof(struct Process) * nProcess);SJF(process, SJFProcess);/*使用优先级重新排序*/struct Process *PRIORITYProcess = (struct Process *)malloc(sizeof(struct Process) * nProcess);PRIORITY_FIRST(process, PRIORITYProcess);/*释放原始进程内存*/free(process);/*按照先来先服务执行进程*/printf("将以先来先服务原则执行进程!\n");runningFunc(FCFSProcess);for (int i = 0; i <= 10; i++){printf("-");}printf("\n");/*释放先来先服务内存*/free(FCFSProcess);/*将总线时间置0*/busTime = 0;/*按照短作业优先执行进程*/printf("将以短作业优先原则执行进程!\n");runningFunc(SJFProcess);for (int i = 0; i <= 10; i++){printf("-");}printf("\n");/*释放短作业优先内存*/free(SJFProcess);/*将总线时间置0*/busTime = 0;/*按照优先级执行进程*/printf("将以优先级原则执行进程!\n");runningFunc(PRIORITYProcess);for (int i = 0; i <= 10; i++){printf("-");}printf("\n");/*释放优先级内存*/free(PRIORITYProcess);/*将总线时间置0*/busTime = 0;printf("所有进程作业全部完成!\n");
}

运行结果

将以先来先服务原则执行进程!
进程0开始执行!
进程0已被阻塞!
进程1开始执行!
进程1已被阻塞!
进程2开始执行!
进程2已被阻塞!
进程3开始执行!
进程3已经完成!
进程4开始执行!
进程4已经完成!
进程0已被释放!
进程1已被释放!
进程2已被释放!
进程0开始执行!
进程0已经完成!
进程1开始执行!
进程1已经完成!
进程2开始执行!
进程2已经完成!
-----------
将以短作业优先原则执行进程!
进程0开始执行!
进程0已被阻塞!
进程1开始执行!
进程1已被阻塞!
进程2开始执行!
进程2已被阻塞!
进程3开始执行!
进程3已被阻塞!
进程4开始执行!
进程4已经完成!
进程0已被释放!
进程1已被释放!
进程2已被释放!
进程3已被释放!
进程0开始执行!
进程0已经完成!
进程1开始执行!
进程1已经完成!
进程2开始执行!
进程2已经完成!
进程3开始执行!
进程3已经完成!
-----------
将以优先级原则执行进程!
进程0开始执行!
进程0已经完成!
进程1开始执行!
进程1已经完成!
进程2开始执行!
进程2已被阻塞!
进程3开始执行!
进程3已经完成!
进程4开始执行!
进程4已经完成!
进程2已被释放!
进程2开始执行!
进程2已经完成!
-----------
所有进程作业全部完成!

记一次C语言课堂实验:实现进程调度及三态转换,基于LinuxGCC相关推荐

  1. 语言 上课点名 缺勤_主播日记5 | “云端”传递的C语言程序设计实验课

    因受疫情影响,全国各大高校纷纷延期开学,但停课不停学.停课不停教,课堂由线下向线上发生转移,教学方式也发生了转变,这既是对传统教学方法的一种挑战,也是推进和升华教学改革的一个契机.我校C语言程序设计实 ...

  2. c语言程序设计实验教学,C语言程序设计实验教学改革研究

    语言程序设计是目前各高校计算机及其相关专业的一门基础课程,也是其它工科专业学生必修的计算机基础课程之一,是学生学习程序设计的入门课程.同时,该课程是一门应用性很强的学科.随着计算机技术飞速发展,计算机 ...

  3. c语言程序设计实验周信东指针,C语言程序设计实验4数组周信东

    1.实验 4 数 组姓名:XXX 学号: 实验日期:XXX1. 实验目的和要求(1)掌握一维数组与二维数组的定义.使用及初始化方法.(2)学习数组作为函数参数的用法.(3)掌握字符数组和字符串函数的使 ...

  4. c语言程序设计的实验仪器和设备,C语言程序设计实验.doc

    南京工程学院 电力工程学院 2010/ 2011 学年 第 1 学期 实 验 报 告 课程名称 C语言程序设计 实验项目名称 分支结构 实验学生班级 电气101 实验学生姓名 同组学生姓名 实验时间 ...

  5. c语言程序设计实验指导实验报告,C语言程序设计实验指导及报告.doc

    太原理工大学现代科技学院 C语言程序设计课程 实验报告 专业班级 学 号 姓 名 指导教师 C语言程序设计 实验指导及报告 实验说明: 1.共4次实验,每次实验完成1个内容. 2.实验报告命名统一为: ...

  6. C\C ++语言 文件备份实验

     编写C程序,模拟实现Linux文件系统的简单I/O流操作:备份文件,将源文件source.dat备份为target.dat文件.要求: (1)使用C库函数实现文件备份 (2)使用系统调用函数实现文件 ...

  7. 2022秋季C语言专题实验03-一维数组

    2022秋季C语言专题实验03-一维数组 1 数组求平均值和小于等于平均值的实数个数 2 求最大值及其下标 3 交换最小值和最大值 4 分2列 5 求集合数据的均方差 6 斐波那契数列 7 计算平均分 ...

  8. 2022秋季C语言专题实验07

    2022秋季C语言专题实验07 指针应用-查找数组元素 请编写函数CHG(char *S) 7-1 秋天的第一杯奶茶 7-2 统计单词 7-3 找最大字符串 7-4 字符串排序 7-5 缩写期刊名 7 ...

  9. 《c语言程序设计》实验报告,C语言程序设计实验实验报告_wenkub

    C语言程序设计实验实验报告_wenkub 2020-08-30 16:30:07 [导读]综合使用基本结构.基本算法.函数.指针.结构体.链表等知识设计程序.需要复习课本以前所学内容,浏览上课讲解的相 ...

最新文章

  1. Linux那些事儿之我是Sysfs(1)sysfs初探
  2. 【sox】使用sox增加混响效果
  3. easyui datagrid表头 toolbar 固定
  4. 汇编第二章节检测2-1
  5. WINCE源代码配置文件
  6. Redis 小白指南(二)- 聊聊五大类型:字符串、散列、列表、集合和有序集合...
  7. 检查图形是否为真彩色图形
  8. 多重共线性诊断与R语言实践
  9. Nacod服务注册与发现(AP架构)、心跳检查机制
  10. kylin: build cube Hbase: Region Server 意外退出
  11. Python——assert(断言)主进程级的终止判断语句
  12. MAVEN创建项目后缺少文件夹
  13. Python 的切片语法为什么不会出现索引越界呢?
  14. 网上打印个人完税证明流程
  15. 仿照扫描全能王python程序实现
  16. 帝国cms生成动态php栏目,帝国cms怎么实现页面自动生成html
  17. 小白鼠测试---VR头戴设备-暴风魔镜4
  18. PPT导出高分辨率dpi图片
  19. BurpSuite使用详解(三)Spider功能
  20. 测绘人真实故事 | 放弃上万月薪从私企跳回国企

热门文章

  1. 英语速成的窍门—你需要掌握这些【胶水词】
  2. 集团公司治理及运营管理图解
  3. Windowsnbsp;XPnbsp;Modenbsp;中文正式版下载nbsp;(…
  4. excel随机生成数字或者字母
  5. 2017年复合材料与高分子科学工程国际会议(CMPSE2017)
  6. 赶快进来!!!手把手教你贪吃蛇
  7. 原神Genshin Impact Mac高清动态壁纸
  8. Omi NTFS磁盘专家 for Mac - Mac磁盘读写工具
  9. C语言的组成及一些基本术语概念
  10. 配置Mondrian源码