操作系统--进程管理

一、实验目的

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

二、实验内容

设计一个有 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 <iostream>

#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("进程的运行时间:%d\n",p->runtime010);



q=head->next;

if(q->next != NULL)

{

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

}

else

{

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

}



while(q)

{

if(q!=p)

{

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

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

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

    printf("进程运行时间为:%d\n",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("优先权:%d\n\n",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("****现在就绪队列为空!!!*****\n\n");

else

{

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

q = head->next;

while(q)

{

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

    printf("Wait  ");

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

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

    printf("优先权:%d\n",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("优先权:%d\n",p->priority010);



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

    delete_(head,p);



q = head->next;

if(q!= NULL)

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

else

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

while(q)

{

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

printf("Wait  ");

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

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

printf("优先权:%d\n",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);

}

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值