【操作系统】处理机调度

简介: 【操作系统】处理机调度


一. 实验目的

(1)加深对进程概念的理解,明确进程和程序的区别

(2)深入理解系统如何组织进程

(3)理解常用进程调度算法的具体实现

二. 实验内容

(1)编写C程序模拟实现单处理机系统中的进程调度算法,实现对多个进程的调度模拟,要求采用常见进程调度算法(如先来先服务、时间片轮转和优先级调度等算法)进行模拟调度。

三. 实验步骤

(1)编写C程序:

#include <stdio.h>
#include <stdlib.h>
#define getpch(type) (type*)malloc(sizeof(type))
struct pcb {
  char name[10];
  char state;
  int nice;
  int ntime;
  int rtime;
  struct pcb *link ;
}*ready=NULL,*p;
typedef struct pcb PCB;
void sort() {
  PCB *first,*second;
  int insert=0;
  if((ready==NULL)||(p->nice > ready->nice)) {
    p->link=ready;
    ready=p;
  } else {
    first=ready;
    second=first->link;
    while(second !=NULL) {
      if(p->nice>second->nice) {
        p->link=second;
        first->link=p;
        second=NULL;
        insert=1;
      } else {
        first=first->link;
        second=second->link;
      }
    }
    if(insert==0)
      first->link=p;
  }
}
void input() {
  int i,num;
  printf("\n请输入被调度的进程数目:");
  scanf("%d",&num) ;
  for(i=0; i<num; i++) {
    printf("\n进程号No.%d : ",i);
    p=getpch(PCB);
    printf("\n输入进程名:");
    scanf("%s",p->name) ;
    printf("输入进程优先级:");
    scanf("%d",&p->nice);
    printf("输入进程运行时间:");
    scanf("%d",&p->ntime);
    printf("\n");
    p->rtime=0;
    p->state= 'W';
    p->link=NULL;
    sort();
  }
}
int space() {
  int l=0;
  PCB *pr=ready;
  while(pr !=NULL) {
    l++;
    pr=pr->link;
  }
  return (l);
}
void disp(PCB *pr) {
  printf("\n qname lt state lt nice ltndtime \truntime \n");
  printf("%slt",pr->name);
  printf("%c\t",pr->state);
  printf("%d\t",pr->nice);
  printf("%d\t",pr->ntime);
  printf("%d\t",pr->rtime);
  printf("\n");
}
void check() {
  PCB *pr;
  printf("\n****当前正在运行的进程是:%s",p->name);
  disp(p);
  pr=ready;
  if(pr!=NULL)
    printf( "\n****当前就绪队列为:");
  else
    printf( "\n****当前就绪队列为空\n");
  while(pr !=NULL) {
    disp(pr);
    pr=pr->link;
  }
}
void destroy() {
  printf("进程[%s]己完成。\n",p->name);
  free(p);
}
void running() {
  (p->rtime)++;
  if(p->rtime==p->ntime)
    destroy();
  else {
    (p->nice)--;
    p->state= 'W';
    sort();
  }
}
int main( ) {
  int len,h=0;
  char ch;
  input();
  len=space();
  while( len!=0 && ready !=NULL)  {
    h++;
    printf( "in The execute number:%d\n",h);
    p=ready ;
    ready=p->link;
    p->link=NULL;
    p->state='R';
    check();
    running();
    printf( "\n按任意键继续.......\n");
    ch=getchar();
  }
  printf( "\n\n所有进程己经运行完成!\n");
  ch=getchar();
  return 0;
}

