towny 发表于 2003-10-20 12:59:00

菜鸟请教个为位高手一个关于进程代码的编写!

create()创建一个进程
要求:1 用c语言编写
         2 程序+PCB(ID的内外优先权,申请资源)
只需做进程中”产生“这一步。
以下是做了3分之1的范例:
#include "stdio.h"
#define running 1 /*用running 表示进程处于运行态*/
#define aready 2 /*用aready表示进程处于就绪态*/
#define blocking 3 /*用blocking表示进程处于等待态*/
#define sometime 5 /*用sometime 表示时间片大小*/
#define n 10 /* 假定系统允许进程个数为10 */

struct
{
int name; /*进程标识符*/
int status; /*进程状态*/
int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/
int pc; /*进程现场信息,程序计数器内容*/
int psw; /*进程现场信息,程序状态字寄存器内容*/
int next; /*下一个进程控制块的位置*/
}pcbarea; /*定义模拟进程控制块区域的数组*/

int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/

int run; /*定义指向正在运行进程的进程控制块的指针*/
struct
{
int head;
int tail;
}ready; /*定义指向就绪队列的头指针head和尾指针tail*/
int block; /*定义指向等待队列的指针*/
int pfree; /*定义指向空闲进程控制块队列的指针*/

麻烦各位高手了,望帮忙解决一下,急啊!~~!!!!!

yzhlinux 发表于 2003-10-20 18:20:00

这个问题也太麻烦了,回答这个问题要自己去写调试花费时间太浪费了,你还是参考书上的吧

towny 发表于 2003-10-20 20:54:00

我的脑子都快调得暴了,能写个大至的,让我自己调吗?
麻烦各位高手了!!!

yzhlinux 发表于 2003-10-20 22:40:00

你给的头部定义的几个队列指针看的出来你是想写一个 链接方式 的进程队列,由于给得太粗糙和简单,我尝试了一下,反而觉得很不好写,想考虑的一些东西你的结构里没有,而考虑进去发现弄的复杂了就写不完了,所以很难办,结果还是没有写下去,给你我开始的一点筐架吧。
/* the main site file */
CreatePro(&ID){
GetFreePcb(&ID);//申请一个空闲的PCB,并为其命名一个标识ID;
InitResour(&ID) ;//为该进程分配资源(内存空间和工作区);
/*初始化参数*/
   CallName(&ID);   //命名进程的外部名
SetParProStat(&ID);//记录父进程的ID和CPU的状态、
SetFL();//优先级数、
SetHeap();//进程起始地址、
_SetSelfStat();//设置进程的状态为就绪态
AddStat_Read(); //将该进程加入到就绪队列中。
.
.
.
.
}
我觉得上面至少要考虑的,但是实在很懒了,对你也许一点用没有,不好意思

towny 发表于 2003-10-21 12:04:00

呵呵!!
谢谢斑竹的高见!!

towny 发表于 2003-10-21 12:18:00

这是我自己做的一个版本,望斑竹给予指点!!!谢谢

