【操作系统】处理机调度

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


一. 实验目的

(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)调度算法:根据进程剩余需要执行的时间进行调度,剩余执行时间最短的进程会被优先调度。

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

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

目录
相关文章
|
1月前
|
算法 调度 UED
深入理解操作系统:进程调度与优先级队列
【10月更文挑战第31天】在计算机科学的广阔天地中,操作系统扮演着枢纽的角色,它不仅管理着硬件资源,还为应用程序提供了运行的环境。本文将深入浅出地探讨操作系统的核心概念之一——进程调度,以及如何通过优先级队列来优化资源分配。我们将从基础理论出发,逐步过渡到实际应用,最终以代码示例巩固知识点,旨在为读者揭开操作系统高效管理的神秘面纱。
|
16天前
|
存储 算法 调度
深入理解操作系统:进程调度的奥秘
在数字世界的心脏跳动着的是操作系统,它如同一个无形的指挥官,协调着每一个程序和进程。本文将揭开操作系统中进程调度的神秘面纱,带你领略时间片轮转、优先级调度等策略背后的智慧。从理论到实践,我们将一起探索如何通过代码示例来模拟简单的进程调度,从而更深刻地理解这一核心机制。准备好跟随我的步伐,一起走进操作系统的世界吧!
|
28天前
|
消息中间件 算法 调度
深入理解操作系统:进程管理与调度
操作系统是计算机系统的核心,负责管理和控制硬件资源、提供用户接口以及执行程序。其中,进程管理是操作系统的重要组成部分,它涉及到进程的创建、调度、同步和通信等方面。本文将深入探讨进程管理的基本概念、进程调度算法以及进程间的同步和通信机制。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程管理的基本技能。
42 11
|
22天前
|
算法 调度 UED
深入理解操作系统:进程管理与调度策略
操作系统作为计算机系统的核心,其进程管理和调度策略对于系统性能和用户体验至关重要。本文将通过直观的代码示例和浅显易懂的语言,带领读者了解操作系统如何有效管理进程以及常见的进程调度算法。我们将从进程的基本概念出发,逐步深入到进程状态、进程控制块(PCB)的作用,最后探讨不同的调度算法及其对系统性能的影响。无论您是初学者还是有一定基础的开发者,都能从中获得有价值的信息。
|
21天前
|
负载均衡 算法 调度
深入理解操作系统:进程管理与调度
在数字世界的心脏,操作系统扮演着至关重要的角色。它如同一位精明的指挥家,协调着硬件资源和软件需求之间的和谐乐章。本文将带你走进操作系统的核心,探索进程管理的艺术和调度策略的智慧。你将了解到进程是如何创建、执行和消亡的,以及操作系统如何巧妙地决定哪个进程应该在何时获得CPU的青睐。让我们一起揭开操作系统神秘的面纱,发现那些隐藏在日常计算背后的精妙机制。
|
23天前
|
调度 开发者
深入理解操作系统之进程调度
在计算机科学领域,操作系统是核心的一环,它管理着计算机硬件资源,并提供接口供上层软件运行。本文将通过深入浅出的方式,探讨操作系统中至关重要的一个概念——进程调度。我们将从基础理论出发,逐步展开讲解进程调度的原理和实现,并配以实际代码示例,旨在帮助读者更好地理解和掌握这一主题。文章不仅适合初学者建立基础,也适合有一定基础的开发者深化理解。
|
1月前
|
算法 调度 UED
深入理解操作系统:进程管理与调度策略
【10月更文挑战第40天】在数字世界中,操作系统是连接硬件与软件的桥梁,它管理着计算机资源和提供用户服务。本文将深入探讨操作系统中的进程管理与调度策略,揭示它们如何协调多任务运行,保证系统高效稳定运作。通过代码示例,我们将展示进程创建、执行以及调度算法的实际应用,帮助读者构建对操作系统核心机制的清晰认识。
|
1月前
|
算法 调度 UED
深入理解操作系统:进程管理与调度策略
【10月更文挑战第34天】本文旨在探讨操作系统中至关重要的一环——进程管理及其调度策略。我们将从基础概念入手,逐步揭示进程的生命周期、状态转换以及调度算法的核心原理。文章将通过浅显易懂的语言和具体实例,引导读者理解操作系统如何高效地管理和调度进程,保证系统资源的合理分配和利用。无论你是初学者还是有一定经验的开发者,这篇文章都能为你提供新的视角和深入的理解。
42 3
|
1月前
|
算法 调度 UED
深入浅出操作系统调度策略
【10月更文挑战第33天】在数字时代的心脏,操作系统扮演着至关重要的角色。本文将探讨操作系统的核心功能之一——进程调度策略的设计与影响。我们将从理论到实践,通过浅显易懂的语言和具体代码示例,揭示如何通过不同的调度算法来优化系统性能和用户体验。无论你是技术新手还是资深开发者,这篇文章都将为你提供新的视角和深入的理解。
|
1月前
|
算法 Linux 调度
深入理解操作系统之进程调度
【10月更文挑战第31天】在操作系统的心脏跳动中,进程调度扮演着关键角色。本文将深入浅出地探讨进程调度的机制和策略,通过比喻和实例让读者轻松理解这一复杂主题。我们将一起探索不同类型的调度算法,并了解它们如何影响系统性能和用户体验。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇理解操作系统深层工作机制的大门。
36 0