栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

操作系统--进程管理

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

操作系统--进程管理

一、实验目的

用高级语言编写和调试一个进程调度程序,以加深对进程的概念 及进程调度算法的理解。

二、实验内容

设计一个有 N 个进程共行的进程调度程序。

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

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

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

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

(5)进程的到达时间为进程的输入的时间。

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

(7)就绪进程获得 CPU 后都只能运行一个时间片。

(8)用已占有 CPU 时间加 1 来表示。

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

三、实验结果

  1.实验结果

 

 

 

 

  2.详细代码

#include 

#define ready 1

#define run 2

#include "malloc.h"



struct PCB

{

char name010[10];      //进程名

int priority010;        //进程优先级

int state010;         //进程的状态W R F

int needtime010;      //进程需要的运行时间

int runtime010;      //已用时间

struct PCB* next;

};

PCB *head;          //进程控制块设计





void create()

{

PCB *p,*q;

int n,i;

printf("请输入要创建的进程数:");

scanf("%d",&n);

head=(PCB*)malloc(sizeof(PCB));

p=head;

for(i=1;i<=n;i++)

{

q=(PCB*)malloc(sizeof(PCB));

p->next=q;

p=q;

printf("请输入第%d个进程的进程名:",i);

scanf("%s",&q->name010);

printf("请输入进程的优先级:",i);

scanf("%d",&q->priority010);

printf("请输入进程所需的运行时间:",i);

scanf("%d",&q->needtime010);

q->state010=Wait;

q->next=NULL;  

}

}







void delete_(PCB *head,PCB *p)

{

PCB *q;

q = head;

while(q->next != p)

   q = q->next;

q->next = p->next;

free(p);

}





PCB* getminneedtime(PCB* head)

{

PCB *p,*q;

p = head->next;

q = p->next;

while(q)

{

if(p->needtime010 > q->needtime010)

   p = q;

q = q->next;

}

return p;



}





void SJF()

{

PCB *p, *q;

while(head->next)

{

p = getminneedtime(head);

p->state010 = Run;



printf("n****正在运行的进程信息如下所示:n");

printf("进程名:%s  ",p->name010);

printf("进程状态:Run  ");

printf("进程所需时间:%d  ",p->needtime010);

printf("进程的运行时间:%dn",p->runtime010);



q=head->next;

if(q->next != NULL)

{

printf("****现在的就绪队列信息如下:*****n");

}

else

{

printf("****现在就绪队列为空!!!*****nn");

}



while(q)

{

if(q!=p)

{

printf("进程名为:%s  ",q->name010);

    printf("进程状态:Wait  ");

    printf("进程所需时间为:%d  ",q->needtime010);

    printf("进程运行时间为:%dn",q->runtime010);

}

q=q->next;  

}

delete_(head,p);

}

}







void RR()

{

PCB *p, *q, *r;

int time;

printf("请输入时间片的大小:");

scanf("%d",&time);

p = head->next;

while(p) //找到进程链表最后一个PCB

{

r = p;

p = p->next;

}



while(head->next)

{

p = head->next;

p->state010 = Run;



printf("n****正在运行的进程信息如下:****n");

printf("%s  ",p->name010);

printf("Run  ");

printf("需要时间:%d  ",p->needtime010);

printf("运行时间:%d  ",p->runtime010);

printf("优先权:%dnn",p->priority010);





if((p->needtime010 - p->runtime010 )<= time)

{

delete_(head,p);

}



else

{

p->runtime010 = p->runtime010 + time;

head->next = p->next;

r->next = p;

r = p;

r->state010 =  Wait;

r->next = NULL;

}



if(head->next == NULL)

printf("****现在就绪队列为空!!!*****nn");

else

{

printf("****现在的就绪队列信息如下:*****n");

q = head->next;

while(q)

{

printf("%s  ",q->name010);

    printf("Wait  ");

    printf("需要时间:%d  ",q->needtime010);

    printf("运行时间:%d",q->runtime010);

    printf("优先权:%dn",q->priority010);

    q = q->next;

}

}

}

}











PCB* getpriority(PCB* head)

{

PCB *p, *q;

p = head->next;

q = p->next;

while(q)

{

if(q->priority010 > p->priority010)

   p = q;

q = q->next;

}

return p;

}





void HPF()

{

PCB *p, *q;



while(head->next)

{



p = getpriority(head);

p->state010 = Run;

(p->runtime010)++;

(p->priority010)--;



printf("n****正在运行的进程信息如下:****n");

printf("%s  ",p->name010);

printf("Run  ");

printf("需要时间:%d  ",p->needtime010);

printf("运行时间:%d  ",p->runtime010);

printf("优先权:%dn",p->priority010);



if(p->runtime010 == p->needtime010)

    delete_(head,p);



q = head->next;

if(q!= NULL)

  printf("****现在的就绪队列信息如下:*****n");

else

  printf("****现在就绪队列为空!!!*****nn");

while(q)

{

printf("%s  ",q->name010);

printf("Wait  ");

printf("需要时间:%d  ",q->needtime010);

printf("运行时间:%d",q->runtime010);

printf("优先权:%dn",q->priority010);

q = q->next;

}

}

}







void printfunc()

{

printf(" *******************n");

    printf(" * 1-创建进程 *n");

    printf(" * 2-短作业调度算法 *n");

    printf(" * 3-优先权调度算法 *n");

    printf(" * 4-时间片轮回算法 *n");

    printf(" * 0-退出 *n");

    printf(" *******************n");



}





int main()

{

printfunc();

int choice;

do

{

printf("请输入相应的数字:") ;

    scanf("%d",&choice);

    switch(choice)

    {

     case 1:

     create();

     printfunc();

     break;

     case 2:

     if(head == NULL || head->next == NULL)

         printf("****现在就绪队列为空,请先创建进程*****n");

     else

     {

     SJF();

                    printfunc();

}

break;

case 3:

if (head == NULL || head->next == NULL)

printf("****现在就绪队列为空,请先创建进程*****n");

else

{

HPF();

printfunc();

}

break;

case 4:

if (head == NULL || head->next == NULL)

printf("****现在就绪队列为空,请先创建进程*****n");

else

{

RR();

printfunc();

}

break;

case 0:

   exit(0);

}



    

}while(1);

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/982836.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号