#include<stdio.h>
#include<graphics.h>
#include<stdlib.h>
#include<conio.h>
#define running 1 /*用running 表示进程处于运行态*/
#define aready 2 /*用aready表示进程处于就绪态*/
#define blocking 3 /*用blocking表示进程处于等待态*/
#define sometime 5 /*用sometime 表示时间片大小*/
#define n 10 /* 假定系统允许进程个数为10 */
struct
{
int name; /*进程标识符*/
int status; /*进程状态*/
int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/
int pc; /*进程现场信息,程序计数器内容*/
int psw; /*进程现场信息,程序状态字寄存器内容*/
int next; /*下一个进程控制块的位置*/
}pcbarea; /*定义模拟进程控制块区域的数组*/
int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/
int run; /*定义指向正在运行进程的进程控制块的指针*/
struct
{
int head;
int tail;
}ready; /*定义指向就绪队列的头指针head和尾指针tail*/
int block; /*定义指向等待队列的指针*/
int pfree; /*定义指向空闲进程控制块队列的指针*/
main()
{ int gdriver=DETECT,gmode;
int i,x,y;
for(i=1;i<=n;i++)
{ready.head=pcbarea.next;}
initgraph(&gdriver,&gmode,"");
setcolor(YELLOW);
for(i=1;i<=4;i++)
{ setfillstyle(8,i);
    circle(284+13*i,190,6);
    floodfill(284+13*i,190,YELLOW);
    }
    setlinestyle(0,0,3);
    circle(316,190,25);
    setcolor(5);
    settextstyle(3,0,4);
    outtextxy(35,311,"press any key to createobjects!");
    getch();
    setcolor(YELLOW);
    line(300,215,290,235);
    line(323,215,333,235);
    delay(50000);
    setlinestyle(0,0,1);
    for(x=1;x<=2;x++)
    {setfillstyle(8,x);
   circle(267+13*x,246,6);
   floodfill(267+13*x,246,YELLOW);
   }
   for(y=3;y<=4;y++)
   {setfillstyle(8,y);
      circle(285+13*y,246,6);
      floodfill(285+13*y,246,YELLOW);
      }
      setlinestyle(0,0,3);
      circle(287,246,14);
      setlinestyle(0,0,3);
      circle(330,246,14);
      delay(50000);
      line(281,260,281,280);
      line(293,260,293,280);
      line(322,260,322,280);
      line(333,260,333,280);
      delay(50000);
      setlinestyle(0,0,1);
      setfillstyle(8,1);
      circle(281,286,6);
      floodfill(281,286,YELLOW);
      setfillstyle(8,2);
      circle(293,286,6);
      floodfill(293,286,YELLOW);
      setfillstyle(8,3);
      circle(322,286,6);
      floodfill(322,286,YELLOW);
      setfillstyle(8,4);
      circle(333,286,6);
      floodfill(333,286,YELLOW);
      getch();
      closegraph();
}




yzhlinux 发表于 2003-10-21 18:58:00

你在搞那么多画图干什么?你不是要做进程的创建吗??
难道不是《操作系统》的‘进程’那一章进程创建??
到底是要个什么效果??糊涂了

towny 发表于 2003-10-21 20:34:00

手误贴错了!
不好意思!!

yzhlinux 发表于 2003-10-21 21:54:00

我倒

ASEE 发表于 2003-10-22 21:09:00

狂晕,这个手误也太离谱了。

ASEE 发表于 2003-10-22 21:09:00

等待楼主的高见。

towny 发表于 2003-10-23 23:08:00

做了一半的半成品望斑竹指点!!

int timecount=0;
char far *indos_ptr=0;
char far *crit_err_ptr=0;
int num=0,current=0,i;
void over();
typedef int (far*codeptr)(void);
int create(char *name ,codeptr code ,int stacklen)
{
unsigned int * s;
num++;
tcb.stack =(unsigned int*) malloc( stacklen*sizeof(int));
      tcb.state = READY;
      strcpy( tcb.name ,name);
      tcb.ss = FP_SEG(tcb.stack);
      tcb.sp = FP_OFF(tcb.stack+stacklen-14);
      *(tcb.stack+stacklen-1) = FP_SEG(over);
      *(tcb.stack+stacklen-2) = FP_OFF(over);
      *(tcb.stack+stacklen-3) = 0x200;
      *(tcb.stack+stacklen-4) = FP_SEG(code);
      *(tcb.stack+stacklen-5) = FP_OFF(code);
      *(tcb.stack+stacklen-10) = FP_SEG(tcb.stack);
      *(tcb.stack+stacklen-11) = FP_SEG(tcb.stack);
      return num;
} ;
void interrupt (* old_int8)(void);
void interrupt new_int8(void)
{
        (*old_int8)();
        timecount++;
        if(timecount>=TL);
                if(!DosBusy())
                {
                        disable();
                        tcb.ss=_SS;
                        tcb.sp=_SP;
                        if(tcb.state==RUNNING)
                        tcb.state=READY;
                        current=3-current;
if(tcb.state==READY)
{                        _SS=tcb.ss;
                        _SP=tcb.sp;
                        tcb.state=RUNNING;
                        timecount=0;
                        enable();
}
}
};
void tcb_state()
{
        int i;
        for(i=1;i<=num;i++)
               printf("Thread %sis %d ",tcb.name,tcb.state);
};
int all_finished()
{
        int i;
        for(i=1;i<=num;i++)
                if (tcb.state!=FINISHED)
                        return 0;
        return 1;

};
void interrupt swtch(void)
{
int i;
        disable();
        tcb.ss=_SS;
        tcb.sp=_SP;
      if(tcb.state==RUNNING)
                  tcb.state=READY;
       for( i= current+1 ; i <= num;i++)
        {if(tcb.state == READY)
           gotoexcute;
       }
        for( i = 1 ; i <= current ; i++)
        { if(tcb.state == READY)
                  goto excute;
       }
       i = 0 ;
       excute:
                _SS = tcb.ss;
                _SP = tcb.sp;
                tcb.state = RUNNING;
                current = i;
       enable();
}

