操作系统实验报告

本文详细介绍了操作系统实验中的两个重要部分:进程调度和资源分配。实验一涉及时间片轮转和先来先服务调度算法的模拟实现,通过程序展示了进程的运行过程。实验二探讨了银行家算法和随机分配资源的策略,以防止死锁并模拟系统运行状态。文章提供了丰富的代码示例,帮助理解资源分配和调度策略的工作原理。
摘要由CSDN通过智能技术生成

操作系统》实验指导书

实验  进程调度实验

一、实验的目的与要求

在多道程序或多任务系统中,系统同时处于就绪态的进程有若干个。也就是说能运行的进程数远远大于处理机个数。为了使系统中的各个进程能有条不紊的运行,必须选择某种调度策略,以选择一进程占用处理机。要求学生设计一个模拟单处理机调度的方法,以巩固和加深处理机调度的概念。

二、实验原理

处理机管理是操作系统中非常重要的部分。为深入理解进程管理部分的功能,设计几个调度算法,模拟实现处理机的调度。

三、实验仪器

一台高性能的个人计算机,计算机程序设计语言集成环境,最好能上Internet。

四、实验内容与步骤

1、实验内容

设计一个按时间片轮转法调度的算法

2、实验步骤

(1)假设系统有5个进程,每个进程用一个进程控制块PCB来代表。PCB的格式如图1所示。

其中,进程名即进程标识。

链接指针:指出下一个到达进程的进程控制块首地址。按照进程到达的顺序排队。系统设置一个队头和队尾指针分别指向第一个和最后一个进程。新生成的进程放队尾。

进 程 名

链接指针

到达时间

估计运行时间

进程状态

(2)为每个进程任意确定一个要求运行时间和到达时间。

(3)按照进程到达的先后顺序排成一个循环队列。在设一个队首指针指向第一个到达进程的首址。

(4)执行处理机调度时,开始选择队首的第一个进程运行。另外再设一个当前运行进程指针,指向当前正运行的进程。

(5)由于本实验是模拟实验,所以对选中进程并不实际启动运行,而只是执行:                                     图1进程控制块

(a)估计运行时间减1;

(b)输出当前运行进程的名字。

用这两个操作来模拟进程的一次运行。

(6) 进程运行一次后,以后的调度则将当前指针依次下移一个位置,指向下一个进程,即调整当前运行指针指向该进程的链接指针所指进程,以指示应运行进程。同时还应判断该进程的剩余运行时间是否为零。若不为零,则等待下一轮的运行;若该进程的剩余运行时间为零,则将该进程的状态置为完成态C,并退出循环队列。

(7)若就绪队列不空,则重复上述的(5)和(6)步骤直到所有的进程都运行完为止。

(8)在所设计的调度程序中,应包含显示或打印语句。以便显示或打印每次选中进程的名称及运行一次后队列的变化情况。

、注意事项

(1)给出所选实验题目。

(2)给出程序中源程序名和执行程序名。

(3)给出程序中使用的数据结构及符号说明。

(4)给出程序流程图和源程序,源程序中要附有详细的注释。

(5)打印程序运行时的初值和运行结果,要求如下:

(1)各进程控制块的初始状态;

(2)选中运行进程的名、运行后各进程控制块状态以及每次调度时,就绪队列的进程排列顺序。

(6)总结收获体会及对该题解的改进意见和见解

、思考题

1、设计一个按先来先服务调度的算法。

2、设计一个按优先级调度的算法。

附参考代码

先来先服务

package operate;

import java.util.PriorityQueue;

import java.util.Queue;

import java.util.Scanner;

/**

 * 先来先服务 算法 FCFS

 * 非抢占式

 * @author ymj

 * @Date: 2019/12/15 20:22

 */

public class FCFS {

    static Scanner cin = new Scanner(System.in);

    /** 进程控制块 */

    static class PCB implements Comparable<PCB>{

        int id; // 进程id

        int arriveTime; // 到达时间

        int runTime; // 运行时间

        int turnAroundTime; // 周转时间

        int waitTime; // 等待时间

        PCB(int id, int arriveTime, int runTime){

            this.id = id;

            this.arriveTime = arriveTime;

            this.runTime = runTime;

        }

        @Override

        public int compareTo(PCB o) { // 按照 到达时间 进入就绪队列

            return  this.arriveTime - o.arriveTime;

        }

    }

    static PCB[] pcbs;

    /** 就绪队列 */

    static Queue<PCB> queue = new PriorityQueue<>();

    /** 初始化 PCB 信息 */

    static void initPCB(){

        System.out.print("输入进程数: ");

        int num = cin.nextInt();

        pcbs = new PCB[num+1];

        System.out.println("输入到达时间, 运行时间");

        for(int i = 1; i <= num; i++) {

            System.out.print("进程" + i + ":");

            pcbs[i] = new PCB(i, cin.nextInt(), cin.nextInt());

            queue.offer(pcbs[i]);

        }

    }

    /** 处理及运行 */

    static void run() {

        int currentTime = 0; // 当前时间

        if(!queue.isEmpty()){

            currentTime = queue.peek().arriveTime;

        }

        while (true) {

            if(queue.isEmpty()){

                System.out.println("当前所有进程运行结束");

                break;

            }else{ // 进程进入 处理机运行

                PCB runPCB = queue.poll(); // 1. 出就绪队列

                System.out.println("当前时间:" + currentTime);

                System.out.println("进程" + runPCB.id + "开始运行------");

                runPCB.waitTime = currentTime - runPCB.arriveTime; // 计算等待时间

                currentTime += runPCB.runTime; // 2. 进入处理机运行

                System.out.println("当前时间:" + currentTime);

                System.out.println("进程" + runPCB.id + "运行结束------");

                runPCB.turnAroundTime = currentTime - runPCB.arriveTime; // 计算周转时间

            }

        }

    }

    public static void main(String[] args) {

        initPCB();

        System.out.println("-----处理机开始运行-----");

        run();

        System.out.println("-----处理机运行结束-----");

        showTurnAroundTime();

    }

    // 周转时间

    private static void showTurnAroundTime() {

        double averageT = 0;

        double averageWTAT = 0;

        double averageWT = 0;

        System.out.println("进程\t 周转时间\t 带权周转时间\t 等待时间\t");

        for (i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

在火星上班

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

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

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

打赏作者

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

抵扣说明:

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

余额充值