这段代码是一个模拟操作系统进程调度的程序。下面对代码进行详细分析:

  1. 定义了一个进程控制块(PCB)的结构体,包含进程名(name)、状态(state)、优先级(nice)、需要运行时间(ntime)、已运行时间(rtime)和链接指针(link)。
  2. 定义了一个全局变量ready,用于存储就绪队列中的所有进程。还定义了一个指针p,用于指向当前正在执行的进程。
  3. 定义了一个宏函数getpch(),用于动态分配内存空间来创建一个进程控制块。
  4. 定义了一个函数sort(),用于将新创建的进程按照优先级插入到就绪队列中。
  5. 定义了一个函数input(),用于从用户输入中获取要调度的进程的信息,并将其插入到就绪队列中。
  6. 定义了一个函数space(),用于计算就绪队列中的进程数目。
  7. 定义了一个函数disp(),用于显示某个进程的信息。
  8. 定义了一个函数check(),用于显示当前正在运行的进程和就绪队列中的进程信息。
  9. 定义了一个函数destroy(),表示进程已完成,释放其占用的内存空间。
  10. 定义了一个函数running(),表示当前正在运行的进程进行运行,如果运行时间等于需要运行时间,则调用destroy()函数,否则将优先级减1,并将进程插入到就绪队列中。
  11. 主函数main()中,首先调用input()函数获取要调度的进程信息。然后进入一个循环,循环条件为就绪队列不为空且进程数目不为0。在循环中,将就绪队列的第一个进程取出来赋给p,并从就绪队列中移除。然后调用running()函数进行运行,最后输出当前正在运行的进程和就绪队列的信息。循环结束后,输出所有进程已经运行完成的信息。

总结:这段代码实现了一个简单的进程调度模拟,根据进程的优先级进行调度,并按照时间片轮转的方式进行运行。

四. 实验结果

五. 实验总结

处理机调度是操作系统中的一个关键部分,它负责决定哪个进程将获得处理器运行的机会。处理机调度的目标是实现公平性、高效性和响应时间的优化。

处理机调度的主要任务是根据一定的算法选择一个进程从就绪队列中调出,然后将处理器分配给它执行。调度算法的选择对系统的性能和效率有重要影响。

常见的调度算法有以下几种:

  1. 先来先服务(FCFS)调度算法:按照进程的到达顺序进行调度,先到达的进程先执行。
  2. 短作业优先(SJF)调度算法:根据进程的执行时间进行调度,执行时间越短的进程会被优先调度。
  3. 优先级调度算法:根据进程的优先级进行调度,优先级高的进程会被优先调度。可以根据进程的重要性、紧急程度或其他指标来确定优先级。
  4. 时间片轮转调度算法:每个进程被分配一个固定的时间片,在时间片用完之前,如果进程没有执行完毕,会被挂起,然后选择下一个进程运行。
  5. 多级反馈队列调度算法:将就绪队列按照优先级划分为多个队列,每个队列都有一个时间片,进程首先被放入优先级最高的队列,如果运行时间超过时间片,则进程会被移到下一个优先级队列。
  6. 最短剩余时间优先(SRTF)调度算法:根据进程剩余需要执行的时间进行调度,剩余执行时间最短的进程会被优先调度。

处理机调度算法的选择要根据系统的需求和性能特点进行权衡。不同的调度算法在不同的场景下会有不同的效果。例如,短作业优先算法适合执行时间短的任务,而多级反馈队列算法适合在系统中有不同优先级的进程。

处理机调度对于操作系统的性能和响应时间至关重要。一个高效的调度算法可以提高系统的利用率和响应速度,同时也能够保证公平性和资源的合理分配。因此,处理机调度是操作系统中一个非常重要的功能模块。

