下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]
towny 该用户已被删除
跳转到指定楼层
1
发表于 2003-10-20 12:59:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
create()  创建一个进程
) H: i( p/ d( s7 m9 n要求:1 用c语言编写- |0 Q/ P* H: Y) ~; Q
         2 程序+PCB(ID的内外优先权,申请资源)
  R; o9 P( l$ _- |只需做进程中”产生“这一步。; k! l1 [  p  H" w2 c% A! R
以下是做了3分之1的范例:  z: M# e- R% B5 ~9 M
#include "stdio.h" : @6 S; n! j- v+ t
#define running 1 /*用running 表示进程处于运行态*/ 0 G2 K. L; U, a
#define aready 2 /*用aready表示进程处于就绪态*/
3 N6 N  n% ?* c3 u# ~/ k9 [#define blocking 3 /*用blocking表示进程处于等待态*/
8 T1 B% w$ m/ C8 ?8 {# Z#define sometime 5 /*用sometime 表示时间片大小*/
1 A4 P# K6 }& B7 [0 p& j- w#define n 10 /* 假定系统允许进程个数为10 */
$ {' N1 P5 I  c2 ~+ J7 D0 R
4 N- W/ K: D0 qstruct
% N4 I0 Z2 K. S{
8 y1 N, ^7 p, f9 g3 t% v( K+ [int name; /*进程标识符*/
! H( c& s+ R2 t" h6 Jint status; /*进程状态*/ 1 b( {8 D, X5 F# K+ W
int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/ / |9 I8 C7 A& ]4 E) R
int pc; /*进程现场信息,程序计数器内容*/ 3 _0 d" w; {4 r; X
int psw; /*进程现场信息,程序状态字寄存器内容*/
$ ?/ q2 N: o: z. v& K7 qint next; /*下一个进程控制块的位置*/
/ M$ n$ k. z6 }) w3 O}pcbarea[n]; /*定义模拟进程控制块区域的数组*/ + Q0 [3 L8 j$ [, D* @# b( v
% e. h0 b; J7 P4 b
int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/
7 y$ a. L9 \! w7 U) d, R% s1 T( B1 ]! d- s1 y
int run; /*定义指向正在运行进程的进程控制块的指针*/
" c8 s' r! c' ~/ wstruct
$ j  S' v& F8 {  i" A8 I" [& \) Q{
) l  U2 L9 o/ v5 n  ~int head;
* \7 X, [+ c% q+ N0 t- x/ zint tail; 8 B7 l  p% q/ H8 R  P' E" d1 X
}ready; /*定义指向就绪队列的头指针head和尾指针tail*/
. e4 L) d; `( q0 lint block; /*定义指向等待队列的指针*/
4 m4 I8 L; A7 O9 s/ p7 `' Kint pfree; /*定义指向空闲进程控制块队列的指针*/( N5 F( \" g' f  S* A

; u5 M8 r+ n  h8 \! v% s& p0 X5 u麻烦各位高手了,望帮忙解决一下,急啊!~~!!!!![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 | 只看该作者
    我的脑子都快调得暴了,能写个大至的,让我自己调吗?( o3 O/ S( P2 B2 {' N
    麻烦各位高手了!!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    4
    发表于 2003-10-20 22:40:00 | 只看该作者
    你给的头部定义的几个队列指针看的出来你是想写一个 链接方式 的进程队列,由于给得太粗糙和简单,我尝试了一下,反而觉得很不好写,想考虑的一些东西你的结构里没有,而考虑进去发现弄的复杂了就写不完了,所以很难办,结果还是没有写下去,给你我开始的一点筐架吧。2 }% G! g9 B* x- p* a2 V
    /* the main site file */
    4 ~! \% E4 g" CCreatePro(&ID){
    $ e) j: s8 _2 ?  GetFreePcb(&ID);  //申请一个空闲的PCB,并为其命名一个标识ID;
    , M9 t! e# L, L9 A9 _$ p  InitResour(&ID) ;//为该进程分配资源(内存空间和工作区);
    4 `- c: q9 o7 N/ d3 w/*初始化参数*/
    ( `$ l) L4 z& ]' N* Y   CallName(&ID);   //命名进程的外部名6 h* i) ~7 H8 i: X  D3 E  c
      SetParProStat(&ID);  //记录父进程的ID和CPU的状态、
    ! V2 ?& v! O2 f5 }- N  SetFL();  //优先级数、
    ' h& i" {& ^2 S) P  SetHeap();  //进程起始地址、
    6 Q( }$ a$ Q1 y2 X1 p  _SetSelfStat();  //设置进程的状态为就绪态
    & V+ K, i6 c; r& I3 F  AddStat_Read(); //将该进程加入到就绪队列中。+ t( }& c& w7 j
    .
    # E1 Z$ C9 v% l' t* n5 ~.4 E0 T7 p; W* w" |% o+ B  t
    .
    ) j- j8 H- r6 B! W/ }.5 u  B$ H+ C6 Z1 D
    }+ i3 Z0 F/ n3 D  v/ h
    我觉得上面至少要考虑的,但是实在很懒了,对你也许一点用没有,不好意思
    ) y2 c" Q4 F7 @# o
    towny 该用户已被删除
    5
     楼主| 发表于 2003-10-21 12:04:00 | 只看该作者
    呵呵!!
    ( T' d4 r" f7 k' v7 C, d谢谢斑竹的高见!!
    towny 该用户已被删除
    6
     楼主| 发表于 2003-10-21 12:18:00 | 只看该作者
    这是我自己做的一个版本,望斑竹给予指点!!!谢谢 5 j a' @# j1 a' w! j* P 2 H7 i1 X( F& z! Q! s5 |" g1 a! g: r#include2 B; i% n# d; w* w$ |% ^) ~ #include7 x% y: S H) W6 Z) u4 o" C, R #include: ]( ]: d$ a5 j% _; o! U #include. F6 |) \0 [7 y% M$ C #define running 1 /*用running 表示进程处于运行态*/ 2 m3 T$ v6 U- J% C5 q' D% v#define aready 2 /*用aready表示进程处于就绪态*/ {! @" s9 V8 v9 ^, z5 p#define blocking 3 /*用blocking表示进程处于等待态*/2 b& e9 W* y2 i6 H #define sometime 5 /*用sometime 表示时间片大小*/6 S6 T; \: d/ u+ w' `2 [" W5 _ #define n 10 /* 假定系统允许进程个数为10 */ + |' w& j& O9 s; M0 }1 Xstruct+ A# j" N! Z0 _8 V& s* { { ) f: f) }+ f) P0 k) l7 J4 c% O, j4 gint name; /*进程标识符*/4 B9 P* O" o- Z int status; /*进程状态*/ , P9 Y9 i1 t& {: R* p5 s* G& F# o& yint ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/ - B# B/ y; T4 Y5 T0 Y- fint pc; /*进程现场信息,程序计数器内容*/3 R ?) s! D% Y( R* ^ int psw; /*进程现场信息,程序状态字寄存器内容*/: `9 X$ i ?1 B6 o( w( W5 X& r int next; /*下一个进程控制块的位置*/- @/ u; }1 M& i }pcbarea[n]; /*定义模拟进程控制块区域的数组*/7 F" n* B* z/ C, M5 U: l int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/ ( J. C7 l9 Q( q; s7 L* }9 D' _int run; /*定义指向正在运行进程的进程控制块的指针*/5 ~& c- o* |; X; X( p/ X' p struct5 z/ D/ u7 n( i+ W' [ {$ ^% m4 t8 d: M q int head; 1 g1 m, A# T Mint tail;: O7 q* r0 Z" q$ {! }' p }ready; /*定义指向就绪队列的头指针head和尾指针tail*/0 U7 x' l* i8 H1 k0 b. J int block; /*定义指向等待队列的指针*/0 ^2 v7 U4 K* R" q; ]# h$ g4 W& K int pfree; /*定义指向空闲进程控制块队列的指针*/9 q0 h- Q" O" o1 q6 ^) _ main()% ^& o% P8 z0 O4 W$ q! b { int gdriver=DETECT,gmode; l+ Q' }/ j' m8 X, l. B/ w8 R6 i int i,x,y;$ B2 p5 n" @: w" p' \, D0 f for(i=1;i<=n;i++)( ]6 _9 ]5 c) t3 {8 A [ {ready.head=pcbarea.next;} : l' i/ k# b- B c3 F3 ^( m initgraph(&gdriver,&gmode,""); + C7 G) l! ~2 n+ P' ? setcolor(YELLOW);2 l1 l! V$ X( I4 M' u' A for(i=1;i<=4;i++) " r3 J; m* y1 T! ?* ?) Q { setfillstyle(8,i); + W' w, H% x4 B- H( x1 j circle(284+13*i,190,6); / P3 g0 y! M+ I2 v- v1 q8 d: @/ m8 S floodfill(284+13*i,190,YELLOW); ! U9 l% s- X7 A }* p$ Y4 S2 d$ ?5 j) o setlinestyle(0,0,3);" ]* |% W1 C" H% u4 S7 h circle(316,190,25); 3 U. f( @, N4 k9 x! m setcolor(5);$ d- i7 [* R# c9 J( x- C% }& G settextstyle(3,0,4); ) |' @, a1 J- E7 n outtextxy(35,311,"press any key to create objects!"); 5 s; T1 Q C1 \, v8 A getch(); $ D" k6 G. H, s$ Q* P5 Q0 o; J# Q setcolor(YELLOW); 8 _( T+ g+ S: Q5 T line(300,215,290,235);# N! X1 ^# P* k4 J9 ~. F& ~ line(323,215,333,235);) s m% K& J! _$ p* |$ x delay(50000); 1 ]% n% Y0 q" n4 u7 | setlinestyle(0,0,1); / r ]" O( m1 Q- ~9 ?. ]2 a for(x=1;x<=2;x++) " F i( j7 p* f% S1 L! c {setfillstyle(8,x); # W! c$ N( Y; H circle(267+13*x,246,6);) e, l6 y# n l8 K& N' r4 B floodfill(267+13*x,246,YELLOW);. B4 d% G! a2 g X$ x o } 0 C+ e/ Z: n2 N6 ~% { for(y=3;y<=4;y++)+ C2 P5 J9 @" v3 W2 _+ B {setfillstyle(8,y); - t& S; x8 U6 K9 N circle(285+13*y,246,6);7 r: _+ z/ b, C, J floodfill(285+13*y,246,YELLOW); 0 u5 D+ H. j1 [/ S- ]9 i- a } . a# P) @: v3 U4 ~" y& \( A7 @ setlinestyle(0,0,3);6 L( t$ a" }$ m6 a7 Y0 U circle(287,246,14); # h/ s( D) t r% M. i- P8 O ~ setlinestyle(0,0,3);% ^; i& `5 h, x8 a1 h5 `5 |$ m circle(330,246,14);$ {" _ r' ]4 m P' B delay(50000);( U' ?. O _+ x+ L2 G! f0 f1 z line(281,260,281,280);; o9 h0 {" P7 J& L+ r- @! ] line(293,260,293,280); - W1 H+ q' v. F7 p line(322,260,322,280); 8 T" M# O3 n4 \( O1 }( H line(333,260,333,280); 7 {; H" B0 S4 W* U delay(50000); 7 k" [7 t! I& K, ~9 q setlinestyle(0,0,1); * g( W' @6 ~* ? s setfillstyle(8,1); # f2 Z5 a8 s) |# o circle(281,286,6); & J( h0 t, g9 v _3 O- R+ o floodfill(281,286,YELLOW); ' N9 g, ?! e( t setfillstyle(8,2);' ^5 c( b5 w, m- N0 T circle(293,286,6);# Y" M' e7 C. F5 [4 Z floodfill(293,286,YELLOW);, { P# y4 o S" F4 h$ V( q setfillstyle(8,3); / @8 P& ?9 }7 g7 U5 P0 F circle(322,286,6);; u9 g) G! U& k floodfill(322,286,YELLOW);6 P0 X% E8 w: z+ u/ A- v5 P setfillstyle(8,4); k! H7 _! x f circle(333,286,6);. b; N) F7 {0 L) H1 p; }: O floodfill(333,286,YELLOW); ! w4 ]! G9 Y: y) V' ^1 x2 s getch(); . E6 g# k# d O/ H closegraph();% ~( i$ n6 W# U& `. | } : T, ^6 |8 f, t- p6 ?$ s7 }( n/ F" t! }9 Z 7 m" z- [5 |9 v0 Y8 T 
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    7
    发表于 2003-10-21 18:58:00 | 只看该作者
    你在搞那么多画图干什么?你不是要做进程的创建吗??; E& A7 m# w  q7 S+ N
    难道不是《操作系统》的‘进程’那一章进程创建??' v7 K+ F, Y% C8 H" \2 w0 S
    到底是要个什么效果??糊涂了
    towny 该用户已被删除
    8
     楼主| 发表于 2003-10-21 20:34:00 | 只看该作者
    手误贴错了!
    5 |# c  K3 E+ T7 c) L9 B/ x! O不好意思!!
  • 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 | 只看该作者
    做了一半的半成品望斑竹指点!! + V. R" H/ c& D/ P1 Q- `8 q* u7 D; H int timecount=0; i& a& X0 P( Y+ _, e5 Echar far *indos_ptr=0; ) o2 ~ h4 i" F; U+ Y4 H5 Zchar far *crit_err_ptr=0;/ p- }% `6 t! X2 Q int num=0,current=0,i; # }. L# j; p' T2 ~% m2 \2 w I) ovoid over(); ! J: A7 Y6 K2 s- d n% u- V$ k' l; xtypedef int (far*codeptr)(void);2 b' C7 C' X& O2 t. l( q int create(char *name ,codeptr code ,int stacklen) " X6 [+ ?! X$ y# n{ : X8 `0 t! r# Z! }6 Y# ounsigned int * s;9 `( Y0 o" K3 U5 F num++;: `+ L5 y/ v B3 z$ J* U: S0 o7 R tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); 6 x) B( F; I4 p+ p' o tcb[num].state = READY; , y) v9 Q2 K% y) Y0 J% D strcpy( tcb[num].name ,name);1 j4 x! E0 D* a4 n0 k tcb[num].ss = FP_SEG(tcb[num].stack);8 H# w& a) c6 ?, A4 a/ h tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14);, g& A( X: T: y. ^ *(tcb[num].stack+stacklen-1) = FP_SEG(over);2 [3 H% b+ k$ E *(tcb[num].stack+stacklen-2) = FP_OFF(over); ' n6 k& E, ]$ P8 n( C1 m2 N *(tcb[num].stack+stacklen-3) = 0x200;$ X4 L' l6 r( M! x+ W& T" G *(tcb[num].stack+stacklen-4) = FP_SEG(code);; M7 n8 u5 O5 C8 A$ f4 }# l3 f& W- A *(tcb[num].stack+stacklen-5) = FP_OFF(code); ! A- C; e. A( k) _ *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack); # d3 t G* W; L& ~* e *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack);6 m: k" G8 a- Z6 x2 w return num; / ~2 N% T, I% ~ S$ r& V5 M} ;/ h" D. r# F& `; p void interrupt (* old_int8)(void); . a% B- L n- P% V0 a- V! u( r void interrupt new_int8(void)! w; l/ K: M) f9 i$ r& a/ _. @$ ? {: }5 c) H+ t3 J0 T* w/ r' h (*old_int8)(); ' H/ j: l( |/ A timecount++; 5 |6 t L5 ~3 f% \3 Z# K+ W3 y f if(timecount>=TL);9 y+ @3 Y) c5 R if(!DosBusy())* M/ `2 k _8 H& F8 ~1 @ {$ o! \: P1 U* h8 S( O disable(); - I, _5 A Y% y, X tcb[current].ss=_SS; - ^7 R k4 a( @: @# { tcb[current].sp=_SP; + S& g4 [) b9 f, F if(tcb[current].state==RUNNING) 6 L9 r4 ?3 [3 d; Q tcb[current].state=READY;0 U! x3 s8 l) j! {9 I6 _* ?0 m current=3-current; 4 @9 @# y" Z" H4 h6 w' Aif(tcb[current].state==READY) ; G; F- k; g- E. \{ _SS=tcb[current].ss; 6 _% j2 h* L, s" q _SP=tcb[current].sp;5 k$ \* `& E( p9 z) b6 k tcb[current].state=RUNNING; x( ~8 X! V" A. B# y+ b/ o" V7 n timecount=0; }) u; L$ W$ |8 K2 S: z; P' a enable();. \# _6 t4 `, x. [ } 1 R- t- X; X" u/ H; F& B2 s}$ @, P/ W* G/ E; Y. G }; # L! k& l$ b6 w+ hvoid tcb_state() . ~- B" C5 r' S! v% e{ % g' }9 N8 ]; z int i;' s, |0 _. n- B2 c/ c& {" ~ for(i=1;i<=num;i++)/ f7 [7 M4 g! r2 l% H9 u printf("Thread %s is %d ",tcb.name,tcb.state); % E6 A8 C* f: {! ^7 h}; : { y* a0 ^! G. }4 _int all_finished() 2 n6 @3 N5 Z4 A$ y; O{6 D' c* Y" ^( X0 H4 G5 m" m( e. V int i;. p9 c* {8 A& w. b. ]0 E# W0 f for(i=1;i<=num;i++) % H3 l2 F% @8 S9 H/ f( P& X7 u9 H if (tcb.state!=FINISHED)" y- }4 h( F) [) F return 0; 7 r. }8 v0 W8 n {6 g0 s return 1; 0 e! c+ @! O+ ]* p) e9 j6 D9 b: K8 I! R( ^ }; * X1 V' f- s, [9 mvoid interrupt swtch(void) + S4 L7 g& K, ]0 s{ 8 d1 G6 [5 |( _- T; e4 n+ kint i;. k0 n* u# R" N disable(); ; J4 M8 _( y2 L" K; q tcb[current].ss=_SS;; y5 v+ p/ U- ^ tcb[current].sp=_SP; # f) @6 S1 m. h; p/ l* [ if(tcb[current].state==RUNNING)2 _/ z* ~9 ~5 {' N' \% _ tcb[current].state=READY; Q) e5 w; P1 z( S! q& Z for( i= current+1 ; i <= num;i++) ' e8 s Y( t! F* M4 N { if(tcb.state == READY )3 v: R0 t2 f: G goto excute; & I' n# G5 ]- f, n } ' b3 d7 u' N/ e: `0 p. \/ W for( i = 1 ; i <= current ; i++) . D) L1 h8 S6 ~+ _1 P9 ? { if(tcb.state == READY) * O5 l6 w, }0 D. e; _7 M goto excute; g4 C2 b6 [! U* j) I( T } * |' ?6 `0 L* Z/ q. r1 q& y. E F/ h i = 0 ; 0 h. Y' g4 m1 C. x) ^: v excute: + Z8 N* ~* |3 q' [9 d _SS = tcb.ss; + ?" ^9 c4 p$ u1 t0 v9 K$ ^6 o( K _SP = tcb.sp; - a! k0 P* P3 [3 k" c1 F" G tcb.state = RUNNING; : Q- u4 p/ s9 K" ?) ~( @: J current = i;5 ?1 h2 d( Z) R6 S$ Z: D1 Y0 w enable(); / W2 G4 A6 ]+ K* ^}
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    13
    发表于 2003-10-24 18:02:00 | 只看该作者
    指点什么呢?效率?方法?还是编程格式?+ ~$ |' @# r" Q# w' ?2 ~
    给一篇代码给别人叫别人指点?我从来没有过。
    towny 该用户已被删除
    14
     楼主| 发表于 2003-10-24 21:48:00 | 只看该作者
    操!
      w/ F$ N, }" ~8 W2 _搞什么脾气啊!一个斑竹有什么了不起的啊垃圾!!
    towny 该用户已被删除
    15
     楼主| 发表于 2003-10-24 21:58:00 | 只看该作者
    你要是不懂就让位!3 w' B/ k8 C9 ^. O1 v# F
    别占着茅坑不拉屎!0 N9 ]  X- v' n
  • 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 T$ C4 r: v0 q4 l$ x r$ Z3 S$ z 3 H5 Z- c- R9 z/ _, I#include 0 ^" J7 X$ I2 A7 _0 W3 f8 a #include " {& Q4 i! N! d6 ?* z* d% j #include 0 {5 ^7 P9 O/ H2 m" ^" m" l #define GET_INDOS 0x34( q! \3 B7 L% f1 x #define GET_CRIT_ERR 0x5d06 . E; n9 r# C2 j#define FINISHED 0+ M5 R0 V- r0 L' }3 i# ~5 T/ o( j #define RUNNING 1 6 Y3 z; q+ c. n4 ^: k5 ^#define READY 2& g0 |) `/ [; d" x# Z! v #define BLOCKED 3 5 p. l- L. u% H1 ^( b#define Ntcb 8% O0 B& Y7 j2 X& b Y #define TL 1, F5 d" r( B1 M, {( Z struct tcb{ - W" _9 @, h; V" A unsigned int * stack;/*堆栈的起始地址*/ 7 h9 y/ m- T% ]( B% u* W# i$ \ unsigned ss; /*堆栈段址*/ , x" F9 Y6 w# M6 ^: k4 o unsigned sp; /*堆栈指针址*/ + d3 i) b4 @% d7 i X1 R char state; /*进程状态*/ ! f1 u: c' V' S char name[10];/*线程的外部标识符*/ 7 j0 a% e5 F7 b% h }tcb[Ntcb]; /* 系统允许最多的任务数 */ ; ?* w4 ~- x+ B3 z2 B9 k Uint timecount=0;; q4 o& n" y1 \1 ?, C' f char far *indos_ptr=0; ) c6 H9 z: o' M# Y* d, r# T3 p. c7 Qchar far *crit_err_ptr=0;8 q/ e& l, j1 }5 \$ L) X C0 l+ ] int num=0,current=0,i; 8 L4 }/ @* ~, m8 Zvoid over();3 _5 o$ O2 z1 M6 P5 Q4 c typedef int (far*codeptr)(void); 6 r! N$ U/ ^6 I' g+ k. o( \. {int create(char *name ,codeptr code ,int stacklen) 8 D- V. @4 s0 d0 S, ^% K{0 O2 L) i0 U' _$ A" k- L unsigned int * s;+ {8 d P9 o7 K5 U* f/ d) v num++;/ N# p% Z9 `( Z H4 Y# {7 D tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int));3 F# D' ^; i1 X& k tcb[num].state = READY;6 n+ L, C! L3 p3 J strcpy( tcb[num].name ,name);, T) U% ]! ~) [" ~4 H& @# t# j tcb[num].ss = FP_SEG(tcb[num].stack);5 u2 ~' `, X: T6 S1 Y3 S% J tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14); . N( W- B0 ]( m; x' X. t *(tcb[num].stack+stacklen-1) = FP_SEG(over);) i" u h+ a8 x6 f4 _( d: [ *(tcb[num].stack+stacklen-2) = FP_OFF(over);- c+ z) ?, `; s* S# y1 t; @ *(tcb[num].stack+stacklen-3) = 0x200; , F E: v$ W* R' ~, G. b( O *(tcb[num].stack+stacklen-4) = FP_SEG(code); 2 `0 ^3 ?# j& y; \8 x& _0 u( N *(tcb[num].stack+stacklen-5) = FP_OFF(code); 6 @6 j# M. S' i: i8 L *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);! \/ | |+ V& F% \7 V- i+ s) R *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack); 6 g8 X( N! `# u4 H return num; 9 O6 R* F% X# U9 J. x3 V} ;4 o! ~/ `: Q2 J void interrupt (* old_int8)(void); 2 d3 v# _3 C. | S6 P2 ^ void interrupt new_int8(void) . y2 q$ {4 v3 t% `, T5 l{0 a8 u. c+ v8 j) H- y1 X2 d2 D/ G (*old_int8)();# i- ~, l7 W+ z" q* e. { timecount++; 5 e5 D! a; `1 W if(timecount>=TL); 8 M7 f$ T0 H! P: e if(!DosBusy()) 8 [3 k) U8 k8 Q {) x- R' A; ?( ?/ L6 O disable();, {+ w1 s4 s% S" D tcb[current].ss=_SS; 4 b5 u& Z/ p# n( }( S tcb[current].sp=_SP; ; Y2 k/ }( T& Q6 \ if(tcb[current].state==RUNNING)( I: d: }$ x$ ]( f- K tcb[current].state=READY; 5 q5 \, ~) b' ~3 ]9 P current=3-current; $ K- q5 O& r& @6 c9 Qif(tcb[current].state==READY); o; V, ^4 K/ q: J. a { _SS=tcb[current].ss;5 v0 e% B) V( c, c1 Y' H _SP=tcb[current].sp;9 S2 J+ U ?. Y1 e5 a' y$ k8 c( y tcb[current].state=RUNNING; - ^+ ^9 t' d, M" f F timecount=0;+ [9 H7 ?! S" m) a4 }1 P enable();& p% ]# z4 V" G w: ?2 m } 0 @) V5 U" c4 x6 N& @( L; {} 0 D5 v- g+ L! [}; T' ]" n7 r, e5 o5 Ivoid tcb_state() : q2 d! d, y8 j r{ % W T3 D" V1 t int i;/ J! F l5 |7 T4 H U for(i=1;i<=num;i++) & [0 e9 _- K5 T/ y5 U8 ~" D) @ printf("Thread %s is %d ",tcb.name,tcb.state);$ _8 f6 t6 j% |# m }; : ]5 x, G3 |: G6 sint all_finished() H9 ^- |. ?- G( D{ , M. k- R: D# Y. `) E int i; / e' R- g+ O9 {' p4 i$ j/ H# H9 Z& c for(i=1;i<=num;i++)8 L# _* U' y. e( o3 U if (tcb.state!=FINISHED) " R% X" k+ [4 F return 0;$ f/ K% T% \: }9 G' P return 1; 8 d9 u. P! _, j7 Z; ^6 P, _! ?: S! r8 J; \9 ~' x }; ; T0 j# ^9 A/ I9 Vvoid interrupt swtch(void)0 Z! I0 i# `0 D) G6 f {/ b6 j) v4 D4 P/ q8 n int i; " t) ^; k( ?4 w& D# _2 U disable(); 3 Q1 ^# I* ]! {- x2 n! e9 ~ tcb[current].ss=_SS;4 y/ }) s/ t( W% F4 P5 R% E# X tcb[current].sp=_SP; 3 e& t+ {; Z! z$ I) k0 J$ j7 M( N/ { if(tcb[current].state==RUNNING) ! S% k. i1 c8 b, ~6 ?, [ tcb[current].state=READY; : }- g& x. ?; s) a for( i= current+1 ; i <= num;i++)3 Q( }/ [; [6 |* ^ { if(tcb.state == READY ) 7 x* E) N, E& k E+ n- D goto excute; h4 j# l6 t+ L' @ }, A/ u- `3 G; t$ z for( i = 1 ; i <= current ; i++)% ?& a8 h- Q( h5 ] { if(tcb.state == READY) 6 k' |4 x9 l: I6 r4 A6 t: S1 N goto excute; ; E- G, z: u y' v7 N } 8 C5 w: D; C% n B4 G# }0 I; S3 n1 G i = 0 ;5 v8 R0 d) w( a: U3 b excute: e/ Z. a0 e( r8 Z3 y5 j6 s _SS = tcb.ss;' n& H6 w) x* W/ r' b j5 Q' t* y/ P5 n _SP = tcb.sp; . w- n: d4 ]: r: v! h* b$ i tcb.state = RUNNING; , L$ ^) O) S0 l5 E( W current = i; , K" ]" ?9 H0 K enable(); * i. `3 a- c* I# E# \}# r* J' T/ M" U. ~ /*-------------------------------------------------------------------------*/& i( `5 ?8 {+ h! ^) s void over()$ ]7 s$ r+ w- k2 l {+ d$ s( v2 L5 ?7 { int i=current;3 d1 ~5 T* M. j% a /*strcpy(tcb[current].name,'\0');*/! @! S6 {8 O* j2 X+ T* r tcb[current].state=FINISHED;, m' F* Z; L, D3 o' s swtch();; X2 _- r% M* {/ ^7 k$ @; q$ f free(tcb.stack);- s# G" L# m: [ }; 5 k' j$ J0 {! }0 L/*---------------------------------------------------*/ 3 J: S# S4 s' n; ^8 q) Bvoid InitInDos(void) 3 ~) z$ u8 k+ k: }& W{ : E8 p; i7 |$ F union REGS regs;! _& l2 s6 ?- z6 c$ B+ F% | struct SREGS segregs; # \) S' k7 U/ a. W8 _ /* get the address to INDOS flag*/6 H J. j) H9 o" I; @ regs.h.ah=GET_INDOS; * ~6 _) v7 U- L' o; n intdosx(®s,®s,&segregs); 5 W. Z: b0 j# y) y3 _$ g indos_ptr=MK_FP(segregs.es,regs.x.bx);$ \' l4 V d" \7 E /*get the address to CRIT_ERR flag*/8 y8 D5 B+ l9 P1 J+ Q' i if(_osmajor<3) 1 ?% C" ^8 h5 U q crit_err_ptr=indos_ptr+1; 1 z, w* E* \% x: a+ O else if (_osmajor==3&&_osminor==0) - O% c* o0 W9 e6 f crit_err_ptr=indos_ptr-1; 2 Y D+ m; q, g else$ k; q5 k F# h, J$ E) @8 c; O {9 F8 ~$ x% I+ |4 D, R# q regs.x.ax=GET_CRIT_ERR;/ e$ N7 a8 Q2 @8 M intdosx(®s,®s,&segregs); * N' \* X3 o2 N2 Z# a% M+ {) Z crit_err_ptr=MK_FP(segregs.ds,regs.x.si); / g, I$ S& Z, A3 N- ^ } + L2 e7 p9 A) f4 D6 w8 [};2 U: z$ K; ~' i1 h' L( H0 i/ W int DosBusy(void) ! V6 I$ V& ^: Q- m9 h{ 4 J2 K. ?5 A n( g3 o8 s+ [ if(indos_ptr&&crit_err_ptr) 0 x* `5 B/ G4 `" y# X return(*indos_ptr&&*crit_err_ptr);9 M/ Z& T9 N" y' c0 E5 ?/ O else # j( \3 I. a5 f8 \* X9 ~ return( -1);7 D0 O5 c/ ^( J: s' E2 Q: z }; * w( b/ W# f% M9 O! ~void f1(void)- V! i N! G5 O, J { , ]7 T" {+ O7 h8 w int i,j,k; 5 T4 T; t: p9 \; x! \' ~( w6 C for(i=0;i<40;i++) % i/ `1 n, S; ?1 Z1 G: { {( h1 P {% h3 r9 a4 i& r! t! a putchar('a'); 0 m* d/ q3 q8 w8 ^9 S( W% A& [6 Z* |' i8 F1 z$ a for(j=0;j<1000;j++): p4 P6 |4 l" Y2 k4 F& o for(k=0;k<100;k++) 1 w0 v$ N" E; l3 {8 _8 G ; 1 x8 W! R; R/ j0 T" E" U }8 ^& n9 {/ ~3 K0 q; E( l u" W }; 9 \, ~2 V- P) }+ j+ \( z) j) N$ ivoid f2(void) " B; Y$ G0 T- M Z{ $ r% Q2 p# d- C$ W A8 G int i,j,k; # y, d5 E- y3 T, q for(i=0;i<30;i++) 3 U0 U4 F+ [9 K2 y3 w* m5 |$ o {- e/ m: f0 i% w3 J1 Q putchar('b');9 j. S/ ?1 V) _ for(j=0;j<1000;j++)0 Q! f8 c& p# r for(k=0;k<50;k++) f' J1 M# n6 f3 q# \ ; 9 O! d k2 r3 B2 ^; O8 d }7 t. o" s6 c. \4 f# i }; 5 p. V! u, A& P0 a/ F4 c/*------------------------------------------*/. L2 q& t# ^) c/ m# M) V# v main() 6 P7 G- d! d, z' L& v- ]6 W{ + s( ?! W) _; H0 ?9 s/ [4 i InitInDos();" H' L3 A3 E2 P/ A) X old_int8=getvect(8);& O6 F8 Y1 n: j! w strcpy(tcb[0].name,"main"); 4 L; |3 {: X- T2 j+ h. c tcb[0].state=RUNNING;, }3 W% b2 Y5 R* a5 P2 L current=0; 0 ^* W% |( s9 j1 V create("f1",(codeptr) f1,1024); . `3 j3 {* T: s) X2 |5 I$ ~ create("f2",(codeptr) f2,1024); 0 E% J1 o7 c( s C/ \, V( G3 S* S; } tcb_state(); 7 B/ F5 L) C S( T setvect(8,new_int8);1 k9 v6 F2 r1 k% i8 o/ u" X& m swtch();" V" F; ]9 r5 c' o& q$ M) L1 T while(!all_finished()); & W$ P$ d5 g, U# P f strcpy(tcb[0].name,'\0'); 6 y* m& R1 j+ W3 S; E _' j+ | tcb[0].state=FINISHED; 7 p# X U4 k9 e. n4 h+ L4 N. k setvect(8,old_int8);) P6 ~' v9 l0 c8 Q! v$ g" _ tcb_state();! N- g5 q% z: j( F5 t" @5 l printf("\n Multi_task system terminanted.\n"); ! _) B) d' L q7 t, C4 B4 g/ e};
    towny 该用户已被删除
    20
     楼主| 发表于 2003-10-27 11:58:00 | 只看该作者
    我不想灌水,也根本不想在这样的版块浪费时间!!

    本版积分规则

    关闭

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

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