yzhlinux 发表于 2003-10-24 18:02:00

指点什么呢?效率?方法?还是编程格式?
给一篇代码给别人叫别人指点?我从来没有过。

towny 发表于 2003-10-24 21:48:00

操!
搞什么脾气啊!一个斑竹有什么了不起的啊垃圾!!

towny 发表于 2003-10-24 21:58:00

你要是不懂就让位!
别占着茅坑不拉屎!

yzhlinux 发表于 2003-10-25 16:39:00

您来,我让位

yzhlinux 发表于 2003-10-25 16:47:00

我一直都等待强人的参与,十分欢迎。我没有权限加你为斑竹,‘煎饼’ 看到请满足他。

ASEE 发表于 2003-10-27 10:57:00

感觉楼主有踢馆的味道哦。HOHO,还是希望楼主先把自己写过的代码全贴出来吧,不然我们就怀疑楼主是不是弄懂了操作系统的进程原理呢,而怀疑楼主是不是随便到网络上拷一段牛头不对马嘴的代码过来,要我们怎么看?因为从上面的代码看,没有完整的代码数据结构都搞不零清啊,况且为你解答不是我们必尽的义务,也希望态度好一点,如果是希望斑竹退位,哈哈……,随便啦。

towny 发表于 2003-10-27 11:56:00

完成了你们看吧!

#include <stdlib.h>
#include <dos.h>
#include <stdio.h>
#define GET_INDOS 0x34
#define GET_CRIT_ERR         0x5d06
#defineFINISHED 0
#defineRUNNING1
#defineREADY    2
#defineBLOCKED3
#defineNtcb   8
#defineTL       1
struct tcb{
               unsigned int * stack;/*堆栈的起始地址*/
               unsigned ss;   /*堆栈段址*/
               unsigned sp;   /*堆栈指针址*/
               char state;   /*进程状态*/
               char name;/*线程的外部标识符*/
               }tcb; /* 系统允许最多的任务数 */
