操作系统上机实验之进程调度

实验任务2 进程调度
基本要求:要求使用随机量,比如进程的数量(在10-100之间)、各进程CPU片段大小及次数、IO片段大小及次数应是随机量,要求计算CPU使用率、IO使用率、平均周转时间、平均带权周转时间。

1、基本理论
进程的概念:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
进程管理的基本理论描述;操作系统的职能之一,主要是对处理机进行管理。为了提高CPU的利用率而采用多道程序技术。通过进程管理来协调多道程序之间的关系,使CPU得到充分的利用。
衡量进程调度性能的指标是什么?常用调度算法有哪些?
答:周转时间 、响应时间、CPU-I/O执行期。常用的进程调度算法有时间片轮转调度算法、优先权调度算法、多级队列调度算法、多级反馈队列调度算法等。
时间片轮转 Round - Robin(RR)调度算法:它用于进程调度,是分时系统采用的主要调度算法。在 RR 算法中,时间片的大小对系统性能有很大的影响。
优先权调度算法:静态优先权在进程创建时确定,且的在整个生命期中保持不变。
多级队列调度算法:多队列调度是根据作业的性质和类型的不同,将就绪队列再分为若干个子队列,所有的作业(或进程)按其性质排入相应的队列中,而不同的就绪队列采用不同的调度算法。
多级反馈队列调度算法:多级反馈队列调度算法,不必事先知道各种进程所需的执行时。
2实验的目的
通过模拟进程调度功能,加深关于进程概念和进程调度的理解,明确不同调度算法的优缺点,加深操作系统基本原理的理解。
3实验平台
编译环境:IDEA
编译语言:Java
4主要数据结构和操作
/** 初始化 PCB 信息 /
static void initPCB(){
System.out.print(“进程数: “);
int num = 10+r.nextInt(1);//cin.nextInt();
System.out.println(num+””);
pcbs = new PCB[num+1];
System.out.println(“到达时间, 运行时间”);
for(int i = 1; i <= num; i++) {
System.out.print(“进程” + i + “:”);
pcbs[i] = new PCB(i, r.nextInt(100), r.nextInt(21));
System.out.println(pcbs[i].arriveTime+" "+ pcbs[i].runTime);;//PCB(i, cin.nextInt(), cin.nextInt());
queue.offer(pcbs[i]);
}
System.out.print(“输入时间片大小:”);
timeSlice = cin.nextInt();
}
/
* 判断当前已经到达的进程, 并使之进入就绪队列 /
static boolean judge(Queue readyQueue, int currentTime){
boolean flag = false; // 为 true 表示 有 到达的进程
while (true){
PCB pcb = queue.peek(); // 最先到达的进程
if (pcb == null){ // 所有进程都已经进入了就绪队列
break;
}else if(pcb.arriveTime <= currentTime){ // 当前有进程到达
PCB runPCB = queue.poll();
readyQueue.offer(runPCB); // 进入就绪队列等待运行
flag = true;
}else { // 当前没有进程到达
break;
}
}
return flag;
}
/
* 进程进入处理机运行, 如果进程运行完成返回 true*/
static boolean processRun(PCB pcb, int currentTime){
if(pcb.hasRanTime == 0){ //进程首次运行时间
pcb.responseTime = currentTime;
}
pcb.hasRanTime++; //进入 处理机运行
System.out.printf(" %d\n", pcb.id);
if(pcb.hasRanTime == pcb.runTime){ // 进程已经结束
pcb.turnAroundTime = currentTime+1 - pcb.arriveTime; // 周转时间
pcb.waitTime = pcb.turnAroundTime - pcb.runTime; // 等待时间
pcb.responseTime -= pcb.arriveTime;
return true;
}else {
return false;
}
}
/** 处理机运行 /
static void run() {
int currentTime = 0; // 当前时间
if(!queue.isEmpty()){
currentTime = queue.peek().arriveTime;
}
/
* 定义就绪队列 /
Queue readyQueue = new LinkedList<>();
int timeSliceFlag = timeSlice; // 时间片标记 (假设 刚开始 是一个时间片的开始)
PCB runPcb = null;
System.out.println(“now 正在运行的进程”);
while (true) {
System.out.printf("%d\t ", currentTime);
if(queue.isEmpty() && readyQueue.isEmpty() && runPcb== null){
System.out.println(“当前所有进程运行结束”);
break;
}else{ // 进程进入 处理机运行
/
* 判断是否到一个时间片 /
if(timeSliceFlag % timeSlice == 0){ // 一个时间片到
/
* 判断当前已经到达的进程, 并使之进入就绪队列 /
judge(readyQueue, currentTime);
if(runPcb != null){ // 处理机上还有进程
// 此时要下处理机, 进入就绪队列
readyQueue.offer(runPcb);
runPcb = null; // 此时处理机空闲
}
runPcb = readyQueue.poll(); // 出就绪队列 if(runPcb == null){ // 就绪队列为空, 意味着此时处理机空闲,而且没有到达的进程
currentTime++; // 处理机等待
System.out.printf(" 处理机空闲,\n");
continue; // 进入下一轮
}
}
/
* 在 处理机中 运行 进程–>runPCB*/
if(processRun(runPcb, currentTime) == true){ // 运行后 进程已经结束
runPcb = null;
timeSliceFlag = timeSlice; // 重新开始一个新的时间片
}else { // 进程没有结束
timeSliceFlag++;
}
/** 时间片+1 */
currentTime++;
5问题分析和解决
问题一:调度排序算法的逻辑判断顺序
解决方案:调度排序实际上是链表排序,首先按优先级排序,若优先级相同则先来的排在前面。这里的逻辑判断顺序问题是需要着重注意的,特别要留意对队首和队尾的特殊处理上,在遍历队列时也要注意使用两个指针记录插入点的前后两个节点,毕竟这是一个单向链表。我的逻辑判断顺序是:链表是否为空;若为优先等级最高,放在队首;遍历链表,直到找到合适位置;若为优先等级最低,放在队尾。
问题二:轮转法强调先进先出的拉链式顺序,而不以其他的权值作为开始调度的先后顺序,所以普通先进先出的普通队列是解决该算法的最好方法。
解决方案:轮转法和优先权法不一样的是优先权法每次只进一个线程只执行一次。而轮转法是进一个可以执行最多是该线程可轮转的次数轮转值(可能在中间就完成线程的释放),所以在写程序的时候每次都要判断是否已经轮转。并且到最后还要判断还是否需要调度。如果需要,再抛入队尾。
6实验结果分析
1、先来先服务进程调度算法运行结果及分析第一次输入按照到来顺序输入进程,第二次输入调整顺序,两次输出结果一样,验证了先来先服务算法的正确性。先来先服务函数主要调用了按照到来时间排序函数,根据已排好序的链表,结合上一进程的结束时间以及此进程的服务时间计算出此进程的结束时间、运行时间、周转时间、带权周转时间等。
2、时间片轮转进程调度算法运行结果及分析第一次输入按照到来时间顺序输入,时间片设为1;第二次乱序输入,时间片设为4,经验证两次结果均正确(算法中先把本次时间片结束后,若当前进程未执行完毕,则先将当前进程入队,再查看已到来进程并入队。这里与真正的时间片轮转相比是一个错误,但由于时间紧急,未进行修改)函数先使用排序函数进行排序,并根据排号的序列检查对于当前时间是否已有新的进程到来,若到来,则使用队列依次存储到来进程在pcb[]中的下标。每次完成一个时间片就开始检查是否有新的进程到来,并加入队列。若队列中已就绪的进程均执行完毕且仍有部分进程没有到来,便让时间增加,每次增加都判断是否有进程到来。对于从队列取出的进程:如果进程剩余执行时间大于时间片,则减去一个时间片,并使当前时间增加一个时间片;否则进程剩余时间不足一个时间片,进程的结束时间即当前时间加上剩余时间,当前时间time增加量为此进程的剩余时间。
3、非抢占式优先级调度算法运行结果及分析
输入时乱序输入没有按照优先级顺序输入,而不按照优先级顺序输入,经验证结果正确;同样此函数使用了排序函数以及队列,按照排好的顺序依次将进程进队,之后从队列中循环查看各进程的优先级,并保存优先级最高进在pcb[]中的下标,同时将队列中此元素的优先级降到最小,为了防止0号单元的空进程占用时间,在执行时先判断下标是否为0。
7实验小结
这次实验,加深了我对进程概念及进程管理的理解,通过模拟进程调度功能,加深关于进程概念和进程调度的理解,明确不同调度算法的优缺点,加深了操作系统基本原理的理解。也让我认识到自己的不足,操作系统的有些知识,我知道的还不多,没有掌握好,还需要多多学学,不断提升自己的能力。实验中,我们小组分工合作,共同学习,虽然在实验中遇到了一些问题,但在老师和同学的细心指导和热心帮助下解决了。同时,了解到团队精神的重要性,也为以后的学习和工作打下了坚实的基础,同时积累了宝贵的经验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

次郎不小

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值