下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]
towny 该用户已被删除
跳转到指定楼层
1
发表于 2003-10-20 12:59:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
create()  创建一个进程
. v& A9 a' ]' A, e3 x要求:1 用c语言编写
9 n! ^5 O' n; `( N) W( H         2 程序+PCB(ID的内外优先权,申请资源)/ J! }, a( o, \! p
只需做进程中”产生“这一步。
) f  c4 K9 A% x1 ]/ n以下是做了3分之1的范例:
4 {  n3 m" |7 D0 S) q0 \#include "stdio.h" . g9 \* c1 Q( |" p, j
#define running 1 /*用running 表示进程处于运行态*/ + L7 N$ |3 U$ H) b% X
#define aready 2 /*用aready表示进程处于就绪态*/ 3 d2 X& `  a/ x
#define blocking 3 /*用blocking表示进程处于等待态*/
/ D  S0 l" o1 y+ n, _/ X#define sometime 5 /*用sometime 表示时间片大小*/ 0 n1 q( N1 j' T0 D$ M
#define n 10 /* 假定系统允许进程个数为10 */
' v5 g; Z& G: e
+ f* d8 b3 [  I! wstruct
8 ]8 e; j) B0 ^. Z9 N{ : K; z- `$ [  U9 S
int name; /*进程标识符*/ 2 D; \1 p7 L) a3 N( d
int status; /*进程状态*/
- ~4 ]# _  @5 b* I3 \int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/
' `) D) C: H; tint pc; /*进程现场信息,程序计数器内容*/
, L' f: a9 n3 ?) d# c. v6 K- kint psw; /*进程现场信息,程序状态字寄存器内容*/ & b; c1 U1 c1 x  L- G* G
int next; /*下一个进程控制块的位置*/ / K1 u8 x8 P( g7 B; F; t7 b
}pcbarea[n]; /*定义模拟进程控制块区域的数组*/ : q8 G* g+ Y( a; A

' M3 w: q9 x! Q% a% J: E& \/ qint PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/ : l6 k8 W9 _7 V2 G$ }) G

' ~& h0 [) U# c+ ]0 `  N$ |/ e2 Yint run; /*定义指向正在运行进程的进程控制块的指针*/
# B( O9 \1 r0 R, Cstruct " q0 z# ]+ \+ h$ ]# z3 k) }
{ $ D" h4 a, v+ X
int head;
3 s9 e6 n9 q5 R8 ~% Aint tail; : L1 r& S+ o5 ]# [3 }
}ready; /*定义指向就绪队列的头指针head和尾指针tail*/ ( b2 }' Y3 p- f
int block; /*定义指向等待队列的指针*/ % m, I, ]0 U* M5 j. a0 F
int pfree; /*定义指向空闲进程控制块队列的指针*/
( x# v' x) }& y  z! t7 J& D( Z% U1 @$ O8 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 | 只看该作者
    我的脑子都快调得暴了,能写个大至的,让我自己调吗?8 }. w) R2 [9 ?& ^8 {# Q4 w7 z; d) x
    麻烦各位高手了!!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    4
    发表于 2003-10-20 22:40:00 | 只看该作者
    你给的头部定义的几个队列指针看的出来你是想写一个 链接方式 的进程队列,由于给得太粗糙和简单,我尝试了一下,反而觉得很不好写,想考虑的一些东西你的结构里没有,而考虑进去发现弄的复杂了就写不完了,所以很难办,结果还是没有写下去,给你我开始的一点筐架吧。
    5 f  M3 }* E2 X0 m/* the main site file */3 v1 a$ l- r' z6 S
    CreatePro(&ID){: [$ V/ J8 }: W0 D
      GetFreePcb(&ID);  //申请一个空闲的PCB,并为其命名一个标识ID;
    5 B1 r( @0 G# G" m$ s1 p  InitResour(&ID) ;//为该进程分配资源(内存空间和工作区);
    . S- j2 s. @# ?/*初始化参数*/
    2 |5 g3 _9 l/ S" m3 k1 y: U   CallName(&ID);   //命名进程的外部名  |8 B/ _3 t. {4 s0 l1 F, c: ~. W
      SetParProStat(&ID);  //记录父进程的ID和CPU的状态、1 W* M9 Z; b2 o2 i- d
      SetFL();  //优先级数、; j# z3 W. H  X
      SetHeap();  //进程起始地址、1 S* b# P: [: |& B, W( J6 U
      _SetSelfStat();  //设置进程的状态为就绪态4 E- I% e/ ?4 U' R
      AddStat_Read(); //将该进程加入到就绪队列中。
    6 z' b$ J* m( x* C, v." I! b, l0 k/ Q, y/ p# Z
    .
    % O( G2 W5 F4 @$ \+ w% [  i" Q.4 m! {; m: I$ B- z& X* I3 M
    .
    ) N1 [, j6 l/ }+ W}( Y& f- j5 B( b- [* b& G* A
    我觉得上面至少要考虑的,但是实在很懒了,对你也许一点用没有,不好意思+ D6 x1 n! G  Z; w* [5 s
    towny 该用户已被删除
    5
     楼主| 发表于 2003-10-21 12:04:00 | 只看该作者
    呵呵!!
    0 Y% @+ `% a! N) B4 s7 o谢谢斑竹的高见!!
    towny 该用户已被删除
    6
     楼主| 发表于 2003-10-21 12:18:00 | 只看该作者
    这是我自己做的一个版本,望斑竹给予指点!!!谢谢. b: B6 I* ^9 F$ W) j5 o ( |" N; N i9 x #include, r0 y' a' C5 v9 { E) t- w, u: F2 [5 q #include. f1 G) H! i ?; x #include+ E! P) f- P( p1 Y5 `! i4 h #include& ^% C2 j4 `% l. b #define running 1 /*用running 表示进程处于运行态*/ 1 Q. W' v8 ^9 ]#define aready 2 /*用aready表示进程处于就绪态*/ # J1 F! B+ M% C" R( n( P' F, i#define blocking 3 /*用blocking表示进程处于等待态*/ , i5 h T: W% q#define sometime 5 /*用sometime 表示时间片大小*/ - V% h- C2 h3 e1 V#define n 10 /* 假定系统允许进程个数为10 */$ O, x$ c' N$ w# c6 ~ N* A' c4 b struct 5 N0 G6 ?1 b8 X. s7 {* A& z# T$ \{ ) p' ?4 x3 M5 t1 H/ i/ ]int name; /*进程标识符*/ 8 o3 Z! o9 E/ _1 ~6 _int status; /*进程状态*/ ) p, w+ j2 T3 H: N$ Q0 v& q3 {int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/3 a# l& q: Q4 t int pc; /*进程现场信息,程序计数器内容*/ ! J- O6 `9 a. y6 E* k" a7 }int psw; /*进程现场信息,程序状态字寄存器内容*/ - w- f; t- n6 q& [6 wint next; /*下一个进程控制块的位置*/ + u4 }" [ b. O4 m( H% ?}pcbarea[n]; /*定义模拟进程控制块区域的数组*/! F q+ m: T0 Z' ^ int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/ + o9 q& a* y! x& `; _int run; /*定义指向正在运行进程的进程控制块的指针*/6 i; m, m' @( U" O- r) ]+ n& A struct `% e, R0 @3 N9 N. a{' B+ ^5 J' G/ c6 ~ int head; 0 v" e% i' s, e: b' @* ?int tail;! [8 G) f( b; S* s; g* ^ }ready; /*定义指向就绪队列的头指针head和尾指针tail*/ 0 d4 V3 p6 O* l8 s, l! Cint block; /*定义指向等待队列的指针*/( L2 ?9 Y6 ~4 T! i0 [* u8 l* S1 i/ F8 \ int pfree; /*定义指向空闲进程控制块队列的指针*/, R! p3 w& r, i6 W+ J3 m# e) d" ^3 s8 C main() + ?# w. D* A8 E! c9 ^! K% h{ int gdriver=DETECT,gmode; 5 N9 O: z! i) @: @0 ? int i,x,y; " A( k0 w1 [* M: E# G for(i=1;i<=n;i++), S0 ]* f2 ]7 P2 b& w {ready.head=pcbarea.next;}4 h2 Z9 S1 m% f) t, C initgraph(&gdriver,&gmode,""); 1 f9 P0 w3 [ z7 w8 p setcolor(YELLOW);4 j; E9 e7 G( |' h. ? for(i=1;i<=4;i++)- q; t/ e$ j' C7 }$ t { setfillstyle(8,i); 9 U6 G2 y8 v/ C' r! h- s, [ circle(284+13*i,190,6);5 J2 V$ T$ j8 r s floodfill(284+13*i,190,YELLOW);2 V* ` E% W9 v( t7 K' u) b/ S, W } * G1 q7 E8 e6 `' ` setlinestyle(0,0,3);- i5 S0 ^- P; S6 ^) q' {- u* q circle(316,190,25);: d7 ]( `+ ^2 M4 |3 O setcolor(5); $ m6 ?2 [. K, x, P( M3 x% h( E# { settextstyle(3,0,4);! @+ e* S. m" C& f outtextxy(35,311,"press any key to create objects!"); ! u" y t% H/ x getch(); ' ^% [6 @& d6 R, S1 Z setcolor(YELLOW);) h% H, f# O6 l1 ]" Q line(300,215,290,235); 0 {1 p5 Z O. L line(323,215,333,235);, p7 i! E. @4 n% j delay(50000);- r) ~ ~5 |+ l q- A. k setlinestyle(0,0,1);! y' N1 n0 D( N6 b for(x=1;x<=2;x++) . o( B* f+ @( d! a {setfillstyle(8,x); 0 |3 p& F$ ]+ ^" n circle(267+13*x,246,6);: c( E" u A# S) H3 a0 J( \7 S floodfill(267+13*x,246,YELLOW);" e Q' g% v% L( v }. T6 ~" [& w% }: e for(y=3;y<=4;y++) : K5 |$ Z$ l- E; N( f2 `+ ~ {setfillstyle(8,y);$ Z/ s* @/ E! m/ O9 S5 q circle(285+13*y,246,6);6 W1 c. u8 E/ p7 t# N b floodfill(285+13*y,246,YELLOW); % y/ S" ^ X' } A& D4 {& U: r2 ` } 2 I& ~7 B* w: N# h. A5 L! D setlinestyle(0,0,3); ! Y; J( R8 Y$ H0 I circle(287,246,14); D( |2 e: p: ~' {& p4 S5 s setlinestyle(0,0,3); . y! O$ u5 q: |8 q0 C0 L0 y6 G# o circle(330,246,14);+ \" z* g: h. }, n/ X7 k- g/ a delay(50000); ; E( Q0 E) h5 B/ g7 U6 C3 n line(281,260,281,280);0 i. Q. D. U9 ?4 s' f/ I/ k5 p line(293,260,293,280);& T- J$ _% G D line(322,260,322,280);+ b. k4 S, ]3 E* \! M line(333,260,333,280);& {9 {0 J6 s( K. O delay(50000); 9 S) t( u6 Q6 X0 K. x- p+ r' F setlinestyle(0,0,1);) c0 {- `# N7 t) J8 e$ t setfillstyle(8,1); " W+ Y5 z) m% A1 Q( n K* R circle(281,286,6);' d: q' M0 A% r4 a4 Y6 H# W floodfill(281,286,YELLOW);0 R& d; r- x: S9 ]( o8 q5 { setfillstyle(8,2);1 u* F, `# l( b. R+ A& O circle(293,286,6);, u# `8 n W \/ t3 A floodfill(293,286,YELLOW);4 D: s# G0 Q, { u! L T* A setfillstyle(8,3); D$ e1 T8 Y# n3 k. E; s! R circle(322,286,6); 8 I' Z2 |0 C% ?" C8 X4 ^0 r( x floodfill(322,286,YELLOW); K+ f% E9 Z8 }8 U8 D setfillstyle(8,4);" M9 \$ t6 E- j0 x9 X6 [6 y k3 P6 V circle(333,286,6); 3 A" A7 G3 }, [5 T' E floodfill(333,286,YELLOW); - A" T% B" ^* e getch(); " d7 F, ~' |8 c8 f( e closegraph();- D8 t, }7 X V/ w }8 I# M4 ?7 P8 P 4 W5 ^) ~; k+ c( z8 O ) o/ c7 P% w, c# x
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    7
    发表于 2003-10-21 18:58:00 | 只看该作者
    你在搞那么多画图干什么?你不是要做进程的创建吗??+ F3 _) N* p+ l6 O' l: {; `/ D' [( }
    难道不是《操作系统》的‘进程’那一章进程创建??& Z% v- ?3 F5 ^+ V; U
    到底是要个什么效果??糊涂了
    towny 该用户已被删除
    8
     楼主| 发表于 2003-10-21 20:34:00 | 只看该作者
    手误贴错了!/ c, r' v8 O* E8 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 | 只看该作者
    做了一半的半成品望斑竹指点!! $ c7 H0 f) m( ~, q3 _! T 9 N7 k/ a2 `0 k+ [0 l2 Nint timecount=0; : w# x. C; D9 uchar far *indos_ptr=0;9 _, w) h4 i9 R9 j$ D char far *crit_err_ptr=0;" c: `8 ~6 {: \1 D- ~1 v int num=0,current=0,i;- Z0 @, s* F9 q; ^0 Y; Y- U void over(); |$ h0 N6 ?+ C: V, ~ typedef int (far*codeptr)(void);) w& j. N7 h- E int create(char *name ,codeptr code ,int stacklen) R2 R6 `8 s R3 y. i {) n) f! g- R: \8 a: [ unsigned int * s; 5 x4 Q$ P1 @& v7 Wnum++; 4 @$ k) m5 J7 V% {% ntcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); 9 ]3 B9 ?4 X& u2 A0 p tcb[num].state = READY;$ q& `; e: d5 G" e8 Z7 |: [ strcpy( tcb[num].name ,name);2 A: g8 J0 U, K7 p2 x+ q- h5 h tcb[num].ss = FP_SEG(tcb[num].stack);9 M$ z. \, |( p2 [4 ^3 W tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14);1 H& |3 ]0 C5 i5 `* W6 P) q *(tcb[num].stack+stacklen-1) = FP_SEG(over);; v' ^: `6 Z$ e" b% | *(tcb[num].stack+stacklen-2) = FP_OFF(over); + g, \$ T1 W6 o- m ?+ V: c; }3 }8 q *(tcb[num].stack+stacklen-3) = 0x200; . F( V/ Q* B& F7 H3 v% A$ K, ~ U7 E *(tcb[num].stack+stacklen-4) = FP_SEG(code);* b. w% Z' D, i; m0 R* o5 E *(tcb[num].stack+stacklen-5) = FP_OFF(code);( A# g+ I4 l: `' [1 N *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);# _) R- R4 H! _: S *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack); % k% v1 X. m: o, D/ r5 v9 ~ return num; / }! J3 R9 f4 |$ T" Q} ;/ K( ^( o8 {: F8 @ N ~; D6 C void interrupt (* old_int8)(void); ) N! S4 v% H" B4 n. l! } void interrupt new_int8(void) 5 s4 P8 }$ |/ u{- F: X! y8 q; @1 P+ b (*old_int8)(); " y' J/ T/ R* g3 E( U/ p { timecount++; 0 i+ \# @# [" n* [ if(timecount>=TL);1 B- [1 k* h% R2 J; k# S8 H& C if(!DosBusy())4 R. u% a, c+ ?& r. x5 N& B { e/ K: N$ F8 _- f* h disable();# v7 H, K& Q/ X tcb[current].ss=_SS; 2 E) W# \$ z6 z* N tcb[current].sp=_SP; + Q. h% B) z+ g+ ?- J/ M: v' Q4 ^ if(tcb[current].state==RUNNING)1 k4 N, i) _$ S9 _+ P- M: Y; L tcb[current].state=READY; 4 ~8 @. L( Z' [( h; r current=3-current; 1 k4 W1 F5 ^- p1 Z8 Qif(tcb[current].state==READY) , M8 A( J8 k! V3 t- J6 `{ _SS=tcb[current].ss; 0 O; [3 Y' U4 \& Q* X2 i' h _SP=tcb[current].sp;2 \$ p- K+ t- `* I$ n tcb[current].state=RUNNING;- i4 b, H( _! G8 R7 b# ~& q$ { timecount=0; r! I+ A" D! a" x n+ s d" L enable(); , P5 r: P" L( P n: W5 ]4 H} ! _# f7 v; M! d}! S8 t. I; b5 m+ w }; ( L) T/ C; Y% R5 Zvoid tcb_state() / [0 T( s0 L: P* S$ g{ ! ~8 ^6 c" {7 g" e5 D int i;; X: T, e3 t/ S# C7 [3 w for(i=1;i<=num;i++)* x4 B* c8 z5 y2 d& G printf("Thread %s is %d ",tcb.name,tcb.state); 5 e( A7 ?: ]6 M; s};/ ~: J) t% }" K- g+ x% U: r: B int all_finished() 6 r+ B) y) d7 r{ , }( Y- M5 t& w int i; 3 W+ F6 @) a; m1 |) |8 V b, @2 ^ for(i=1;i<=num;i++)7 A1 z& Q p& D/ h: i9 z# w if (tcb.state!=FINISHED) 6 {! ~0 b) ]0 V return 0; * U- U. q* t$ F, `- u return 1;2 W- ?4 r# J, Q! C1 A0 @ . u. p8 s( [. n7 C$ S5 N y}; d3 D( @( d% x$ Q- _void interrupt swtch(void) $ v3 P5 u! V9 j" G{ 2 z7 d, B& \% _int i;+ _1 m& n; r1 \/ B* R disable(); 3 \# i" e2 | S9 l2 h' ^8 c tcb[current].ss=_SS; 6 b5 C/ {0 w/ e) ^ tcb[current].sp=_SP; ; @' N% x# B( L: I: I8 K if(tcb[current].state==RUNNING) ( s/ F' N9 j8 F P2 ? tcb[current].state=READY;; B& b4 P/ z$ o; Y5 R for( i= current+1 ; i <= num;i++)& p' n8 ]8 n. R% y { if(tcb.state == READY )4 q1 c0 ?5 v s, f H% X goto excute;) W: {: @3 x2 Z$ O1 Z7 S }8 S+ Z) ~. K/ S2 x6 I9 W for( i = 1 ; i <= current ; i++) : i3 `6 L( n1 _1 H, E* r5 s { if(tcb.state == READY) * |/ I* x8 _$ B4 x5 C, g/ n0 b. i goto excute;# S/ z" }! N3 l* t, w* _, U }3 V2 X, `8 y3 o! x p/ P i = 0 ;" Y% U) e( w5 \" Q! p5 G excute:7 I/ w8 z+ T& k/ \+ I( U _SS = tcb.ss; / }! _# P; t" q5 x% S6 l _SP = tcb.sp;: o: l& O! F) x0 C( H T* \, X6 p& W tcb.state = RUNNING; _3 E. A! Y* i/ ~) ]4 n! r current = i;- s/ B: s1 G% k7 k enable();- k9 h$ I) W. s( R4 m }
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    13
    发表于 2003-10-24 18:02:00 | 只看该作者
    指点什么呢?效率?方法?还是编程格式?
    3 g% k9 |5 O# Q* a9 g给一篇代码给别人叫别人指点?我从来没有过。
    towny 该用户已被删除
    14
     楼主| 发表于 2003-10-24 21:48:00 | 只看该作者
    操!
    8 s/ q7 h, v# j2 P0 F搞什么脾气啊!一个斑竹有什么了不起的啊垃圾!!
    towny 该用户已被删除
    15
     楼主| 发表于 2003-10-24 21:58:00 | 只看该作者
    你要是不懂就让位!
    $ v- R- a+ }9 x别占着茅坑不拉屎!4 d8 S" b/ F4 z9 L* Z
  • 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 | 只看该作者
    完成了你们看吧!8 _/ Z( s+ H" Q; G3 ^ . P8 r0 n9 f; ^9 D#include 6 N6 J. }2 b& h0 A#include + s/ x- o+ b: D9 n. B2 [#include 6 ?% J; Z6 }" B#define GET_INDOS 0x34* c! z/ N) R8 x7 x' |4 M #define GET_CRIT_ERR 0x5d06 . X+ [' z+ q0 I4 v0 d" a#define FINISHED 0 & r6 \: g. E( E8 ~5 m" e#define RUNNING 1 4 S, a# o: g; ^+ v4 ^3 f#define READY 2 $ V% t( j, a: ~0 H/ L( H#define BLOCKED 3 4 z6 I6 v0 r5 v6 G" @#define Ntcb 8 ' V: |3 a* Q8 y2 e: R7 u* {6 e#define TL 1 % ^2 _8 n+ t* K+ i. R7 ustruct tcb{8 h- |: T2 M9 }4 ?) T5 b& N unsigned int * stack;/*堆栈的起始地址*/ 7 Q$ H; ?0 X+ M6 N7 {2 r3 U$ H unsigned ss; /*堆栈段址*/' W! r. W+ K, C0 U, E unsigned sp; /*堆栈指针址*/% O( [% a- Q8 U( |: O7 H char state; /*进程状态*/ & W) A i$ `9 u# O+ V char name[10];/*线程的外部标识符*/; H' h8 [/ c8 q2 J }tcb[Ntcb]; /* 系统允许最多的任务数 */ & i& {' n6 k4 w/ nint timecount=0;* w% N, x, l: ^4 v9 H" j char far *indos_ptr=0;7 u2 F: C9 f5 v7 A) Y! l char far *crit_err_ptr=0; 9 e7 _8 H8 @' Z$ }, mint num=0,current=0,i;. J0 `8 R+ G3 k2 h% K( J: q) q void over(); ) ?6 v# k" q; ~: Stypedef int (far*codeptr)(void);+ p2 }1 E+ s$ M int create(char *name ,codeptr code ,int stacklen) . G8 ^7 G* h4 a: G) \/ J; v{4 S, m8 F2 n) Q+ F& L unsigned int * s; : P" g" D( ^# ynum++;& s1 H- @ I6 N0 u5 C+ G$ t$ } tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); . o; L1 Q$ |! M& a tcb[num].state = READY; " R/ L% D5 X% V* o9 } strcpy( tcb[num].name ,name);% u0 ~: V& Y" {0 l% A tcb[num].ss = FP_SEG(tcb[num].stack);: r$ r( y$ _' w tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14);% I! n% n6 k& f5 l5 j/ r! ~8 x *(tcb[num].stack+stacklen-1) = FP_SEG(over);( p0 l! `* f4 J" {) u *(tcb[num].stack+stacklen-2) = FP_OFF(over);! o4 C: K) i2 x* ~1 H+ O5 Y. B C *(tcb[num].stack+stacklen-3) = 0x200;, U2 J2 U1 f1 Z' ^% i" E% r# } *(tcb[num].stack+stacklen-4) = FP_SEG(code); " f7 u% w4 R, c2 X8 w; g+ o( _ *(tcb[num].stack+stacklen-5) = FP_OFF(code);5 [+ j e# a8 B% I0 K4 d* w) S0 I *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack); 7 q4 k# a& j8 K a, S *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack); ! S- c1 c9 ?# e+ U8 h" y return num;" \6 {8 R, p( K } ;; h E: [1 s+ }( g a. @ void interrupt (* old_int8)(void); / K. G9 P( l) {5 T' ~# D" c2 ovoid interrupt new_int8(void)& }2 e* F# O. P2 O {2 L# x. A7 p) m' o (*old_int8)(); & `" K; d0 E c timecount++; ( t6 `$ W& ?5 W4 V3 _5 x. E2 ^ if(timecount>=TL);, w! F- l: R$ x if(!DosBusy()) 8 o# r5 P) R+ f {: Y& J3 p6 N/ J6 a: i disable();, K6 ~! }) @6 e3 u9 t% y, G4 `) ? tcb[current].ss=_SS;, v. V( O& P8 a# M3 ` tcb[current].sp=_SP; 6 g5 ~. d$ w8 F if(tcb[current].state==RUNNING) 9 G% t! V, E: l. I tcb[current].state=READY; ; y( j6 H3 H5 O& K/ r( g current=3-current;* R9 f$ J4 @. I+ J if(tcb[current].state==READY)! }# d# k. W) p+ a: g { _SS=tcb[current].ss;8 u) g4 n9 x; I/ H _SP=tcb[current].sp; , S! n- [1 {6 |2 u$ j. L8 { tcb[current].state=RUNNING; $ D- k! A/ v, m3 P- v) Y; a, v; ^ timecount=0;) L7 J: j( X, d enable(); u0 w( O# c. y. f1 n( ?}1 Q# y# [( v7 x" L/ g8 J } $ P# q3 u4 m; [};% r0 [: r# n1 g! @# C8 s void tcb_state() 1 A; D, _7 O1 `- }{ $ o% a+ M6 S0 f5 ]: y9 m int i; 9 ~2 [* G4 B5 E! o: x# l for(i=1;i<=num;i++) $ @* Q% o H" P6 E" P5 b/ M printf("Thread %s is %d ",tcb.name,tcb.state); : D% j8 z! z W( |& }};7 r# v4 ]* j2 u; G4 r* u& z% [% t int all_finished() ) Y# e# ~1 y1 d9 w{ * F1 z& |3 ^! o2 ^) s$ @9 H0 j int i;$ ^5 }1 S( F4 w9 ?9 _) w for(i=1;i<=num;i++) - t" ^# I# x/ F if (tcb.state!=FINISHED)( H6 `" k( r# K5 ^ return 0;! k, ]1 ^0 D/ m7 y return 1; 4 c! ?5 ?3 w& T) R1 ~ X( }: u) W/ |* k }; Z7 F0 H2 X; M! \0 avoid interrupt swtch(void) " r3 z. x' F/ {% Q{: t2 Y8 |3 k# b int i; ) I; f. }: G- {0 u# b# Y disable();! k# s( E% x* F: d7 H- G4 L tcb[current].ss=_SS; 9 O' ]) H7 ^/ ~) n0 P9 J tcb[current].sp=_SP; 4 k# t1 G. q/ B* C if(tcb[current].state==RUNNING) " R. O' M; ]) { tcb[current].state=READY; " H% _) G/ X+ U5 W for( i= current+1 ; i <= num;i++) 3 {/ r/ A; u+ r4 L2 J) H { if(tcb.state == READY ) , h/ y5 _* Z! B: q goto excute; . p# T" R' X! m) p: s } 0 R- q1 W9 d' l/ J- m for( i = 1 ; i <= current ; i++) 8 x, P" ]' u# ~: c/ K7 \. A { if(tcb.state == READY) k: H3 l2 r7 T: i' Z goto excute;5 ~+ M( r7 i1 ~& I* I }' o# g6 D) p& T i = 0 ;/ w# K- d3 N3 D6 g; Y3 O) R excute:9 ~4 m1 L( ~* k# G) }& \ _SS = tcb.ss; ; H! N8 c! h3 }* X5 `2 \ _SP = tcb.sp; 8 G" f) P+ J4 q/ Z tcb.state = RUNNING;. N: O3 A# C; t4 ^$ | current = i;0 i% z6 n/ v9 y, g# R% s% `6 H enable();0 p' B2 c! g' m; e& |# i8 F& h }: B7 B* {. z+ n# W% R% V' _ /*-------------------------------------------------------------------------*/& _& [: f1 T8 v0 S/ a4 h void over() 7 C) G; g: i0 N8 k0 P% r- m5 E; \% T{ " b/ ]4 d2 `& a5 U9 v5 P8 | int i=current; ' u2 Y/ [% s# s4 r% V /*strcpy(tcb[current].name,'\0');*/ . g$ ]0 d1 }# a' j+ H" i' Y tcb[current].state=FINISHED;+ W* t7 Z& j( S k1 T swtch(); 2 s& o6 m9 f: y+ ]+ k0 I* H free(tcb.stack); 0 Z) @! U6 y' [) J# a' X}; t6 u) I" ^' U( \! C! i/*---------------------------------------------------*/6 f2 O" Y1 _- m! y* G! Q: C void InitInDos(void)& u7 y3 Y) e1 ` ^' ?2 B7 v3 J' M {/ ~4 ]: @/ N8 i7 O7 v( c union REGS regs; 8 j7 @' ?; q6 S, y+ } struct SREGS segregs;- W' W5 H7 O- u! \ /* get the address to INDOS flag*/( I0 Z" A8 ^4 a. I1 C [8 l regs.h.ah=GET_INDOS;; {+ J, b" u4 s" @ intdosx(®s,®s,&segregs); ) u' c5 w* L! K% h2 H indos_ptr=MK_FP(segregs.es,regs.x.bx); 9 y7 [+ [6 A: u: M* k9 K2 }! A /*get the address to CRIT_ERR flag*/ % C3 ^! i5 d$ P0 }9 O+ v- @ if(_osmajor<3) ' h E6 c3 |; ~! N2 m% d crit_err_ptr=indos_ptr+1;1 z% b* N' p* ^- N) q9 T8 d6 C ^ else if (_osmajor==3&&_osminor==0), Q; E5 g: m+ j/ G crit_err_ptr=indos_ptr-1; 0 X5 {% [! b3 ~4 {( ~' {* m$ J% P else - ~5 m! V% d9 [/ u {' P8 a/ P$ ?& h regs.x.ax=GET_CRIT_ERR;, d2 n( U" I0 K, j" T; d: ^' b intdosx(®s,®s,&segregs);. R- d7 t3 |/ _0 V) Q) q8 L9 U crit_err_ptr=MK_FP(segregs.ds,regs.x.si);7 n- S) q4 _/ w7 v } % V' Z- `" l7 { i+ n6 b};/ R1 \! u! I; h; o; X int DosBusy(void) " j: q9 g( r- z, k: d' h" s{! e1 `/ b" h; ^: | if(indos_ptr&&crit_err_ptr)% a5 n) }% h5 T5 y7 G: N return(*indos_ptr&&*crit_err_ptr); - \! [( U: J0 u& e4 c8 ^ else+ A$ i+ K: |6 h( Z0 V return( -1); 1 @% |9 U" F/ T$ Q4 [; l {};+ v3 u+ g8 ~0 W6 E0 u/ H void f1(void) " F* W% s% V- f' e B$ G{2 o1 a/ o1 K, \8 i" q int i,j,k; - X; I6 P. v$ J. ?' S for(i=0;i<40;i++) 9 Y' x( X2 p5 j! Q1 v) h B" ` {! G3 n8 n& r9 K7 t; {6 L- d putchar('a');( c# c% K% U% ]; r' ? 5 @9 a0 y3 b8 Z8 [6 {' k0 O. n for(j=0;j<1000;j++) , [# ^2 S4 @# R; u% W/ N$ A for(k=0;k<100;k++) & n, O; I) I5 ^* v" v ; 0 R7 b9 _* F% ]1 ~- Z/ K } . b1 {0 q6 r$ x- a% Z: p& K}; ! i4 ?# ^+ {* E# q. J0 Ovoid f2(void)- f+ d H6 C$ U+ z9 ] { 0 d7 y K# E) w& w- k int i,j,k;* g1 X5 ~4 ] f4 j) L: z/ E for(i=0;i<30;i++). N* n% L H; r1 b1 c { : o- i# s/ w( N+ c- s8 p: q# e putchar('b'); + V$ O6 W1 n- h6 {. C* o7 T+ h for(j=0;j<1000;j++) & o1 S e% ~, `1 o$ r for(k=0;k<50;k++) 0 o, {/ e* ~$ ^& ` ; " }# u0 J M, i5 i/ L } / o3 e3 O( N( I5 V3 h) E};( f) G; f# ^* _* v( d /*------------------------------------------*/) W' r/ K/ b" T( k main() - C$ `3 Q( P: G' m7 R# z5 U{+ x& S. K$ w: ^/ |& M& q InitInDos();! [4 @8 y7 w" ~! p6 N- c old_int8=getvect(8); ~4 w: T8 k$ k9 L# s2 C strcpy(tcb[0].name,"main");2 l/ a! P. R2 Z2 R) W0 ]6 S tcb[0].state=RUNNING;' f' d! ~6 B; \' E/ n6 l5 }+ | current=0; - H5 Z/ ]+ \$ f* P8 U; H create("f1",(codeptr) f1,1024); # p2 `$ P# g9 X) _2 M; Q create("f2",(codeptr) f2,1024); + {1 ?1 ?5 {8 v tcb_state();) u4 K, e& ~* C7 Q' [5 M setvect(8,new_int8); ) K8 U% X! i4 w* z7 V1 p1 c swtch();3 Y$ w; k2 r7 e$ r7 l$ p while(!all_finished());9 U* d4 j4 P# Z; G0 W strcpy(tcb[0].name,'\0');. I, Z! F& T3 D$ w tcb[0].state=FINISHED;9 B0 E: W. W9 [% `+ r setvect(8,old_int8);, a& s) L. C% H0 M tcb_state(); 2 [, F# e7 B M" r0 @ printf("\n Multi_task system terminanted.\n");# z- p8 K) O$ t, R4 Y+ X };
    towny 该用户已被删除
    20
     楼主| 发表于 2003-10-27 11:58:00 | 只看该作者
    我不想灌水,也根本不想在这样的版块浪费时间!!

    本版积分规则

    关闭

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

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