zoukankan      html  css  js  c++  java
  • 进程调度

    进程调度

      一,设计目的:    

      进程管理是操作系统中的重要功能,用来创建进程、撤消进程、实现进程状态转换,它提供了在可运行的进程之间复用CPU的方法。在进程管理中,进程调度是核心,因为在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态,当就绪进程个数大于处理器数目时,就必须依照某种策略决定哪些进程优先占用处理器。本设计模拟在单处理器情况下的进程调度,目的是加深对进程调度工作的理解,掌握不同调度算法的优缺点。

    二,设计内容

    设计程序模拟单处理机系统中的进程调度算法,在短作业优先调度算法、时间片轮转调度、最高优先级优先算法三种算法中选择两种实现。

    每个进程由一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等。

    进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。

    进程的运行时间以时间片为单位进行计算。

    每个进程的状态可以是就绪W(Wait)、运行R(Run)或完成F(Finish)3中状态之一。

    三、开发环境

    windows环境,VC6.0平台。

    四,分析设计

    <一>实验原理

    (1)最高优先级优先算法思想

       将进程按照优先级由高到低排序

    就绪进程获得CPU后都只能运行一个时间片,用已占用CPU时间加1来表示。

    如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤销该进程,如果运行一个时间片后进程的已占用CPU时间还未达到所需要的运行时间,也即进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。

    每进行一次调度程序都打印一次运行进程、就绪队列以及各个进程的PCB,以便进行检查。

    重复以上过程,直到所有进程都完成为止。

    (2)时间片轮转调度

    系统将所有的就绪进程按先来先服务的原则,排成一个队列,每次调度时,CPU分配给队首进程,并令其执行一个时间片.时间片的大小从几ms到几百ms.当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片.这样就可以保证就绪队列中的所有进程,在一给定的时间内,均能获得一时间片的处理机执行时间.

    <二>程序结构

    (1)最高优先级优先

      1.按照优先级排序

    for(i=0;i<n-1;i++)      //按照优先级排序

        {

            for(j=n-2;j>=i;j--)

            {

                if(pcb[j+1].priority>pcb[j].priority)

                {

                    temp=pcb[j];

                    pcb[j]=pcb[j+1];

                    pcb[j+1]=temp;

                }

            }

        }

    2.按照排序运行时间片

    3.判断程序是否完成

    if((pcb[0].needtime-pcb[0].usedtime)>pTime)   //判断进程剩余的运行时间是否大于时间片

            {

                pcb[0].usedtime+=pTime;

                pcb[0].priority--;

                pcb[0].state='W';

            }

            else                       //已完成的进程

            {

                pcb[0].usedtime=pcb[0].needtime;

                pcb[0].priority=-1;

                pcb[0].state='F';

    4.完成退出

    (2)时间片轮转调度

    1按照先来先服务原则排序

    struct pro* creatList()   //创建链表,按照进程的到达时间排列,记录所有进程的信息

    void insert(struct pro *head,struct pro *s)   //插入节点

    {

    struct pro *p=searchByAT(head,s->arriveTime);

    s->next=p->next;

    p->next=s;

     

    2.按照先来先服务原则排序好队列之后按照输入的时间片运行。

    3.进程运行完成退出就绪队列

    程序流程图

    (1)最高优先级优先

    2时间片轮转调度

     

     

     

     

     

    五.结果分析

    (1)最高优先级优先

     

     

    1.输入四个进程后按照优先级排序:2 1 3 4

    2.按照时间片运行,每次运行后进程优先级减一。

    3.每当进程运行完进程状态显示为F

  • 相关阅读:
    html5_css 3 学习指南__转
    MySQL常见故障处理手册_转
    MYSQL出错代码列表——转
    Redhat 6环境下安装Oracle 12c的方法
    Wireshark入门:分析DHCP协议的运行
    重命名Oracle数据库的表空间(Renaming a Tablespace)
    Oracle DB 分区特性概述 Overview of Partitions
    Oracle Database Concepts:介绍模式对象(Introduction to Schema Objects)
    Supporting Connected Routes to Subnet Zero
    Secondary IP Addressing
  • 原文地址:https://www.cnblogs.com/Anei/p/7862999.html
Copyright © 2011-2022 走看看