操作系统 进程调度 实验(C语言) |
您所在的位置:网站首页 › c语言实现进程调度 › 操作系统 进程调度 实验(C语言) |
进程调度
基本要求
在进程控制实验基础上实现按先来先服务FCFS、短作业优先SJF以及时间片轮转算法调度进程的模拟过程。根据当前所设定调度算法,连续调度所有进程,并计算每个进程的周转时间和带权周转时间、所有进程的平均周转时间和平均带权周转时间。实现调度算法时应适当输出调度过程中各进程状态队列的变化情况以及进程的已执行时间、还需服务时间(针对时间片轮转算法)。同时可以考虑优先级等其它的进程调度算法,独立的避免死锁的银行家算法。 实验提示
1、 调度算法:程序开始运行时选择调度算法,创建进程时输入进程所需服务时间以及到达时间。可参考如下数据结构:
struct PCB{ char name[10]; int size; int arrival_time; //到达时间 int burst_time; //服务时间 int finished_time; //结束运行时间 int runned_time; //已运行时间 struct PCB*next; }; struct PCB *ready,*blocked,*running,*finished;
其中,finished队列是已运行结束的进程队列,便于统计各项时间数据。
2、 银行家算法:首先检查安全性,然后进程资源请求后及其安全检测。 2.1数据结构
1) 可利用资源向量Available。这是一个含有m个元素的数组,其中的而每一个元素代表一类可利用资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态的改变。如果Available[j]=K,则表示系统中现有Rj类资源K个。
2) 最大需求矩阵Max。这是一个n*m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=K;则表示进程i需要Rj类资源的最大数目为K。
3) 分配矩阵Allocation。这也是一个n*m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K。
4) 需求矩阵Need。这也是一个n*m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成任务。
上述三个矩阵间存在下述关系:Need[i,j]=Max[i,j]-Allocation[i,j] 2.2设计思路 第一部分:银行家算法模块
1).如果Request p[j+1].arrival_time) { p[0] = p[j]; p[j] = p[j+1]; p[j+1] = p[0]; } // 到达顺序相同 按服务时间排序 else if (p[j].arrival_time == p[j+1].arrival_time) { if (p[j].burst_time > p[j+1].burst_time) { p[0] = p[j]; p[j] = p[j+1]; p[j+1] = p[0]; } } } } p[1].start_time = p[1].arrival_time; p[1].finished_time = p[1].arrival_time + p[1].burst_time; p[1].T = p[1].finished_time - p[1].arrival_time; p[1].W = p[1].T / p[1].burst_time; int time = p[1].finished_time; // 过程 for (int i = 2; i p[j].burst_time) { p[0] = p[j]; p[j] = p[i]; p[i] = p[0]; } } else { continue; } } p[i].start_time = p[i-1].start_time + p[i-1].burst_time; p[i].finished_time = p[i-1].finished_time + p[i].burst_time; p[i].T = p[i].finished_time - p[i].arrival_time; p[i].W = (double)p[i].T / p[i].burst_time; time = p[i].finished_time; } double sum_T = 0; double sum_W = 0; for (int i = 1; i |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |