计算机操作系统实验:进程调度实验

05-14 阅读 0评论

目录

前言

二、实验目的

三、实验要求

四、实验原理

五、实验过程

六、代码详解

总结


前言

计算机操作系统是管理计算机硬件和软件资源的核心软件,它负责为用户提供一个友好、高效、安全的使用环境。进程调度是操作系统的一个重要功能,它决定了进程在处理器上的执行顺序和时间,从而影响了系统的性能和用户的体验。本实验旨在通过模拟不同的进程调度算法,比较它们的优缺点,加深对操作系统原理和设计的理解和掌握。


一、开发语言及实验平台

C++/JAVA

Turbo C / Microsoft Visual Studio 6.0 / Microsoft Visual Studio .NET 2010

在本文中使用的是c语言(?),使用的平台是devc++

二、实验目的

(1)加深对进程的概念及进程调度算法的理解;

(2)在了解和掌握进程调度算法的基础上,编制进程调度算法通用程序,将调试结果显示在计算机屏幕上,并检测机算和笔算的一致性。

三、实验要求

(1)了解进程调度;

(2)理解利用进程调度算法进行调度的原理;

(3)使用某种编程语言进行算法模拟。

四、实验原理

  • 例题:设计一个有N个进程的进程调度算法。

    进程调度算法:采用最高优先数的调度算法(即把处理机分配给优先数最高的进程)。

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

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

    每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。就绪进程获得CPU后都只能运行一个时间片。用已占用CPU时间加1表示。

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

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

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

    分析:

    使用固定队列与静动态优先级结合,每个优先级为0~0xFF,并且以小的数字为高优先级,大的数字为低优先级,每次皆使用循环得到最高优先级的进程并执行,然后将其动态优先级设置为最低,并将其他进程动态优先级提高,以使得每个进程都有机会运行。进程的优先级与运行时间由随机数产生。

    计算机操作系统实验:进程调度实验

    五、实验过程

    代码如下:

    #include 
    #include 
    #include 
    /*常量和状态定义*/
    #define        PRO_NUM        0x05
    #define        MAX_TIME    0xFF
       /*状态宏*/
    #define        WAIT        0x01
    #define        RUN            0x02
    #define        FINISH        0x03
    #define        ID_ERROR    0x10
    #define        MIN_PRIOR    0xFF //255
    #define        MAX_PRIOR    0x00 0
    typedef unsigned int    Uint32;
    /*进程PCB*/
    struct PCB_Info
    {
       Uint32    s_id;
       Uint32    s_static_prior;
       Uint32    s_dynamic_prior;
       Uint32    s_start_time;
       Uint32    s_need_time;
       Uint32    s_used_time;
       Uint32    s_state;
    };
    /*进程队列*/
    PCB_Info    g_queue[5];
    Uint32        g_time = 0;
    /*模拟进程执行函数*/
    void Simulator();
    /*初始化5个进程函数*/
    void Init_Process();
    /*初始化进程队列函数*/
    void Init_Queue();
    /*创建进程函数*/
    Uint32 Create_Process(Uint32 pri,Uint32 needtime);
    /*系统运行函数*/
    void Run_Process();
    /*得到最高优先级进程 ID函数*/
    Uint32 Get_PriProcess();
    /*进程时间片执行函数*/
    void    Work_Process(Uint32 id);
    /*改变进程状态和优先级函数*/
    void    Change_Process(Uint32 id);
    /*打印进程状态函数*/
    void    Print_State();
    /*结束系统函数*/
    void End_Process();
    /*入口函数*/
    int main( int argc, char *argv[ ])
    {
       Simulator();
       return 0;
    }
    void Simulator()
    {
       Init_Process();
       Run_Process();
       End_Process();
    }
    void Init_Process()
    {
       int i;
       Uint32 id;
       srand( (unsigned)time( NULL ) );
       Init_Queue();
       for(i=0;i

免责声明
本网站所收集的部分公开资料来源于AI生成和互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,人围观)

还没有评论,来说两句吧...

目录[+]