操作系统实验一:处理器调度算法的实现

 

1)加深对处理机调度的作用和工作原理的理解。

2)进一步认识并发执行的实质。

 

二、实验要求:

本实验要求用高级语言,模拟在单处理器情况下,采用多个调度算法,对N个进程进行进程调度。语言自选。

并完成实验报告。

  

三、实验内容:

在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。

当就绪状态进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。

  1. 进程及进程队列的表示。
  2. 处理器调度算法:FCFS,SJF,RR,HRRN,MLFQ等
  3. 跟踪进程状态的转化
  4. 输出:系统中进程的调度次序,计算CPU利用率,平均周转时间和平均带权周转时间

四、实验过程与结果

  1.先来先服务调度算法(FCFS)

    1.1算法思想

      该算法采用非剥夺策略,算法按照进程提交或进程变为就绪状态的先后次序,分派 CPU。当前进程占用CPU,直到执行完或阻塞,才出让CPU(非抢占方式)。在进程唤醒后(如I/O 完成),并不立即恢复执行,通常等到当前进程出让CPU。这是最简单的调度算法,比较有利于长进程,而不利于短进程,有利于CPU 繁忙的进程,而不利于I/O 繁忙的进程。

    1.2算法设计

    1.3算法实现代码

class Process:
    def __init__ (self,name,arrive_time,serve_time):
        self.name=name
        self.arrive_time=arrive_time #进入进程顺序
        self.serve_time=serve_time      #服务时间
        self.finish_time=0      #完成时间
        self.cycling_time=0     #周转时间

        self.w_cycling_time=0   #带权周转时间
process_list=[]
running_time=0
A = Process('A',5,4)
B = Process('B',4,3)
C = Process('C',3,4)
D = Process('D',1,2)
E = Process('E',2,4)
process_list.append(A)
process_list.append(B)
process_list.append(C)
process_list.append(D)
process_list.append(E)
i=int (0)
p=process_list[i]
y=len(process_list)
print("进程进行排序")
for j in range(len(process_list)-1):
    for k in range(len(process_list)-1):
        if process_list[k].arrive_time>process_list[k+1].arrive_time:
            text=process_list[k+1]
            process_list[k+1]=process_list[k]
            process_list[k]=text
print("进程号  到达顺序 服务时间")
for p in process_list:
    print(p.name, "\t" ,p.arrive_time,"\t" ,p.serve_time)
for p in process_list:
     running_time +=p.serve_time
     p.finish_time=running_time
     p.cycling_time=p.finish_time-p.arrive_time
     p.w_cycling_time=p.cycling_time/p.serve_time
print("进程号  到达时间    完成时间  周转时间  带权周转时间")
for p in process_list:
    print(p.name ,"\t\t",p.arrive_time,"\t\t\t\t",p.finish_time,"\t\t",p.cycling_time,"\t",p.w_cycling_time)

 

    1.4运行结果

  2.短作业优先算法(SJF)

    2.1算法思想

    该算法也采用非剥夺策略,对预计执行时间短的进程优先分派处理机。通常后来的短进程不抢先正在执行的进程。相比FCFS 算法,该算法可改善平均周转时间和平均带权周转时间,缩短进程的等待时间,提高系统的吞吐量。缺点是对长进程非常不利,可能长时间得不到执行,且未能依据进程的紧迫程度来划分执行的优先级,以及难以准确估计进程的执行时间,从而影响调度性能。

    2.2算法设计

    2.算法实现代码

class Process:
    def __init__ (self,name,arrive_time,serve_time):
        self.name=name
        self.arrive_time=arrive_time #进入进程顺序
        self.serve_time=serve_time      #服务时间
        self.finish_time=0      #完成时间
        self.cycling_time=0     #周转时间

        self.w_cycling_time=0   #带权周转时间
process_list=[]
running_time=0
A = Process('A',5,4)
B = Process('B',4,3)
C = Process('C',3,4)
D = Process('D',1,2)
E = Process('E',2,4)
process_list.append(A)
process_list.append(B)
process_list.append(C)
process_list.append(D)
process_list.append(E)
i=int (0)
p=process_list[i]
y=len(process_list)
print("进程进行排序")
for j in range(len(process_list)-1):
    for k in range(len(process_list)-1):
        if process_list[k].serve_time>process_list[k+1].serve_time:
            text=process_list[k+1]
            process_list[k+1]=process_list[k]
            process_list[k]=text
print("进程调度顺序   服务时间")
for p in process_list:
    print(p.name, "\t\t" ,p.serve_time)
for p in process_list:
     running_time +=p.serve_time
     p.finish_time=running_time
     p.cycling_time=p.finish_time
     p.w_cycling_time=p.cycling_time/p.serve_time
print("进程号  服务时间  周转时间  带权周转时间")
for p in process_list:
    print(p.name ,"\t\t",p.serve_time,"\t\t",p.cycling_time,"\t",p.w_cycling_time)

 

    2.4运行结果

  3.轮转调度算法(RR)

    3.1 算法思想:

    CPU时间划分为时间片,例如100ms

    时间片调度:调度程序每次把CPU分配给就绪队列首进程使用一个时间片,就绪队列中的每个进程轮流地运行一个时间片。当这个时间片结束时,强迫一个进程让出处理器,让它排列到就绪队列的尾部,等候下一轮调度

    3.2 算法设计:(采用描述或程序流程图)

      Ø进程排序

      Ø队列不为空时循环:

        Ø到达?

          Ø剩余服务时间>时间片

          Ø运行时间

          Ø剩余服务时间

        Ø剩余服务时间<=时间片

          Ø运行时间

          Ø剩余服务时间、完成时间、周转时间、加权周转时间

          Ø保存

          Ø从队列删除进程

 

     3.3 算法实现代码

