我是靠谱客的博主 缓慢御姐,最近开发中收集的这篇文章主要介绍2021-8-15,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

  1. List item

进程的状态和转换

一 实验目的
1.了解进程状态转换的模型:进程状态反映进程执行过程的变化。这些状态随着进程的执行和外界条件的变化而转换。在三态模型中,进程状态分为三个基本状态,即运行态,就绪态,阻塞态。在五态模型中,进程分为新建态、终止态,运行态,就绪态,阻塞态。
2.了解并掌握进程控制块的结构定义。就绪;执行;阻塞;转换条件。

二 实验要求
1.认真阅读并理解教材上进程控制块的作用。
2.正确编写进程控制块作用的模拟程序并能上机运行。

其中必须完成:
定义多个进程实体(2个以上);
初始化进程实体
标识进程状态
依次输出每个执行进程的开始时间和周转时间

选择完成:
采用随机函数模拟进程的到达时间;
采用随机函数产生每个进程实体的执行时间;

三 代码

#include <stdio.h>
#include <stdlib.h>

typedef struct PCB
{
	int name;			// 进程编号
	char state;			// 进程状态	
	int arrivaltime;	// 进程的到达时间	
	int runtime;		// 进程的执行时间
	int cputime;		// 进程已执行时间	
	int proirity;		// 优先级	
	struct PCB *next;
}pcb;

pcb *head = NULL;	// 正常队列
pcb *wait = NULL;	// 未到达队列

int n = 0;			// 进程数目  

//创建头指针
void createhead()
{
	pcb *p = (pcb*)malloc(sizeof(pcb));	
	head = p;	
	pcb *q = (pcb*)malloc(sizeof(pcb));	
	wait = q;
}
void sort()// 按照优先级进行排序
{	
    pcb* t = head;	
    pcb *q, *p, *r;	
    int max;	
    while (t->next != NULL)	
    {		
    p = t->next;		
    r = t->next;		
    max = r->proirity;		
    while (r != NULL)		
    {			
           if (r->proirity > max)			
          {				
                 max = r->proirity;				
                 p = r;			
           }			
           r = r->next;		
     }		
     q = t;		
     while (q->next != p)			
           q = q->next;		
     if (t->next != p)		
     {			
           q->next = p->next;			
           p->next = t->next;			
           t->next = p;	
      }		
      t = t->next;	
      }
 }
 bool create() //创建pcb
 {	
      createhead();	
      pcb *p = head;	
      pcb *q = wait;	
      printf("请输入进程数目:");	
      scanf("%d", &n);	
      pcb *temp;	
      for (int i = 1; i <= n; i++)//尾插法建立就绪队列	
      {		
             temp = (pcb*)malloc(sizeof(pcb));
             if (!temp) return false;		
             printf("请输入进程%d的运行时间,进程优先数,到达时间:", i);		
             scanf("%d %d %d", &(temp->runtime), &(temp->proirity), &(temp->arrivaltime));		
             temp->cputime = 0;		
             temp->name = i;		
             temp->next = NULL;		
             temp->state = 'W';		
             if (temp->arrivaltime != 0) // 对到达时间进行判断		
             {			
             q->next = temp;			
             q = temp;		
             }		
             else		
             {			
             p->next = temp;			
             p = temp;		
             }	
       }	
       sort(); // 排序	
       return true;
}
void destory(pcb *rp)// 撤销操作
{	
        printf("****************进程%d已完成****************n", rp->name);	
        pcb *q = rp->next;	
        head->next = q;	
        free(rp);
}
void display(pcb *rp) // 打印信息
{	
       printf("进程编号:%d", rp->name);
       printf("n进程优先级:%d", rp->proirity);	
       printf("n进程所占时间片:%d", rp->runtime);	
       printf("n进程已运行时间:%d", rp->cputime);	
       printf("n进程当前状态:%c", rp->state);	
printf("n=====================================n");
}
void arrivaltime()// 对于到达时间-1的操作
{	
       pcb *q = wait->next;	
       pcb *r, *t;	
       while (q != NULL) // 判断到达时间是否为0 此时是否到达	
       {		
       q->arrivaltime--;		
       if (q->arrivaltime == 0)		
       {			
                t = wait;			
                while (t->next != q)				
                t = t->next;			
                t->next = q->next;			
                r = head->next;			
                q->next = r;			
                head->next = q;		
        }		
        q = q->next;	
        }
}
void runpcb(pcb *rp)
{	
        rp->cputime++; //修改cpu占用的时间	arrivaltime();	
        printf("----------正在运行的进程----------n"); // 输出正在运行的队列	
        display(rp);
        if (rp->cputime == rp->runtime)	
        {		
                  destory(rp);	
        }	
        else	
        {		
                 rp->proirity--;		
                 rp->state = 'W';
        }	
        pcb *p = head;	
        if (head->next == NULL && wait->next == NULL) return;	
        printf("----------处于就绪对列的进程----------n"); // 输出就绪的队列	
        while (p->next != NULL)	
        {		
                  display(p->next);		
                  p = p->next;
        }	
        pcb *q = wait;	
        while (q->next != NULL)	
        {		
                 display(q->next);		
                 q = q->next;	
         }	
         sort();
}
int main()
{	
        create();	
        pcb * p;	
        while (head->next != NULL || wait->next != NULL) 	
        {		
                  if (head->next != NULL)		
                  {			
                            p = head->next;			
                            p->state = 'R';		
                            runpcb(p);		
                   }		
                   else	
                   {			
                             arrivaltime();		
                    }
          }	
          return 0

最后

以上就是缓慢御姐为你收集整理的2021-8-15的全部内容,希望文章能够帮你解决2021-8-15所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部