下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]
towny 该用户已被删除
跳转到指定楼层
1
发表于 2003-10-20 12:59:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
create()  创建一个进程4 v; q% B( v$ ^7 V: E. q
要求:1 用c语言编写* y6 z: A2 [; s4 j/ N! H: j
         2 程序+PCB(ID的内外优先权,申请资源)
. M4 Q' ^) G; M: P; O8 ]1 X只需做进程中”产生“这一步。; l" `! v3 Z! e$ Y9 J
以下是做了3分之1的范例:
0 ~: h- {& I* q6 h#include "stdio.h" 9 Y: M3 I* V' r$ d2 q/ Y
#define running 1 /*用running 表示进程处于运行态*/
" O) ^- A9 w+ P. n* o#define aready 2 /*用aready表示进程处于就绪态*/ 5 u: T9 P( W" E0 ~9 E
#define blocking 3 /*用blocking表示进程处于等待态*/
5 H3 }+ o, G$ {3 u#define sometime 5 /*用sometime 表示时间片大小*/ ! q7 n# U- P0 v9 Q4 l: n% j
#define n 10 /* 假定系统允许进程个数为10 */ 4 d) g* u. x, D" _3 j' {

9 m9 U8 T% [! G  L; D1 mstruct 7 d& i7 Q  D6 y8 ?; D
{ 6 G; F! r" e0 M1 d
int name; /*进程标识符*/
9 h8 F6 f1 l! _1 \$ M# Qint status; /*进程状态*/
2 q: Y6 D- R+ }& O0 @$ i" cint ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/
- ?0 |& ~0 t- W9 m# x# ^int pc; /*进程现场信息,程序计数器内容*/ 0 p5 S! W! l* B: V. C
int psw; /*进程现场信息,程序状态字寄存器内容*/
! P# a& R* i/ C; d% xint next; /*下一个进程控制块的位置*/
: j3 K& t# K: h: I}pcbarea[n]; /*定义模拟进程控制块区域的数组*/ 5 f* P' z/ D/ z, o" c$ i1 n' N
& Q, J: n9 c( Y' A
int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/
8 t9 J! m, @+ D7 z" \' y) `: O3 M  B, u6 v2 v' ]
int run; /*定义指向正在运行进程的进程控制块的指针*/ - h5 ?# O  q( w# l+ ~) b9 B
struct ) X" N: l( g8 H* \( d, c- B
{
9 R  C8 B+ E" M; ^8 pint head; 2 g: u5 F, I' i& s# S+ ]2 E& S6 b* m
int tail;
" _9 _4 T5 k4 ]8 n$ F0 E* R}ready; /*定义指向就绪队列的头指针head和尾指针tail*/ 4 Y9 `2 t% f: E4 v2 h
int block; /*定义指向等待队列的指针*/ 4 J7 n* D, z% d) p5 Q
int pfree; /*定义指向空闲进程控制块队列的指针*/* A+ h) M/ z* F" C. ]& z
, R3 `2 l9 _2 P, Q
麻烦各位高手了,望帮忙解决一下,急啊!~~!!!!![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 | 只看该作者
    我的脑子都快调得暴了,能写个大至的,让我自己调吗?
    6 s' b3 m! }' X6 p3 P; y' y麻烦各位高手了!!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    4
    发表于 2003-10-20 22:40:00 | 只看该作者
    你给的头部定义的几个队列指针看的出来你是想写一个 链接方式 的进程队列,由于给得太粗糙和简单,我尝试了一下,反而觉得很不好写,想考虑的一些东西你的结构里没有,而考虑进去发现弄的复杂了就写不完了,所以很难办,结果还是没有写下去,给你我开始的一点筐架吧。+ q/ X9 _! ^5 D! J1 c
    /* the main site file */
    & g4 ]& U$ G: r! \CreatePro(&ID){/ E& ^" x# ~* E$ |2 H) Z" I, H+ o
      GetFreePcb(&ID);  //申请一个空闲的PCB,并为其命名一个标识ID;
    7 Q$ l( a; ~  O: s2 a3 _  InitResour(&ID) ;//为该进程分配资源(内存空间和工作区);
    & g4 R6 r) N/ l4 L1 s/*初始化参数*/7 M' l' P! Q+ d# k6 D3 K; E
       CallName(&ID);   //命名进程的外部名9 M' e6 t9 V9 v; ]
      SetParProStat(&ID);  //记录父进程的ID和CPU的状态、+ G2 }& m4 c8 C: u5 z
      SetFL();  //优先级数、( J- x2 p3 a; A6 {  J& s
      SetHeap();  //进程起始地址、
    1 B) I  s6 ]' t+ L% A' m  _SetSelfStat();  //设置进程的状态为就绪态
    / g6 l; [1 V2 w; v  AddStat_Read(); //将该进程加入到就绪队列中。. f& G# N/ ~. f, L0 `: l
    .
    - ]+ ]4 q8 _" J1 Q0 o.
    1 j$ Z2 Q8 O' P3 |* L& q.
    ' K1 s+ z& D6 z+ m* Z.
    ! M' c& Y2 y  T2 E4 z( b}0 y% W4 |. r( X% K! f
    我觉得上面至少要考虑的,但是实在很懒了,对你也许一点用没有,不好意思% k( S. L3 M1 n2 A) V
    towny 该用户已被删除
    5
     楼主| 发表于 2003-10-21 12:04:00 | 只看该作者
    呵呵!!8 z7 g% ]5 d) U, e& f! k" }( F
    谢谢斑竹的高见!!
    towny 该用户已被删除
    6
     楼主| 发表于 2003-10-21 12:18:00 | 只看该作者
    这是我自己做的一个版本,望斑竹给予指点!!!谢谢& U) d8 K: O/ `4 l R 7 w* x% s1 z/ }. }* H* L' l1 j2 l #include 5 {9 n- t7 d. A' b#include 1 T: u: a( e7 C7 @$ q#include $ k: @/ h: P, R: W# h#include1 [6 K% d$ V/ I #define running 1 /*用running 表示进程处于运行态*/ v+ ? @! y+ d, x1 t+ H#define aready 2 /*用aready表示进程处于就绪态*/' o( s( n# E, [ i& Y #define blocking 3 /*用blocking表示进程处于等待态*/ # G) Z9 x1 I0 S7 i4 ]4 \#define sometime 5 /*用sometime 表示时间片大小*/ 0 t! x% J. H9 j. v# n m; D% y#define n 10 /* 假定系统允许进程个数为10 */ 9 Y. o1 w6 K. U( a( q5 Pstruct% b9 Y. u7 `' d* u& x {# i- Z* [- a. J int name; /*进程标识符*/6 h* [/ W8 B5 n# | w; G M5 f int status; /*进程状态*/ 6 u, s v9 U) b, S7 s& Qint ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/: Z! u; C; ?6 V( y int pc; /*进程现场信息,程序计数器内容*/ 1 C3 V6 h W( l) [4 rint psw; /*进程现场信息,程序状态字寄存器内容*/ ) H4 C3 h. E# q3 L. H( T' Jint next; /*下一个进程控制块的位置*/ # v4 Z) J0 e9 }5 B# ]}pcbarea[n]; /*定义模拟进程控制块区域的数组*/ . F$ ~3 G; R& ~6 U7 Yint PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/ ( y. W* _& z$ |! {: E) q% C; lint run; /*定义指向正在运行进程的进程控制块的指针*/ * h& s8 w1 g: q$ c% a/ a+ n' Istruct, w. V! z7 ]* `3 t" [8 |! `: ~ {8 n3 M( a2 o/ p) l9 g* C( L int head; + @8 s, u+ ^$ ~3 b& Fint tail; , \/ a4 Z6 k8 M}ready; /*定义指向就绪队列的头指针head和尾指针tail*/! E$ s6 n. \8 x1 J/ B int block; /*定义指向等待队列的指针*/' v$ {. x+ Z( V9 `. X3 E- u int pfree; /*定义指向空闲进程控制块队列的指针*/ 2 Q, y% f( m; ^2 Lmain() : j1 {& `3 v$ f) @# X{ int gdriver=DETECT,gmode; 3 J( ~. N' o8 @2 o; r3 S- \ int i,x,y; ; E% C1 M! N ^$ s0 ^ for(i=1;i<=n;i++)+ s- f7 v+ P. ^, _& _* ] {ready.head=pcbarea.next;}+ S5 d% W+ v5 l- d) n v+ A( k initgraph(&gdriver,&gmode,""); , a, B7 `; s0 \6 M. t5 I setcolor(YELLOW);9 O3 A4 f4 D5 R0 ] for(i=1;i<=4;i++)1 T, F# K; z- H5 b2 x! M, M { setfillstyle(8,i); ; j5 W y6 ^) {# ? circle(284+13*i,190,6);3 A" P/ `+ B& `. F) v4 E floodfill(284+13*i,190,YELLOW);% G5 |9 \4 s- A* N } 9 _3 W+ N% o; ~ setlinestyle(0,0,3);& ?+ U6 {8 Q5 m circle(316,190,25);; J# S$ {6 s" Z. L" e, [. r) x setcolor(5); 4 u7 z0 n9 B+ b" V* s settextstyle(3,0,4);! ]' B: m3 j3 m. Q Q M. L7 r outtextxy(35,311,"press any key to create objects!");7 {. P' M ~7 T+ ` H+ b9 a. ? getch();1 k# E p" | M4 f setcolor(YELLOW);/ k( ~5 @# c# J4 U; x line(300,215,290,235); ! v7 H8 d2 i+ | line(323,215,333,235);* z# h" ]! x% _' e delay(50000);" @9 Y; y. Q8 ^- ^$ b6 } setlinestyle(0,0,1);8 d' A; o0 b1 p# B( V for(x=1;x<=2;x++)/ ]6 D3 V- t( }4 i! O3 J2 ] {setfillstyle(8,x);. i- S4 d6 p# b: X circle(267+13*x,246,6); y& \+ t {! K) a% X9 c floodfill(267+13*x,246,YELLOW);7 r7 K. M5 Q$ } i+ R1 b+ c/ G& L }$ h. Y1 P4 I J; b3 |1 c for(y=3;y<=4;y++): j% ?- F% s& e( V {setfillstyle(8,y); ' z7 y D- F& M" s circle(285+13*y,246,6); , g3 j: n6 T$ p, U* o1 T floodfill(285+13*y,246,YELLOW);$ R% [" K9 a! ~+ g% S }0 }0 G% C% `% M setlinestyle(0,0,3);; V# X' ^6 q# ~7 u circle(287,246,14); & B; x. o6 L* B" e1 L5 K8 `- \2 \ setlinestyle(0,0,3);6 }" B0 n% [* Z0 y O circle(330,246,14);: }) B6 L1 s) q( |6 e delay(50000);: s" d( Q9 y& Z& M1 M/ C) N line(281,260,281,280);; m6 Q: Z" _0 c. K% O- ] line(293,260,293,280);4 q. A2 P' c* ~# s% J7 w7 g line(322,260,322,280); $ \9 s) |* G x3 v line(333,260,333,280); ) x+ d* X! i; Z9 u0 N' v# C delay(50000);5 j" z; d' X) ~) b setlinestyle(0,0,1); # P4 r8 f1 K, ?7 I0 N setfillstyle(8,1); # X. _+ H2 i6 \2 ~; i circle(281,286,6); $ L8 B# V& U3 s/ ]5 \' } floodfill(281,286,YELLOW); : l2 m7 p! \4 U' c5 e2 s setfillstyle(8,2); # Z3 X1 {( \2 k: [# k8 X circle(293,286,6); $ B( A4 w2 E! X- l0 @ floodfill(293,286,YELLOW); 3 _1 [, F3 ]# T7 u2 |$ T setfillstyle(8,3);2 r% `3 t' `! f4 C: t8 y4 d5 \ circle(322,286,6); * P6 a% |2 r0 T, x s floodfill(322,286,YELLOW);: s0 W3 s; A7 f/ ^8 { setfillstyle(8,4); ) H0 h! S6 E4 q8 g3 I$ E C circle(333,286,6); # F$ Q& H. s6 j* A" f, H4 C4 y floodfill(333,286,YELLOW); 9 e& U) A8 j5 C2 _ getch();9 P& ]; }+ E' B1 u0 B3 p# @ closegraph(); 1 D: b; \$ k' J4 r* D& J}, B% J( n1 ^. Z( `' D : |5 Q" n/ V: b" v% O1 }& ? - M" A; |( W; a* f' ~/ P
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    7
    发表于 2003-10-21 18:58:00 | 只看该作者
    你在搞那么多画图干什么?你不是要做进程的创建吗??. F# V3 ^) q  {% u
    难道不是《操作系统》的‘进程’那一章进程创建??/ ^5 _* x2 R4 Y) r) M6 i
    到底是要个什么效果??糊涂了
    towny 该用户已被删除
    8
     楼主| 发表于 2003-10-21 20:34:00 | 只看该作者
    手误贴错了!! v1 ~4 F! k7 l8 f4 g1 L+ a& D) c
    不好意思!!
  • 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 | 只看该作者
    做了一半的半成品望斑竹指点!! . B6 q9 H& A; E: u3 x/ d, @1 { / i2 w4 c: l2 S4 t6 ^$ d5 aint timecount=0;: j; W5 ]( y4 p/ S char far *indos_ptr=0;, f) T) G7 d" T+ h" C char far *crit_err_ptr=0; 3 G3 T, A; V# c& cint num=0,current=0,i; ( \# h' f8 U. X8 }, ^+ U4 Wvoid over();; V/ Q, c; ~+ G% @( B typedef int (far*codeptr)(void); , A+ n- a# V9 J" D6 s) uint create(char *name ,codeptr code ,int stacklen) Q* E) s" s% p6 F, x { $ Z+ c9 V% B/ q* k" [unsigned int * s;6 Y6 D# {- k( L: n3 T num++; , m7 \' j+ a( B- t, f- ? Atcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int));8 } b9 C R7 D3 e7 ]3 K4 E& v; F8 S tcb[num].state = READY;, l% x' q! i8 n; j8 T strcpy( tcb[num].name ,name);, D' i: Z7 B* h tcb[num].ss = FP_SEG(tcb[num].stack);7 T7 R& m2 x {. c! P tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14);8 z9 M$ f/ J$ x9 J* n6 a *(tcb[num].stack+stacklen-1) = FP_SEG(over);8 `5 U3 e0 _$ v: _6 I *(tcb[num].stack+stacklen-2) = FP_OFF(over); . K5 r4 ~0 k& C% ~0 M *(tcb[num].stack+stacklen-3) = 0x200;$ D6 _" F: p, t *(tcb[num].stack+stacklen-4) = FP_SEG(code);, q L% K! \, N N0 O! o *(tcb[num].stack+stacklen-5) = FP_OFF(code);5 ?8 v6 d% Y; T! O) D, {1 h1 j *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack); ! D3 G5 ]6 G7 f/ b, B! X *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack); 9 Y" W$ B/ p9 L/ V; P return num;1 j5 C- l0 Y3 F* p/ z5 k- F* n/ P9 Z } ; 0 H) \8 e, X7 m5 ?: Evoid interrupt (* old_int8)(void); $ J4 f7 q2 x5 d7 V7 [! fvoid interrupt new_int8(void) 2 q6 q6 o. V' I5 s, b9 }{3 T4 Z3 I/ b" j" y0 n' s, z (*old_int8)();! n C2 o# Z3 u2 ]; L% ~ timecount++;" M! F! y3 E |% ?" {; E" Y9 i if(timecount>=TL);/ _$ n! K, e) D7 m f if(!DosBusy()) - L3 @9 u0 \! x) z. k; h {, L" G' S( ^# U9 F disable(); / d" B$ C0 ?9 f7 T) P+ E tcb[current].ss=_SS; . `' t; m* X$ @: H# h, Q tcb[current].sp=_SP; / ]& z+ u" a8 g" i- \7 f5 ?4 ~; a if(tcb[current].state==RUNNING) # H) F6 E( W- e- l! R! ]6 g tcb[current].state=READY; 7 R' U7 d! I% o2 o3 a# V current=3-current; 0 Y8 E& L) p" E. P. r8 ]! j" { b) Y$ U" }if(tcb[current].state==READY) " q5 i8 q, M( c; R: N/ C{ _SS=tcb[current].ss;: _# y# E5 ^' W _SP=tcb[current].sp;# Q! N" K- E6 n. H8 W$ k+ k tcb[current].state=RUNNING; 0 C- N t4 B! p' } timecount=0;3 h) c; A! d0 E& ]0 {- N/ P enable();. S( w( i4 S0 W0 g, ] } 1 m% c) P1 \) g% G `; G$ C" T}0 r2 A* _+ U7 N) Q6 ? o% ] }; 3 U; ?- q: L1 q, o+ D7 O; C3 o Zvoid tcb_state() 1 E8 \5 `$ ~ e3 i$ r6 h! \. }, W{6 ~) R- r5 G c) `4 i int i;4 Z/ j" ` ~9 _9 w2 K for(i=1;i<=num;i++) 8 [5 a& H& |) t& ` printf("Thread %s is %d ",tcb.name,tcb.state); 0 L9 q! `* K* d/ @4 v& e4 l+ b}; ! u* G" w% n' e4 Y g* G. |, Jint all_finished()+ g, Q( \0 V5 F1 I+ R { * c- I" ? |9 @: B7 h: r" W* [ int i;$ R% f8 ~1 E+ u# f for(i=1;i<=num;i++) : i8 j9 o, j# ^ _: \ if (tcb.state!=FINISHED) " l4 y. g" n( f" I$ E) S7 Y4 u2 | return 0;6 l! u) G; D0 n$ M' h return 1;' F1 V: d) f9 ^( O! ? 2 b) L7 o5 w. R. K! ]+ L };( M2 x& z3 Q; O* U1 g; @2 s( z void interrupt swtch(void)3 b: ] q0 v8 c7 R9 k6 L { 8 g: c2 O! N, X& Y' ^int i; 8 U' p( o* r' }. i- A0 g a' P+ D disable();- Z6 S4 V, V3 b tcb[current].ss=_SS;$ t2 p$ b2 L+ }4 C" B9 Y* J( W tcb[current].sp=_SP;, `# R) J+ F. r8 X/ L$ ~9 k if(tcb[current].state==RUNNING)% H# u2 V' g9 }4 u tcb[current].state=READY;4 b! m5 f/ z+ q/ V1 [1 q0 q for( i= current+1 ; i <= num;i++)- X } Y3 _ D5 ` { if(tcb.state == READY )2 x! j% I* C2 V3 ` goto excute; 3 n; l) `6 d! Z5 r } # V8 N6 m* A# g8 w/ T for( i = 1 ; i <= current ; i++) 7 A6 q, ]; Q3 p% O1 K { if(tcb.state == READY)2 ?: _5 i3 c0 s2 I3 P2 h goto excute; ' D* o S& U8 X8 [ }6 S+ g2 l/ P6 Z5 o& j! w i = 0 ;1 |9 ]* R1 e1 J& V* Q* Z$ T excute:0 m9 }* ]6 U' g: `/ h _SS = tcb.ss;. F% ~- ~# B: w3 `7 C& K& \ _SP = tcb.sp; ) h/ s8 g7 N/ `3 g1 l# R tcb.state = RUNNING; " ?/ G5 {. w( ^ ~ current = i;6 h$ P% V$ d: p6 X& o enable();5 M, R6 f9 _+ t3 ~2 j }
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    13
    发表于 2003-10-24 18:02:00 | 只看该作者
    指点什么呢?效率?方法?还是编程格式?
    " u% g$ F8 x3 U4 t给一篇代码给别人叫别人指点?我从来没有过。
    towny 该用户已被删除
    14
     楼主| 发表于 2003-10-24 21:48:00 | 只看该作者
    操!( C2 f# E( g0 R' ~
    搞什么脾气啊!一个斑竹有什么了不起的啊垃圾!!
    towny 该用户已被删除
    15
     楼主| 发表于 2003-10-24 21:58:00 | 只看该作者
    你要是不懂就让位!
    ! r( `+ N& Z' {7 i. i+ i别占着茅坑不拉屎!
    6 o0 x0 E; A8 T  |
  • 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 | 只看该作者
    完成了你们看吧! 1 D- a! n, g- Q- K- L: j , \" }) m; \' P$ V3 T2 C0 ~: b#include ( k+ O- R, j Z4 y/ l0 B( N( q #include ; o- Z& ]5 Y7 {* u+ `9 U #include / s( J/ e9 I& V7 e: T9 Z6 W. E; d #define GET_INDOS 0x34 # `2 x3 }, G( d' O2 H) u" q#define GET_CRIT_ERR 0x5d061 Q f' s& e9 W #define FINISHED 0 ' I( Y1 i3 @- I2 C+ `* G$ s' g#define RUNNING 1 5 `+ S/ r; H) i$ w#define READY 25 i9 p6 K t7 P' _' Q$ _! \ #define BLOCKED 3' C: H3 i6 O) b& M #define Ntcb 8/ N P- X( s9 E* S$ Z3 L, j+ A! j #define TL 1& l; A H" D3 ~; L3 f5 } N( q. } struct tcb{6 W( V8 r1 A; a unsigned int * stack;/*堆栈的起始地址*/ O. Z% o0 u* L9 u# y unsigned ss; /*堆栈段址*/- G% ^# Y3 f$ H; w2 k8 ?$ t/ u unsigned sp; /*堆栈指针址*/8 U. {. J- P; ]& C char state; /*进程状态*/ L7 u* ?' W" b/ S% D# | char name[10];/*线程的外部标识符*/7 Y! k9 k5 V7 K* D# G }tcb[Ntcb]; /* 系统允许最多的任务数 */ + f E0 Q- S$ X4 vint timecount=0;& R: c0 H9 s) Z( o+ Q char far *indos_ptr=0;3 t" O8 B) P% r9 Y, j char far *crit_err_ptr=0; $ [/ ^' M* O3 ~, {) N4 v5 Iint num=0,current=0,i; * v- v- |+ C; y) C% U9 e) ^, ivoid over();8 H4 q; Q R o" d7 Z typedef int (far*codeptr)(void); 7 q i* r8 [' h6 e* {/ o7 Kint create(char *name ,codeptr code ,int stacklen)7 ~" t% H+ s& Q, s; }3 x- z, J {5 b+ @# b; Z- W& { L! W+ k/ y unsigned int * s; e: L, C. {" s& enum++;) z }( d* |# ?; n" j* y/ t" s tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); $ {$ V- T5 [& j: q- m" L tcb[num].state = READY; : ^! y8 [8 `! I$ a# ?, E* `2 r, j4 O' O strcpy( tcb[num].name ,name);) C6 F: b8 ~. k& _ tcb[num].ss = FP_SEG(tcb[num].stack);' E ~% ~, {. u tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14); Q0 `" [- K- m *(tcb[num].stack+stacklen-1) = FP_SEG(over); $ U) @) }. ]+ w! Z *(tcb[num].stack+stacklen-2) = FP_OFF(over); * ?% t/ A' c- C *(tcb[num].stack+stacklen-3) = 0x200;* ]- D+ h8 [0 X3 Y5 A, l; B. A9 ` *(tcb[num].stack+stacklen-4) = FP_SEG(code); # ?7 J1 A" @* y+ Y+ b *(tcb[num].stack+stacklen-5) = FP_OFF(code); * [& E. t+ I9 _( w1 {5 Q0 W *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);# q! O* V1 R2 C# X! O2 a *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack); : j, d* ~& S$ z; L0 {% O. k return num; 9 m# R+ P- V" m} ; 6 _; `! e4 [2 X* E& cvoid interrupt (* old_int8)(void); 8 R; H5 n; T4 r9 _( d/ {0 Avoid interrupt new_int8(void)( L( a( p# }8 \2 C" A {/ Q& K6 R* N1 k, c (*old_int8)();8 O7 C$ |" s: s0 d) h. E timecount++;" A8 o9 p1 a! R) }- C! v if(timecount>=TL);& |3 u1 b4 X& p7 y7 H" E# v% b if(!DosBusy()) q& ^3 |( y( P* t! @ { S* s. u9 c/ i4 }6 j3 f disable(); 3 \) V! U, U8 O8 f/ g3 r$ r tcb[current].ss=_SS; 3 a% ~8 Y# ]* I: ^ tcb[current].sp=_SP;7 Q4 ?' z% q, a6 d4 K if(tcb[current].state==RUNNING)8 Q- q" P& J) V' _/ Y- _4 T tcb[current].state=READY;( M' O1 k8 R; k# O4 B7 a7 q current=3-current; 6 _ r9 u( t" n' y; sif(tcb[current].state==READY)! {- p' \ r; [0 ] f { _SS=tcb[current].ss;4 A# s+ t) }+ C/ \# m _SP=tcb[current].sp;7 n! a5 m5 p) z2 o0 [ tcb[current].state=RUNNING;! l8 R( ~- C$ r9 [4 a' \* ` ?! E timecount=0; 7 g3 C. g/ h4 z! u9 J enable();! P) n# R7 U& C6 s8 R& \, u } 3 p; O$ @5 I4 M. h. x}( H1 b3 `% I7 v' ~& B };* ^2 T' p2 ]% k& ]) ~6 m void tcb_state()1 f4 f% U) c9 K/ r& C {% ^5 Y- B6 k2 O) u3 W* h int i;$ P$ x% p; O) d E8 H: [4 H% @ for(i=1;i<=num;i++) ) r2 i( @5 l* p1 M& J* s e/ ]& C$ i printf("Thread %s is %d ",tcb.name,tcb.state); / Y" |+ F& B& \ {+ {) A}; " E! A' U m+ D7 hint all_finished()+ ?9 g6 o7 F) Y8 k1 O {& Q }! W5 |6 n& ]% @ t2 I8 y int i;* e$ D# z# o, G+ ?( q4 h4 b for(i=1;i<=num;i++) ( i: q* W; D: j; y* @8 f if (tcb.state!=FINISHED) ; z8 z# t3 E0 w5 Y" [/ a/ v: P return 0;6 o# x4 R, [" ~! G) ]" K return 1; 7 Z* W8 Q8 K- P 5 M% \" p& y$ q3 j' `6 o- w};$ s" v, l0 a, ]% _+ c- ]& { void interrupt swtch(void) 6 Y! M% F+ g$ i: _( L. _9 M! ~{ / l' p( E# d2 U0 r) T/ cint i;9 i- q1 ]3 d: W Q disable();' T% a4 m2 i: R! u% F6 c tcb[current].ss=_SS;$ Z6 L) b) K$ `1 Y3 i& J- b7 h. N tcb[current].sp=_SP;/ y- X3 x4 o) W; B, | if(tcb[current].state==RUNNING) 7 A, t M4 ~8 a tcb[current].state=READY;& \) t- g' T& S9 u2 s# l for( i= current+1 ; i <= num;i++) ; d/ Y- `- Z+ N9 ] { if(tcb.state == READY ) ) e1 A+ a4 z# m- X1 s goto excute; . H) E/ D V( _& r8 T3 }( t } * Q- k e' w/ [9 t for( i = 1 ; i <= current ; i++) * x% @5 [/ z0 D' w7 y { if(tcb.state == READY)1 d1 |( t# _; ~; ? goto excute;; R1 I* K' O/ j0 J! V7 j0 U( [$ n } 1 S9 v2 m* z2 B! _+ w C4 a2 U i = 0 ;! c$ U2 N) G- [' ?, w9 e excute:! w3 @8 O" B5 w' K% Z) h% N _SS = tcb.ss;# t/ k1 E- f+ A7 P# k! ^( { _SP = tcb.sp;/ Y6 R. ]* Q0 [8 Z, B5 p% D tcb.state = RUNNING;* k! Q0 r$ i, ?( w3 E9 k5 }/ _ current = i; , A4 u$ [9 `' a, N, ? enable();5 v/ J, p$ K8 B: Q; f1 h }& U! b8 d6 Y! A+ V/ f0 q% o8 C /*-------------------------------------------------------------------------*/ 0 F* {, k4 D* t7 I. y6 d- e$ _void over()7 |. N% T+ k+ \- y, N3 e {/ d% Z9 z: q& B, O+ D. J int i=current;( ?* ~" ?' Q. W% c2 q0 ` /*strcpy(tcb[current].name,'\0');*/ `+ s! _$ A1 x% C0 n tcb[current].state=FINISHED;1 E+ y( |! N6 n) B9 O: A swtch();% J) @- d! j# x+ c* D. w+ S free(tcb.stack); ) ^8 p7 n3 n; p2 y6 w% V}; ( f& c& q" N1 \/*---------------------------------------------------*/ 7 c4 G) j# h1 ?- X2 c* wvoid InitInDos(void)* J) k# h9 U4 Y" h( e* R8 s' V {% z- Z" o: C9 j$ k/ x0 R union REGS regs; , n+ M) [) Y' R$ j# h& | struct SREGS segregs;3 D/ p' P! j& T6 H! r: R/ Q( E) e /* get the address to INDOS flag*/ $ q2 X. {; n4 c7 {6 i- J2 F regs.h.ah=GET_INDOS; Y3 B$ m1 w7 M2 F) B, ` intdosx(®s,®s,&segregs);9 W" X e( J; T indos_ptr=MK_FP(segregs.es,regs.x.bx);$ W% {$ y- l& M$ N2 c I/ ^ /*get the address to CRIT_ERR flag*/: x0 \! r( q) Q0 C if(_osmajor<3)2 u; u" F/ A% ?4 a1 q crit_err_ptr=indos_ptr+1; : k: p! E" g- d3 [5 F) r else if (_osmajor==3&&_osminor==0) / E0 v: c9 l' |& S9 w+ r crit_err_ptr=indos_ptr-1; R3 O5 f3 U1 M# S# t) K else# P b2 k% h- M4 B% b { R) t8 K2 A8 Q. c regs.x.ax=GET_CRIT_ERR; ; h5 m3 D5 }8 ~, }) q w intdosx(®s,®s,&segregs);% y8 L% k" J' |6 [% q U crit_err_ptr=MK_FP(segregs.ds,regs.x.si);" S' H! f% {3 P) s9 q } - Q. |8 f, i* X: C' m}; & L3 b3 Y- Q: q' Wint DosBusy(void) 2 h; `" p: }4 n3 i! e' C6 `0 Z# T{ $ S- v: ]2 k+ T* U6 l if(indos_ptr&&crit_err_ptr)# e* w' G D" z' v return(*indos_ptr&&*crit_err_ptr);9 x# v$ h) t0 s, C5 X- v4 Y else : D0 {$ u! P7 w: k3 ^ return( -1); 3 |( `2 J" R5 D( y- H' j% i}; & E) _" g8 N7 y8 J& p3 ~& w. _' x' lvoid f1(void)' g5 W# b: T1 P* q7 m { 9 ~4 j) t; G3 q6 }; e( L9 ?0 _ int i,j,k;$ D+ ?2 T( |2 Q& S! e; D for(i=0;i<40;i++)4 O+ R! a& J5 A, D5 e { ( K; _* d% @. l0 w$ \ putchar('a');) K" B4 }* y2 L1 @ ' G& `5 o* `; L, d. `: y( O for(j=0;j<1000;j++) 6 N4 }- o+ @3 ~- k ? for(k=0;k<100;k++)) e. f4 Z* D+ F6 v, f* `2 f z9 F ; , o4 M/ V+ g1 Q" X1 z }% \# l x3 A; s) a+ h$ V: b( R }; j! }5 {. |! L% x8 ^! J$ q void f2(void) - J- Y. \' {; b# I# |. x2 L/ }5 P3 I{ ' l j+ |9 J M6 |4 [ int i,j,k;, S! D# z" [: ^8 ~* r for(i=0;i<30;i++) * A# d8 Q0 [% k$ K { 0 ~3 {+ t7 m5 Z putchar('b'); : T. J, Q1 m* h5 X( H3 Q7 Z0 E) j for(j=0;j<1000;j++); N Z- R* S( f1 k# R& J for(k=0;k<50;k++) 1 a4 Z' t6 D) r ;* }! b% v, \8 F" t1 X( A* j }. \6 k. O/ ?# r% j# ~9 v: U };6 i9 x/ i8 {0 k9 o# }! U3 G /*------------------------------------------*/5 _7 x+ s# w" ^$ L% n# J* c7 J4 b main() . ^5 Q+ C0 Y- D) B& Y4 o{ ; i5 O" e- c9 {% Z2 ?' m9 v9 c InitInDos();, v& K5 Q7 v; r/ r' D2 m old_int8=getvect(8); " n+ s5 @" l7 }- ~ A strcpy(tcb[0].name,"main"); 5 g7 N7 m* u4 y tcb[0].state=RUNNING; * e0 G; ?2 p) u/ ~9 i- H( |! s current=0; ) @4 l7 c2 N/ n/ g create("f1",(codeptr) f1,1024); * E' S" y( {6 q# n! r! L6 \ i create("f2",(codeptr) f2,1024); 5 q9 C) C1 @+ v( { tcb_state();$ I; k, N- s9 W7 ?( J+ } setvect(8,new_int8); 7 G' }8 o$ `6 g8 M9 I4 i- K swtch(); 8 c8 _" ?/ d' N while(!all_finished()); 7 v& x: {9 i5 d$ S, g strcpy(tcb[0].name,'\0'); W2 D, T" w; d% `& l* R* M tcb[0].state=FINISHED; + O' j* Z4 a8 S8 L; U setvect(8,old_int8); 8 C( o3 `; I% e9 ~9 M4 g tcb_state(); & g+ `6 W& a$ C. d o printf("\n Multi_task system terminanted.\n"); : F; ]. v0 W/ X3 H+ q; n; s0 K& P};
    towny 该用户已被删除
    20
     楼主| 发表于 2003-10-27 11:58:00 | 只看该作者
    我不想灌水,也根本不想在这样的版块浪费时间!!

    本版积分规则

    关闭

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

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