下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]
towny 该用户已被删除
跳转到指定楼层
1
发表于 2003-10-20 12:59:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
create()  创建一个进程1 f7 _) [7 F4 A! ~# B
要求:1 用c语言编写
+ E0 a/ M: h/ p7 ~         2 程序+PCB(ID的内外优先权,申请资源)
' P7 F* k7 u( [只需做进程中”产生“这一步。7 h& C8 s; l. s, @, k. d8 O
以下是做了3分之1的范例:
; h5 H9 u& E" l- o5 u1 v#include "stdio.h" $ x8 x# |( U; G+ p& g2 X
#define running 1 /*用running 表示进程处于运行态*/
- [- p& `( W' Q0 b2 k/ [' g. Z#define aready 2 /*用aready表示进程处于就绪态*/ ( d- R: b' F/ M% r& D
#define blocking 3 /*用blocking表示进程处于等待态*/ . `) G, o/ Y6 E8 d+ G! E; N3 J
#define sometime 5 /*用sometime 表示时间片大小*/ 2 R( k; C$ i, }! R" e6 C# @
#define n 10 /* 假定系统允许进程个数为10 */
+ [4 s+ V; w' V8 V$ x$ z' m3 _( I, v+ U( x+ y( {8 a0 G
struct 3 M* n" p" y; x% l  W) e6 G) k4 t* g
{
8 u6 H' d- F3 ~% J4 D4 Y% s7 Tint name; /*进程标识符*/
( h2 e& B5 y& F5 U8 B6 K1 |3 d4 eint status; /*进程状态*/ 6 L- j, O; y' e
int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/
8 ^5 x- M2 j- }- nint pc; /*进程现场信息,程序计数器内容*/
. {# [! U. G& U8 d% _+ Dint psw; /*进程现场信息,程序状态字寄存器内容*/ ) V3 k2 L: b8 Q' Q* ]5 W
int next; /*下一个进程控制块的位置*/ / G6 d  K$ G& e6 D! o0 s
}pcbarea[n]; /*定义模拟进程控制块区域的数组*/ $ I1 b# ?- e* e/ W3 w, k* q

: a/ v6 h; m: G" _$ H! Q6 N% qint PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/ $ @8 \. p- Z; Q
: }" k4 X7 `. e$ |! E0 o- A$ o3 W
int run; /*定义指向正在运行进程的进程控制块的指针*/ * ]; `+ ?1 g' {/ l" Q5 g
struct
2 m3 C0 z, s0 Y9 Q5 m. |{ 8 Q" G% w$ Y* ?* e% \
int head;
6 o' ~8 i. v% k$ K! S. ?0 N4 iint tail;
; P) a& ^+ s0 c1 ^2 Q9 g: Y" ^! Y) K7 ?}ready; /*定义指向就绪队列的头指针head和尾指针tail*/
: L% F  K+ f3 N& ~, Gint block; /*定义指向等待队列的指针*/
& ^1 l- b9 k- S2 ^int pfree; /*定义指向空闲进程控制块队列的指针*/! _. O2 l3 N' z) a. A: ?, Y- _

. w3 t# R# T( G3 g% l, V+ z9 H) X麻烦各位高手了,望帮忙解决一下,急啊!~~!!!!![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 | 只看该作者
    我的脑子都快调得暴了,能写个大至的,让我自己调吗?
    ' V2 }0 ^% ]2 p# x4 Y" E麻烦各位高手了!!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    4
    发表于 2003-10-20 22:40:00 | 只看该作者
    你给的头部定义的几个队列指针看的出来你是想写一个 链接方式 的进程队列,由于给得太粗糙和简单,我尝试了一下,反而觉得很不好写,想考虑的一些东西你的结构里没有,而考虑进去发现弄的复杂了就写不完了,所以很难办,结果还是没有写下去,给你我开始的一点筐架吧。
    % A! J; t. u' ~+ f/* the main site file */5 H4 C- }( }8 N
    CreatePro(&ID){
    7 O5 T' U' R, S; t' u4 s' H  GetFreePcb(&ID);  //申请一个空闲的PCB,并为其命名一个标识ID;
    0 f" D1 f+ y! D+ e6 v2 U0 i/ ]4 I  InitResour(&ID) ;//为该进程分配资源(内存空间和工作区);
    $ U6 H5 ?7 K( o# V4 L' n/*初始化参数*/
    0 v  y. q& K$ V& x$ d+ p   CallName(&ID);   //命名进程的外部名- z* k: e3 z1 G& b( ^% J
      SetParProStat(&ID);  //记录父进程的ID和CPU的状态、& [9 [9 i3 Q( h) R$ H2 L4 ^4 J, B
      SetFL();  //优先级数、
    & v9 F$ x$ B0 t: k" o+ T" F  SetHeap();  //进程起始地址、3 h/ p$ c" W# N) k# Z
      _SetSelfStat();  //设置进程的状态为就绪态
    7 q- N9 Y& \: F* b2 t# o1 F  AddStat_Read(); //将该进程加入到就绪队列中。, i- p  A* y* \* U; ~
    .; ~' k. @9 X& s# p+ L
    .
    / K9 t) F8 ]) [9 G/ [5 U., K: y' X) r+ `! f) O" }2 u
    .
    : e8 g# W: `- L}0 B. E5 s- `; K/ R: E0 c6 Q* `3 ~
    我觉得上面至少要考虑的,但是实在很懒了,对你也许一点用没有,不好意思* n. _$ u% ?) H
    towny 该用户已被删除
    5
     楼主| 发表于 2003-10-21 12:04:00 | 只看该作者
    呵呵!!2 _9 a; g4 k5 x- T$ N: K
    谢谢斑竹的高见!!
    towny 该用户已被删除
    6
     楼主| 发表于 2003-10-21 12:18:00 | 只看该作者
    这是我自己做的一个版本,望斑竹给予指点!!!谢谢 ' H+ d! G3 }: f1 P3 `: p+ o2 u0 p( {& x' b# \ #include & b# e; @" c9 H8 {#include ( _' E; A* l4 C j/ `" x2 n#include. t# C) |# `4 j9 u- A4 K& f #include 3 B6 v, b3 x0 q4 f7 l#define running 1 /*用running 表示进程处于运行态*/9 `$ E2 n+ A1 F( D! \. ? #define aready 2 /*用aready表示进程处于就绪态*/ 0 v9 t" |+ ~6 F#define blocking 3 /*用blocking表示进程处于等待态*/) [1 S$ p0 k5 ~; M #define sometime 5 /*用sometime 表示时间片大小*/ ; l. l. ?- G+ h#define n 10 /* 假定系统允许进程个数为10 */$ W% c0 \+ W' [" }, ] struct . s; z, w# ~! h( ]* U( u{, E7 T* I5 }! o0 ? int name; /*进程标识符*/3 C* P- j a# X3 r. e: E0 c( ], U; J int status; /*进程状态*/! _# y6 V4 _6 X3 }8 H* R, C int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/ 0 d A; G) }# y+ f# jint pc; /*进程现场信息,程序计数器内容*/( R K j6 F1 k. r int psw; /*进程现场信息,程序状态字寄存器内容*/. Q5 ^" `! G# V' V4 s- @' w int next; /*下一个进程控制块的位置*/' r1 E6 m: i3 H( o& o# q! m }pcbarea[n]; /*定义模拟进程控制块区域的数组*/" O: B/ S5 \ b, U; _/ H- v% C( h int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/ " g3 U6 z( {2 _: ^int run; /*定义指向正在运行进程的进程控制块的指针*/+ w% Y- a# n' ~$ S- D% | struct ! k/ ?2 Z7 F+ p) P; a( ?. T8 H" e* ~ L* q{' X \3 }' ^+ W) Y9 w2 G# H int head; / g, o# f; N+ \" {2 K; A% j- v& dint tail;3 r2 w! P5 v( C) t% I5 n9 C. R }ready; /*定义指向就绪队列的头指针head和尾指针tail*/ ) M; ]! G' Y3 `" Rint block; /*定义指向等待队列的指针*/ ; V. a- r% U8 ~int pfree; /*定义指向空闲进程控制块队列的指针*/ ; l& j6 [) J- P/ Rmain() - K3 ^1 t4 n4 \; g{ int gdriver=DETECT,gmode; 2 R6 D$ C' B4 [7 I1 y: A1 H. s3 P int i,x,y; 9 y0 f' K \7 D! C/ o% M2 [ s. ? for(i=1;i<=n;i++)0 w* m) M! F/ |1 F1 b3 c {ready.head=pcbarea.next;} 6 H& n( {! {- l initgraph(&gdriver,&gmode,"");1 P7 S3 H7 D' @! q! S9 N X+ y8 R setcolor(YELLOW);6 W0 l: S% k8 X for(i=1;i<=4;i++)3 X0 i2 r8 s( e6 B# ?. F% S { setfillstyle(8,i);' ?0 B8 Y& z: [8 @* _ circle(284+13*i,190,6); ' x8 a- D, F( N u# T) m( E floodfill(284+13*i,190,YELLOW); ) g" }7 y0 I. E/ l( D } Y7 a+ }7 ^& b- `: m0 s9 t+ } setlinestyle(0,0,3); 4 @: }4 j! i8 t( g circle(316,190,25); m' }( X7 C# o setcolor(5);" F5 I. x; |' r5 e, }6 T) _ settextstyle(3,0,4); 8 _) ?1 C( N3 v/ } outtextxy(35,311,"press any key to create objects!");) ^; H/ B1 Q7 n+ {7 V. ~ getch();8 q% n3 W$ f: y- M( {3 t setcolor(YELLOW);$ U5 a; y& B0 x7 P& t line(300,215,290,235); ; H9 _( T0 Y' m! F9 M0 w line(323,215,333,235); 8 V1 @. k7 W! R5 x) S R delay(50000);- h; ]- `4 y: ]6 T9 t setlinestyle(0,0,1);: V" p# h$ z) ?3 B- U for(x=1;x<=2;x++) 2 |! q1 h, y1 O {setfillstyle(8,x); 7 ~2 m) [. i) H: g* P( j circle(267+13*x,246,6);) W! D3 `: W+ ^3 M$ C# b+ V) @ floodfill(267+13*x,246,YELLOW);' j6 V$ N8 ~7 ?5 S } $ u3 K( X" B, e/ w- _ for(y=3;y<=4;y++) 2 P9 {; @5 x% x6 J5 Q- {8 O! y {setfillstyle(8,y);4 I/ S* @# g7 ~( G7 c circle(285+13*y,246,6); & S2 }) n# I. F3 n+ E8 h4 B floodfill(285+13*y,246,YELLOW);" R$ M' J9 Z3 _1 I+ V+ D' o+ V( t }* |, Y5 D* t! ?, f" F$ v0 @ setlinestyle(0,0,3);$ l( l9 X4 S% ^! T circle(287,246,14); # V) j( N( q3 O$ a2 j2 W setlinestyle(0,0,3);0 w( a4 S! |* p circle(330,246,14);$ M* r0 D" j y' k. a delay(50000); & t Y4 `" a. X5 Z line(281,260,281,280);+ Y ?& [0 u3 b% E0 e: F' p line(293,260,293,280); ; m/ X/ X7 D0 }1 { A, `% _& p line(322,260,322,280); ! b2 I4 `, w$ J0 `% F6 g line(333,260,333,280);" M. T& n0 j" a delay(50000); ) d& D6 w5 ~, S6 K5 ]2 m" k" X setlinestyle(0,0,1);% ^7 k* R2 } n. T setfillstyle(8,1); 0 O3 Z6 _8 P5 X8 i circle(281,286,6); 6 S/ K8 ?$ E2 r' ~9 p; I8 k floodfill(281,286,YELLOW);: G( X% o8 @$ I, }! K- p9 E setfillstyle(8,2); 4 u. e/ t/ h: n3 H circle(293,286,6);' ^# q. M+ `6 t" K floodfill(293,286,YELLOW);( Z( |% A/ w6 u: Y0 u5 } setfillstyle(8,3); 6 I& B+ |- a5 E" q. A/ U circle(322,286,6); t1 P) Z# h, w1 N3 d' x floodfill(322,286,YELLOW);( c* D& t) `- X t6 k8 r setfillstyle(8,4); / x, l7 j+ I2 K circle(333,286,6); ! R6 \) n8 o6 J+ ?! x" H; } floodfill(333,286,YELLOW); 8 _/ k, w8 S% T' m+ a! w% c getch(); % [/ Y' V9 W( @ closegraph();: S4 B: @0 @( s! U } 2 g+ e5 `2 O( w4 P 6 U2 V' L$ e9 t- h4 x' a4 |7 D9 H* K. [9 C+ M2 U# A 
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    7
    发表于 2003-10-21 18:58:00 | 只看该作者
    你在搞那么多画图干什么?你不是要做进程的创建吗??
    $ i& ^( y: V. o/ G) Z难道不是《操作系统》的‘进程’那一章进程创建??
    * R; }$ \: E7 L: R4 q7 e到底是要个什么效果??糊涂了
    towny 该用户已被删除
    8
     楼主| 发表于 2003-10-21 20:34:00 | 只看该作者
    手误贴错了!* Z' e- c& ~3 B" u0 ^& @6 F2 K& v
    不好意思!!
  • 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 | 只看该作者
    做了一半的半成品望斑竹指点!!0 H# F7 h5 Q4 a8 U, \ $ w* K. m; d" K- v+ w int timecount=0;7 z3 @# e$ f5 d3 \0 U) G9 |/ b2 x/ n char far *indos_ptr=0; 5 f/ E& d+ d( \2 e3 {' _) Dchar far *crit_err_ptr=0;. i5 A2 n4 Y* V$ H. B int num=0,current=0,i; 0 c ]5 f$ V1 x, o" _0 T5 q- Uvoid over();9 S! T/ y0 A" B+ ^/ ] typedef int (far*codeptr)(void); 8 f% J; p% J1 t% n9 P! i0 q3 w9 u" P% }" Hint create(char *name ,codeptr code ,int stacklen), t, }/ b: x' U; ] {* {4 D0 Z6 F% f: n unsigned int * s; ; y- F# \, J! A) G# Nnum++;- Q* G c: v4 n2 u tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); " n( E; E6 x% N tcb[num].state = READY;( [4 G% y* E, m+ B- F$ a strcpy( tcb[num].name ,name); % B* P' V, H P$ O- U& Q7 @ tcb[num].ss = FP_SEG(tcb[num].stack);: x9 n0 s; w9 R* v L( R7 n tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14);6 @6 U# Q6 Z+ v" Y! J *(tcb[num].stack+stacklen-1) = FP_SEG(over); " o+ _* y, v" |3 T$ D. m9 {# T *(tcb[num].stack+stacklen-2) = FP_OFF(over);( K: y. _8 R' F0 V1 V *(tcb[num].stack+stacklen-3) = 0x200; 9 e$ E& o8 `. r7 d9 E2 v *(tcb[num].stack+stacklen-4) = FP_SEG(code);: c2 c, W' [' a *(tcb[num].stack+stacklen-5) = FP_OFF(code);( v+ W6 u& s+ T) A1 ] *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);* c. ~" V+ {: E *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack);8 [# [) \* O& I; ]# q, V7 ^ return num;: l" ^0 i9 }1 @$ o: B- z: C* J } ;& h5 B8 M( w& f! m* S/ V void interrupt (* old_int8)(void); 8 n N# A1 X5 _+ I) n2 M/ I7 s void interrupt new_int8(void) 8 G. k7 M/ ?* s; G/ @ T{8 a( l B1 u) K (*old_int8)(); ; p' k4 b8 v2 Y/ i+ C; Y timecount++;" q, b- ]. @7 g# d& X: Q; v( r# u if(timecount>=TL);+ W( C" r# c5 Z, q& } if(!DosBusy()) k" N! g2 U, e: D7 M { 1 i; f2 P4 A+ s6 R4 ]7 L9 K2 m disable(); X. {3 U! |8 m5 u$ ]: X' j3 T3 x tcb[current].ss=_SS; 3 |1 q4 ?* I& L" C! h tcb[current].sp=_SP;0 U/ l7 ?3 l2 v if(tcb[current].state==RUNNING) ! d& N% I. {* F$ U# h' f tcb[current].state=READY; o5 H& @/ {: ~) j! a! ]/ Q current=3-current;5 h e8 Q5 y# A' @ if(tcb[current].state==READY) ' K$ s4 o! S: @! S{ _SS=tcb[current].ss;, K* ^4 X1 J5 g" S _SP=tcb[current].sp;$ J3 `* b2 S* w$ B0 w" d tcb[current].state=RUNNING;. D! u0 h" i1 j/ E. ^ timecount=0;2 d2 j/ x; Y* ?7 d. \6 g enable(); E% K% Q$ r! a+ E} + Z5 K! T; [* \) e$ t( V N* L}4 I) h, H4 J9 M+ n- N }; ) _5 m0 Z; n2 e( _+ U, ]void tcb_state() , ~* q" i( P+ E4 L: G{6 k5 B. A: q# c$ `8 p2 E int i; # _3 a, n! S) ?8 g3 y for(i=1;i<=num;i++)" D, B h( f% A( L4 m printf("Thread %s is %d ",tcb.name,tcb.state); 3 A/ |) Y. f2 L# L* S l3 Y};% A7 g A, l9 a' m% | F int all_finished() 5 @- A2 K4 Y' \4 c{ : f! A" x- u/ p5 r; z- E H3 C int i;: h8 V& K2 p7 M for(i=1;i<=num;i++) [, N6 ^1 f) I, f' y) S if (tcb.state!=FINISHED)( B" X( A2 Z) U- ` return 0; ' l0 n- M2 _) C7 f) D0 V return 1; ) k2 c# G! _ f) p: _ $ J% j* Q% j& g0 S9 M2 m};# A7 |2 e/ m: q void interrupt swtch(void)8 {1 Z# i" _0 \. {* o( ^. ~ { * q0 H4 B4 b- ^3 \& e- v$ Uint i; 0 y ~/ G5 V0 t; L- A( @1 y disable(); 4 m; B s1 F2 }: W; y tcb[current].ss=_SS;+ }& T0 {- _6 h7 h$ h* b tcb[current].sp=_SP;: t& p4 y9 ^* ?( ~+ h- L( O if(tcb[current].state==RUNNING)$ Q, `" c% e# _3 i tcb[current].state=READY;/ A; {9 c7 M! n: b* I0 _ for( i= current+1 ; i <= num;i++) . c8 ]* ~+ f2 T4 H7 ~0 F: } { if(tcb.state == READY ) ( i( J- v! d. M- } goto excute;5 M8 n2 ^- W+ [5 h4 b } , I) A: W' r$ G" X" x for( i = 1 ; i <= current ; i++) $ e! R- D- E4 f) Y8 b { if(tcb.state == READY)" ?, Z( B$ o/ ?& p) h% r+ p goto excute;2 v3 D6 K, W T! z& T% N; H } % ]0 r" v3 R& f0 W. R i = 0 ; $ g( m- ?4 b' Y" `1 D excute: 2 ?* N' A' i( [" d _SS = tcb.ss; : h; b- T0 e. i% R6 s! k! s _SP = tcb.sp;0 e3 ?: P8 ?* b tcb.state = RUNNING;- q7 J. ?1 r: |) } current = i;9 x& S* y% ]' u enable();7 N2 R3 W, |3 h% U* T4 M' X7 N" Q }
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    13
    发表于 2003-10-24 18:02:00 | 只看该作者
    指点什么呢?效率?方法?还是编程格式?
    ) f1 k/ U" i7 Q$ x给一篇代码给别人叫别人指点?我从来没有过。
    towny 该用户已被删除
    14
     楼主| 发表于 2003-10-24 21:48:00 | 只看该作者
    操!
    ( X6 t7 `7 w  p( v搞什么脾气啊!一个斑竹有什么了不起的啊垃圾!!
    towny 该用户已被删除
    15
     楼主| 发表于 2003-10-24 21:58:00 | 只看该作者
    你要是不懂就让位!/ s( }6 I8 C) x$ k2 ^" M
    别占着茅坑不拉屎!. M: U% _: J" _: W
  • 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 | 只看该作者
    完成了你们看吧!+ G7 m" b2 M$ u( U- b 9 {5 [' K4 A/ u9 G6 m' B1 ~ #include ( N% M( y7 I1 m% `7 V #include ( W% ~! v' ]6 s3 b #include ( R2 F2 G( u# ?! l8 L #define GET_INDOS 0x34 6 B% g. a2 k+ ?: t( v! q#define GET_CRIT_ERR 0x5d06 2 ]$ m& Z0 b5 f1 W1 t4 g$ N$ g) l#define FINISHED 0 % m4 r+ U( }1 f* W#define RUNNING 1* R5 {. h7 H4 U! x, C0 G9 u #define READY 2 & z5 j( y& r+ O: a#define BLOCKED 31 O) f9 b% S$ }! j D #define Ntcb 8" h5 J( t6 i: t #define TL 1 + L' H1 b, G; Q0 Q8 Y5 P5 I: xstruct tcb{ " J8 l$ z$ W+ m |) ]8 q4 B0 m7 n unsigned int * stack;/*堆栈的起始地址*/" D3 [ p* T+ X$ h unsigned ss; /*堆栈段址*/& W- B1 z0 S$ J2 r unsigned sp; /*堆栈指针址*/" o: W3 w6 r2 }- M' ?; t5 i" n char state; /*进程状态*/ 3 e' i) Q- u; } e% `. c char name[10];/*线程的外部标识符*/4 q; |, Z7 g3 M0 j! E }tcb[Ntcb]; /* 系统允许最多的任务数 */ 9 Q/ o# X+ q+ dint timecount=0;; M# X3 h) v) r- U" n5 } char far *indos_ptr=0;/ V! Z0 E- K2 M8 c$ H char far *crit_err_ptr=0; ' u& u5 @) c9 |, \& v$ sint num=0,current=0,i;! k4 ^5 e% A8 x4 y3 f% ^ K void over();' i }0 t7 f s3 X typedef int (far*codeptr)(void); 8 R: b+ `1 C3 Z8 r) p1 L1 ]: Pint create(char *name ,codeptr code ,int stacklen), d I! _8 l0 M6 u8 c, G7 d- \ { $ l& U6 H8 c! Vunsigned int * s;9 g% \2 P f! n6 ?( ]7 M num++;6 ]% u3 P$ F. U3 U9 _) Y, t tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int));; @: m2 E9 H. Y tcb[num].state = READY; , l+ f- J2 n) m! J2 z strcpy( tcb[num].name ,name); 6 ~& |# N: i( \: s- I) S( x tcb[num].ss = FP_SEG(tcb[num].stack);# L3 C3 {) H( a5 G tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14);, E7 D5 C0 M u. k- T: u *(tcb[num].stack+stacklen-1) = FP_SEG(over);9 ~' k; K1 H1 s8 p; g8 X( E *(tcb[num].stack+stacklen-2) = FP_OFF(over);. Q" K! d+ ^! o% n1 a *(tcb[num].stack+stacklen-3) = 0x200; . ?4 N6 ]. x& f+ X7 b4 l *(tcb[num].stack+stacklen-4) = FP_SEG(code); ! N& h, v' U6 K1 k *(tcb[num].stack+stacklen-5) = FP_OFF(code); * S; }$ Y V7 n/ Q7 G% R4 N( M2 c *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);( U, h0 K! O1 u0 J; z *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack);8 d! _" O6 A! s5 X+ o7 p return num;+ J; v( m6 G! m } ;! d9 n3 n- Q* I" L4 w! K' h void interrupt (* old_int8)(void); ) U) J. i$ s9 t) J3 qvoid interrupt new_int8(void)9 i3 o9 d; n/ z4 l8 y3 T( O$ Y8 A { , m7 i5 l# ~5 }. B7 y- U (*old_int8)();# P) V$ H+ E. p0 z timecount++; 2 T9 c( C' h' B, ], R if(timecount>=TL); 4 @( ]) j2 I8 e9 r% ^ v, [: z if(!DosBusy())- C; Y1 ?9 B3 t* {6 t- \! c3 j* E2 V { 3 |! t. t2 j9 O: \' p6 q* r7 P disable();$ _+ ~+ `; h8 k6 n$ ]6 \ K1 b tcb[current].ss=_SS;5 v" p+ Y( F- A. l* s tcb[current].sp=_SP; 1 x: K' m' @6 K9 _& m+ V+ ] if(tcb[current].state==RUNNING)6 j- D4 V7 G( r tcb[current].state=READY; * N/ h8 t* Q3 J0 y5 `- n6 g current=3-current;% o% C3 q P( f( I if(tcb[current].state==READY). I4 `7 W& O4 J) o9 p6 F" V { _SS=tcb[current].ss;: P3 t$ U( a7 u# I& m h" ` _SP=tcb[current].sp; 4 N' o E3 e" t. }% f tcb[current].state=RUNNING; 7 R. @- q) ~# I7 D timecount=0;9 j! f" T8 {; { enable(); 6 {9 Q J0 P2 u$ f! u. w* d0 ]' q}$ h; A, ~. _. z! K } ]' _# F$ Q/ D' N2 _3 r}; # p2 z1 l; e' n" c I/ e) E5 ^void tcb_state() 2 C) G( F- g) A" P! @+ _{ 6 `% V3 z# u$ F* O' u* O int i;( Q1 N3 c6 v- L0 { for(i=1;i<=num;i++) 6 R! `$ D* s. k# E; a# T; W& u1 B printf("Thread %s is %d ",tcb.name,tcb.state); ' S# f) U: y) `};4 {% `- J" p& Y4 q9 X# B9 ]8 | int all_finished()( ~: G4 j0 x+ Z. M' F { - K T2 ~. f. m0 V& Z- b int i; , I+ M- i9 n5 r. X; F for(i=1;i<=num;i++)* r$ c( J: j) e1 f, j3 Z if (tcb.state!=FINISHED)$ [# }- n: |8 @: o* h return 0;3 m! J6 |& j8 O6 P: x6 R return 1;4 {: m' `4 q; T0 T 5 _( D! p; D$ E) b& I! e7 l$ V}; 1 {& i& l T8 a- Bvoid interrupt swtch(void) Q! A5 n: ~8 ~+ h% \7 ~. u% u { - g6 p( e6 S0 ]int i;: @7 f% R3 H- S X disable();) X2 F8 S- Y& E3 O( X. F tcb[current].ss=_SS; & p0 x% u q& Q4 j/ _3 U tcb[current].sp=_SP;0 p: L5 P: l) A2 b" r0 r8 U+ D7 B if(tcb[current].state==RUNNING) # f: D$ s: K' R' d* z" ?3 X, s tcb[current].state=READY;) r$ o8 x; A+ m1 @; z# z" G2 } for( i= current+1 ; i <= num;i++) 1 J+ s, f6 A7 l' w5 | { if(tcb.state == READY ) 6 h9 `. i) N- @ goto excute;2 s+ ?, e% P9 G; V4 w: N }9 U& G& y4 k0 _1 P/ J; U for( i = 1 ; i <= current ; i++)$ X. T5 H; f2 I) P' [3 h9 N$ w0 l { if(tcb.state == READY)3 w; p- ?# k) @5 T) r goto excute;; X6 j1 i) q( _/ \+ ~ } ! S3 y, o6 b$ z& e E! \& N) Y i = 0 ; - s' h4 _: X4 w7 c excute:4 x) E2 k+ J; i8 z" r) _7 V" a" W _SS = tcb.ss;$ Q4 H" O$ H$ `: I$ v- n) t7 } _SP = tcb.sp; . A, F$ g8 N/ e0 G$ V8 G tcb.state = RUNNING;5 e- ^' [: j0 P# ?% C. F% Y current = i; ( ?# o# z+ {* U! I6 y( T8 w enable(); " \/ [' V' H/ u4 @} / _* N/ t; d: l d) W/*-------------------------------------------------------------------------*/ 7 N4 q$ ?/ O2 P/ |( rvoid over(). M- p0 H2 R5 { { 2 q- B; |8 F1 c) d& o- x- w int i=current;: g2 D9 a1 d8 K$ y" P: n) ^( H /*strcpy(tcb[current].name,'\0');*/: n3 p! e h* Z% h' c2 b! Z5 ^ tcb[current].state=FINISHED;/ V7 P Z: N4 @) i' d* n7 C$ ` swtch();1 R8 j# z, }; s+ z# o9 y5 j! Z free(tcb.stack); ' k: J8 k0 t, c5 ^# \; X2 b/ Y};* s1 z! {) n0 z. D /*---------------------------------------------------*/! J7 Y7 B* }; P+ M9 S void InitInDos(void) , N+ g M% @5 D* n{/ y. G/ K) P% H! a union REGS regs;6 k/ s9 F4 K7 x( Z struct SREGS segregs;. }% A& k3 ^$ \7 o N* q /* get the address to INDOS flag*/ # q+ e) j. q ?9 L: [ regs.h.ah=GET_INDOS;- G5 T+ t, z$ B4 B- G8 D# c$ i2 d intdosx(®s,®s,&segregs); 5 Z( j; `& `- t& f, G indos_ptr=MK_FP(segregs.es,regs.x.bx); ( B4 A, [, n# j /*get the address to CRIT_ERR flag*/$ r- {7 _3 p3 M6 s' T/ x if(_osmajor<3)* d& A: T8 n3 I4 s/ i crit_err_ptr=indos_ptr+1;: |! Q8 g4 ~$ H else if (_osmajor==3&&_osminor==0)$ E* K$ g* @5 {) W3 Q crit_err_ptr=indos_ptr-1;5 b& D. F- i9 h$ W/ y; t% s7 W( X else/ k/ d$ e7 Y% e& V0 p { 1 ~/ M" a3 A" w( ?9 q2 ~ regs.x.ax=GET_CRIT_ERR;& _" J o- P* W intdosx(®s,®s,&segregs); " i4 ?* w0 Y) b: ?% N: y crit_err_ptr=MK_FP(segregs.ds,regs.x.si); 0 I+ }" i0 M9 l& U8 r+ | }0 s3 ]4 Y& I# _+ e$ f) B5 W! H( { }; 5 u4 _; ?. B. G8 Z8 j% Pint DosBusy(void) 2 k5 ?! J M# x0 D) _% ~{ , |9 ]9 r/ c) F) { if(indos_ptr&&crit_err_ptr) ) w7 u7 h, W" O1 ^% O. x' D return(*indos_ptr&&*crit_err_ptr);- M- `7 j, Q* i else: h# J" |' ?5 K' b return( -1); 8 {: R4 L$ t7 o0 ~}; ( U- H% h; I p M/ N$ rvoid f1(void) / V3 Z, k, r. [9 H{ 3 B& I; A C. W4 z* S int i,j,k;* t: e% r- P* I3 }* _ for(i=0;i<40;i++); Z: L7 P% |& q/ U6 T2 X {; z8 Z" R' W. E* D/ B putchar('a'); & D7 x6 z8 C/ ? $ ?' @9 V& J7 k5 s9 s for(j=0;j<1000;j++)6 [0 U1 s5 n/ @; ~7 q: v for(k=0;k<100;k++)* T6 ?1 R/ ? E5 `. P/ B3 S- U ; ( ^0 |4 {! P' e' O }$ l9 r B$ ]7 ^( \4 U. G+ V' j* O };: A& Y- g/ J$ Z( X: F) X" r void f2(void)9 K1 ~$ k4 n: R0 P) B8 c {- l) K( K* `8 e int i,j,k;6 V" R5 n/ w1 _4 ]" i for(i=0;i<30;i++)* u1 Q" B; Q: |) k3 J& \ {8 K A/ P/ z- X& y7 c( I putchar('b'); 7 v5 I; s0 }1 O' }9 u for(j=0;j<1000;j++) ' L9 t7 Y+ V. B& ` for(k=0;k<50;k++)5 z9 x2 Q. Q# [, y+ F" @6 P$ O- k ; ! `, U1 V( T# S, ]! L+ e } ; C. R# a+ e1 U) \}; # \1 Z- o( ~$ N1 H) u/*------------------------------------------*// ?* T9 \$ l! B; d3 ~ main() E8 @6 A: h6 ~{ * {% J3 f0 c. ~2 l InitInDos(); ; c* B4 a# E7 m4 j$ y) s: R old_int8=getvect(8); " X# H5 S3 U9 @4 s. X strcpy(tcb[0].name,"main");! n% _4 M5 V! [+ j1 p1 W tcb[0].state=RUNNING;- ?0 p% U) h6 Q- O3 f; V' V current=0;4 w9 ^& F7 k# B( E" k- S8 o create("f1",(codeptr) f1,1024); ' x: h3 |7 P* o create("f2",(codeptr) f2,1024);4 Y: r; `6 s0 W. L4 I% h5 M tcb_state();( h* T5 k8 U# T8 y setvect(8,new_int8); g1 F1 P- x$ p$ U% I3 e swtch();3 w; {, S+ ^% B while(!all_finished());. X8 l. u* C' g strcpy(tcb[0].name,'\0');- F/ M7 ~* U$ Z5 [6 _! F; u3 G tcb[0].state=FINISHED; , b# x! N- D7 [' M G setvect(8,old_int8);9 J6 C# U4 m" `! H" U tcb_state(); C1 H* }( x) G! i9 M printf("\n Multi_task system terminanted.\n");1 x0 f4 j9 A7 i0 _3 k };
    towny 该用户已被删除
    20
     楼主| 发表于 2003-10-27 11:58:00 | 只看该作者
    我不想灌水,也根本不想在这样的版块浪费时间!!

    本版积分规则

    关闭

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

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