记一次C语言课堂实验:实现进程调度及三态转换,基于LinuxGCC
目录
- 代码编写
- 运行结果
代码编写
// 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相关推荐
- 语言 上课点名 缺勤_主播日记5 | “云端”传递的C语言程序设计实验课
因受疫情影响,全国各大高校纷纷延期开学,但停课不停学.停课不停教,课堂由线下向线上发生转移,教学方式也发生了转变,这既是对传统教学方法的一种挑战,也是推进和升华教学改革的一个契机.我校C语言程序设计实 ...
- c语言程序设计实验教学,C语言程序设计实验教学改革研究
语言程序设计是目前各高校计算机及其相关专业的一门基础课程,也是其它工科专业学生必修的计算机基础课程之一,是学生学习程序设计的入门课程.同时,该课程是一门应用性很强的学科.随着计算机技术飞速发展,计算机 ...
- c语言程序设计实验周信东指针,C语言程序设计实验4数组周信东
1.实验 4 数 组姓名:XXX 学号: 实验日期:XXX1. 实验目的和要求(1)掌握一维数组与二维数组的定义.使用及初始化方法.(2)学习数组作为函数参数的用法.(3)掌握字符数组和字符串函数的使 ...
- c语言程序设计的实验仪器和设备,C语言程序设计实验.doc
南京工程学院 电力工程学院 2010/ 2011 学年 第 1 学期 实 验 报 告 课程名称 C语言程序设计 实验项目名称 分支结构 实验学生班级 电气101 实验学生姓名 同组学生姓名 实验时间 ...
- c语言程序设计实验指导实验报告,C语言程序设计实验指导及报告.doc
太原理工大学现代科技学院 C语言程序设计课程 实验报告 专业班级 学 号 姓 名 指导教师 C语言程序设计 实验指导及报告 实验说明: 1.共4次实验,每次实验完成1个内容. 2.实验报告命名统一为: ...
- C\C ++语言 文件备份实验
编写C程序,模拟实现Linux文件系统的简单I/O流操作:备份文件,将源文件source.dat备份为target.dat文件.要求: (1)使用C库函数实现文件备份 (2)使用系统调用函数实现文件 ...
- 2022秋季C语言专题实验03-一维数组
2022秋季C语言专题实验03-一维数组 1 数组求平均值和小于等于平均值的实数个数 2 求最大值及其下标 3 交换最小值和最大值 4 分2列 5 求集合数据的均方差 6 斐波那契数列 7 计算平均分 ...
- 2022秋季C语言专题实验07
2022秋季C语言专题实验07 指针应用-查找数组元素 请编写函数CHG(char *S) 7-1 秋天的第一杯奶茶 7-2 统计单词 7-3 找最大字符串 7-4 字符串排序 7-5 缩写期刊名 7 ...
- 《c语言程序设计》实验报告,C语言程序设计实验实验报告_wenkub
C语言程序设计实验实验报告_wenkub 2020-08-30 16:30:07 [导读]综合使用基本结构.基本算法.函数.指针.结构体.链表等知识设计程序.需要复习课本以前所学内容,浏览上课讲解的相 ...
最新文章
- Linux那些事儿之我是Sysfs(1)sysfs初探
- 【sox】使用sox增加混响效果
- easyui datagrid表头 toolbar 固定
- 汇编第二章节检测2-1
- WINCE源代码配置文件
- Redis 小白指南(二)- 聊聊五大类型:字符串、散列、列表、集合和有序集合...
- 检查图形是否为真彩色图形
- 多重共线性诊断与R语言实践
- Nacod服务注册与发现(AP架构)、心跳检查机制
- kylin: build cube Hbase: Region Server 意外退出
- Python——assert(断言)主进程级的终止判断语句
- MAVEN创建项目后缺少文件夹
- Python 的切片语法为什么不会出现索引越界呢?
- 网上打印个人完税证明流程
- 仿照扫描全能王python程序实现
- 帝国cms生成动态php栏目,帝国cms怎么实现页面自动生成html
- 小白鼠测试---VR头戴设备-暴风魔镜4
- PPT导出高分辨率dpi图片
- BurpSuite使用详解(三)Spider功能
- 测绘人真实故事 | 放弃上万月薪从私企跳回国企