int timecount=0;
char far *indos_ptr=0;
char far *crit_err_ptr=0;
int num=0,current=0,i;
void over();
typedef int (far*codeptr)(void);
int create(char *name ,codeptr code ,int stacklen)
{
unsigned int * s;
num++;
tcb.stack =(unsigned int*) malloc( stacklen*sizeof(int));
      tcb.state = READY;
      strcpy( tcb.name ,name);
      tcb.ss = FP_SEG(tcb.stack);
      tcb.sp = FP_OFF(tcb.stack+stacklen-14);
      *(tcb.stack+stacklen-1) = FP_SEG(over);
      *(tcb.stack+stacklen-2) = FP_OFF(over);
      *(tcb.stack+stacklen-3) = 0x200;
      *(tcb.stack+stacklen-4) = FP_SEG(code);
      *(tcb.stack+stacklen-5) = FP_OFF(code);
      *(tcb.stack+stacklen-10) = FP_SEG(tcb.stack);
      *(tcb.stack+stacklen-11) = FP_SEG(tcb.stack);
      return num;
} ;
void interrupt (* old_int8)(void);
void interrupt new_int8(void)
{
        (*old_int8)();
        timecount++;
        if(timecount>=TL);
                if(!DosBusy())
                {
                        disable();
                        tcb.ss=_SS;
                        tcb.sp=_SP;
                        if(tcb.state==RUNNING)
                        tcb.state=READY;
                        current=3-current;
if(tcb.state==READY)
{                        _SS=tcb.ss;
                        _SP=tcb.sp;
                        tcb.state=RUNNING;
                        timecount=0;
                        enable();
}
}
};
void tcb_state()
{
        int i;
        for(i=1;i<=num;i++)
               printf("Thread %sis %d ",tcb.name,tcb.state);
};
int all_finished()
{
        int i;
        for(i=1;i<=num;i++)
                if (tcb.state!=FINISHED)
                        return 0;
        return 1;

};
void interrupt swtch(void)
{
int i;
        disable();
        tcb.ss=_SS;
        tcb.sp=_SP;
      if(tcb.state==RUNNING)
                  tcb.state=READY;
       for( i= current+1 ; i <= num;i++)
        {if(tcb.state == READY)
           gotoexcute;
       }
        for( i = 1 ; i <= current ; i++)
        { if(tcb.state == READY)
                  goto excute;
       }
       i = 0 ;
       excute:
                _SS = tcb.ss;
                _SP = tcb.sp;
                tcb.state = RUNNING;
                current = i;
       enable();
}
/*-------------------------------------------------------------------------*/
void over()
{
        int i=current;
        /*strcpy(tcb.name,'\0');*/
        tcb.state=FINISHED;
        swtch();
        free(tcb.stack);
};
/*---------------------------------------------------*/
void InitInDos(void)
{
   union REGS regs;
   struct SREGS segregs;
   /* get the address to INDOS flag*/
   regs.h.ah=GET_INDOS;
   intdosx(&regs,&regs,&segregs);
   indos_ptr=MK_FP(segregs.es,regs.x.bx);
   /*get the address to CRIT_ERR flag*/
   if(_osmajor<3)
          crit_err_ptr=indos_ptr+1;
   else if (_osmajor==3&&_osminor==0)
          crit_err_ptr=indos_ptr-1;
   else
   {
          regs.x.ax=GET_CRIT_ERR;
          intdosx(&regs,&regs,&segregs);
          crit_err_ptr=MK_FP(segregs.ds,regs.x.si);
   }
};
int DosBusy(void)
{
   if(indos_ptr&&crit_err_ptr)
       return(*indos_ptr&&*crit_err_ptr);
   else
           return( -1);
};
void f1(void)
{
        int i,j,k;
        for(i=0;i<40;i++)
        {
                putchar('a');

                for(j=0;j<1000;j++)
                        for(k=0;k<100;k++)
                        ;
        }
};
void f2(void)
{
        int i,j,k;
        for(i=0;i<30;i++)
        {
                putchar('b');
                for(j=0;j<1000;j++)
                        for(k=0;k<50;k++)
                        ;
        }
};
/*------------------------------------------*/
main()
{
        InitInDos();
        old_int8=getvect(8);
        strcpy(tcb.name,"main");
        tcb.state=RUNNING;
        current=0;
        create("f1",(codeptr) f1,1024);
        create("f2",(codeptr) f2,1024);
        tcb_state();
        setvect(8,new_int8);
        swtch();
        while(!all_finished());
                strcpy(tcb.name,'\0');
                tcb.state=FINISHED;
                setvect(8,old_int8);
                tcb_state();
                printf("\n Multi_task system terminanted.\n");
};

towny 发表于 2003-10-27 11:58:00

我不想灌水,也根本不想在这样的版块浪费时间!!
页: [1] 2
查看完整版本: 菜鸟请教个为位高手一个关于进程代码的编写!