下沙论坛

 找回密码
 注册论坛(EC通行证)

用新浪微博连接

一步搞定

QQ登录

QQ登录

下沙大学生网QQ群8(千人群)
群号:6490324 ,验证:下沙大学生网。
用手机发布本地信息严禁群发,各种宣传贴请发表在下沙信息版块有问必答,欢迎提问 提升会员等级,助你宣传
新会员必读 大学生的论坛下沙新生必读下沙币获得方法及使用
查看: 6118|回复: 27
打印 上一主题 下一主题

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

[复制链接]
towny 该用户已被删除
跳转到指定楼层
1
发表于 2003-10-20 12:59:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
create()  创建一个进程
; o4 g. d0 r: y1 H8 I- r2 `0 D5 t, G: j要求:1 用c语言编写5 S" T. S: ]' r% K! [
         2 程序+PCB(ID的内外优先权,申请资源)+ R1 u" J: f+ N0 o8 d
只需做进程中”产生“这一步。1 ?0 I0 {( y2 ~1 R, O" J
以下是做了3分之1的范例:, `9 V0 ^8 l6 ~
#include "stdio.h"
' F3 S. I. O/ y* E/ u$ @; ?0 A& ?#define running 1 /*用running 表示进程处于运行态*/
" k9 A; ?4 Z( {#define aready 2 /*用aready表示进程处于就绪态*/
% x) A: h- n! P* p3 j+ a6 k#define blocking 3 /*用blocking表示进程处于等待态*/ 1 T1 f6 d& k1 N4 S6 |& i7 u4 h
#define sometime 5 /*用sometime 表示时间片大小*/ 8 u' d2 E8 u6 Q: E2 K4 k6 C
#define n 10 /* 假定系统允许进程个数为10 */
5 ?2 H5 M3 Z3 ]3 k
- e: B! v$ W: C+ _( o. A) W' Z7 y1 fstruct
0 j# `5 N, I0 V9 a- c9 g{ 1 W7 k) i! y& v8 f: H
int name; /*进程标识符*/
1 G* M% H7 ?% R4 p% ?  _int status; /*进程状态*/
* V, T3 ?) y( i, Y# E' j( k* Qint ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/
3 C. e/ B2 ?  C8 S$ r/ e$ Fint pc; /*进程现场信息,程序计数器内容*/
/ ~2 R3 ]) w, L: m# sint psw; /*进程现场信息,程序状态字寄存器内容*/ 6 {5 I5 u& x: a4 o# O
int next; /*下一个进程控制块的位置*/
, t: B: O) M! y3 P( x* G# r2 O}pcbarea[n]; /*定义模拟进程控制块区域的数组*/ / M: _2 r" |% A6 _( ~/ y% }

7 r: j# F; o6 o5 w1 Z% Wint PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/ : D# O: t" O' `# i
+ j) s1 \1 t9 ]/ D: Q3 S
int run; /*定义指向正在运行进程的进程控制块的指针*/
6 B2 E8 F$ u0 y6 d5 Vstruct * N; F) ^" z4 U$ W
{
0 Q6 S: U" s& lint head;
, h5 z% r% ^7 H3 Oint tail;   b& K& d. \2 u- N
}ready; /*定义指向就绪队列的头指针head和尾指针tail*/
0 Y8 X' U% ?+ m0 G* t8 Qint block; /*定义指向等待队列的指针*/
, w* M! F( t* P: ], U4 oint pfree; /*定义指向空闲进程控制块队列的指针*/# _" z- D4 R: t: _$ y$ p5 W" O
9 a! v% a' X) Z
麻烦各位高手了,望帮忙解决一下,急啊!~~!!!!![em00]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩 转发到微博
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    2
    发表于 2003-10-20 18:20:00 | 只看该作者
    这个问题也太麻烦了,回答这个问题要自己去写调试花费时间太浪费了,你还是参考书上的吧
    towny 该用户已被删除
    3
     楼主| 发表于 2003-10-20 20:54:00 | 只看该作者
    我的脑子都快调得暴了,能写个大至的,让我自己调吗?$ m. E5 p  a' \3 A+ I" I# a
    麻烦各位高手了!!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    4
    发表于 2003-10-20 22:40:00 | 只看该作者
    你给的头部定义的几个队列指针看的出来你是想写一个 链接方式 的进程队列,由于给得太粗糙和简单,我尝试了一下,反而觉得很不好写,想考虑的一些东西你的结构里没有,而考虑进去发现弄的复杂了就写不完了,所以很难办,结果还是没有写下去,给你我开始的一点筐架吧。
    ' f3 O( r4 i" i, L% q/* the main site file */' @( l  m, r& ~2 ~- T3 ?+ G
    CreatePro(&ID){' e- P5 }* U8 b# q9 U4 U
      GetFreePcb(&ID);  //申请一个空闲的PCB,并为其命名一个标识ID;2 U+ K! B& j, f4 b
      InitResour(&ID) ;//为该进程分配资源(内存空间和工作区);5 @' \: _" ^( V# _- N$ c
    /*初始化参数*/# q3 G* ^# y; _
       CallName(&ID);   //命名进程的外部名5 _4 ]  c2 o- [
      SetParProStat(&ID);  //记录父进程的ID和CPU的状态、
    2 b3 s; ?  p* e/ f8 I  SetFL();  //优先级数、+ m: `3 \+ M! V( ^
      SetHeap();  //进程起始地址、
      ~$ t" k/ f- J1 [8 w+ w# i  _SetSelfStat();  //设置进程的状态为就绪态* l2 Y0 @. x" ]! v
      AddStat_Read(); //将该进程加入到就绪队列中。
    5 b8 E. \: b3 p. Q' m$ \/ ~." T# ]/ {  f  h8 L6 D0 @4 o" ?) a
    .
    7 ~+ x/ @& W2 l3 ~.. K3 z/ m$ B1 l5 H% L/ c
    .
    2 S0 M2 `+ O! b- U. H}
    ! F# I/ F9 |3 r; J) N1 C我觉得上面至少要考虑的,但是实在很懒了,对你也许一点用没有,不好意思
    0 {5 J1 \; a) X% ]
    towny 该用户已被删除
    5
     楼主| 发表于 2003-10-21 12:04:00 | 只看该作者
    呵呵!!* F$ t2 w( D6 ]- Y- X
    谢谢斑竹的高见!!
    towny 该用户已被删除
    6
     楼主| 发表于 2003-10-21 12:18:00 | 只看该作者
    这是我自己做的一个版本,望斑竹给予指点!!!谢谢 ( g( {3 W5 A; _; F% D' n+ ^8 ?" ]0 F8 N- I- g- i #include& V/ K; l R* K ` #include; t: B/ T) b) V" c, T! n! a #include6 y; D% |9 S) G) K4 M( B #include Y4 O- S6 a8 W2 y. p8 M3 G#define running 1 /*用running 表示进程处于运行态*/ & g$ a- S6 ]3 r3 D5 b( T#define aready 2 /*用aready表示进程处于就绪态*/ 2 |0 ]" H4 m9 X/ Z( J* y4 j; D#define blocking 3 /*用blocking表示进程处于等待态*/ . u. a+ Z0 E, u/ M7 M. ]#define sometime 5 /*用sometime 表示时间片大小*/3 _4 `9 P0 L: g8 ^3 k. r: `# `8 \/ n #define n 10 /* 假定系统允许进程个数为10 */3 G1 C4 u. P9 K' I0 n0 P2 a( `) d `5 K struct0 o9 v5 Y) f* J$ v: a+ [, t) K { " _2 I7 |$ {; {2 c3 ]2 ?int name; /*进程标识符*/- r) [+ U4 _9 v- n int status; /*进程状态*/, V7 g& [9 M1 b7 Z. J int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/ * v) e6 c1 i; k& v5 |% Y* A- F) ]int pc; /*进程现场信息,程序计数器内容*/# _4 E8 w( v% h int psw; /*进程现场信息,程序状态字寄存器内容*/" x: P* a3 ~! S9 w% Z2 @ int next; /*下一个进程控制块的位置*/ 6 X1 E" c5 ^! h4 Q0 i2 I+ G}pcbarea[n]; /*定义模拟进程控制块区域的数组*/ [- i' X" H' t: e# h9 Wint PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/ 4 M+ U( x1 c6 W, fint run; /*定义指向正在运行进程的进程控制块的指针*/ / X' r2 [, r# M# L& j5 wstruct # a/ X4 f$ R7 v3 f5 s5 y( D{ + I( _3 j8 T. B7 K$ }* D) Zint head;- |# M( a6 y3 O/ ~+ h Z int tail;! y' s! [ R3 e" e0 N2 v }ready; /*定义指向就绪队列的头指针head和尾指针tail*/ ) h1 m8 k! q$ n, S. z) gint block; /*定义指向等待队列的指针*/. m9 t4 q4 o0 N$ H+ `' \ int pfree; /*定义指向空闲进程控制块队列的指针*/ # w) w# _* b: J# h7 I, \$ zmain() + ]! C/ N4 E! f" Y1 X6 {- {{ int gdriver=DETECT,gmode;! v- V& P, e8 E- J: a int i,x,y;; N4 }; O$ |7 l Y9 I for(i=1;i<=n;i++)0 a' _% ^/ J) I {ready.head=pcbarea.next;}& t/ F1 d! v3 D. z% l: f initgraph(&gdriver,&gmode,"");- G& C" D/ o9 q, `* f setcolor(YELLOW); : I* C- c3 ^- m' _+ } for(i=1;i<=4;i++)" c1 ]5 |! [5 g& R6 x: r. \ { setfillstyle(8,i);& t8 v6 ?4 |; v- ?2 p! _ circle(284+13*i,190,6);0 K0 n8 |( E$ p3 v5 `( p floodfill(284+13*i,190,YELLOW); k L* l+ `3 F. A- s* N! [5 x2 @9 f } ; r! T {: ~( k {8 |8 j setlinestyle(0,0,3); D4 @, D4 @, v4 \ circle(316,190,25); ! g; y3 A; G* v( T0 y setcolor(5);* U* J8 Q J4 S# T settextstyle(3,0,4); / K- f9 o$ Q4 C5 J* \ outtextxy(35,311,"press any key to create objects!"); 4 _: `2 `* u- e$ S getch();$ `2 O! b+ ]0 h! e' q6 W setcolor(YELLOW); - g4 z* J" y( B2 w$ a line(300,215,290,235);* v9 o, Z0 ^( \) i line(323,215,333,235);% \& w ~7 N! l" T delay(50000);% r5 t1 p8 n/ r% c setlinestyle(0,0,1); ! K3 K A D& f+ ^4 |7 R1 B" l for(x=1;x<=2;x++) $ `' A& X/ [4 ?9 W$ E# \! N2 F {setfillstyle(8,x); * v W; i8 D0 ?4 Z circle(267+13*x,246,6); * `6 P7 `' K4 e5 N% D& u floodfill(267+13*x,246,YELLOW); / D5 O; |; N0 m o, N } ; a' N( @, Q$ d3 w for(y=3;y<=4;y++)+ ]3 @8 O; a7 H8 m7 N+ O {setfillstyle(8,y); . ?4 V. Y# |7 i f circle(285+13*y,246,6);% @% r Z, ~) g) }7 D3 @ floodfill(285+13*y,246,YELLOW);5 z {, E+ |3 _! I( _) q } 9 |: o0 @, n5 u, L2 ] setlinestyle(0,0,3); F* _/ S# l* S+ Z5 j circle(287,246,14);+ X0 C. |0 j/ g! B( R3 c setlinestyle(0,0,3); 0 E2 M5 t* G9 K0 w! C: x& ?' F, t circle(330,246,14);6 X6 h' E3 G, ~! q5 Y1 ]6 \ delay(50000);* |( t4 o% K; i+ z line(281,260,281,280);1 }9 n5 H! Q9 Q; [ line(293,260,293,280); 5 h* ~1 `- U( S! N# t# y line(322,260,322,280); 1 C" g# W' v) W o( W; B3 s line(333,260,333,280); 2 ]7 w6 F) A* G9 } delay(50000);/ t8 f' [. ]: U% \* g3 B0 K setlinestyle(0,0,1); 8 {3 R2 _, z7 v$ O9 t5 q setfillstyle(8,1); 0 @/ [) F8 k! `3 W. O circle(281,286,6);* W" T% V3 ?0 F9 h4 j. B: x% n floodfill(281,286,YELLOW); ; Z- Z3 L0 j, Q$ F setfillstyle(8,2);0 G- O C4 S( H* \+ w' q circle(293,286,6); 1 U( e4 Z; ~; f floodfill(293,286,YELLOW); + T/ e- b" a- R3 M+ l! D# r* J setfillstyle(8,3);* M9 P6 q7 g) ^9 J+ V, Q5 v circle(322,286,6);/ ~) d+ z7 m3 K1 c floodfill(322,286,YELLOW); ) [, G" K5 F7 s& ~. `3 r! ?% J p; W5 n* S setfillstyle(8,4); * L7 N$ @6 b% H. X circle(333,286,6);- N) V9 W& b! Y$ Y* F floodfill(333,286,YELLOW); 6 S9 T" p% E/ [0 C: n* g6 \ getch();' h* e! L8 J& k5 `+ ^% h& `: d closegraph();8 \3 I& Y& p- d }! g( q- {1 T$ p) h! X2 e 6 K( z! D) A# C9 T 0 Y& }4 B+ X! L% A1 m
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    7
    发表于 2003-10-21 18:58:00 | 只看该作者
    你在搞那么多画图干什么?你不是要做进程的创建吗??
    ! @9 |" e" t! ^2 Z" q4 _" ^难道不是《操作系统》的‘进程’那一章进程创建??( r  A7 h0 X3 ?
    到底是要个什么效果??糊涂了
    towny 该用户已被删除
    8
     楼主| 发表于 2003-10-21 20:34:00 | 只看该作者
    手误贴错了!
    ; M  v) j. W0 f* [5 m# L; W- g不好意思!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    9
    发表于 2003-10-21 21:54:00 | 只看该作者
    我倒
  • TA的每日心情
    无聊
    2015-1-16 14:36
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    10
    发表于 2003-10-22 21:09:00 | 只看该作者
    狂晕,这个手误也太离谱了。
  • TA的每日心情
    无聊
    2015-1-16 14:36
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    11
    发表于 2003-10-22 21:09:00 | 只看该作者
    等待楼主的高见。
    towny 该用户已被删除
    12
     楼主| 发表于 2003-10-23 23:08:00 | 只看该作者
    做了一半的半成品望斑竹指点!! 7 d/ Y" r4 c" s& B% C8 m8 P7 l. u* E' F int timecount=0; $ Z, M- W ~3 I2 C9 Xchar far *indos_ptr=0; 3 S I" X# o" Y6 S1 R% q8 [char far *crit_err_ptr=0;- p! K& e$ k8 ^/ a int num=0,current=0,i;5 i6 X3 S. e, o' @* d0 J- ^+ j6 ^ void over();( K5 c. j" p: y$ R* l typedef int (far*codeptr)(void); ' E$ d# n9 m' xint create(char *name ,codeptr code ,int stacklen). g( e" l4 h% V3 [' m {9 r) o; w2 g1 S! [0 @ unsigned int * s;6 h7 S0 Q2 f2 L& r. S num++;! W; ^: K6 z8 v. C v tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); - F8 C: v6 R! f# `- k tcb[num].state = READY; _5 b, M! B0 L, b$ [0 ^4 M3 c; Z" Z strcpy( tcb[num].name ,name);. K y. `6 ~8 Q8 N$ x5 l$ Q tcb[num].ss = FP_SEG(tcb[num].stack); ; ? K* k' ?4 w) M' K1 w tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14);+ R! Y* T, @8 s* A5 A *(tcb[num].stack+stacklen-1) = FP_SEG(over);8 U6 Y. g1 e. R6 I *(tcb[num].stack+stacklen-2) = FP_OFF(over);0 y. _( L, `7 u& }4 u/ U *(tcb[num].stack+stacklen-3) = 0x200;& I: j/ E+ o2 E! J *(tcb[num].stack+stacklen-4) = FP_SEG(code);, y, q1 o& P3 f7 R *(tcb[num].stack+stacklen-5) = FP_OFF(code); 4 y% E$ i7 \/ P% v *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);$ G. `: d' h! u' i *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack);$ Y& h. U/ {& a/ x# e0 ? return num;! w4 E2 b% C( z* r! V } ;; O; a' n$ @' o5 D void interrupt (* old_int8)(void); , c; p3 @4 s/ K- I- J9 jvoid interrupt new_int8(void). b4 [/ ]0 f0 j' N( i {" S& Y7 }% V) i7 J& v8 U% T. o. W1 e6 Z (*old_int8)();8 `9 I7 E" U7 b# I& Q, ] timecount++; 2 M" l- s4 K' h# v, \0 P6 L4 m1 I if(timecount>=TL); " N9 _% j2 W/ F9 { if(!DosBusy()) 9 D; v: y) [7 B1 y" f { ' @& C; g0 m, A F disable();0 a3 s% B, B8 t. u! M; _8 J, m tcb[current].ss=_SS;: F" |6 F! o' y* K4 O6 ~0 {2 C tcb[current].sp=_SP;) N" {1 |4 y! f) m/ `3 j4 x( D+ l if(tcb[current].state==RUNNING) - k0 f9 Z6 ]& k8 E. E tcb[current].state=READY;1 H3 C s$ f( s" Q6 o current=3-current;- {" E& H* o) M, a8 [$ H9 O$ T* {& u3 H if(tcb[current].state==READY)+ i/ ]1 l k% S' B { _SS=tcb[current].ss;' A7 X" x# L, h) _; M _SP=tcb[current].sp;' x" J4 x+ ]5 O: |& J/ q" @ tcb[current].state=RUNNING;8 Q" @9 ]9 e& S: B% @7 V- c" v$ H timecount=0;3 D7 Q9 n% e V$ n- f0 M Z# ]& w enable();3 U2 `! r6 T! m& h+ u }( ~3 [2 ]8 l3 f; r7 S X# n# @ } . S R, d% O. X+ w4 p};# W y" l( D" B& h# M: ?7 Y j5 I1 J void tcb_state()- }. `' O, W9 h+ q {! @- A5 \# z4 `& W8 j int i; . t8 A$ q6 y! r3 O for(i=1;i<=num;i++) - ^- h+ m- I( r3 D printf("Thread %s is %d ",tcb.name,tcb.state); # H, ?: P: ]# A3 g$ E};, [" X7 Z- C& p8 m int all_finished() d1 ]( @, O- \0 b( w& Z- H {& G6 R8 z, j% E int i;5 V( H3 L% H; Y6 ]9 R for(i=1;i<=num;i++)+ X- ~& _1 A+ e if (tcb.state!=FINISHED)' c; \! w3 n& w* s0 z return 0; ]( {2 H4 p& a) H7 B( @, s return 1;3 c; e0 d1 f1 k+ o3 h* K( ~9 ^/ {& K& p 6 z9 l+ S7 {# p5 k. } J }; " c2 A: Q. m, G; A" p0 hvoid interrupt swtch(void) & V1 I+ f$ N+ O1 W{ 9 ?0 }) |, j% i0 O) K2 _1 k$ q$ Gint i;: [$ Z, [% m: D1 T7 z( | h( z6 l disable(); " e0 D' v& T# l9 {/ e) l tcb[current].ss=_SS;* h/ l* F! m. b tcb[current].sp=_SP;, t( L3 \+ V6 v6 C if(tcb[current].state==RUNNING); k$ l; {! S- x: ? tcb[current].state=READY;* m+ S/ h- o6 w" k for( i= current+1 ; i <= num;i++)6 F! Z3 P2 k) O9 l) |% c { if(tcb.state == READY ) 7 l& j0 q! E" V7 O+ | T' j, { goto excute;/ ?0 Z- d! _9 Q7 ]+ \ }- {- P$ B; Q' t8 J9 F, q! C; u for( i = 1 ; i <= current ; i++)* k0 W5 F8 v- P { if(tcb.state == READY)$ a1 d+ s; j$ ?0 F4 k. O goto excute; : B. J4 r; J, V& m/ t; r4 V }$ x- T/ H" ?; q$ y, ] i = 0 ;5 Q+ r. P" A/ q" j0 K- J excute: ) k* g/ y1 x3 J6 A _SS = tcb.ss;/ Y9 V& R* b/ V# @ _SP = tcb.sp; # F, K: T# z' n: C- ` tcb.state = RUNNING;. V+ _0 V: V, l" ?- i d) M current = i;2 e4 K" d5 @# D8 @" h! M) B; w enable(); ! H* A Z: m7 X) w}
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    13
    发表于 2003-10-24 18:02:00 | 只看该作者
    指点什么呢?效率?方法?还是编程格式?( D0 j. l1 ^9 o4 h( ^
    给一篇代码给别人叫别人指点?我从来没有过。
    towny 该用户已被删除
    14
     楼主| 发表于 2003-10-24 21:48:00 | 只看该作者
    操!/ R% x. s! x2 j! e& W
    搞什么脾气啊!一个斑竹有什么了不起的啊垃圾!!
    towny 该用户已被删除
    15
     楼主| 发表于 2003-10-24 21:58:00 | 只看该作者
    你要是不懂就让位!
    6 |* I0 Y  [9 P0 C9 Q别占着茅坑不拉屎!
    2 r3 |1 c6 V- s( G
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    16
    发表于 2003-10-25 16:39:00 | 只看该作者
    您来,我让位
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    17
    发表于 2003-10-25 16:47:00 | 只看该作者
    我一直都等待强人的参与,十分欢迎。我没有权限加你为斑竹,‘煎饼’ 看到请满足他。
  • TA的每日心情
    无聊
    2015-1-16 14:36
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    18
    发表于 2003-10-27 10:57:00 | 只看该作者
    感觉楼主有踢馆的味道哦。HOHO,还是希望楼主先把自己写过的代码全贴出来吧,不然我们就怀疑楼主是不是弄懂了操作系统的进程原理呢,而怀疑楼主是不是随便到网络上拷一段牛头不对马嘴的代码过来,要我们怎么看?因为从上面的代码看,没有完整的代码数据结构都搞不零清啊,况且为你解答不是我们必尽的义务,也希望态度好一点,如果是希望斑竹退位,哈哈……,随便啦。
    towny 该用户已被删除
    19
     楼主| 发表于 2003-10-27 11:56:00 | 只看该作者
    完成了你们看吧! 7 V: }! ^( v1 C ! u5 U& g: G( ~* T. O5 e$ t; k#include 5 \ C- `0 l6 D5 W% ^#include $ d2 R& K/ s% V0 g: v ]#include & c) E4 J, O4 L. f, [#define GET_INDOS 0x340 [5 }" D- W O7 [1 r( B3 {7 Z7 H #define GET_CRIT_ERR 0x5d06 3 T7 J, A; Q( U2 |$ K#define FINISHED 0 ' ^8 e6 B" M1 r#define RUNNING 12 u' a. |( X* T; y( n; h #define READY 2* g1 S* a) h. z #define BLOCKED 3 % a( \- }! o3 o- t, `2 D( G#define Ntcb 83 L) R$ @( Y+ x( u- D& A% l #define TL 1 ( k: v4 I6 w6 g: X' [struct tcb{ 5 y4 P9 w! x3 R3 }9 X8 N! N0 i unsigned int * stack;/*堆栈的起始地址*/# U! x* |% l1 e+ k7 N/ F- y unsigned ss; /*堆栈段址*/ - }9 i2 W; G6 E( |5 k6 W unsigned sp; /*堆栈指针址*/& h" a% H! Z; o D char state; /*进程状态*/ 9 s- Z! |. }. o4 v char name[10];/*线程的外部标识符*// `% J* S6 p: ?+ `7 H }tcb[Ntcb]; /* 系统允许最多的任务数 */$ y0 [5 H) R* `, _: ~! E, g3 u int timecount=0;2 O% [1 U/ X: ^) \0 d: w* l char far *indos_ptr=0; ; w( g3 a8 [6 _2 i+ l/ Y$ N, T# pchar far *crit_err_ptr=0; + D2 Z+ s3 a, {# m% Q' O6 U* w' Oint num=0,current=0,i; 7 {8 S" j! |2 `& I* e4 Svoid over(); n4 m* |! c( z$ P) _) N# _! } typedef int (far*codeptr)(void);1 Q; @6 e, r8 Z int create(char *name ,codeptr code ,int stacklen)$ M: y) Z+ ~ o3 ~ { ) K4 ^; i7 H, @7 ~$ funsigned int * s; ; |4 n' I' g, i* fnum++;5 {7 k+ F. `. \0 k tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int));. U5 `$ @* ^* }- X: ] tcb[num].state = READY; 8 a S; J$ m6 y6 g3 r# h+ q strcpy( tcb[num].name ,name); 7 M5 k2 u2 P! j+ I tcb[num].ss = FP_SEG(tcb[num].stack);$ V Y1 A7 G! k# w' R0 o tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14); ! j- W w* s: ^ *(tcb[num].stack+stacklen-1) = FP_SEG(over);4 M' R" x/ ~# b0 C, T; `: y *(tcb[num].stack+stacklen-2) = FP_OFF(over); j, [4 l1 E2 _ ]9 F- J) A *(tcb[num].stack+stacklen-3) = 0x200;* n$ c+ h! s6 j; A {# z0 R *(tcb[num].stack+stacklen-4) = FP_SEG(code);. Z8 w% Q+ K/ H3 p7 r1 F A *(tcb[num].stack+stacklen-5) = FP_OFF(code);6 o! O5 {; E+ b# ^6 [& C *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);+ m: l9 N C [6 o" m6 k) A *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack); z& ^' I7 m4 C( N# j' o: y9 t return num;$ C+ D. D) Z- _1 o } ; ! E: s6 ~2 g4 R8 `8 c: m# r9 ?) z. [void interrupt (* old_int8)(void); , p4 s( O" p, x- Z0 O. ? void interrupt new_int8(void)1 \3 d- I' q/ m. f- Y. ^. K! _ {, H7 K' t2 C0 l# @+ J (*old_int8)(); 7 | F/ O; V( `) s9 m' g timecount++; ! Y9 s4 p' |* q P- S3 n if(timecount>=TL); * D: E, W# u5 v# c7 ]4 l if(!DosBusy())( \- B5 C% u3 c6 i7 x/ j { ] O6 j* {! s0 I2 S6 k# w% U disable();8 G( B- A/ P3 ?& _# l) A7 i tcb[current].ss=_SS; # ~# R) b3 I% q6 e2 g# x7 C tcb[current].sp=_SP;+ ~+ C) `$ u; d" K if(tcb[current].state==RUNNING) ' m2 x, G, |4 a* D' G tcb[current].state=READY;: W. a& S: _1 o- D; G0 G0 P current=3-current;& h3 H' M: v' q! D( b' e | if(tcb[current].state==READY)# P! [5 q4 y9 t { _SS=tcb[current].ss;# N' F' G% Y# r x2 M. k4 `6 H" P4 F& T _SP=tcb[current].sp; * j* \: Z& e6 O3 P z tcb[current].state=RUNNING;1 @) p8 H& X6 b4 J timecount=0; 7 U4 g8 F1 [( _$ X. O- w( y: F* F enable(); - C! p( h5 S4 @4 R4 c}2 ?- x8 P9 F3 f! [ } 3 H# Q8 d r' h3 _}; : a, h! c, x. ` Rvoid tcb_state() 4 l4 C6 N# A8 M/ T( l{ - T6 X; E7 `# u- f/ o int i; . f+ v8 _" U' P9 m for(i=1;i<=num;i++) " d4 _) x* x* f7 ~! o printf("Thread %s is %d ",tcb.name,tcb.state);9 ]: B! [) p0 M: _ }; 1 a) T4 w5 i8 v% H$ nint all_finished()4 P6 Q7 r* K1 ?3 \( Q: E { / N5 Y0 W R. n: l) Z int i;6 q4 d! }% l; g6 q! L. u3 b for(i=1;i<=num;i++)/ l$ c# S3 U3 `( } if (tcb.state!=FINISHED)+ r0 z$ b: j+ U2 r0 T2 V1 g# q3 S# t return 0;3 S$ @- c& } _ return 1;+ N) W) Y3 x( w' c# P / F8 C& c1 J4 \6 M# e" `};% {- l: n, `) J3 f" _1 \; z void interrupt swtch(void) $ N- N$ s8 [* s, P; i% r{ 0 u, e0 z y( ?8 Yint i;3 i8 D% B8 f2 E disable();4 ~/ h7 l/ P5 }; n% }7 ~ tcb[current].ss=_SS;% z( u5 U; v5 U7 H0 e2 C tcb[current].sp=_SP; ' c- C) W! |2 J3 C9 N, J if(tcb[current].state==RUNNING): F2 I# q3 i# k tcb[current].state=READY;9 Z& W s7 c! x# e+ M for( i= current+1 ; i <= num;i++) ) f% T8 \6 d. q4 ^0 I0 P { if(tcb.state == READY ) E+ Y; m/ y2 I, e" a# A& Y goto excute; " u5 g. p4 c& Q& K/ Q* z P1 l. u' V }& i2 n( i1 ]. l0 W2 s1 ~ for( i = 1 ; i <= current ; i++) # g; M9 r* b: f! Z4 H" q& j { if(tcb.state == READY); I/ X4 N# p! M6 T. c goto excute; ( Q7 H8 B0 ], V/ p5 L' y: k }0 T. X4 ?; X. Y M. k T i = 0 ;3 O, e5 }) t7 R1 x' H excute:& m; m: e; k! @( \ _SS = tcb.ss;% |- y% X+ ^% c _SP = tcb.sp;, M7 G# x5 D- _ tcb.state = RUNNING;6 |! Q' x, K; ?6 n0 a current = i; 1 w4 N/ d9 Z6 [/ f enable(); # u' t* }( q3 W; V H}: j$ @8 L7 j0 i, }- v /*-------------------------------------------------------------------------*/; W/ ]% |$ U; w5 Y G void over()' p, V8 r& D( L! m2 H' n( B3 X {, V- e8 O5 R, C' J$ k int i=current;/ \7 h" T }6 Y# d' w" }6 h* I- K /*strcpy(tcb[current].name,'\0');*/ 7 s* Z( k& f& A5 @' P9 D tcb[current].state=FINISHED; 0 H" c6 q4 e$ F# i+ l* A1 q7 X# s swtch();0 ]- R, I; s8 |8 q& `: U [! O: V free(tcb.stack);% M. G7 P3 [! l5 k4 N };( S/ E; d* Q f9 J, f: s" v /*---------------------------------------------------*/ 8 R- h' h% y! h8 l- K+ S( \void InitInDos(void) ' F. U/ S% U' q! i{3 @/ c {; [! M; [9 t: T. K; L union REGS regs; ' Q! o9 R* C- T( C6 F8 {1 a0 b struct SREGS segregs;1 b: w' A# L, w /* get the address to INDOS flag*/ 4 F* j% m2 ^+ V5 ^9 q- S regs.h.ah=GET_INDOS;# u2 n+ i7 _7 @( ~+ n0 I5 |) T intdosx(®s,®s,&segregs); ! Z% S! q- e9 R2 J indos_ptr=MK_FP(segregs.es,regs.x.bx); 6 ^+ U. x/ j' z' H1 V4 c8 K /*get the address to CRIT_ERR flag*/ ) R9 P% C- ~! o& b3 {. l9 B" [ m" v if(_osmajor<3)4 C7 f3 {4 o$ Z# x! l/ S1 v* T crit_err_ptr=indos_ptr+1;: @' `' M7 d& C3 m! e else if (_osmajor==3&&_osminor==0)1 A( N [0 {1 J$ v% d9 E0 `1 R7 ]" C crit_err_ptr=indos_ptr-1;% i4 m) T: d6 T- e else6 \# I6 B/ z2 B/ B/ {' c6 i- b {, L' P& q1 H% ] _: I- Q regs.x.ax=GET_CRIT_ERR; t9 |3 P2 I5 w2 H intdosx(®s,®s,&segregs);+ u1 r) r9 f: V crit_err_ptr=MK_FP(segregs.ds,regs.x.si);& y1 t4 l3 g2 j- N }7 X. b- H2 `4 E1 g1 K% L };) T$ \$ Y% y% b x; J, A int DosBusy(void); N' M4 q1 _( G+ [+ `, g) j { $ l. {; ^2 a# M if(indos_ptr&&crit_err_ptr)/ B/ ~+ I. O, o6 o2 l* Q) B return(*indos_ptr&&*crit_err_ptr); ) Q$ `$ j9 m2 e1 t0 J2 `/ L8 i" u* u& Q0 X$ | else) q: c% |6 N( i return( -1);. J& Y/ l& L/ z }; " o" _+ u. ^8 B2 E+ rvoid f1(void) 5 Z1 H. X/ D* j. g{3 G1 G, y) r+ X# i- L) \ int i,j,k;' M4 `/ `9 \- x) h1 Z! A for(i=0;i<40;i++) O3 H: N/ a) D, v$ \ { # ^$ R7 l, A9 P) R8 d! M) K putchar('a'); 9 ^ ]1 k! n" B& W7 T8 x+ w% y- `# } ; q" j* d; r* c5 ~9 T0 H- S for(j=0;j<1000;j++)8 \: h! M# u! Y( E- g3 t for(k=0;k<100;k++)( M% R( f5 G' w) v ;& ]; w) w& X, _* l; f8 E }8 Y3 O$ j5 M' X E4 k* x+ G' M9 ? };1 R' E0 S3 z% s. R7 k void f2(void) 3 i: I# p5 F: R: Y; Y2 E{& e1 l5 p+ H( R! ~3 N$ b) f int i,j,k;* R7 P2 Z0 Y# z% m0 C for(i=0;i<30;i++) 9 O- O' i8 X% a1 Y# \ {2 L3 O: p y* I, K( H% D putchar('b'); 6 }% j; r7 P: R4 c0 V2 Z# c# ~ for(j=0;j<1000;j++) " `* N. N k% ]' a for(k=0;k<50;k++) 6 J" Z0 A4 Z/ v4 c1 x3 M ;) \( ^6 L9 S: y } a; A4 c& d. O1 R- W};/ v1 ~" K2 {* m) ?7 p /*------------------------------------------*/ ! c$ ~1 |# `( Z* H1 \' L3 imain()4 o- | f2 ^/ f( T, Y9 J- m' | {6 G1 F5 i5 C! S InitInDos(); : U% u. d) y& G* y2 ?4 S old_int8=getvect(8); 7 h- H9 f+ M( n, c strcpy(tcb[0].name,"main");. z4 y3 F) ]# {9 i tcb[0].state=RUNNING;1 [ E* ]# t/ p( M* ~ current=0;9 ]% \/ d- i% n1 E$ @ create("f1",(codeptr) f1,1024); 1 ` x0 O2 y- B) m. e create("f2",(codeptr) f2,1024);9 h5 @: J; D9 j) ^4 K tcb_state(); 6 F6 T3 N5 B: f setvect(8,new_int8); ; A6 y0 x1 f. l2 b1 B" y swtch();1 f7 k# ?# l- r- u I5 u while(!all_finished());) w% B$ p! I6 _+ V- D: z2 \ strcpy(tcb[0].name,'\0'); . f- o. |# u5 v4 B9 k tcb[0].state=FINISHED;" A: m# W1 l0 N9 F" r setvect(8,old_int8); 2 r1 O) b1 x" a tcb_state(); 1 @; P$ W! `; C printf("\n Multi_task system terminanted.\n");4 `2 G4 @5 S3 w };
    towny 该用户已被删除
    20
     楼主| 发表于 2003-10-27 11:58:00 | 只看该作者
    我不想灌水,也根本不想在这样的版块浪费时间!!

    本版积分规则

    关闭

    下沙大学生网推荐上一条 /1 下一条

    快速回复 返回顶部 返回列表