我来我网
https://5come5.cn
 
您尚未 登录  注册 | 菠菜 | 软件站 | 音乐站 | 邮箱1 | 邮箱2 | 风格选择 | 更多 » 
 

本页主题: 急~~~有一个时间片轮转的进程切换算法 显示签名 | 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

samuschen



性别: 美女 状态: 该用户目前不在线
等级: 品行端正
发贴: 201
威望: 0
浮云: 1663
在线等级:
注册时间: 2007-09-15
最后登陆: 2008-06-29

5come5帮你背单词 [ mouthful /'mauθful/ n. 满口,一口 ]


急~~~有一个时间片轮转的进程切换算法

有一个时间片轮转的进程切换算法,编译通过的,就是运行时候老出错,实在不知道什么问题了,请高手帮忙看一下,谢了。。。


Quote:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct node
{
  char name[10]; /*进程标识符*/
  int rtime; /*进程占用CPU时间*/
  int ntime; /*进程到完成还要的时间*/   
  char state; /*进程的状态*/
  struct node *next; /*链指针*/
}PCB;



struct node *ready,*run,*tail,*finish; /*队列指针*/


int N; /*进程数*/
int T=1;//时间片

/*轮转法创建N个进程PCB并放进ready队列*/
void create()
{
 
  int i;
  printf("请输入进程数:");
  scanf("%d",&N); /*输入进程数*/
  printf("\n***请输入进程名和进程所需运行的时间***\n");
  for(i=1;i<=N;i++)
  {
     /*初始化进程信息*/
    PCB *p;
    p=(PCB *)malloc(sizeof(PCB));
    printf("\n 进程名:");
    scanf("%s",&p->name);
    printf("\n 进程运行时间:");
    scanf("%d",&p->ntime);
 
    p->rtime=0;   
    p->state='R';
    tail->next=p;//新进程插入ready队尾
    tail=tail->next;
  }

}

/*输出进程q的属性信息*/
void printq(PCB *q)
{
/*轮转法的输出*/
    printf(" name    rtime  ntime    state\n");
    printf(" %-10s%-10d%-10d%-c\n",q->name,
    q->rtime,q->ntime,q->state);
}


/*输出正在运行的进程的属性信息*/
void printrun()
{

printf("\n **** 当前正在运行的是进程:%s\n",run->name);
printq(run);

}

/*运行ready队列中的进程*/
void running()
{
  if(ready->next!=NULL)
    {       
     while(1)
        {
            run=ready->next;//取对头
            ready->next=ready->next->next;
            run->state='R';
           
            run->rtime=run->rtime+T;
            run->ntime=run->ntime-T;
            printrun();
           
            if(run->ntime==0)
            {
                run->next=finish;//将run进程放进finish队头
                finish=run;
                printf("\n\n 进程已经完成.\n");
                run->state='F';
                run=NULL;
            }
            else
            {
                tail->next=run;
                tail=tail->next;//将run进程放进ready队尾
                run=NULL;
            }
        }


     } 
  else printf("ready队列为空");

/*主函数*/
main()
{
    run=NULL;
    ready=(PCB *)malloc(sizeof(PCB));//ready队列头结点
    ready->next=NULL;
    tail=ready;
    create();
    running();
   
   

 
}
顶端 Posted: 2008-04-05 10:38 | [楼 主]
chenyukang



性别: 帅哥 状态: 该用户目前不在线
等级: 人见人爱
发贴: 2275
威望: 0
浮云: 1127
在线等级:
注册时间: 2006-09-24
最后登陆: 2020-08-17

5come5帮你背单词 [ sunshine /'sΛnain/ n. 日晃,日照 ]


if(ready->next!=NULL)
    {     
    while(1)
        {
            run=ready->next;//取对头
            ready->next=ready->next->next;
            run->state='R';
           

看这一段,
在while(1)这个循环最后怎么跳出?
gdb下调试也可以看出

Program received signal SIGSEGV, Segmentation fault.
0x08048589 in running () at process.c:74
74                  ready->next=ready->next->next;
顶端 Posted: 2008-04-05 15:32 | [1 楼]
chenyukang



性别: 帅哥 状态: 该用户目前不在线
等级: 人见人爱
发贴: 2275
威望: 0
浮云: 1127
在线等级:
注册时间: 2006-09-24
最后登陆: 2020-08-17

5come5帮你背单词 [ superconductor // n. 超导体 ]


在这个循环里改变了这两个变量   
run=ready->next;//取对头
            ready->next=ready->next->next;

为空是要跳出

前面那个if只是判断初始化时候是否为空
顶端 Posted: 2008-04-05 15:35 | [2 楼]
ljpdxj



性别: 帅哥 状态: 该用户目前不在线
等级: 栋梁之材
发贴: 687
威望: 0
浮云: 1108
在线等级:
注册时间: 2006-02-28
最后登陆: 2008-06-29

5come5帮你背单词 [ stammer /'stæmə/ v. 口吃,结结巴巴地说;n. 口吃 ]


Quote:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct node
{
  char name[10]; /*进程标识符*/
  int rtime; /*进程占用CPU时间*/
  int ntime; /*进程到完成还要的时间*/   
  char state; /*进程的状态*/
  struct node *next; /*链指针*/
}PCB;



struct node *ready,*run,*tail,*finish; /*队列指针*/


int N; /*进程数*/
int T=1;//时间片

/*轮转法创建N个进程PCB并放进ready队列*/
void create()
{
 
  int i;
  printf("请输入进程数:");
  scanf("%d",&N); /*输入进程数*/
  printf("\n***请输入进程名和进程所需运行的时间***\n");
  for(i=1;i<=N;i++)
  {
      /*初始化进程信息*/
    PCB *p;-----------这里分配的空间当create()调用结束后,被销毁,下面分配的地址空间丢失(当然会造成内存泄露)
    p=(PCB *)malloc(sizeof(PCB));

    printf("\n 进程名:");
    scanf("%s",&p->name);
    printf("\n 进程运行时间:");
    scanf("%d",&p->ntime);
 
    p->rtime=0;   
    p->state='R';
    tail->next=p;//新进程插入ready队尾
    tail=tail->next;
  }

}

/*输出进程q的属性信息*/
void printq(PCB *q)
{
/*轮转法的输出*/
    printf(" name    rtime  ntime    state\n");
    printf(" %-10s%-10d%-10d%-c\n",q->name,
    q->rtime,q->ntime,q->state);
}


/*输出正在运行的进程的属性信息*/
void printrun()
{

printf("\n **** 当前正在运行的是进程:%s\n",run->name);
printq(run);

}

/*运行ready队列中的进程*/
void running()
{
  if(ready->next!=NULL)
    {       
      while(1)
        {
            run=ready->next;//取对头
            ready->next=ready->next->next;
            run->state='R';
           
            run->rtime=run->rtime+T;
            run->ntime=run->ntime-T;
            printrun();
           
            if(run->ntime==0)
            {
                run->next=finish;//将run进程放进finish队头
                finish=run;
                printf("\n\n 进程已经完成.\n");
                run->state='F';
                run=NULL;
            }
            else
            {
                tail->next=run;
                tail=tail->next;//将run进程放进ready队尾
                run=NULL;
            }
        }


    } 
  else printf("ready队列为空");

/*主函数*/
main()
{
    run=NULL;
    ready=(PCB *)malloc(sizeof(PCB));//ready队列头结点
    ready->next=NULL;
    tail=ready;
    create();
    running();
   
   

 
}



[ 此帖被ljpdxj在2008-04-05 23:45重新编辑 ]
顶端 Posted: 2008-04-05 22:30 | [3 楼]
ljpdxj



性别: 帅哥 状态: 该用户目前不在线
等级: 栋梁之材
发贴: 687
威望: 0
浮云: 1108
在线等级:
注册时间: 2006-02-28
最后登陆: 2008-06-29

5come5帮你背单词 [ soup /su:p/ n. 汤,羹 ]


段错误对初学者来说很容易犯,我觉得主要是要理解函数调用的时候1级指针和2级指针的区别
可以这样说:段错误都是因为没有正确处理好在子函数内分配空间后没有正确传给调用函数引起的。
顶端 Posted: 2008-04-05 22:34 | [4 楼]
samuschen



性别: 美女 状态: 该用户目前不在线
等级: 品行端正
发贴: 201
威望: 0
浮云: 1663
在线等级:
注册时间: 2007-09-15
最后登陆: 2008-06-29

5come5帮你背单词 [ context /'kontekst/ n. 上下文,(事情等的)前后关系,情况 ]


Quote:
引用第4楼ljpdxj于2008-04-05 22:34发表的  :
段错误对初学者来说很容易犯,我觉得主要是要理解函数调用的时候1级指针和2级指针的区别
可以这样说:段错误都是因为没有正确处理好在子函数内分配空间后没有正确传给调用函数引起的。

这样啊,看来要好好研究一下了
顶端 Posted: 2008-04-06 18:27 | [5 楼]
我来我网·5come5 Forum » 程序员之家

Total 0.010186(s) query 5, Time now is:11-22 03:19, Gzip enabled
Powered by PHPWind v5.3, Localized by 5come5 Tech Team, 黔ICP备16009856号