下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]
towny 该用户已被删除
跳转到指定楼层
1
发表于 2003-10-20 12:59:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
create()  创建一个进程
3 e5 h# ^3 ~* [3 D; p+ W8 r要求:1 用c语言编写
1 M& p1 C0 r- F         2 程序+PCB(ID的内外优先权,申请资源)
* O7 E$ U6 s# g4 j% G只需做进程中”产生“这一步。' I, `, F/ \8 G  g$ ~+ G
以下是做了3分之1的范例:  V* k5 {; ~' S: L
#include "stdio.h"
4 e1 d- f0 ^" C! s, A9 a; V#define running 1 /*用running 表示进程处于运行态*/ - @/ C! h" ?, w
#define aready 2 /*用aready表示进程处于就绪态*/
( S0 z+ A+ N# U- n) q/ M$ u#define blocking 3 /*用blocking表示进程处于等待态*/
4 A8 a7 w1 m2 w( U! j7 a0 E/ d#define sometime 5 /*用sometime 表示时间片大小*/
8 f# U* ~% j- ?% t/ j#define n 10 /* 假定系统允许进程个数为10 */
( |1 b) R+ I: E$ o6 N
5 k3 f4 a9 a8 ^& T$ z: cstruct
: E# t. S! m* l{
  w& l8 r/ N/ Q9 Sint name; /*进程标识符*/ 9 D/ S& a- T7 ~0 C, m. U) Q; @
int status; /*进程状态*/ , X; f$ H1 C( B8 S0 i2 Z5 O. D, f
int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/ % y0 k: E( L( ?2 M
int pc; /*进程现场信息,程序计数器内容*/
) J5 M- ?$ d) `% oint psw; /*进程现场信息,程序状态字寄存器内容*/
+ M6 g1 }& E3 e& @int next; /*下一个进程控制块的位置*/
# |! l/ k3 d5 ?+ ], B0 e}pcbarea[n]; /*定义模拟进程控制块区域的数组*/
/ c- b# z# ]( @. j+ v# ?9 N, p( f2 I* J* N
int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/
  v& R5 E6 V0 G2 T, Y
$ \2 u9 `5 ~( r8 @2 qint run; /*定义指向正在运行进程的进程控制块的指针*/
. o- v% O9 Y7 E: A$ [& ^struct
8 y3 p) A5 `% l, a{
+ X) b' u. I/ M+ F% C. H4 V$ aint head;
7 W( U$ E" i: J) J6 Rint tail; ; M% p0 B- x( P0 Y  h2 i9 w
}ready; /*定义指向就绪队列的头指针head和尾指针tail*/ 4 u- D3 L2 F9 m! {" ?
int block; /*定义指向等待队列的指针*/   N2 T. ]+ o! V, c- K6 }  Y
int pfree; /*定义指向空闲进程控制块队列的指针*/
" C8 x5 R+ Y1 Z- R, o4 X' G4 g9 R
麻烦各位高手了,望帮忙解决一下,急啊!~~!!!!![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 | 只看该作者
    我的脑子都快调得暴了,能写个大至的,让我自己调吗?
    % f  D3 M. p. B8 A1 ?* Q5 [1 ~% D麻烦各位高手了!!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    4
    发表于 2003-10-20 22:40:00 | 只看该作者
    你给的头部定义的几个队列指针看的出来你是想写一个 链接方式 的进程队列,由于给得太粗糙和简单,我尝试了一下,反而觉得很不好写,想考虑的一些东西你的结构里没有,而考虑进去发现弄的复杂了就写不完了,所以很难办,结果还是没有写下去,给你我开始的一点筐架吧。
    $ V% |/ a( ^/ u% o# [1 T  @  C5 \0 c/* the main site file */
    1 t6 ~0 N5 j! O1 U7 S1 C7 SCreatePro(&ID){
    7 y5 E) ?% `/ n7 D+ O- m2 r  GetFreePcb(&ID);  //申请一个空闲的PCB,并为其命名一个标识ID;
    % i+ J2 g  v6 \$ p, g  InitResour(&ID) ;//为该进程分配资源(内存空间和工作区);: w# r+ r, u/ c/ A+ S
    /*初始化参数*/$ O# S: o" U9 n* y1 J- U. Q
       CallName(&ID);   //命名进程的外部名, Q- _! N( ^% U
      SetParProStat(&ID);  //记录父进程的ID和CPU的状态、, w! h: a+ j! Y0 k/ ?
      SetFL();  //优先级数、5 M8 I! @3 W5 ~
      SetHeap();  //进程起始地址、
    ; I, w6 H" `' X( u0 T% A  _SetSelfStat();  //设置进程的状态为就绪态4 I" O# ?" q+ C  y  S6 E4 U
      AddStat_Read(); //将该进程加入到就绪队列中。: c( y; ?( N" @1 V: A
    .
    9 U" A9 t. z' E! F2 ]0 r$ o9 y) [0 |.
    & G- @9 N) }6 S2 i# \." m  G! j. n6 D
    .! @, v: J( b# Y$ T' \  V7 A& \) u
    }
    ) Q2 z) t1 @7 m我觉得上面至少要考虑的,但是实在很懒了,对你也许一点用没有,不好意思
    / Q2 N8 u" _: M! N
    towny 该用户已被删除
    5
     楼主| 发表于 2003-10-21 12:04:00 | 只看该作者
    呵呵!!  I% c9 E0 A9 @2 ?  I' q
    谢谢斑竹的高见!!
    towny 该用户已被删除
    6
     楼主| 发表于 2003-10-21 12:18:00 | 只看该作者
    这是我自己做的一个版本,望斑竹给予指点!!!谢谢7 S2 o& M# F1 S8 ] ; q5 R! S# D( }! l" V#include }* F# B6 {3 E/ |: X#include / j2 r, J I# R% K#include' |4 I2 q+ _+ b3 v2 l9 o. v #include $ B7 ~$ r1 }, b' [6 e0 Y7 t! o5 Z#define running 1 /*用running 表示进程处于运行态*/ 2 s: g: ]' g3 @#define aready 2 /*用aready表示进程处于就绪态*/ & T9 W( [2 m, {% P2 P2 \#define blocking 3 /*用blocking表示进程处于等待态*/$ }: D a, |/ H/ N% ?, y #define sometime 5 /*用sometime 表示时间片大小*/ 3 c8 k7 }! b/ T6 |2 Y9 M L#define n 10 /* 假定系统允许进程个数为10 */5 \2 h% U, ]+ { g5 C& |% j, z struct & b! m# C) j# R7 Q{ - i# h# o9 b5 Sint name; /*进程标识符*/ ( T$ q* b' I$ x5 e& c& Dint status; /*进程状态*// G+ K/ C) t# Z- U$ [+ L7 U int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/. d& w1 F- R# W int pc; /*进程现场信息,程序计数器内容*/ ?: W4 _! f8 L' o- vint psw; /*进程现场信息,程序状态字寄存器内容*/* F: C' z. d- }0 m int next; /*下一个进程控制块的位置*/ % A, w' Q6 h. a# \; a) a}pcbarea[n]; /*定义模拟进程控制块区域的数组*/3 V o. m" r/ V0 ~* M9 ~) h+ i int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/ % n! L; [! c; D7 x( Jint run; /*定义指向正在运行进程的进程控制块的指针*/ ; i4 |9 z4 A6 m3 astruct 0 y+ d0 f+ r, i" ]" P7 i. d! E{ ! l# [1 N+ Q/ j% M1 I G/ X; ?int head;9 u- k$ o0 b/ O int tail;+ x* L+ l2 y- G }ready; /*定义指向就绪队列的头指针head和尾指针tail*/" O! P2 J+ D# C, s int block; /*定义指向等待队列的指针*/ * k: l7 j4 e0 D4 \int pfree; /*定义指向空闲进程控制块队列的指针*/ & H- K# ^2 y+ a8 t& D5 Qmain() 1 a* M/ l( g4 t1 N{ int gdriver=DETECT,gmode;8 n- ]- W( L3 n int i,x,y; ! w$ I& T7 M' t } for(i=1;i<=n;i++) ! ]( {) C# z7 i0 G {ready.head=pcbarea.next;} . [/ k) j' n; r; S initgraph(&gdriver,&gmode,"");% t0 D. ?9 Q H setcolor(YELLOW); 7 | t* o. b" l4 q for(i=1;i<=4;i++) u5 \7 ]) m1 e t5 h G3 f( M9 e { setfillstyle(8,i); % X7 F: u: x1 y8 M6 r. ^ circle(284+13*i,190,6); % r1 p% d: p* d( A- G floodfill(284+13*i,190,YELLOW); + V4 \: X8 n) e/ K9 h* S& E } ' V; N0 z% Y' {5 c, w4 o* f setlinestyle(0,0,3);) ^- `* M& X; `& |& H circle(316,190,25); ( q }! p/ p* o% ^# h$ g0 B setcolor(5);, E: o: t2 z6 y- v1 F; Y settextstyle(3,0,4); , w3 i5 B4 e7 r3 I6 x0 `9 v outtextxy(35,311,"press any key to create objects!");( D s3 ^2 ?! J2 {0 X a getch(); . p3 Z5 X; y5 I' i( s3 J setcolor(YELLOW); & J& i; o7 P7 J) X0 C3 S; a# c line(300,215,290,235);, c& e' M* d1 @1 Q/ l% D line(323,215,333,235); ) c# `* w) @, j4 i delay(50000);" P! T6 v/ }& U. m1 c setlinestyle(0,0,1); ' ]0 Q# ?3 v! l; t% U6 U2 A for(x=1;x<=2;x++) & X# g% H: S w$ g {setfillstyle(8,x); * d' z# s+ L& y; M1 A6 |; G5 j circle(267+13*x,246,6);8 N5 c2 @8 ~- ]) }* f6 h floodfill(267+13*x,246,YELLOW); 5 i6 H* A* A1 ~' T9 N; L- l }: Q+ i0 _* h. ]& g: }& ? for(y=3;y<=4;y++)1 K1 T, M6 y9 B5 E0 [ {setfillstyle(8,y);, Q0 I* i7 Y1 f5 Q circle(285+13*y,246,6); 2 @% w" `9 Q& y, m7 n* X1 X) f floodfill(285+13*y,246,YELLOW);# i$ [: ~; H9 n0 v+ X } * l# q: K6 j" a+ R( z# x5 { setlinestyle(0,0,3); " Q" i$ w% d( A+ r/ j( D circle(287,246,14);1 O1 b) Q0 D" T) c0 v setlinestyle(0,0,3);8 K, X7 i8 K' ~5 T# x3 V circle(330,246,14); " S* A$ W1 R. P delay(50000); ; L5 L3 o7 F4 L& B line(281,260,281,280);' y( {$ }/ {7 f+ |* x4 h line(293,260,293,280); 7 |1 L7 d- D g( \" h line(322,260,322,280); 3 y4 I3 [ y( j+ P m line(333,260,333,280);4 j& Y2 c2 d4 K, A$ n) ]4 P delay(50000);& U0 l! E) M* B ?4 o( p setlinestyle(0,0,1);: ]/ c2 p! T5 }2 I setfillstyle(8,1); * L! C l: R2 j circle(281,286,6); 5 H; l( m W) y* u2 h2 }) z floodfill(281,286,YELLOW);9 u- B0 S; Y. l4 n) r setfillstyle(8,2); ) T$ @' g% G1 O) E$ ` circle(293,286,6);& Q/ T( b$ n ~5 j5 j1 X floodfill(293,286,YELLOW); 0 C6 p7 P6 k/ F- O( p' L" C setfillstyle(8,3); , i9 }0 u4 B% f7 D8 M circle(322,286,6); : z9 r; G2 u$ a floodfill(322,286,YELLOW);4 s2 G- d I8 i& T v setfillstyle(8,4); . M$ q, Q O) k, F: {6 w+ B$ }- o8 h circle(333,286,6);+ E' O+ ]$ |8 E floodfill(333,286,YELLOW);: d b* ]6 Q! `5 d3 o/ Z" b. r getch();* W6 n2 H% a6 X5 M; q; y9 U closegraph();/ T1 w9 z8 r8 m$ r6 f6 D# K, @ }. P% p* B. n6 g . `5 G9 B$ F1 y( w9 Y% I: J0 \ / t6 m' @% a% t o; i
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    7
    发表于 2003-10-21 18:58:00 | 只看该作者
    你在搞那么多画图干什么?你不是要做进程的创建吗??5 A4 B9 ^% ~, q' A7 H8 ^* T
    难道不是《操作系统》的‘进程’那一章进程创建??
    $ C( Y5 u, Q) A  @" r5 }到底是要个什么效果??糊涂了
    towny 该用户已被删除
    8
     楼主| 发表于 2003-10-21 20:34:00 | 只看该作者
    手误贴错了!
    . F1 y2 E3 d7 o, V9 h2 j不好意思!!
  • 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 | 只看该作者
    做了一半的半成品望斑竹指点!!8 B4 p9 ]9 W1 ~# I ' I" S0 |- k- [% m int timecount=0;! ~5 a/ _8 `6 w$ j) T% G v0 E char far *indos_ptr=0; 8 x, x& |" ?- d% a- h, a' uchar far *crit_err_ptr=0;. y: d9 q6 Z8 p( o' \7 c s9 s int num=0,current=0,i; ! `) q3 H% G2 X4 {void over();5 m' m' c2 @: X3 ~4 G typedef int (far*codeptr)(void); / @* z! N \2 c& }int create(char *name ,codeptr code ,int stacklen)- P7 I3 ]; T& J8 l1 b- w { : p1 S) R0 o; K& G' Wunsigned int * s;# C6 O& s, A8 J' h2 N: h: F$ l num++;2 \+ b4 X5 N i3 v2 Y) K6 r1 _ tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); * G9 B! q" L+ R tcb[num].state = READY;( t5 o" S+ @# \6 ^- g* `8 P# T strcpy( tcb[num].name ,name);' K- d1 O4 E$ A; W6 U5 @9 N tcb[num].ss = FP_SEG(tcb[num].stack);( q# Q" p/ o G& }4 N7 Z tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14);" ?- p) Y+ |5 G *(tcb[num].stack+stacklen-1) = FP_SEG(over); + \3 p5 ?: V( R- C& e *(tcb[num].stack+stacklen-2) = FP_OFF(over);3 b, f0 _6 v |' D *(tcb[num].stack+stacklen-3) = 0x200; : B- y, Z2 O; W. W* P *(tcb[num].stack+stacklen-4) = FP_SEG(code);/ ]- B( `0 x: x0 a; Z *(tcb[num].stack+stacklen-5) = FP_OFF(code);# c7 _& d; ?3 [ *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);0 l' {( E" P4 s. W *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack);. i, ~* r5 r3 z7 _ return num; 7 R* T }0 r2 `) _" A} ; % d/ e* o7 C0 b Uvoid interrupt (* old_int8)(void); 2 g# }1 ~; Y& x6 v" m! z2 X- I* J+ Nvoid interrupt new_int8(void) ! q* t" F8 R) }0 x; d{ : P9 D) K6 a! P9 y (*old_int8)(); 5 |3 H8 B* K. a timecount++; ( f1 G5 i8 h7 u3 t if(timecount>=TL);( Y* _) P+ H" k, s if(!DosBusy()), q e% J4 x6 u, h/ E( _ {# V6 a; e# i4 Q disable(); 2 M. g W) c1 R: ]# o: {. a1 n* O tcb[current].ss=_SS; ; G! ~0 T3 b/ D* _ @) i8 y( _ tcb[current].sp=_SP; ! E2 M& D% E: t) X: s6 m5 r if(tcb[current].state==RUNNING)/ E: n9 ]' N; Z5 P6 q tcb[current].state=READY; " ]2 B6 ?8 J1 `. c0 K ` current=3-current; + G, P0 A2 |/ S7 [& y7 P+ g% kif(tcb[current].state==READY) # s+ e. h2 h: H4 y* }1 s9 b{ _SS=tcb[current].ss; ) x+ q8 A1 A' Y) [4 H' z _SP=tcb[current].sp;: \! W+ Z- `+ I: j6 W tcb[current].state=RUNNING;$ u( i, r/ y% f, d7 c timecount=0;6 R; Q/ y! x1 r p& p4 _5 c enable(); ' v4 q, ?7 [$ Z) W2 ~} 3 B; `" N6 _1 y. Y% o' L} . ?/ N; K4 j* i4 _) Y, k; C};7 q* d0 X* i, N6 u! N7 g/ K; j void tcb_state() ( a) j5 x* M8 C{ w T+ p5 m1 I% C" W) a4 k int i; D0 h4 X M# C1 i5 U for(i=1;i<=num;i++)/ Q3 R( N1 @* z) s printf("Thread %s is %d ",tcb.name,tcb.state); : [( l9 R1 F, U) ]$ c5 F};. N0 E! x$ k! J" _2 [3 q' [ int all_finished() ( |- j& A" v1 q! Z+ |$ e{ & r8 Z4 d, x5 X: j6 {# n% r8 e; k int i; 9 b9 a7 W6 I4 H0 n% M: X& x for(i=1;i<=num;i++) - J; y( \, ]7 z2 c7 q+ h if (tcb.state!=FINISHED)3 ]. q2 z' d$ b3 G8 Y/ B return 0; 0 a; n# W+ Z5 S1 e) c3 N% m return 1;+ G1 f5 {6 E: F, I6 y+ | & } H' U. f& K0 C/ F; R}; ! A9 c Y, }% h6 ?void interrupt swtch(void) 7 A# ~2 ^, x7 l! n5 O7 G. h{ $ f# }! N, d6 Kint i;+ E( Q8 ^8 L4 O- F! I- b disable(); 5 L) Z. K/ y" c2 h0 m8 }! ?* s. S tcb[current].ss=_SS; * \6 V0 u# L$ K: t1 c tcb[current].sp=_SP;) l+ s1 F- B0 r5 M" l2 { if(tcb[current].state==RUNNING) ' I; w) k, @$ H7 k tcb[current].state=READY;* R. _' a( I# V3 \5 o5 ?2 d* i for( i= current+1 ; i <= num;i++) : F5 p$ w+ O1 V6 N7 s7 P4 ^ { if(tcb.state == READY )7 W8 `4 Q" t* v9 d1 [4 ~; E goto excute;: D! t0 q! o% y' L } $ O% a& v. S( E3 z for( i = 1 ; i <= current ; i++)* C+ S7 |4 j( _( L" d { if(tcb.state == READY) % J: m/ M+ i; e# {! e, c, Z, W1 R. H; P goto excute; / K: ~7 r3 Q6 O8 {" b } 1 l6 h9 |/ E6 }2 E7 m! {4 H* ] i = 0 ; 7 w) l9 u9 f' Z3 E) i excute: : P4 x* [" @6 R' V' K* Q+ i% q# Z+ E3 ~ _SS = tcb.ss;0 j7 c# k; y, \& b% K7 Z8 D _SP = tcb.sp; & V9 D% u! D- a5 O tcb.state = RUNNING; / r6 x" q7 B; I7 ~- X2 _. T current = i;( S( @/ S! J! J: T; a enable();+ y( D& h+ m t& q( S% q }
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    13
    发表于 2003-10-24 18:02:00 | 只看该作者
    指点什么呢?效率?方法?还是编程格式?
    7 u9 D2 V4 D0 x7 \+ g8 F给一篇代码给别人叫别人指点?我从来没有过。
    towny 该用户已被删除
    14
     楼主| 发表于 2003-10-24 21:48:00 | 只看该作者
    操!
    1 f( ~" ]4 p. Z3 q/ s- s5 r搞什么脾气啊!一个斑竹有什么了不起的啊垃圾!!
    towny 该用户已被删除
    15
     楼主| 发表于 2003-10-24 21:58:00 | 只看该作者
    你要是不懂就让位!
    * `. }6 t& _; `4 v. d( g+ C+ {别占着茅坑不拉屎!7 f" @* p9 a2 m( R) 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 | 只看该作者
    完成了你们看吧! & W9 k) [$ V" o0 F: _0 U+ _6 u X3 |2 Z4 [2 w% ~8 p' r t #include ) R3 y% a; N1 O5 g #include : B! L' n) o) d6 @; E1 P#include ' u% s4 G' w5 P5 I #define GET_INDOS 0x343 J* J+ A* g' @1 G2 I2 f4 U4 Q& O; a #define GET_CRIT_ERR 0x5d06 3 h* X; J! l+ c7 L#define FINISHED 0 K( g& w, ^! @% V, T ]#define RUNNING 1 J% t, r: a( y#define READY 2# j9 \2 L9 m* e. C% ^ #define BLOCKED 3 : ]- m; r; z2 M, P3 s" T6 [$ C#define Ntcb 80 j- W4 R, m9 K. W/ _+ G+ R, C% E1 m #define TL 1 % R9 O$ t( E( y; ]. H: q# s Astruct tcb{ % X' U |9 @- a0 y) g% M unsigned int * stack;/*堆栈的起始地址*/0 K6 e" o. d( ]4 p0 A9 v$ u unsigned ss; /*堆栈段址*/& ~/ D1 I8 [) a4 r$ A unsigned sp; /*堆栈指针址*/2 D' `0 C& y6 d char state; /*进程状态*/ # N# ]/ k9 U) K( r$ I: r+ F char name[10];/*线程的外部标识符*/" _8 a3 u& h) p" z( ]. q: j: f }tcb[Ntcb]; /* 系统允许最多的任务数 */ 1 W8 J" n: f# `+ |0 v: V8 [& Pint timecount=0;" H; v0 A. w2 ?/ R1 l7 k7 ?2 }2 J char far *indos_ptr=0;& j- G" [) n: V0 W/ ] char far *crit_err_ptr=0; : i s" U `! m& H5 n, ] iint num=0,current=0,i; - X0 ]6 K* F& z0 bvoid over(); 0 M' V' F) [3 `5 U. Ytypedef int (far*codeptr)(void);7 B e3 }4 n" O- j& N int create(char *name ,codeptr code ,int stacklen) ; b+ [! n d! B# T{ : c" L3 b8 y7 F8 _unsigned int * s; " l! C3 m" g, _/ Z4 n# Ynum++;& R4 a L" B6 S; Y. E T tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); ' r7 e$ y; v7 V( s( i tcb[num].state = READY; 8 t/ [7 p- Q- a* E6 _: Q strcpy( tcb[num].name ,name); ) W! C8 v& z/ u5 a7 q. X2 S# W tcb[num].ss = FP_SEG(tcb[num].stack);6 B& h% R' J2 ^2 Z2 v9 W# g tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14); ! U( x( E1 R1 K6 A" a& y& P8 D- r *(tcb[num].stack+stacklen-1) = FP_SEG(over);: ~0 u7 E: L7 z7 P+ G *(tcb[num].stack+stacklen-2) = FP_OFF(over); 4 d* d6 l! G+ u& F& s *(tcb[num].stack+stacklen-3) = 0x200; 6 B, z- X# G$ `% k *(tcb[num].stack+stacklen-4) = FP_SEG(code);, K9 V: Z$ J! } ?# o; a *(tcb[num].stack+stacklen-5) = FP_OFF(code); 0 V! n6 o# x& x) Z *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);; c) n/ Z+ h# a0 C1 @% \ *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack); 8 ^3 m/ E# ` @& @8 X P return num; 5 ]2 z: x+ Q; K W) k/ h5 U} ;) Y) t/ C4 O+ ]8 t( X6 x void interrupt (* old_int8)(void); 7 I* C6 A* B! g, F0 L+ H& A. cvoid interrupt new_int8(void)! ~5 y& ?8 m4 e$ i: R9 ^6 @# G {, L( M/ e3 |! f: s. x (*old_int8)();3 d/ s' p* c! x0 M% e! Z3 L timecount++; + ^ g% [; |: r: T" @# L+ S if(timecount>=TL);# ^: K6 F- l- _( H/ T6 h: j' \$ q0 K+ q/ ] if(!DosBusy()) 7 l" R3 z$ Z6 \4 ?$ a { : |' {& H8 s! ~4 M7 p3 T2 e disable(); 8 J/ v/ C( K4 x( d1 ]' s! y tcb[current].ss=_SS;. }4 t) C- c) u7 j8 z4 q& Z: [ tcb[current].sp=_SP;0 j3 y, K, H! A1 Q. T* I if(tcb[current].state==RUNNING) . k4 S; y6 i: u o* N tcb[current].state=READY; C& o( a; o4 h9 K2 H' K) \1 _ current=3-current; # |. p: `9 P7 Q( u/ d3 }) mif(tcb[current].state==READY)" V+ |8 K6 E7 a0 W( z2 D" `9 n { _SS=tcb[current].ss;& w' m; l) }) i8 o( ^: N _SP=tcb[current].sp; H9 `: [7 {4 R/ ?( V* S tcb[current].state=RUNNING; ! g/ K" u; s4 i. o# l timecount=0; ' H: {' O& w2 q4 U1 T1 V# c/ `4 r( ^! D enable(); % `, {. c& X( \7 P} ) _+ U' p R/ p9 T, [: U} 0 Q/ x& B4 J* o0 g2 K; B1 u4 }};& \$ K4 m* S. w& p5 `/ V- S2 | void tcb_state()" Y( C" |2 A, b, e5 s { ( Z5 x8 @! o/ Y3 g; x+ _! {6 \0 t int i;9 X9 ~; h: @( l" r2 f for(i=1;i<=num;i++)5 I* e0 c" `, {" ^ printf("Thread %s is %d ",tcb.name,tcb.state); 4 B1 r; u. v5 A) ^7 ~4 ?% \};! A2 }) Y! D. v4 K3 G$ O3 F [ int all_finished() 6 p# o3 _% G" R- N+ V{) c' j) _2 J2 B1 J( J% Z9 Q, F int i; 7 A( K# [( k, M( L) P for(i=1;i<=num;i++)! G' i. O' U1 g S7 m if (tcb.state!=FINISHED)3 Y5 t; P" ~' t- c8 M2 d0 I return 0; " x0 ^, C7 c- n, N* Z8 I7 v return 1;: V+ h4 [# p' L# d+ ? 4 E, ?2 \% J' ]}; 1 q; g/ X1 j; a7 U: Z8 evoid interrupt swtch(void)" s: E7 {! l+ R { : _7 q S# D" r# m) K K @int i;+ U1 p1 J0 ?% D2 ~" O7 h disable(); 4 S% o8 G, M8 @2 g+ E tcb[current].ss=_SS; 3 o5 ~/ x3 N6 }1 s: w/ l tcb[current].sp=_SP;" d5 c' z; E3 Q+ _- b* Q if(tcb[current].state==RUNNING) 9 b# g. E; m/ t. E tcb[current].state=READY; - ^- D: F1 B* J V J0 J for( i= current+1 ; i <= num;i++) # h+ D7 f7 |; a, r8 p' P- u { if(tcb.state == READY ) + i6 @- c, P+ e+ {( ^ goto excute; 4 {3 E j, }$ S7 w: e7 E } / f* {4 P- h% j, l6 X0 a for( i = 1 ; i <= current ; i++)6 X8 R. [, \+ }7 h5 y' u( c { if(tcb.state == READY)% |1 z; m6 i* y9 j. ] goto excute;7 z0 g3 x! f) Z l0 Y }- D" S. U/ e5 L0 {# M i = 0 ; 0 B6 g" i/ K) x ^! {) h$ t F3 g excute:5 L2 I/ T7 ^6 l$ O0 n _SS = tcb.ss; 8 x) N* Z7 p7 @& h# {8 y _SP = tcb.sp; , [/ x. ~& K" B, n1 E tcb.state = RUNNING; 9 o: l8 P* j' `" q) J$ x current = i;5 X: m) j6 C3 X8 Z1 n enable();. F' ?1 {* f ]# d8 V: }2 U4 g }% ]7 C- v/ f% I9 q: i /*-------------------------------------------------------------------------*/ / n- { F. \2 X! R* L5 B1 svoid over() & |+ T9 |6 r$ D& u6 D$ Q4 j! \/ c{ $ n/ Z0 G) {1 b% P/ d2 ] int i=current;3 \9 M K" d" t b$ {8 a /*strcpy(tcb[current].name,'\0');*/. K) W; ]0 w4 ]0 a( n tcb[current].state=FINISHED;8 F/ f# ?4 G0 p( ~ swtch(); * o9 m# r/ s4 p$ n A free(tcb.stack); 1 g# k! k# ^. Z3 [0 r};* D$ `. |! x6 z U* a /*---------------------------------------------------*/& B; r" u! q. [# R void InitInDos(void)# @/ \4 Z: Z, H* i# ~7 Q { ) M7 k- d! g) A2 _( t union REGS regs;0 \; E1 U; t/ J' p$ O struct SREGS segregs; $ X B. K/ m% D' g0 i6 F" A /* get the address to INDOS flag*/- D* m+ e( x+ i. g regs.h.ah=GET_INDOS;/ C' j' h3 v2 q! I intdosx(®s,®s,&segregs);' T* I4 z& q3 w& `- ~ indos_ptr=MK_FP(segregs.es,regs.x.bx); 4 W! E1 j7 t( G4 v' z9 n" L /*get the address to CRIT_ERR flag*/5 C. T$ G, a3 A6 U if(_osmajor<3) 1 d7 s- Q- G6 k2 z5 A; V) I crit_err_ptr=indos_ptr+1; 3 J% x, n w# E+ e else if (_osmajor==3&&_osminor==0) " _) V1 J# R. d) {2 H. o0 b) ]" q crit_err_ptr=indos_ptr-1; D9 I% [9 D: M else. E9 J9 W: r4 L) T) {) p/ ? {/ k% ^ `, {+ R1 v regs.x.ax=GET_CRIT_ERR;7 f4 q8 x1 {* s! H# ]9 s intdosx(®s,®s,&segregs); 4 W7 a! f1 z- o/ ^. @" {% [ crit_err_ptr=MK_FP(segregs.ds,regs.x.si);/ I1 n% l0 D! M$ a! O5 |. ~% l" @ } 0 [ M+ E0 H1 D. Q3 l% D}; 3 ?) j e" D6 D( H1 \8 L9 ]( W( ]int DosBusy(void)) O y7 d0 J6 E9 V: o" z { & S# k1 A3 \+ y! |' v8 X' @$ ~ if(indos_ptr&&crit_err_ptr)4 ~$ l8 r$ Z1 A) u! N return(*indos_ptr&&*crit_err_ptr);, ?7 l, t8 S" Y# o+ x else: b7 v2 F) o0 N; k8 S* p0 k return( -1); - ]4 m/ p1 m: l; Q* ^5 e}; d4 a2 l) u# R3 |+ s+ }void f1(void) 4 C8 z `2 _" \$ T6 s/ I- `{7 Z9 a. I7 ~# `7 y int i,j,k;$ }% W9 G5 r/ P, w6 j for(i=0;i<40;i++)# z4 E/ G' d- t7 N1 d# W6 S/ J& x { 9 g; U" C/ k* e, E putchar('a');; K) n% R$ i; Q; O: a* i% m p + ]5 z+ U; d2 j" I5 w# z for(j=0;j<1000;j++)4 @* ?7 }* F) d' g% \ for(k=0;k<100;k++) 2 y! }% m1 @ k' D) u! ^% d ; . c) v8 C4 D9 Z# r' g) Z6 x4 g9 P }" z6 P% R; Y" K }9 r! | }; / n/ W( {& \9 Vvoid f2(void)! D1 w' U9 T8 {" X8 m { & N5 M; Y6 R7 {# w int i,j,k; * A; c5 b3 _( H1 J) H: ~& @ for(i=0;i<30;i++)' C% {0 e8 l0 k# P! H" e { . L! I& [0 ]# t4 {6 U- D9 ?+ T5 ^ putchar('b');, R2 x) O% ^* O6 V, s0 X; X for(j=0;j<1000;j++)4 O: J, c/ p/ V/ M6 ]8 X$ D( Y for(k=0;k<50;k++) h2 y; L5 z c0 o ;; ?8 I s, J. |6 D* f } ! i( t: F) `2 a9 t! R/ s9 N};1 c+ ^0 H6 Z: T) \! I$ } /*------------------------------------------*/2 z2 {$ j( B' R main() N8 }# o6 b! c1 W( R {% ?; ?5 I8 R) T C/ ]+ J/ D InitInDos();( b/ E- o/ u/ q* @ old_int8=getvect(8);& D, q" [8 m( g- m# M$ O9 b strcpy(tcb[0].name,"main"); 0 z) V, P* Q P9 o$ Z: Z2 u tcb[0].state=RUNNING;0 H- B# v* w/ H/ G E. X8 o$ I current=0; $ q i8 I7 t/ R create("f1",(codeptr) f1,1024); 6 }) u* K+ {5 @5 P+ T create("f2",(codeptr) f2,1024);8 E* k. k% c8 t/ D+ p tcb_state(); ' m( h+ M8 W0 H4 H5 K' p2 V; U setvect(8,new_int8); # z9 F- ^7 Z4 L0 Q# o swtch(); 1 y% f8 C/ G+ c while(!all_finished()); % L; j+ k6 |8 s8 g strcpy(tcb[0].name,'\0'); : \; D6 Q y9 u- f7 I2 l3 z5 | tcb[0].state=FINISHED; / k4 S( z) A% c0 @" Q setvect(8,old_int8);, V' \6 {1 h* A8 W, X6 k6 x tcb_state(); , O% l% b) ^- ?- l printf("\n Multi_task system terminanted.\n"); ) V9 h. Y0 M9 P) q4 e6 ~};
    towny 该用户已被删除
    20
     楼主| 发表于 2003-10-27 11:58:00 | 只看该作者
    我不想灌水,也根本不想在这样的版块浪费时间!!

    本版积分规则

    关闭

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

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