下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]
towny 该用户已被删除
跳转到指定楼层
1
发表于 2003-10-20 12:59:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
create()  创建一个进程( v' Q- r. H: d" _, J9 Z
要求:1 用c语言编写
& S$ y; h0 Q; E* @: ]# ]* Y         2 程序+PCB(ID的内外优先权,申请资源)& v  ^' F' b1 O9 _+ n
只需做进程中”产生“这一步。8 s5 T8 j9 V2 S: ~. W2 g% j
以下是做了3分之1的范例:
/ l+ q0 x9 {# O* R! n#include "stdio.h"
4 q  K, [  T' w#define running 1 /*用running 表示进程处于运行态*/
! W8 o$ E$ w' `/ ?" A#define aready 2 /*用aready表示进程处于就绪态*/ 8 w4 E5 @) F. i5 ~8 M, }) o
#define blocking 3 /*用blocking表示进程处于等待态*/
: o/ c  h; n, h#define sometime 5 /*用sometime 表示时间片大小*/ 3 g6 t& y& N6 N
#define n 10 /* 假定系统允许进程个数为10 */
( P% F( q5 l$ v2 p  n" T. ?: n' S3 |! g4 {! B5 E  i
struct 1 U5 m0 t, P* e$ @4 I
{
2 S) A0 H* f/ I, u9 X$ N- fint name; /*进程标识符*/ : R0 a- f  ?( X+ b1 X
int status; /*进程状态*/
0 C2 g5 r/ w; {, \9 F- L7 N6 q/ l7 cint ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/ " P: t$ D* n& [: g% D
int pc; /*进程现场信息,程序计数器内容*/ : K" ^5 ^# ]1 j
int psw; /*进程现场信息,程序状态字寄存器内容*/
+ b# O; d4 k3 `# I( l7 fint next; /*下一个进程控制块的位置*/
% @8 m+ ~9 @/ R}pcbarea[n]; /*定义模拟进程控制块区域的数组*/
, X" B* y4 Z9 \5 f2 L1 a
3 |* I* ?/ M5 T, C; e" Cint PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/ . E$ m% D3 K$ Z2 V: e' y& w

5 b& t# P# E) Q9 Kint run; /*定义指向正在运行进程的进程控制块的指针*/ 2 E' i" A/ G1 b2 Z+ u- X
struct 3 @' E% m( @5 e& p( I
{
" E! y5 Q( e4 G  ?* e# xint head; + }# ~7 k6 J% T
int tail; " C+ B& o( r( ^* j  M4 q; p
}ready; /*定义指向就绪队列的头指针head和尾指针tail*/ ) D! Y4 |# M) m+ [# ^
int block; /*定义指向等待队列的指针*/
) t/ l7 y6 m2 N4 c5 b8 \+ v2 O, Eint pfree; /*定义指向空闲进程控制块队列的指针*/) g( y/ N- G0 U: G- p; d' m. A

1 y: t( x0 L) e2 a3 D麻烦各位高手了,望帮忙解决一下,急啊!~~!!!!![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 | 只看该作者
    我的脑子都快调得暴了,能写个大至的,让我自己调吗?
    + J, C' `- W) t( f麻烦各位高手了!!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    4
    发表于 2003-10-20 22:40:00 | 只看该作者
    你给的头部定义的几个队列指针看的出来你是想写一个 链接方式 的进程队列,由于给得太粗糙和简单,我尝试了一下,反而觉得很不好写,想考虑的一些东西你的结构里没有,而考虑进去发现弄的复杂了就写不完了,所以很难办,结果还是没有写下去,给你我开始的一点筐架吧。
    - U" b2 h7 H3 Y4 v2 L- Q) \/* the main site file */& x6 d, h. k! W' `# O
    CreatePro(&ID){
    # K8 [2 z( R$ Y( D6 g: ^# C6 E4 |' X2 [  GetFreePcb(&ID);  //申请一个空闲的PCB,并为其命名一个标识ID;3 A( n% f  C$ x. [5 W" C
      InitResour(&ID) ;//为该进程分配资源(内存空间和工作区);# @8 z( u5 T  `* n- ]( |- F  O
    /*初始化参数*/- y" \5 m6 |' |) Y! \1 |
       CallName(&ID);   //命名进程的外部名
    " Y. J1 w" r8 b; Q  SetParProStat(&ID);  //记录父进程的ID和CPU的状态、
    ) K, ^7 A7 `9 l% Z! D$ C* c& l  SetFL();  //优先级数、
    - P4 W  _1 L# L6 o, u  SetHeap();  //进程起始地址、! G! ~1 O: f- a2 i  p1 @
      _SetSelfStat();  //设置进程的状态为就绪态
    - g% A" s; Y% P  j. A4 @7 H/ h  AddStat_Read(); //将该进程加入到就绪队列中。
      ~2 n3 S5 a0 U# y" }! [5 b! B6 \.4 N; N6 B5 w# q( _
    ./ h8 g+ O$ O1 ?
    .
    0 b7 x( D. F2 `" Z2 g.
    0 Q$ r) g+ |) s7 ]}
    " L! M5 M, p3 a: O" n" |我觉得上面至少要考虑的,但是实在很懒了,对你也许一点用没有,不好意思
    ' N, Y# z. m# Q/ o/ y0 N$ s; n
    towny 该用户已被删除
    5
     楼主| 发表于 2003-10-21 12:04:00 | 只看该作者
    呵呵!!
    . x4 w% Y+ I  W) B谢谢斑竹的高见!!
    towny 该用户已被删除
    6
     楼主| 发表于 2003-10-21 12:18:00 | 只看该作者
    这是我自己做的一个版本,望斑竹给予指点!!!谢谢 9 X E! E% Y2 }( b& K* V5 Q( I& V( X; o1 K$ Y+ R: K* B( ~9 h #include- J5 q2 N3 J% q9 q* Z #include + j/ J1 w7 d8 ^& c#include8 m4 ~8 o/ i( p #include / X6 k" ~; G$ ?; ^) E9 D#define running 1 /*用running 表示进程处于运行态*/ ( f, f% G! t7 q8 v#define aready 2 /*用aready表示进程处于就绪态*/% ?' R+ h/ G0 |1 A8 @2 Y #define blocking 3 /*用blocking表示进程处于等待态*// N; m$ j: X: L: J #define sometime 5 /*用sometime 表示时间片大小*/; K" J5 ?+ P& b" @) q #define n 10 /* 假定系统允许进程个数为10 */ / o5 ~3 q% q9 s0 N2 I- J6 ?struct . _9 g6 B- z% e2 k: a{ 0 a! e. u; |7 R- g1 ?1 Fint name; /*进程标识符*/$ O( x! v+ }" L" Q5 C0 v: t int status; /*进程状态*/$ ]$ N6 f7 X: ]2 D& @0 @3 l6 n5 S int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/ 7 V3 n9 I0 R6 n3 _. H6 Q3 j" X. bint pc; /*进程现场信息,程序计数器内容*/& V, t+ |& M$ m/ m' D# `5 {- C int psw; /*进程现场信息,程序状态字寄存器内容*/' B- H# {$ c. S+ c4 V, B int next; /*下一个进程控制块的位置*/ - C: J3 ^6 H6 d; p}pcbarea[n]; /*定义模拟进程控制块区域的数组*/ 0 H& ?+ C' N Q) j+ jint PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/ + l: ^1 x# R, B) gint run; /*定义指向正在运行进程的进程控制块的指针*/ * N* o7 ~( V+ F3 W, Ostruct8 ~: {4 k4 y1 ?# r4 _3 N% K/ D {' \3 K/ r4 |0 i7 }- K9 F& r7 d int head; $ N5 p1 B& v/ Q0 u; Qint tail;+ E; m& k5 W; I% X5 H }ready; /*定义指向就绪队列的头指针head和尾指针tail*/ 5 v& Y3 u# B, Q8 aint block; /*定义指向等待队列的指针*/2 [3 O" s. o5 E int pfree; /*定义指向空闲进程控制块队列的指针*/" e4 N+ P A& H: Q+ A6 q main() ; v" ]2 d0 U+ \( O# K1 m! ~8 h: r{ int gdriver=DETECT,gmode;9 e2 @/ Z' d* X/ Y, k$ v int i,x,y; 2 }0 D& h- k* b- h; D for(i=1;i<=n;i++)! c5 ^9 G/ r0 V5 K# }5 M {ready.head=pcbarea.next;} / p2 U$ c7 g/ E/ r: {. { initgraph(&gdriver,&gmode,""); 2 F% _: y: X# ]4 F setcolor(YELLOW);- z3 a" C3 x: w3 m) n1 f for(i=1;i<=4;i++) & @% L% X3 o3 D& b: f: Q { setfillstyle(8,i); * ]" X+ m/ [8 G0 u' \2 [5 ` circle(284+13*i,190,6);/ K6 x# W5 L/ S0 } floodfill(284+13*i,190,YELLOW);, U9 d, u1 k: l$ Y9 T2 J } 3 ^3 D! r% d; v$ ? setlinestyle(0,0,3); / O7 J* i4 U4 Z. J; r& K circle(316,190,25); % j1 z* L7 p3 i. A P setcolor(5);# L! ^, b% ?# { settextstyle(3,0,4); A: V) q- q3 X! O outtextxy(35,311,"press any key to create objects!");0 p6 J7 y& }2 J1 _2 p getch(); " O( Y" t0 B% | B setcolor(YELLOW); 8 v0 ~9 e2 c$ R( \5 i1 u line(300,215,290,235); & _0 y# l/ q, w# T line(323,215,333,235); + Q+ `! }0 z" t3 y: s- B& n delay(50000); * W5 n2 r1 z- n0 @0 B3 [ setlinestyle(0,0,1); 2 N7 B- r' d( h1 N# s for(x=1;x<=2;x++) $ _, k& h6 q* A* z7 {9 R {setfillstyle(8,x); * u1 e5 N8 i! V6 q circle(267+13*x,246,6);5 p3 Q- R- Z ~. [. ? floodfill(267+13*x,246,YELLOW);; ~0 q6 M- ?* ?0 G6 P: \5 H% s } " K: I; W2 R9 T3 P for(y=3;y<=4;y++)5 S- n/ h$ V6 j- O {setfillstyle(8,y); ( }7 r: b- @8 B circle(285+13*y,246,6); . }; z& h9 c' m( S floodfill(285+13*y,246,YELLOW);+ c* M, @9 @2 W } 5 i& e2 w: W" \# t* E setlinestyle(0,0,3);, U7 O$ Q$ x' D" F, ] circle(287,246,14); , ]0 D9 i; \, M6 b setlinestyle(0,0,3);5 q; @; }& v& Q circle(330,246,14);* j+ W k0 C- E; a0 e2 |" m8 U delay(50000);& e6 K2 Z4 @; u% h6 D line(281,260,281,280);' W! W7 Y+ r1 ^6 n) }. }8 U line(293,260,293,280);$ G& |+ M; r7 N1 A" o E, O8 u line(322,260,322,280); * `" e& y: C R line(333,260,333,280); . n& h$ Z( f# @7 X: N9 [ delay(50000); % M, j5 o9 c, C' x" b setlinestyle(0,0,1); 2 H4 @5 |7 K/ L6 n3 _0 } setfillstyle(8,1);$ }6 N8 g* T/ u# y* Q circle(281,286,6);) ?8 Y( E1 ^- O6 Q5 C1 j3 Y floodfill(281,286,YELLOW); " h6 p% I0 ?, X setfillstyle(8,2); _1 `; a, @) {0 C, K. H9 ~ circle(293,286,6);8 t: I2 C1 D) v/ d v floodfill(293,286,YELLOW); , R: z8 _! x5 @ setfillstyle(8,3);- `6 f" }+ Z; C circle(322,286,6);+ k! T. o8 Y. O, m8 c7 q floodfill(322,286,YELLOW);; K3 S7 i/ z6 C: B$ l setfillstyle(8,4);8 W4 r' N k, m( b, W* C circle(333,286,6); . D' x+ U7 r( p' j/ D; q% h floodfill(333,286,YELLOW); / T4 F e4 S; K, \; h8 u+ N getch();+ ]( V& f5 o8 K% X7 C$ a closegraph();4 u0 w4 e+ u9 m' y6 i! l } ' [# h$ @8 q+ s2 q: q2 D* S* ?4 Q4 r* G/ W, d% ` ) D* f, r, T7 c$ V, [3 ]' U
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    7
    发表于 2003-10-21 18:58:00 | 只看该作者
    你在搞那么多画图干什么?你不是要做进程的创建吗??6 O  h3 j3 _) y3 W
    难道不是《操作系统》的‘进程’那一章进程创建??
    # I# a- ~8 F$ _# n到底是要个什么效果??糊涂了
    towny 该用户已被删除
    8
     楼主| 发表于 2003-10-21 20:34:00 | 只看该作者
    手误贴错了!
    6 q. h) `. c2 R: S7 X' t' F* 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 | 只看该作者
    做了一半的半成品望斑竹指点!!5 ^. G2 R; S8 O 1 o/ M0 `3 `7 r. [9 Lint timecount=0;. P2 W+ A" r% e5 R F; r$ N char far *indos_ptr=0;/ }- B; E$ Y5 V" t3 {- b char far *crit_err_ptr=0;/ @- A! A6 [; j! t: v% A5 D- K: ~, y int num=0,current=0,i;0 t3 ]( h% o1 w; a5 G) R void over(); 6 i) T9 @. Z' u! ntypedef int (far*codeptr)(void); N' d" z K7 B- E, l int create(char *name ,codeptr code ,int stacklen) 2 h' ]! G9 |$ v8 @' C2 s{ / Y3 Z! c2 A+ t c, A3 |unsigned int * s; & u2 X: r: ~- W+ l- C( K$ G# Bnum++;2 r. N7 T( s% g3 [8 r9 k0 b) [8 n. o, T tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); " H& x' @; K2 s7 n0 M9 s/ c tcb[num].state = READY; ) U" n# W7 V3 ?$ c strcpy( tcb[num].name ,name); 0 C0 D( Z: s2 g! u6 t5 r* @# ] tcb[num].ss = FP_SEG(tcb[num].stack); ) X/ m! w( Z/ f8 j' @9 ]* j! Y3 I/ v tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14);: C8 L/ r f" \( @" d *(tcb[num].stack+stacklen-1) = FP_SEG(over);/ L* a$ Z! L9 \ *(tcb[num].stack+stacklen-2) = FP_OFF(over);2 U h! u7 J. K+ m. P( K" m! `0 d *(tcb[num].stack+stacklen-3) = 0x200; 9 R; S: q/ H6 Q0 i- M5 I' |4 Z *(tcb[num].stack+stacklen-4) = FP_SEG(code);: i6 r Y9 B6 F8 O& j *(tcb[num].stack+stacklen-5) = FP_OFF(code); - V/ K7 [7 g/ u% b6 H" T" z *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack); , H7 X+ o, h& x; k0 V *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack);7 K- h( U! [9 z7 C# _& u( Q$ d return num;8 }( Y: K) { n; }/ t } ; 6 o' h" l% k) F1 J! Avoid interrupt (* old_int8)(void); / `+ K7 Y0 s3 r8 s" O8 }0 w0 vvoid interrupt new_int8(void)/ `6 |& o! {$ G2 |. w+ u { ) \ i6 O; r S% u- s (*old_int8)();2 M( l% G5 K6 M! a$ G7 s timecount++; : t W, R3 [: {& }. u a9 O if(timecount>=TL); 7 ~8 U7 I7 z8 N( t3 P u9 g+ G y if(!DosBusy()) 8 ^9 Y! k/ A9 Z( e6 O& y- v1 \ {' U/ K8 b5 S/ g disable(); * D- z9 Z/ V' \& ? tcb[current].ss=_SS; - Q5 b8 E9 `# x% O4 p tcb[current].sp=_SP;. a; n* f6 W0 t0 s( z if(tcb[current].state==RUNNING)% G" M) P2 O) J# ^ tcb[current].state=READY; 4 R2 x1 X5 K( q% W current=3-current;8 O. D+ h7 H% e6 P J+ l5 h if(tcb[current].state==READY)5 T" @' {2 q8 h6 l { _SS=tcb[current].ss;8 y" q" r8 G, v, Q/ r4 R0 | _SP=tcb[current].sp;8 H1 V1 Z; ` h# S5 t; O* \/ l( u tcb[current].state=RUNNING;! v9 {4 S" \2 M2 Q( R timecount=0; 0 @$ o8 Z. I6 h enable();+ j( Y, `! k2 g, R7 C } * r' a) |9 M6 f1 ~8 @! G/ n+ {+ ^}7 |' Z# B" j. ^7 H% W9 t/ [ };$ T0 {, A/ `- n. f void tcb_state() z) ]( z* v9 C4 T# D+ Z1 E { 4 [5 k9 P9 [% O% T4 c0 O& U int i;! j+ y/ Z. q1 m9 [ for(i=1;i<=num;i++) * e0 P; X/ W, S& O8 j3 A' f9 Q printf("Thread %s is %d ",tcb.name,tcb.state);4 e9 d8 |+ w5 m, f0 r2 s h5 Q };" k, o% P8 R8 r5 F0 }4 A. K6 R( e int all_finished() U2 O, Q, |, W; z5 ]{9 z7 y' c9 ~2 V9 Q int i;, b% c6 p; @5 b' ]$ h for(i=1;i<=num;i++) 6 d; F4 o- }6 t4 J0 t if (tcb.state!=FINISHED)) {# ^; m9 p0 a* n1 w: O9 M return 0; ! p; `6 J1 \: V& H2 t, h2 B return 1;( ]. s8 @ q+ g1 V- @! p4 A4 N0 C5 b 6 Y. P, j" q8 H9 |( u, W9 L}; 6 r7 F* j0 N1 _" l+ Cvoid interrupt swtch(void) 1 _) C" M! c# A( x{! D' k6 L% f0 e/ m- b+ x int i;; Y' J4 \/ V4 L+ L7 U a disable();+ ?$ l9 [; u! o4 x' m. B tcb[current].ss=_SS; 1 H( l R, J' B2 D tcb[current].sp=_SP;; n& x5 j8 m' u5 [/ t if(tcb[current].state==RUNNING) 3 u0 Y4 z" w. e tcb[current].state=READY;% H, j1 E$ g8 W& l; \3 f# G for( i= current+1 ; i <= num;i++) 1 z. n4 R; r! L) b2 S) I- @# A { if(tcb.state == READY )+ @9 R2 R, e7 r4 \( q. a goto excute;+ e% U, h( p7 C6 M& r2 S } , x3 h9 l1 J4 ? G& y for( i = 1 ; i <= current ; i++)6 E' i* W3 a& p) ^3 ^4 ]1 n4 {& f: {: i { if(tcb.state == READY) " u" `+ q# w) \ goto excute; K; s1 |9 M: W( \7 u }5 z( x; o/ {: n: f4 ^% I i = 0 ;' |3 p0 _' c+ r0 k j) H excute: % T3 V$ d) Y; E% C4 u _SS = tcb.ss;6 F; [' Y. n T0 P2 f3 X$ S( v _SP = tcb.sp; ! E' T) R- A$ ~$ P# E( j, W tcb.state = RUNNING;) I8 |! m" M; y% P& Q' K" y3 O5 k current = i; 9 R; m$ a* U3 d enable();8 e; o- q) y& h! \% t' ~5 t! H$ x }
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    13
    发表于 2003-10-24 18:02:00 | 只看该作者
    指点什么呢?效率?方法?还是编程格式?
    ; I6 [1 h% O8 c6 R! R2 y给一篇代码给别人叫别人指点?我从来没有过。
    towny 该用户已被删除
    14
     楼主| 发表于 2003-10-24 21:48:00 | 只看该作者
    操!1 Q% ?' s# V- v& c  ^/ P/ L; j, D
    搞什么脾气啊!一个斑竹有什么了不起的啊垃圾!!
    towny 该用户已被删除
    15
     楼主| 发表于 2003-10-24 21:58:00 | 只看该作者
    你要是不懂就让位!
    ' f. B" r$ c2 e1 ~( M别占着茅坑不拉屎!
    , }' C1 |5 ~6 ]
  • 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 | 只看该作者
    完成了你们看吧!3 Q* h# B! {( }0 e' K1 [1 v& H- _ 6 z. h8 ~+ L) q, `% Q# l#include + |( T/ n% e4 g$ z' u #include 0 c2 S( z6 ]9 D+ t: K8 r#include 2 g0 a8 Q, ?# R #define GET_INDOS 0x34 $ y* V+ r0 T2 o! N# n$ O#define GET_CRIT_ERR 0x5d06 & p3 q" N" h9 o! i4 P$ c4 R#define FINISHED 0, p0 R+ |: ?$ J3 T& x #define RUNNING 1& B* R8 b- K+ G. T( d. F #define READY 2& q# ^" D+ g4 Q9 K6 J1 x4 U# D #define BLOCKED 35 o+ [# g% U. a# d o' V) n6 O( j. v #define Ntcb 8 - Z2 d5 Y' T! G+ ^, B) ^- @9 |#define TL 11 s# l+ Z; Z2 X! g/ @ struct tcb{: w' N0 b+ M4 K' ~9 q) G unsigned int * stack;/*堆栈的起始地址*/ 4 m7 ]7 ?" Q) m' h0 o) l unsigned ss; /*堆栈段址*/# o* }8 _& q, k( K) K unsigned sp; /*堆栈指针址*/+ T v- W8 W3 k2 H) j* {0 Q! l char state; /*进程状态*/ $ T" c& R" X0 o) E/ J char name[10];/*线程的外部标识符*/ }: }* W) c9 R& W }tcb[Ntcb]; /* 系统允许最多的任务数 */ 9 l6 u k- J6 _3 mint timecount=0;2 M: {; g% a! E0 f' b! X4 E' K char far *indos_ptr=0;' x4 Z9 `0 C5 m1 T char far *crit_err_ptr=0; & i- N! y3 g4 |8 Xint num=0,current=0,i; # W# P: j, ]2 D" Y% }void over(); $ @; e: u* C* ^$ O. ]& U \2 r% qtypedef int (far*codeptr)(void);! A3 S1 y! D2 G" Y: K9 o int create(char *name ,codeptr code ,int stacklen) ) T3 X! W' z" s+ W0 O- x{' G5 ^. F- w) T# y/ b4 Y) B% P unsigned int * s;; H& q- E7 V+ Z6 B% ~ num++; ( C- J$ L. d( O0 jtcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); 0 @* B d8 d6 B, m tcb[num].state = READY; ! X$ Y9 L# W) ]9 `+ |; t strcpy( tcb[num].name ,name); 8 N) F2 y- g F! n7 x tcb[num].ss = FP_SEG(tcb[num].stack);6 I( d8 v6 u4 U! b, E0 A& u tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14);- Z) G9 L& F0 A3 A* e *(tcb[num].stack+stacklen-1) = FP_SEG(over);: Y. r5 i) N+ g *(tcb[num].stack+stacklen-2) = FP_OFF(over);2 D: |: U: C" a; r- n1 H6 K *(tcb[num].stack+stacklen-3) = 0x200; ( O5 K) X$ W$ q) d% a" \1 y *(tcb[num].stack+stacklen-4) = FP_SEG(code); ) r! P2 @/ ~+ Z) v *(tcb[num].stack+stacklen-5) = FP_OFF(code);- W4 i4 x \6 A$ }9 ^ *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);) U! n4 e' P& \4 x9 f *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack);; U$ C* L r0 v$ S$ B% c& _: f- T return num; : b8 W* d8 @4 s' R h( H% ?% d# I9 t8 V} ; . {0 \ W# s) ^+ \- ^- k9 Pvoid interrupt (* old_int8)(void); $ a5 Y( K8 K' T+ z( @* D1 _6 h void interrupt new_int8(void): U$ l$ Y/ M; b { # W6 l9 Q9 V& T: X) }$ s$ P: m1 T) M (*old_int8)();, `; V& Z+ g) J a& v0 k- V timecount++;9 q3 J6 Z, o) h+ s5 G if(timecount>=TL);- O1 X* ]1 y3 x( D/ t& V+ e, _ if(!DosBusy())% U, S9 k0 a2 L1 l n; ~& c {6 k* k+ p) [. l, H) A. [ disable(); : m- ~6 I. a" ?5 M' m0 x, K tcb[current].ss=_SS;0 n6 b& d$ w+ } tcb[current].sp=_SP; 8 \4 |' V+ p9 b8 A3 Z5 n- \3 g if(tcb[current].state==RUNNING) |5 l* z* R& b3 z1 z tcb[current].state=READY; : X7 u, S4 U0 W" W current=3-current; & v z" {. m! Aif(tcb[current].state==READY)4 D% X( y/ u, r/ L. h' s$ }1 Q { _SS=tcb[current].ss; / R. {7 i- l9 s( ~4 d' T/ p _SP=tcb[current].sp;; F+ X( ~! Y8 W tcb[current].state=RUNNING; 4 |. `% z# i6 V5 u0 [( o) B! d1 v/ P i4 R timecount=0; ( r! e9 W6 T3 s; M enable(); ; Z* P* m) H, r5 n}, ^3 y( C" g1 n4 l0 m } 6 Z* ^) g% u- }. c3 f, H};- L: V* p2 S' P# @+ G void tcb_state() # j p- \% S, }& z; }0 E{ ; V& ?1 Z! ^9 [. ]" [ int i; % m7 p r* n1 \: T1 T for(i=1;i<=num;i++)8 s) M A; i! q3 R$ }5 y4 l) |0 N printf("Thread %s is %d ",tcb.name,tcb.state);$ g! k! D- E. i } };* n; j- V8 H0 v0 C6 e4 k" R int all_finished() 0 Y- a6 {- J! t9 ?$ p2 a- V{, f7 T; C( w5 ^- k+ i3 [+ T int i;* H/ b0 ]; ?% O/ U) z, _ for(i=1;i<=num;i++) ) J6 g. H7 m% E if (tcb.state!=FINISHED) 6 r! s- H. H- Q6 ^ return 0;* J/ Z3 T& t1 ?' [. @- Z! P+ d9 ~ return 1;) U3 h0 j3 I3 r- { ( n- s$ d( @1 d" K( `8 t- z}; ( P j) I. x5 o3 j) b! b; g. \void interrupt swtch(void)4 x0 S' ] M7 m7 ? { 3 O; y0 `! E- N$ W7 F7 Eint i;* v* f5 D/ X0 d) Y* m disable(); . s9 k- `- B, [7 g% ]* L5 n. O tcb[current].ss=_SS; & E: P8 P% K j4 O tcb[current].sp=_SP; ! E/ C" S( N4 b6 _1 f6 U+ b if(tcb[current].state==RUNNING) * x7 ]7 R0 I" F1 Q' W/ l2 } tcb[current].state=READY;+ l- Y" |. V3 k# h4 ? for( i= current+1 ; i <= num;i++)# v* H! J' J/ J' C2 m { if(tcb.state == READY ) " T8 |! a% q3 h/ V) ^: t goto excute;/ l/ \ z0 _. s4 ^( i } # e/ t! B& H/ W$ A, D e# F for( i = 1 ; i <= current ; i++)3 {# _2 D4 S* l, u5 Q6 c7 S { if(tcb.state == READY) 3 s7 d3 F1 L( p: [, v( n( O' [/ ] goto excute;% H6 K$ R' Q; s8 ? } 0 Q+ ^+ D. @' S( ~' y i = 0 ;* {/ I9 R5 F8 U excute:8 X$ U; B8 v. z; L; o _SS = tcb.ss;, z; M& P6 L6 z) g6 S' F: e! V _SP = tcb.sp; 2 ]$ O( P8 M9 Y6 ?5 i! P5 [$ p tcb.state = RUNNING;, ]; O: v) N" v! ]6 p. i current = i; # z4 w1 o# a+ F0 O8 Y" b enable(); * P. _) W& P8 d} $ [- a1 r. U2 m7 P" a0 e: `/*-------------------------------------------------------------------------*/ ]$ V- \6 C, x: |6 l* P4 N: u- K void over() 4 V/ b: F% ]$ j7 H9 |; C6 L{ O y6 \% P8 v8 M h int i=current;9 o( B; v8 x& f1 d& N* L /*strcpy(tcb[current].name,'\0');*// V. r7 |, g1 w9 i9 s0 ?9 n8 l* Z) F tcb[current].state=FINISHED; ; n8 ], j: ~5 p5 F3 [' m) X1 T) s swtch(); / K/ Q3 Q2 H* g5 I0 l' ^ free(tcb.stack);6 L- X5 N) \+ D8 h' q; w1 d9 c8 Y }; ; Q. U. C. @' d8 \/*---------------------------------------------------*/ / I( l/ A3 @! L! [* z8 Ovoid InitInDos(void)4 `' X1 T# _2 c* p {) W4 L& ]' w7 Y8 J0 i) Y/ v( b+ }: O union REGS regs;8 Z# d3 c. V1 n2 a+ E- R+ X% d% G. ` struct SREGS segregs;* r2 z% \( g, N /* get the address to INDOS flag*/ 1 w3 M9 q2 j& x. m regs.h.ah=GET_INDOS; 3 g6 J, j; W4 k8 G8 \# H8 U) i intdosx(®s,®s,&segregs); ; w/ X* v# S, R indos_ptr=MK_FP(segregs.es,regs.x.bx); + N' H! P% x9 u7 q% y0 Y /*get the address to CRIT_ERR flag*/, t1 _# w' R3 x+ ? _( S if(_osmajor<3) ) r4 L* }+ t6 t& [. q crit_err_ptr=indos_ptr+1; ) S9 A2 i. x! P+ C. ^. h else if (_osmajor==3&&_osminor==0) ; B, S$ Z6 M/ {6 u9 v! [ crit_err_ptr=indos_ptr-1; 3 H+ H' c9 m2 @3 M+ b else/ [% B' w" Z* O2 n3 [6 x& f9 a8 L { : ^' B* e# G G% Y( i2 b regs.x.ax=GET_CRIT_ERR;2 l; ^2 k! ~2 [ intdosx(®s,®s,&segregs);1 l7 o5 F8 `/ m' n9 s5 } crit_err_ptr=MK_FP(segregs.ds,regs.x.si);6 W; E, g9 d; m- y0 e }+ z6 X7 ^$ [/ N8 _4 |: M }; - _, ^, c: |& ~( lint DosBusy(void)% @! @( \" r2 P) y2 ?) Q { : ]7 P' x3 X* x4 N if(indos_ptr&&crit_err_ptr)) v; @$ y8 m6 y6 T return(*indos_ptr&&*crit_err_ptr);# O$ a+ T# h, f+ o) C: a' G else) r7 ?7 ]- d; z" T return( -1); % s/ j3 N2 v( i! {( A) ]};. I' W2 d9 N0 F5 B8 } void f1(void) 2 ?9 Z5 m& D. _5 K, d) ]{ 5 y) O/ ?9 p! c. W( r8 H+ t int i,j,k; % a& E, {) A: `+ L% i; Y for(i=0;i<40;i++) 4 `. _9 z/ Y D5 r; e1 _6 H { - c7 H5 G- b& m% y& M putchar('a'); / ^: N, [) w( z0 T7 H/ M# H2 R8 [- D+ m: o for(j=0;j<1000;j++) , C m9 \* ~( f$ O! } for(k=0;k<100;k++) 6 Y5 p( w) R7 p9 T ;: }. G. Q3 {! I3 n }* R4 B, q! z. ~ };8 Q& Q7 n+ ~; u7 [1 E: | void f2(void) - k! I. a: Z% q! c9 v: o{ - ]' V* |; [2 _+ t# X* c int i,j,k; $ V% C, w. W( N& p2 a for(i=0;i<30;i++): U+ ?/ k- `' c7 g {! ?4 h' m% r. W |/ v putchar('b');* I# F4 X4 _/ q for(j=0;j<1000;j++)! M, G1 x( J6 ]& k0 j p6 Q/ U for(k=0;k<50;k++) 1 }( S c% H6 Q; V5 c ;( i8 Y& R& g0 M8 I* N' ] } $ F1 r% X( K' k! j};' i+ [0 ]. k* {- h4 S( J6 Z /*------------------------------------------*/) M. ~. @. @ T: w main(); g( ? u( o1 j3 a, I: f# _ {. p* ]4 G9 U8 ]! F& r InitInDos();5 q) f7 F5 K* s2 y* @ old_int8=getvect(8);) N) `3 u- A$ T L# O) h* g; U4 C strcpy(tcb[0].name,"main"); 3 w7 G6 J. o+ B% u+ E1 e tcb[0].state=RUNNING;# g k5 X5 C0 N, z( R3 J! b5 { current=0; 3 J, \5 b& m. Y* [ create("f1",(codeptr) f1,1024);* T4 t+ z6 I8 ~% l create("f2",(codeptr) f2,1024);4 ]+ O9 |4 F4 T6 C tcb_state();' j" ]. o5 b1 R! i! R$ L. r `, C+ |* @ setvect(8,new_int8); 7 U( B0 C. `5 x$ J; R; C swtch();/ l) S, i0 s; ~; ~6 J$ |% Q" E, I while(!all_finished()); _5 D* T6 c! B$ t strcpy(tcb[0].name,'\0'); : J7 @% s0 v" ? }2 B7 K tcb[0].state=FINISHED; - a3 e g% {5 c( L2 c( t2 H& _ setvect(8,old_int8);7 K2 z' t: D* t$ P, c7 @ tcb_state();" G' F$ X; f5 l& A, A) V { printf("\n Multi_task system terminanted.\n");. t) G# V2 t8 d' J6 C8 E };
    towny 该用户已被删除
    20
     楼主| 发表于 2003-10-27 11:58:00 | 只看该作者
    我不想灌水,也根本不想在这样的版块浪费时间!!

    本版积分规则

    关闭

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

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