下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]
towny 该用户已被删除
跳转到指定楼层
1
发表于 2003-10-20 12:59:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
create()  创建一个进程+ j3 `: S+ y6 |' o% B- ?
要求:1 用c语言编写: j% h: g7 P# N' P0 o, s
         2 程序+PCB(ID的内外优先权,申请资源)) l4 l6 d5 x6 y7 s, R% {
只需做进程中”产生“这一步。
: V; V# K; M/ t/ ?. P以下是做了3分之1的范例:% ^* u- t" ?4 R; D" P& }8 V
#include "stdio.h"
2 T0 f( ]" ^+ y" `: z8 [#define running 1 /*用running 表示进程处于运行态*/ & Z# G7 P4 o- r5 d9 g2 V) G# l
#define aready 2 /*用aready表示进程处于就绪态*/
  L& d5 E2 ?, ^0 X& p  z#define blocking 3 /*用blocking表示进程处于等待态*/
' {' U! b( y0 L4 x' q" N5 B' S#define sometime 5 /*用sometime 表示时间片大小*/ ; A! b+ B; X. k( [
#define n 10 /* 假定系统允许进程个数为10 */ ! h5 g1 w! {. W' T
6 m' a+ {: j7 Z/ E; e6 o- q! c/ h
struct
; U! C. d, o  K4 q0 j{
8 U) N- s. m* T6 C; mint name; /*进程标识符*/ + \- B  V1 g6 c/ V. q3 s
int status; /*进程状态*/
: J3 ^# n( k1 o6 eint ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/
  k7 ]5 K+ N% _% F8 e- dint pc; /*进程现场信息,程序计数器内容*/
: W, [% P! N% Cint psw; /*进程现场信息,程序状态字寄存器内容*/ 1 h4 U9 ~" |) N! `0 B6 w
int next; /*下一个进程控制块的位置*/ 4 `# I/ n8 h* O/ x" B5 v1 z
}pcbarea[n]; /*定义模拟进程控制块区域的数组*/ * n; [( Y2 k, l( o1 a7 Y

* ?. K& _8 B  Cint PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/ / ~$ R$ d" O9 Y

' |0 o" w  r) ^( bint run; /*定义指向正在运行进程的进程控制块的指针*/   i& ?) q- o. j( z
struct
2 H+ }& A" M% k3 E; F  A( n/ g{ " v9 x0 _# x9 C, h3 ]3 L, ]
int head;
% A) m) ^8 Q8 G. Gint tail; $ o, g3 [/ u. K7 [/ n
}ready; /*定义指向就绪队列的头指针head和尾指针tail*/ ; L! F" R+ x, ]2 x, n
int block; /*定义指向等待队列的指针*/
2 @! ]1 z) Z7 [! Iint pfree; /*定义指向空闲进程控制块队列的指针*/
2 C! i: ~4 U% y' |
6 S, O! E2 J, 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 | 只看该作者
    我的脑子都快调得暴了,能写个大至的,让我自己调吗?$ D- J8 p6 T! N. N7 A
    麻烦各位高手了!!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    4
    发表于 2003-10-20 22:40:00 | 只看该作者
    你给的头部定义的几个队列指针看的出来你是想写一个 链接方式 的进程队列,由于给得太粗糙和简单,我尝试了一下,反而觉得很不好写,想考虑的一些东西你的结构里没有,而考虑进去发现弄的复杂了就写不完了,所以很难办,结果还是没有写下去,给你我开始的一点筐架吧。/ m5 I$ B3 t# h1 i& Y- Q
    /* the main site file */& K  |, x: c5 E' X+ f7 x9 @. B' ?0 I# n
    CreatePro(&ID){
    9 o1 u( o9 x" Z' y: o" w$ e, U$ Q  GetFreePcb(&ID);  //申请一个空闲的PCB,并为其命名一个标识ID;9 A+ @8 ?7 L  m, C+ a- j
      InitResour(&ID) ;//为该进程分配资源(内存空间和工作区);3 i$ Z/ C  {- ~
    /*初始化参数*/8 ~/ O; W; d& ]3 j. K
       CallName(&ID);   //命名进程的外部名; d5 j! Q' p* v# k7 F7 D
      SetParProStat(&ID);  //记录父进程的ID和CPU的状态、" g9 s# B* i! t( x9 c
      SetFL();  //优先级数、
    ; z9 w: ]4 C3 F* N1 E, c  SetHeap();  //进程起始地址、
    0 K4 k( D8 e% E$ L) I! ~) F0 g  _SetSelfStat();  //设置进程的状态为就绪态5 ~0 {4 u7 X' Y3 y$ L
      AddStat_Read(); //将该进程加入到就绪队列中。
    / ?; s1 p9 l' I) b& P.$ j  T# G/ m3 g
    .) v. O+ Q* x/ H5 j# D
    ./ |" N7 C" {* k; Q$ N
    .! y+ A  F7 i  Y8 K, O6 c7 |! [6 x
    }
    7 d$ t+ {0 O: l8 ^5 O' R3 f5 [$ n我觉得上面至少要考虑的,但是实在很懒了,对你也许一点用没有,不好意思! `# t# X1 G# N; s/ I) B
    towny 该用户已被删除
    5
     楼主| 发表于 2003-10-21 12:04:00 | 只看该作者
    呵呵!!2 E+ n8 b' O7 a/ g. H
    谢谢斑竹的高见!!
    towny 该用户已被删除
    6
     楼主| 发表于 2003-10-21 12:18:00 | 只看该作者
    这是我自己做的一个版本,望斑竹给予指点!!!谢谢" v( z. E# t( \/ a" s! p* J: v 0 K- |; a4 r2 H# @- O#include1 `+ H/ b. f4 P8 o #include: R, ^8 Z" S2 e% t" B1 e8 B9 d #include % Z/ d' q- ~* E) g#include - F$ K9 W( l$ a% R$ ~* R#define running 1 /*用running 表示进程处于运行态*/* I# z% m* W# \2 \; ~4 b9 w8 t #define aready 2 /*用aready表示进程处于就绪态*/ 7 C6 y8 |) W3 A- M) z! r#define blocking 3 /*用blocking表示进程处于等待态*/ , t. f, _+ r4 Y7 Z4 M#define sometime 5 /*用sometime 表示时间片大小*/" c3 }+ [) q7 v- B! ? #define n 10 /* 假定系统允许进程个数为10 */' H! e. G% j0 H& u1 |9 X2 d; x struct . G/ C, O& k3 R{ ) d& t+ `. p) x6 D7 d( I* Uint name; /*进程标识符*/4 y: f6 i# w4 w- x int status; /*进程状态*/ 4 }& K2 i' ^$ I7 ]( N1 M: eint ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/ * N1 n0 H+ g& x1 k. h* ]+ }+ Cint pc; /*进程现场信息,程序计数器内容*/ 9 x1 O% V& O8 D/ w: ^' J9 u/ k, Qint psw; /*进程现场信息,程序状态字寄存器内容*/$ k5 [9 i3 Z' \" L* q' M int next; /*下一个进程控制块的位置*/- i3 A$ k0 W8 I+ n- A }pcbarea[n]; /*定义模拟进程控制块区域的数组*/ 0 \/ M+ b/ b9 B H9 Cint PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/& i G: ?7 }/ o o+ Q* h, o int run; /*定义指向正在运行进程的进程控制块的指针*/ + s3 `7 K e; J7 k' J" wstruct/ _+ G3 ]* l; o- L+ v0 S {" G7 Z& B3 ^9 F( v1 a7 ` @ int head; ; Q( O5 a' ?. k2 a9 @( h0 uint tail; 4 Y+ ^5 s5 Z) X9 `}ready; /*定义指向就绪队列的头指针head和尾指针tail*/+ W6 W+ O. l+ K+ {- F int block; /*定义指向等待队列的指针*/ 5 L" o8 A; u9 c% ]4 Hint pfree; /*定义指向空闲进程控制块队列的指针*/ 4 h) r g' j9 N" \' Nmain()1 z& o9 _. D( N, A6 B { int gdriver=DETECT,gmode; 1 i1 b( F x8 X ]$ U int i,x,y;3 J* X5 Y9 v D' l for(i=1;i<=n;i++) 1 Z% @* D, g9 j2 |" h8 z1 ^2 i3 F {ready.head=pcbarea.next;} . ^" | T8 r( T$ T4 ? initgraph(&gdriver,&gmode,"");' C" D0 X B+ v' } setcolor(YELLOW);9 q3 O }2 J r3 U" g+ b for(i=1;i<=4;i++) / F0 o+ Z7 C0 Y+ w" k7 X { setfillstyle(8,i);# D# R; _' U) z3 d# H4 W circle(284+13*i,190,6);' z2 ^! Y9 F; y& c* v0 N! s floodfill(284+13*i,190,YELLOW); [ |$ z$ F% B P4 [' s% g. y9 O } + ?' u1 i, z; L4 r setlinestyle(0,0,3);2 K: F$ W$ P( C+ J9 ?, Z% a circle(316,190,25);: m# b" Y1 x! I1 c& h setcolor(5); , J, _+ F% c8 f8 }, a settextstyle(3,0,4); . c6 ]/ f! z! t' N: H outtextxy(35,311,"press any key to create objects!");4 \/ b/ R8 X7 k& O getch(); : D* d5 b9 B9 ^0 P, _ setcolor(YELLOW); " D ~2 S X; r line(300,215,290,235);/ K; ]/ Q6 Y( n, B% r( ] line(323,215,333,235); , |" a; p( D, o" }. { delay(50000); % Q4 U0 R) m- y/ p setlinestyle(0,0,1);1 \' q) [+ z& Y for(x=1;x<=2;x++). A6 r6 U& U9 ]/ ^ {setfillstyle(8,x); _7 ^ x$ ~2 i% }" G circle(267+13*x,246,6);) \2 F9 e3 d; C* K+ A floodfill(267+13*x,246,YELLOW); * m0 e. Z9 w9 C! s5 W } - ]2 C7 w$ G+ l for(y=3;y<=4;y++) ' S0 q" `$ ?. O( Q2 I {setfillstyle(8,y); ! {) ~8 t8 m3 d% X circle(285+13*y,246,6); ! }2 L) o/ i* S floodfill(285+13*y,246,YELLOW); 0 O9 f- v) x: j/ E } ' m; M& u( t( a; V3 A setlinestyle(0,0,3);+ `. E! K, i: N! J9 a, W: @& ?7 } circle(287,246,14);" P& U) u- ]4 X$ J setlinestyle(0,0,3); & o8 }- B( Y: D5 Y circle(330,246,14); 0 S- u: L+ t6 M2 [1 p! u0 ~0 }) _ delay(50000); ; j* Q+ O$ @0 W( f: e! [; x line(281,260,281,280);) G: e5 ~/ n) F line(293,260,293,280);2 e# T) [$ `) C line(322,260,322,280); * Q0 K* _2 {+ s, H2 \. L7 D line(333,260,333,280); 6 N8 ? ^8 n1 Z0 t% a1 T delay(50000);9 ?$ H/ N8 t' } setlinestyle(0,0,1);7 W) g& l9 ?5 i! q; G w5 r setfillstyle(8,1); + T/ e5 \$ e/ t2 g( ]0 a circle(281,286,6); - a* V8 e/ \& {0 ~) F" {" r: \ floodfill(281,286,YELLOW);- d0 A5 V& `& [) o [ setfillstyle(8,2); * e Z) m1 m. L+ q' C circle(293,286,6); 5 K3 N8 _6 t7 }5 h9 P0 z% q! N: ~ floodfill(293,286,YELLOW);# H" u0 y; ^: w0 Z$ g! k& n setfillstyle(8,3);* A, |/ h, s8 C# q# l o circle(322,286,6);6 h2 Y3 J6 J$ a4 U2 Z5 T5 f0 _0 Z2 G floodfill(322,286,YELLOW);. c; s6 x4 y k p5 f$ c7 m, e setfillstyle(8,4); - r8 K( T, j F+ N& R circle(333,286,6);* N! U/ Q6 f: L9 V! J6 A floodfill(333,286,YELLOW); / O+ Q0 x# E9 O: m# ^2 \8 u getch(); 0 ~# x* ~3 y! ]! N6 J5 Y closegraph();: h: n6 o0 V e( O4 L5 t: _% s }' T3 r0 Z, Y: F& I+ ^/ f4 K/ [ * m. m! e$ z$ |6 j5 w. R- d S& e9 c7 p 7 r- a- r. j9 I& I u
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    7
    发表于 2003-10-21 18:58:00 | 只看该作者
    你在搞那么多画图干什么?你不是要做进程的创建吗??- |. S. k3 c, a1 r
    难道不是《操作系统》的‘进程’那一章进程创建??
    ; k' v$ Z! i/ z- w7 `0 ?9 y# I到底是要个什么效果??糊涂了
    towny 该用户已被删除
    8
     楼主| 发表于 2003-10-21 20:34:00 | 只看该作者
    手误贴错了!
    ! ~! A3 _# K/ V( d! K不好意思!!
  • 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* C; c/ Y% `2 w1 ~9 @0 \8 {- u8 g5 E int timecount=0; ( ]" ~+ F/ Z- d* _. Echar far *indos_ptr=0;' v& u, V& Q/ T+ D% o' t char far *crit_err_ptr=0; + v. ^8 Q- `: Gint num=0,current=0,i;, J. ?* |6 I* Q! t% u void over();' |+ K+ s- g" A, ^ typedef int (far*codeptr)(void);( i6 M$ m+ ]8 h2 N4 M4 x' @ int create(char *name ,codeptr code ,int stacklen)6 ^% L( n8 Z) ?3 ^* E {, }: k9 j& C5 ^* ^1 B6 Z, U unsigned int * s; " P2 U7 t' R1 t4 F( u; Knum++; # V" E) ]7 Q2 s7 r$ L* j+ d q1 z4 }7 Ztcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int));) S. Y$ G3 n' m& f7 _3 } tcb[num].state = READY; ; K# b5 z2 p' z7 D2 H( w) e strcpy( tcb[num].name ,name);$ k+ X1 w' t5 I# k( j% ^ tcb[num].ss = FP_SEG(tcb[num].stack); 3 M( ~% j Q5 X0 K8 J1 C. n1 i2 x: p tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14); & w$ l5 z# t, ] Y# Y& J/ } *(tcb[num].stack+stacklen-1) = FP_SEG(over); # Q7 F2 M& w& y. G) Z7 ?% e. I *(tcb[num].stack+stacklen-2) = FP_OFF(over); ( J0 X/ E; D+ j6 j: g *(tcb[num].stack+stacklen-3) = 0x200; ; ?5 I. q, |+ r *(tcb[num].stack+stacklen-4) = FP_SEG(code); ! j/ [7 ?( _: ]8 N' R" ~$ \ *(tcb[num].stack+stacklen-5) = FP_OFF(code); 9 }9 O5 D% i, ]5 K8 Y6 _0 `. `$ n *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack); 5 F) ]4 E6 @; B# ? *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack); 1 T) ^+ e! d6 A/ V( E return num; I. Q- [& I6 ~, E& m- q} ;. P2 w% n; u- _$ U void interrupt (* old_int8)(void); $ F+ i) i& v9 |& k( o5 c void interrupt new_int8(void)4 C) K8 ?6 O( X+ @$ O { . P- Q& n! E8 g7 o" E5 e- B% y (*old_int8)();1 d# `- b% e- y7 E5 z timecount++; ( z/ V. ~$ c6 i! h9 S" d$ M if(timecount>=TL);/ I8 i" Z: T, i1 R/ `; ?/ E4 q if(!DosBusy())8 J+ c3 g: ~, r0 w) ` { 4 ?. I$ Q( M8 p$ N0 G% U& e disable();- S& ~; p& t" h7 K tcb[current].ss=_SS;# f2 }2 ]+ p& ^9 o0 R4 M& v1 H tcb[current].sp=_SP;! @, e v) w- c; B if(tcb[current].state==RUNNING)4 g; u6 k7 ?) P# }+ f# a1 C tcb[current].state=READY;/ @6 R, V* C/ Q' J; z" A current=3-current;1 u1 @+ t7 R, u4 J0 _+ W6 B4 [; J if(tcb[current].state==READY) 0 E/ V) p% ]0 q. ^& h9 d- C8 V# ?$ d; S{ _SS=tcb[current].ss; 9 x" J) Z/ {0 R& L" Q _SP=tcb[current].sp;$ U+ e% W! ]% G# U tcb[current].state=RUNNING;- H- B1 I) _4 H timecount=0; / S/ X l, j/ H2 H& V2 z k enable(); & R; E5 W9 p6 ?, R n} 4 @: b) U1 J1 c* w2 H" e3 |0 \5 h}6 n c+ r2 e9 u5 B2 Z2 p* M };: }9 ?! M! V7 `# {5 T void tcb_state() 0 d. {8 [' e5 ~7 [5 y& a4 N{1 @3 s; ~9 `1 I4 f. w, D int i;+ E9 k$ T# z. N for(i=1;i<=num;i++) 3 s7 s8 O4 {* G( o! _ printf("Thread %s is %d ",tcb.name,tcb.state); / k: n8 \4 u* C4 s5 F$ k. d}; 4 ~* } O- I+ c6 \4 jint all_finished() 2 N* K& f7 M- u8 }3 v" r{( V8 u) Q' N( @. l int i;& n1 w! U8 m( N for(i=1;i<=num;i++)0 t9 n0 o7 }2 i if (tcb.state!=FINISHED) 6 Z' l( _) S8 M$ H% u1 @! f# B return 0;: s- [: s+ i8 W/ {0 O: ?" y% f0 Q return 1;8 _' M, d& {% t: D. T , H- ]6 V5 y% [& m" v }; 3 d C7 O8 R- [! G: q4 i0 jvoid interrupt swtch(void) ( z$ }# e3 ?9 Z! d9 c{ " a+ @5 y \5 u% [9 _5 iint i;, A* g* ^+ ~% m7 K disable(); . s" Q6 Q8 u1 t2 X$ [ tcb[current].ss=_SS; 3 i6 r/ X& f7 R4 f Z1 H( J: d S tcb[current].sp=_SP; T" A9 |/ C- l" \8 z4 O. _# Z if(tcb[current].state==RUNNING) & [( T m$ H3 |: ]) I9 a6 O- e1 B0 M" B tcb[current].state=READY;* N- g5 k" E# E' c5 e0 V% |9 d: p for( i= current+1 ; i <= num;i++) 4 P/ [( E3 ?( F7 g/ r* [6 j' s { if(tcb.state == READY )5 C0 P O5 N" `& M7 ? goto excute; ( `& G4 ?' j' I/ }! C } ' z f( Y' |. O: S for( i = 1 ; i <= current ; i++)) ~4 u8 b% H1 G. K { if(tcb.state == READY)( A0 V5 r) u/ Z* i goto excute; " R2 |9 }9 n# m } 5 U8 Z" J* ^9 B i = 0 ;$ A0 W5 Q, \+ U" h4 D# o excute: ' Q; O( {, C }& d. Z! P$ C+ r _SS = tcb.ss;7 z' `3 ~7 B3 v& X2 r _SP = tcb.sp; 0 O' ]3 I" `/ ?: f0 N0 f tcb.state = RUNNING;0 t; [1 z' w0 a6 R7 Q; j5 _( O current = i; + _2 f( G! e |: j" h enable(); : f% a+ x+ J/ O; j8 b+ d}
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    13
    发表于 2003-10-24 18:02:00 | 只看该作者
    指点什么呢?效率?方法?还是编程格式?
    * ^1 a  ~! G- m: m* X8 h% Q! g给一篇代码给别人叫别人指点?我从来没有过。
    towny 该用户已被删除
    14
     楼主| 发表于 2003-10-24 21:48:00 | 只看该作者
    操!. T- Q: W+ S7 O. W$ F
    搞什么脾气啊!一个斑竹有什么了不起的啊垃圾!!
    towny 该用户已被删除
    15
     楼主| 发表于 2003-10-24 21:58:00 | 只看该作者
    你要是不懂就让位!
    * T/ O3 }8 l8 B) W" J4 s: V& E别占着茅坑不拉屎!5 Z, V2 D4 _0 v, E7 d
  • 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 | 只看该作者
    完成了你们看吧!/ ]& _, J- w. v! g9 v0 \# I - I" |7 z$ D/ K #include 1 S: o6 u1 U' T5 G# n( @' y% O8 c#include 5 p: c1 {1 |7 W% X; ~6 i; }* R #include 8 Z1 I2 l3 L. m#define GET_INDOS 0x34& C# W: N, c; L1 D* U( H' y #define GET_CRIT_ERR 0x5d06; ]; Z! Z, U: A* G4 d #define FINISHED 02 q( S! p6 \% |0 E) K7 k #define RUNNING 1 6 g. V$ b7 o- P. Y2 K" y$ |! a. U#define READY 26 p. \6 y& t( U; |% Q7 M #define BLOCKED 3% l2 c3 A' i: f0 t2 i #define Ntcb 8 & n, h# Q6 |( ]1 T1 B+ d' M0 I6 {#define TL 11 x( y5 P# j" _( G# s! x struct tcb{ 6 b. e3 G) T1 f0 U0 b0 z. X8 L. A unsigned int * stack;/*堆栈的起始地址*/- O X# r3 o9 f unsigned ss; /*堆栈段址*/, I/ R; ? D, C9 v) C( L! i% J unsigned sp; /*堆栈指针址*/. p) Y( D: M- f* T3 z char state; /*进程状态*/+ {9 n" z' Y& f2 n char name[10];/*线程的外部标识符*/% T5 N! t0 R) S1 n* `+ R }tcb[Ntcb]; /* 系统允许最多的任务数 */; {9 X1 |9 `- f% l) I int timecount=0;9 |2 y6 G% s) `5 a8 I Q2 o. @ char far *indos_ptr=0;. P/ Y) e- R, @& W6 o$ g* U* w9 h char far *crit_err_ptr=0; & S( w% K1 t- A2 _int num=0,current=0,i;0 P5 J1 Y: ^ u6 e9 x0 @ void over();- v; q* V+ l; b typedef int (far*codeptr)(void); * B3 Q. x% V. W! f+ `4 J$ [; N0 _int create(char *name ,codeptr code ,int stacklen) + a% ~, |4 u5 J6 Q! j) X{& y# M" i0 T' R5 v; S unsigned int * s;3 Q+ b7 C! ~, k6 Z num++;* F6 \# }/ H9 S2 n2 G5 _5 N3 E6 S tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int));" G. o& r* K) |5 n tcb[num].state = READY; 3 ]* P3 ^0 a' o5 [6 k# j3 [ strcpy( tcb[num].name ,name);" U5 R' A& ]# [/ W' y tcb[num].ss = FP_SEG(tcb[num].stack); 2 ~) J: W5 v4 t' D1 t& l tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14); ! g% k# f' g g/ k7 f; k *(tcb[num].stack+stacklen-1) = FP_SEG(over); ' y& [3 D2 Z# H! _) s. R *(tcb[num].stack+stacklen-2) = FP_OFF(over); ) _ e4 p5 j* K% Q e *(tcb[num].stack+stacklen-3) = 0x200; 1 {/ [1 F9 J2 \# J' p1 i! {& j' ~ *(tcb[num].stack+stacklen-4) = FP_SEG(code); 4 e7 B# e4 C3 S' ? *(tcb[num].stack+stacklen-5) = FP_OFF(code);3 W/ u L1 x4 H, ]4 r- t *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack); 5 G, P% Q" C. } *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack);0 W6 d0 S+ S7 g# N) m3 C: g$ g/ A4 u! I return num; % a" e# u' h, E6 ~% \4 T} ;5 t9 s1 T5 t' G* B. S. \ void interrupt (* old_int8)(void); ; M9 s" r1 y7 k1 n# |$ jvoid interrupt new_int8(void)9 e$ q5 S: {) ~4 p7 X {. D6 f! E5 f' P: J3 ]% L: t (*old_int8)(); / O: w# p4 D2 y* k* F$ q5 x: ^7 |0 r timecount++;4 ]9 G# y6 B& i, }, ` if(timecount>=TL); ; i% g5 Q6 |# C" \: u1 Q if(!DosBusy()) % X3 A& \+ F, X4 k) z {# a4 j' y1 P7 _" H; ?7 i# t! L; { disable(); 0 n0 |4 S( ?( \9 K tcb[current].ss=_SS; / I3 q( a6 \3 [. ~ S& W1 j tcb[current].sp=_SP;' {+ j$ a6 {% r! m" | w' p3 x if(tcb[current].state==RUNNING)0 n: \. \9 X$ q5 F+ m tcb[current].state=READY;# _6 v. V) v$ i( _ current=3-current; + x2 w' `& H& a- W3 l0 Q3 Gif(tcb[current].state==READY); }# s; x! S* G5 @) F4 i- e( `7 G { _SS=tcb[current].ss;4 Y/ U- P, }8 f. R' j! i _SP=tcb[current].sp; / z1 s3 Q* k& z tcb[current].state=RUNNING; * ~7 _1 o5 t) V$ q timecount=0; 8 _8 ~: B- F/ A, _6 k. @ enable(); 0 X- ~0 t& K& @9 v2 y H, _} & a$ W3 F$ S& ]: s1 M& o0 L c F}, I) y2 H, V( G7 M }; # d. P$ e u/ v5 tvoid tcb_state() 9 Z$ K. q& T# U5 q- {, }8 Y0 I{ : E s# }+ O1 k- m3 ^4 f" ? int i; ; B @; u+ p) d/ y2 c" G: K. L$ _ for(i=1;i<=num;i++)7 \( O" ^$ n4 z* ? printf("Thread %s is %d ",tcb.name,tcb.state); I f/ p! d) I9 Z2 Q };( |9 _# Q5 c6 { A int all_finished() * c0 k c. h; q8 e{ + T% s8 I' H$ D) e8 w2 o* n int i;( D( ]+ _: B: J! W% W" b9 S for(i=1;i<=num;i++) 0 i: Z& v7 g) K2 F u if (tcb.state!=FINISHED)6 t8 E+ [3 L: c4 ^9 m ? return 0;1 i3 q* I; f# Q! _4 ^ return 1; : f" ]5 z! }" g4 d 8 C2 U3 \0 U) V0 D" p7 d}; $ H3 }' K4 e! G9 C% @6 b! h6 D5 H) z& ]void interrupt swtch(void)' Z {2 R$ X4 f L1 ]& ^ { 6 q$ Z1 {7 H" s4 g- F3 Y' _int i; + m& w4 B% W. K- _: a disable();7 X9 v2 Q9 m" ]" { tcb[current].ss=_SS;5 v: B! @/ |; f# L0 D" h tcb[current].sp=_SP; + I } H+ G$ }3 y if(tcb[current].state==RUNNING)0 g- \7 j2 F" k' X) H+ N; N1 k tcb[current].state=READY;8 x1 c1 X/ G' w* {% c' w+ q for( i= current+1 ; i <= num;i++) , }, n3 c$ y3 U5 b$ } { if(tcb.state == READY ); ~# h* D T6 I! C8 S goto excute; 1 o* F1 `' j# @7 X } # v- e: w( [: z9 H: Q for( i = 1 ; i <= current ; i++)8 V6 r' y: C6 ^2 E { if(tcb.state == READY)9 S) @; t/ o' _; y goto excute;' a/ y4 c4 \; o# w' G } . Z% B4 Q% O8 g5 t. @6 X i = 0 ; z; D* p, _: H* U: W H4 z excute:" i. K$ l* g% B7 @ _SS = tcb.ss; 9 _# i9 u. b: y7 C7 ^: D. Z _SP = tcb.sp; ( r9 M5 Z e4 S: {: n! F* v tcb.state = RUNNING; : k2 {9 ^ S8 {: ?* P2 I) J2 N current = i; 5 u3 ?- Q2 s$ S, o enable(); % j3 W) ^. ?$ Z J% V}$ d+ Q+ y! \; S: H9 E( U5 v /*-------------------------------------------------------------------------*/1 M0 p9 o# M& [; L! |( O+ ] void over()8 S: M% E5 V7 x { * [" K8 p: t* Y+ A4 f7 a int i=current;3 r/ T/ h% b+ X' B# e* x% w6 n1 T /*strcpy(tcb[current].name,'\0');*/- ]7 Y; D: A9 ^4 S2 L7 o tcb[current].state=FINISHED; 9 m' o- Z7 Y2 M( r/ ?4 o- d* q% T( F swtch();" h u% \! w+ g, S free(tcb.stack);# o3 \' g: v7 R9 z4 d. d0 J }; % g$ \$ O l; v. W- w# D3 y+ t" @0 r4 {/*---------------------------------------------------*/% z5 Z; w( F% m) @ void InitInDos(void) 7 S1 e m3 z3 n- I; L# V l8 N2 j{$ ^) A1 F8 D" U- [# W union REGS regs; 9 l" t" w! I0 g7 m' K4 V struct SREGS segregs;: [+ r& V3 }0 R9 ~, _& Q, X6 { N /* get the address to INDOS flag*/" ? b- O' N, P8 ^" B3 M regs.h.ah=GET_INDOS; * f* @$ ~8 W8 k3 C2 [- {# ] intdosx(®s,®s,&segregs); $ }+ ]* F1 p4 A indos_ptr=MK_FP(segregs.es,regs.x.bx); $ G9 P/ w% ~$ [; v /*get the address to CRIT_ERR flag*/ f4 w }7 P! t& T if(_osmajor<3) 4 f0 s7 V( @6 c0 v crit_err_ptr=indos_ptr+1; ! F% j& i1 J, j. R8 j3 H else if (_osmajor==3&&_osminor==0)/ z6 w- M+ l) q7 A7 V% P crit_err_ptr=indos_ptr-1; ) ~. F& M! t4 ]* G+ P+ L else* t: @. y* w8 O$ p( y7 m, b1 d { ) C& C1 ]% l/ b! F$ } regs.x.ax=GET_CRIT_ERR;, O% l& Z# x3 Q$ V intdosx(®s,®s,&segregs);2 |7 C3 S1 Q5 @, F% z crit_err_ptr=MK_FP(segregs.ds,regs.x.si); 1 x8 V3 o2 K% m: |6 g } N$ w; T1 z$ z: Q3 K9 ?: Z6 a4 _ }; * {- ?$ T3 C. [( \int DosBusy(void)2 W" R5 `& n+ m {0 U; @1 e# N% V if(indos_ptr&&crit_err_ptr) $ R& C4 y2 V7 T6 M0 H: M return(*indos_ptr&&*crit_err_ptr);' U& L4 B& _* D- x, o0 F( g else 9 f& X# @, E, t7 z, J return( -1); 3 F; a5 Y L" y2 l2 d};+ ^0 Y$ E; U1 u! A! u/ w# l g5 |- G: h! t void f1(void) 4 k7 G; Q; J1 \+ W) Z8 K) [{8 k0 k( A; h8 t# C$ H K int i,j,k;, ~$ o6 C. ^+ @" T% j for(i=0;i<40;i++): p/ }7 c# F; o& u) w1 P4 {+ I { , E( P8 y% a8 E4 `8 S putchar('a');3 \9 S& I# J+ y/ r 4 V" | f. N0 }# |$ R Y2 B8 u for(j=0;j<1000;j++)# Z+ ~7 y. [+ w, s: g- M2 u9 y for(k=0;k<100;k++)) E% k6 C7 f) [1 H: `9 x* S. N ; 5 E$ o1 l8 w# ^0 ]( N$ { }; r$ _# a5 h8 [- @) j% Q, l9 W, ] };- _# Z) V# ~! U: t6 p; M8 R' k& \ void f2(void) 9 m( N7 }1 V [: G4 C* b+ A5 m{ - e$ R6 c5 n7 w, T/ j int i,j,k;( y. K; [ [$ Z, t9 V* b for(i=0;i<30;i++). W- W4 s" d! {' w- b9 ^. ] { $ t! M( t9 \; z8 W putchar('b');/ ` l; y, m) S- V6 ^& m0 J6 Y6 Z0 h& ^ for(j=0;j<1000;j++) " `! h7 E2 v$ n! e for(k=0;k<50;k++)! `. H5 y1 O X: _- w' h ; 3 S: \/ d$ _' F# ^4 ^" F } 7 z+ u$ b9 O* G4 X" R- N* {7 x}; ' l" h/ d+ _* J/ L V: [( V3 ?/*------------------------------------------*// f0 c& P/ }( }2 y# ~7 U' { main() $ @# B6 E0 ^4 n{% j! v7 U' w f3 T" _ InitInDos(); 8 a6 ]! f7 P" O' L1 |4 j6 e old_int8=getvect(8); " Q! S k# t7 m strcpy(tcb[0].name,"main");* a5 d) c7 G8 Z$ q1 H1 o. M tcb[0].state=RUNNING;2 I/ Y! F- R1 y, ?+ n7 j7 U current=0;. s: `( n( m& f/ v9 o create("f1",(codeptr) f1,1024); " D1 F& `1 E: K8 E# K! t4 `, F6 J create("f2",(codeptr) f2,1024);9 i$ U) _: J l) E8 D7 f* H& x' | tcb_state();2 [8 Q- r9 r- x$ }/ C: p' V setvect(8,new_int8);4 u; z! ^ K E# V% z9 r swtch(); 6 x* Q& h2 u" D t while(!all_finished()); 7 ^$ e3 H% B( x$ e( T ?( z strcpy(tcb[0].name,'\0'); 9 w) m6 D- o6 j& [ i6 w: Q tcb[0].state=FINISHED; 8 x) X2 w; O) J+ w setvect(8,old_int8); ( k3 i' C' v$ ~& Q; d tcb_state();+ k. I6 ~6 [, r printf("\n Multi_task system terminanted.\n");+ u2 I* F2 L: \8 C$ g9 o };
    towny 该用户已被删除
    20
     楼主| 发表于 2003-10-27 11:58:00 | 只看该作者
    我不想灌水,也根本不想在这样的版块浪费时间!!

    本版积分规则

    关闭

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

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