目录
相关文章
|
9天前
|
算法 调度 UED
深入理解操作系统:进程调度与优先级队列
【10月更文挑战第31天】在计算机科学的广阔天地中,操作系统扮演着枢纽的角色,它不仅管理着硬件资源,还为应用程序提供了运行的环境。本文将深入浅出地探讨操作系统的核心概念之一——进程调度,以及如何通过优先级队列来优化资源分配。我们将从基础理论出发,逐步过渡到实际应用,最终以代码示例巩固知识点,旨在为读者揭开操作系统高效管理的神秘面纱。
|
6天前
|
算法 调度 UED
深入理解操作系统:进程管理与调度策略
【10月更文挑战第34天】本文旨在探讨操作系统中至关重要的一环——进程管理及其调度策略。我们将从基础概念入手,逐步揭示进程的生命周期、状态转换以及调度算法的核心原理。文章将通过浅显易懂的语言和具体实例,引导读者理解操作系统如何高效地管理和调度进程,保证系统资源的合理分配和利用。无论你是初学者还是有一定经验的开发者,这篇文章都能为你提供新的视角和深入的理解。
23 3
|
12天前
|
消息中间件 算法 调度
深入理解操作系统:进程管理与调度策略
【10月更文挑战第29天】本文将带领读者深入探讨操作系统中的核心组件之一——进程,并分析进程管理的重要性。我们将从进程的生命周期入手,逐步揭示进程状态转换、进程调度算法以及优先级调度等关键概念。通过理论讲解与代码演示相结合的方式,本文旨在为读者提供对进程调度机制的全面理解,从而帮助读者更好地掌握操作系统的精髓。
26 1
|
12天前
|
算法 调度 UED
深入理解操作系统中的进程调度
【10月更文挑战第29天】探索进程调度的奥秘,本文将带你深入了解在操作系统中如何管理和控制多个并发执行的程序。从简单的调度算法到复杂的多级反馈队列,我们将逐步揭示如何优化系统性能和提高资源利用率。准备好一起揭开进程调度的神秘面纱吧!
|
17天前
|
算法 大数据 Linux
深入理解操作系统之进程调度算法
【10月更文挑战第24天】本文旨在通过浅显易懂的语言,带领读者深入了解操作系统中的进程调度算法。我们将从进程的基本概念出发,逐步解析进程调度的目的、重要性以及常见的几种调度算法。文章将通过比喻和实例,使复杂的技术内容变得生动有趣,帮助读者建立对操作系统进程调度机制的清晰认识。最后,我们还将探讨这些调度算法在现代操作系统中的应用和发展趋势。
|
30天前
|
分布式计算 算法 大数据
探索操作系统的核心:调度与内存管理机制
【10月更文挑战第11天】 本文深入探讨了操作系统中两大核心功能——调度与内存管理机制。通过分析调度算法、进程状态转换及内存分配策略等关键方面,揭示了它们如何共同维护系统性能和稳定性。旨在为读者提供对操作系统内部运作的深刻理解,同时引起对优化策略的思考。
56 5
|
8天前
|
算法 调度 UED
深入浅出操作系统调度策略
【10月更文挑战第33天】在数字时代的心脏,操作系统扮演着至关重要的角色。本文将探讨操作系统的核心功能之一——进程调度策略的设计与影响。我们将从理论到实践,通过浅显易懂的语言和具体代码示例,揭示如何通过不同的调度算法来优化系统性能和用户体验。无论你是技术新手还是资深开发者,这篇文章都将为你提供新的视角和深入的理解。
|
9天前
|
算法 Linux 调度
深入理解操作系统之进程调度
【10月更文挑战第31天】在操作系统的心脏跳动中,进程调度扮演着关键角色。本文将深入浅出地探讨进程调度的机制和策略,通过比喻和实例让读者轻松理解这一复杂主题。我们将一起探索不同类型的调度算法,并了解它们如何影响系统性能和用户体验。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇理解操作系统深层工作机制的大门。
19 0
|
12天前
|
算法 调度 开发者
探索操作系统的核心:进程管理与调度
【10月更文挑战第29天】本文深入探讨了操作系统中至关重要的一环——进程管理。通过浅显易懂的语言,我们将了解到什么是进程,进程如何被创建和管理,以及操作系统如何决定哪个进程应该获得CPU时间。文章还将揭示进程调度对系统性能的影响,并分享一些优化技巧。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供宝贵的知识。
|
1月前
|
算法 Unix Linux
深入理解操作系统:进程管理与调度策略
【10月更文挑战第9天】本文将带你进入操作系统的核心,探索进程管理的奥秘。我们将从基础的概念出发,逐步深入到进程的创建、调度和同步等关键机制。通过理论与实际代码示例的结合,你将获得对操作系统中进程管理更深层次的理解和应用能力。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和知识,让你在操作系统的学习之旅上更进一步。

热门文章

最新文章