菜鸟请教个为位高手一个关于进程代码的编写!
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; /*定义指向空闲进程控制块队列的指针*/
麻烦各位高手了,望帮忙解决一下,急啊!~~!!!!! 这个问题也太麻烦了,回答这个问题要自己去写调试花费时间太浪费了,你还是参考书上的吧 我的脑子都快调得暴了,能写个大至的,让我自己调吗?
麻烦各位高手了!!! 你给的头部定义的几个队列指针看的出来你是想写一个 链接方式 的进程队列,由于给得太粗糙和简单,我尝试了一下,反而觉得很不好写,想考虑的一些东西你的结构里没有,而考虑进去发现弄的复杂了就写不完了,所以很难办,结果还是没有写下去,给你我开始的一点筐架吧。
/* the main site file */
CreatePro(&ID){
GetFreePcb(&ID);//申请一个空闲的PCB,并为其命名一个标识ID;
InitResour(&ID) ;//为该进程分配资源(内存空间和工作区);
/*初始化参数*/
CallName(&ID); //命名进程的外部名
SetParProStat(&ID);//记录父进程的ID和CPU的状态、
SetFL();//优先级数、
SetHeap();//进程起始地址、
_SetSelfStat();//设置进程的状态为就绪态
AddStat_Read(); //将该进程加入到就绪队列中。
.
.
.
.
}
我觉得上面至少要考虑的,但是实在很懒了,对你也许一点用没有,不好意思
呵呵!!
谢谢斑竹的高见!! 这是我自己做的一个版本,望斑竹给予指点!!!谢谢
#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();
}
你在搞那么多画图干什么?你不是要做进程的创建吗??
难道不是《操作系统》的‘进程’那一章进程创建??
到底是要个什么效果??糊涂了 手误贴错了!
不好意思!! 我倒 狂晕,这个手误也太离谱了。 等待楼主的高见。 做了一半的半成品望斑竹指点!!
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();
} 指点什么呢?效率?方法?还是编程格式?
给一篇代码给别人叫别人指点?我从来没有过。 操!
搞什么脾气啊!一个斑竹有什么了不起的啊垃圾!! 你要是不懂就让位!
别占着茅坑不拉屎!
您来,我让位 我一直都等待强人的参与,十分欢迎。我没有权限加你为斑竹,‘煎饼’ 看到请满足他。 感觉楼主有踢馆的味道哦。HOHO,还是希望楼主先把自己写过的代码全贴出来吧,不然我们就怀疑楼主是不是弄懂了操作系统的进程原理呢,而怀疑楼主是不是随便到网络上拷一段牛头不对马嘴的代码过来,要我们怎么看?因为从上面的代码看,没有完整的代码数据结构都搞不零清啊,况且为你解答不是我们必尽的义务,也希望态度好一点,如果是希望斑竹退位,哈哈……,随便啦。 完成了你们看吧!
#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(®s,®s,&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(®s,®s,&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");
}; 我不想灌水,也根本不想在这样的版块浪费时间!!
页:
[1]
2