class Process:
    def __init__ (self,name,arrive_time,serve_time):
        self.name=name
        self.arrive_time=arrive_time
        self.serve_time=serve_time      #服务时间
        self.left_serve_time=serve_time     #剩余服务时间
        self.finish_time=0      #完成时间
        self.cycling_time=0     #周转时间
        self.w_cycling_time=0   #带权周转时间
process_list=[]
A = Process('A',0,4)
B = Process('B',1,3)
C = Process('C',2,4)
D = Process('D',3,2)
E = Process('E',4,4)
process_list.append(A)
process_list.append(B)
process_list.append(C)
process_list.append(D)
process_list.append(E)
print("进程号  到达时间 服务时间")
for p in process_list:
    print(p.name, "\t" ,p.arrive_time,"\t" ,p.serve_time)

index=0
running_time=int (0)
q=2
pf=[] #记录完成的进程

while len(process_list) >0:
    p=process_list[index]
    if p.arrive_time>running_time:
        running_time=p.arrive_time
    if p.left_serve_time>q:
        print(p.name,p.left_serve_time)
        running_time+=q
        p.left_serve_time-=q
    else:
        print("进程号  剩余服务时间")
        print(p.name,"\t",p.left_serve_time)
        running_time +=p.left_serve_time
        p.left_serve_time=0
        p.finish_time=running_time
        p.cycling_time=p.finish_time-p.arrive_time
        p.w_cycling_time=p.cycling_time/p.serve_time
        print("-进程号  到达时间  服务时间  剩余服务时间")
        print('-',p.name,"\t",p.arrive_time,"\t",p.serve_time,"\t",p.left_serve_time
              )
        print("\n")
        pf.append(p)
        process_list.remove(p)
        index -=1
    index +=1
    if index >=len(process_list):
        index=0
print("进程号  到达时间  剩余服务时间  完成时间  周转时间  带权周转时间")
for p in pf:
    print(p.name ,"\t",p.arrive_time,"\t\t",p.left_serve_time,"\t",p.finish_time,"\t",p.cycling_time,"\t",p.w_cycling_time)

 

     3.4 运行结果

转载于:https://www.cnblogs.com/lr-c/p/10712941.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的通用处理机调度演示程序的 Java 实现: ```java import java.util.*; public class ProcessorSchedulerDemo { public static void main(String[] args) { // 创建处理器队列 Queue<Processor> processors = new LinkedList<>(); processors.add(new Processor("P1", 5)); processors.add(new Processor("P2", 3)); processors.add(new Processor("P3", 8)); processors.add(new Processor("P4", 4)); processors.add(new Processor("P5", 2)); // 创建作业列表 List<Job> jobs = new ArrayList<>(); jobs.add(new Job("J1", 2)); jobs.add(new Job("J2", 3)); jobs.add(new Job("J3", 1)); jobs.add(new Job("J4", 4)); jobs.add(new Job("J5", 2)); // 初始化时间片 int timeSlice = 1; // 开始调度 while (!jobs.isEmpty()) { Job currentJob = jobs.get(0); Processor currentProcessor = null; int shortestTime = Integer.MAX_VALUE; // 找到最短时间的处理器 for (Processor p : processors) { if (p.getTimeRemaining() < shortestTime) { currentProcessor = p; shortestTime = p.getTimeRemaining(); } } // 如果当前处理器有作业,减少时间片,否则分配新作业 if (currentProcessor.getCurrentJob() != null) { currentProcessor.setTimeRemaining(currentProcessor.getTimeRemaining() - timeSlice); if (currentProcessor.getTimeRemaining() <= 0) { currentProcessor.setCurrentJob(null); } } else { currentProcessor.setCurrentJob(currentJob); jobs.remove(0); } // 输出当前状态 System.out.print("T=" + timeSlice + " "); for (Processor p : processors) { if (p.getCurrentJob() != null) { System.out.print(p.getCurrentJob().getName() + "(" + p.getTimeRemaining() + ") "); } else { System.out.print("Idle "); } } System.out.println(); timeSlice++; } } } // 处理器类 class Processor { private String name; private int timeRemaining; private Job currentJob; public Processor(String name, int timeRemaining) { this.name = name; this.timeRemaining = timeRemaining; } public String getName() { return name; } public int getTimeRemaining() { return timeRemaining; } public void setTimeRemaining(int timeRemaining) { this.timeRemaining = timeRemaining; } public Job getCurrentJob() { return currentJob; } public void setCurrentJob(Job currentJob) { this.currentJob = currentJob; if (currentJob != null) { setTimeRemaining(currentJob.getTimeRequired()); } } } // 作业类 class Job { private String name; private int timeRequired; public Job(String name, int timeRequired) { this.name = name; this.timeRequired = timeRequired; } public String getName() { return name; } public int getTimeRequired() { return timeRequired; } } ``` 这个程序模拟了一个简单的处理器调度算法,将作业分配给可用的处理器,并在每个时间片结束时输出当前的处理器状态。它使用一个处理器队列和一个作业列表来模拟处理器和作业的分配,以及一个时间片来模拟处理器的时间管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值