下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]
towny 该用户已被删除
跳转到指定楼层
1
发表于 2003-10-20 12:59:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
create()  创建一个进程
; o. z0 ~) \' t% w) c1 K1 U要求:1 用c语言编写: |1 K# d6 t; \7 D" ^5 R, a
         2 程序+PCB(ID的内外优先权,申请资源)
% P: v, A5 e) O" y只需做进程中”产生“这一步。
! W$ H+ b4 t% q2 u+ |6 h以下是做了3分之1的范例:
0 _/ X5 k; n6 k' X% K#include "stdio.h"
9 R  Y9 y3 J9 w3 l( t) a$ ?+ I#define running 1 /*用running 表示进程处于运行态*/
! \: C$ x) g* X, A# W" S0 J#define aready 2 /*用aready表示进程处于就绪态*/ 7 M+ W  a1 ?% M2 j6 e% Z* k, c
#define blocking 3 /*用blocking表示进程处于等待态*/
8 h, l7 G2 l1 F, _#define sometime 5 /*用sometime 表示时间片大小*/ ( ?/ v: J( C: W% `# v
#define n 10 /* 假定系统允许进程个数为10 */
+ h3 ?+ U% X4 r% U  `3 X8 ~6 A% `0 u. t! u6 b* u  B, Z# B4 {" e, C5 R
struct
3 V/ X- ?- g6 W7 S: Q7 k7 o{
1 ]6 \* \; K1 h* _! Y5 X& Vint name; /*进程标识符*/ 0 u9 P$ \/ s) E; S# Q5 l
int status; /*进程状态*/
+ q6 Z9 n. s$ G6 T. n( Sint ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/
, E7 a8 N" [: s: R$ ^2 rint pc; /*进程现场信息,程序计数器内容*/
0 |' X8 D. C  J8 h0 C! W7 i: vint psw; /*进程现场信息,程序状态字寄存器内容*/ & i1 Y4 i* k" r" I- T: J1 J: ]0 D* J
int next; /*下一个进程控制块的位置*/
( S% {: d: l6 x}pcbarea[n]; /*定义模拟进程控制块区域的数组*/
2 I# c: ^9 @( k9 P7 k
) c  r: V) V% K. |int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/
1 k1 @$ W1 }* q6 @4 V3 C$ N3 Q# d2 `5 Z
int run; /*定义指向正在运行进程的进程控制块的指针*/
) O9 |% a( r% J: N' c. \struct
' M/ g+ k5 f% N$ Q; j7 H- V{ / j& {$ S1 l! W6 C; G
int head; ( A8 k! e0 p. ]
int tail;
( U( B* F# y* H}ready; /*定义指向就绪队列的头指针head和尾指针tail*/
) V) W, o: v2 [8 J2 c/ O# Iint block; /*定义指向等待队列的指针*/ % ?4 B. ^3 ]. E: {, g+ ~9 g7 g
int pfree; /*定义指向空闲进程控制块队列的指针*/0 ~$ M3 u0 m/ p+ e8 y, H- S- E

) }3 D) p- [6 ~8 O: y; u: z; m麻烦各位高手了,望帮忙解决一下,急啊!~~!!!!![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 | 只看该作者
    我的脑子都快调得暴了,能写个大至的,让我自己调吗?
    - {5 g) F5 x2 t8 O9 O( B  D5 _麻烦各位高手了!!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    4
    发表于 2003-10-20 22:40:00 | 只看该作者
    你给的头部定义的几个队列指针看的出来你是想写一个 链接方式 的进程队列,由于给得太粗糙和简单,我尝试了一下,反而觉得很不好写,想考虑的一些东西你的结构里没有,而考虑进去发现弄的复杂了就写不完了,所以很难办,结果还是没有写下去,给你我开始的一点筐架吧。
    8 q" k' W' y& w: u/ {' Z7 P/* the main site file */" `9 o- S0 ~7 F* Q5 z
    CreatePro(&ID){
    ! e. }' h% r- t: a& Y  GetFreePcb(&ID);  //申请一个空闲的PCB,并为其命名一个标识ID;7 a1 u4 I4 |) A, E) q- e
      InitResour(&ID) ;//为该进程分配资源(内存空间和工作区);0 g8 F$ V: c* r8 t. \( P9 q
    /*初始化参数*/9 N$ U2 V* J/ M2 M7 l  ~' o
       CallName(&ID);   //命名进程的外部名/ y$ q$ J% `/ G
      SetParProStat(&ID);  //记录父进程的ID和CPU的状态、" g4 d) v+ O; f6 I( l
      SetFL();  //优先级数、$ I7 l2 y. ^% l5 D
      SetHeap();  //进程起始地址、$ \; J- Q! t8 j5 m; G% E
      _SetSelfStat();  //设置进程的状态为就绪态
    8 ]% E' L5 s# _; r. w  A  AddStat_Read(); //将该进程加入到就绪队列中。) k% z' E7 @/ z9 V9 ]4 u( D( G
    .
    # D% [3 [4 G+ r. b4 u.+ z6 H- G0 t. o
    .
    ; P- q1 X' W- B.2 n) o1 P& E$ N( V0 N# Z9 H
    }8 c& |7 w, t: E' Y7 s7 U5 a. \- f
    我觉得上面至少要考虑的,但是实在很懒了,对你也许一点用没有,不好意思
    : x& v4 p, E! c! R+ C
    towny 该用户已被删除
    5
     楼主| 发表于 2003-10-21 12:04:00 | 只看该作者
    呵呵!!6 T$ P+ H. z5 g, [8 q" }
    谢谢斑竹的高见!!
    towny 该用户已被删除
    6
     楼主| 发表于 2003-10-21 12:18:00 | 只看该作者
    这是我自己做的一个版本,望斑竹给予指点!!!谢谢 ' O3 [: u+ K1 U8 C6 y % c* J2 f; c: i% n% m5 x' H: L#include& j4 @5 U) [5 b3 H6 v #include * t# @2 u; P; a' L#include , |: {2 ?9 |+ o( Q#include " {4 u) w7 S/ W1 r/ Y7 f2 x#define running 1 /*用running 表示进程处于运行态*/ 0 N4 N6 O: H6 W: S- t& @: N#define aready 2 /*用aready表示进程处于就绪态*/ 4 k- i& M" _$ R7 W#define blocking 3 /*用blocking表示进程处于等待态*/) ^& n6 |$ B+ h/ m9 c- S #define sometime 5 /*用sometime 表示时间片大小*/1 @0 f G$ a1 M$ Z. F" B1 Z/ o1 G5 _ #define n 10 /* 假定系统允许进程个数为10 */ : O/ ?- J3 C$ ~% {% [struct8 f% R/ H3 i' S7 `; v; i {2 {: S2 l! v% ?; s int name; /*进程标识符*/ & C: ]- j! O' ]9 F9 aint status; /*进程状态*/. K) u. d6 W$ B3 z! k int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/ + m, c6 x' f+ Q; X3 j8 `1 Y- ]int pc; /*进程现场信息,程序计数器内容*/ 2 Y" D' z$ \( ]" V3 p9 F% `int psw; /*进程现场信息,程序状态字寄存器内容*/ 0 S; {! g4 x* i" E+ Yint next; /*下一个进程控制块的位置*/ : t2 D: w! Z. h5 O! a}pcbarea[n]; /*定义模拟进程控制块区域的数组*/: z, [( t! o' o" o int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/4 v! k4 @) ~% y7 `+ M int run; /*定义指向正在运行进程的进程控制块的指针*/8 e8 C% o- O% Q J' H/ ^8 d struct 1 }5 z: K1 _: y3 d{3 `6 t. K. k8 C) C9 j, m+ k int head;9 N8 E+ m( ^& j& s int tail; / B! v4 d& v3 t) y$ E) I' V}ready; /*定义指向就绪队列的头指针head和尾指针tail*/ 2 ^% `( }1 U5 }0 l3 ]( r: jint block; /*定义指向等待队列的指针*/ # k( D7 y9 B f7 u8 o4 O- ?: _int pfree; /*定义指向空闲进程控制块队列的指针*/% v) x3 J- I) s: |9 n8 b main()! l5 Z$ b$ [+ u- `1 J { int gdriver=DETECT,gmode;; Y! i+ D& g# U$ Q7 H r int i,x,y;$ v; T0 E$ \) G for(i=1;i<=n;i++)4 r1 L, m( L: A" r {ready.head=pcbarea.next;} . [3 {) e8 n4 c( q# c# m initgraph(&gdriver,&gmode,""); * O0 x" T# I6 |0 B0 ~ setcolor(YELLOW);! v1 S$ s+ G, g' X7 ` for(i=1;i<=4;i++) 5 a4 w3 `. i; K- r" K; P2 i5 Z1 K { setfillstyle(8,i);4 ]7 A0 d& C0 \1 _ circle(284+13*i,190,6);+ ~; h2 e9 F, m9 c B floodfill(284+13*i,190,YELLOW);5 Z6 L3 m8 T' y F8 P3 H. F }2 V# V; f: x( x6 k6 T4 N" t A$ i: I setlinestyle(0,0,3);- Y9 p7 b H. V& O% f3 O circle(316,190,25);3 _/ p+ y. ~5 L7 w' g4 Y setcolor(5); % ] x M- M: ~, {9 l( Z settextstyle(3,0,4); 5 E- e/ E. N. ~# e! D( x outtextxy(35,311,"press any key to create objects!");% v6 [, l2 r4 _0 H getch(); / d- v* ^* Y$ ?$ H% R- O setcolor(YELLOW);: U3 r$ ]: c1 l' W! _ line(300,215,290,235);( S1 w- @1 @& I line(323,215,333,235);2 p" }5 A) O1 D6 `& i delay(50000);3 t) [/ o7 U! s$ Q, T setlinestyle(0,0,1);+ B% C8 R: l5 W T' k for(x=1;x<=2;x++)% [- Z- O' _/ v {setfillstyle(8,x);# L- b+ L4 ? r" c" v circle(267+13*x,246,6);0 c/ E2 J* R' l& M; m3 E8 T! o- R floodfill(267+13*x,246,YELLOW);4 v: X0 w3 ^! L1 K' ] }. d" L. G) f- J for(y=3;y<=4;y++) 5 ]+ z( f6 |% |! H, u! z. n; Y {setfillstyle(8,y); $ d4 b2 g$ m- z3 O& b circle(285+13*y,246,6);4 a h2 ~* F+ X6 j4 p* C# d0 v floodfill(285+13*y,246,YELLOW);& M& r' S* [ t5 J2 P# B }1 g8 C+ m& x1 z7 u setlinestyle(0,0,3);' S0 F9 u9 E* }+ U4 m circle(287,246,14);+ a/ l# @- s# r setlinestyle(0,0,3); 5 s' j) [! l) y( m* x) v- Z0 g circle(330,246,14);$ ?; s g8 y! T4 ^: s- D% ^$ K& E- _ delay(50000); 5 E" `5 O* t8 I& t7 z$ p line(281,260,281,280); 4 C$ R( G7 ?# o- F2 _7 }+ V1 O line(293,260,293,280);) z- C7 n B! c6 r% w M8 Z line(322,260,322,280); ; z8 k& M" x& v# b% O. v9 d line(333,260,333,280); E: c' p! o+ d delay(50000);$ R; o4 x1 I( Y1 w setlinestyle(0,0,1); ( ]4 U& G$ ]( d6 c4 o9 N setfillstyle(8,1);& @# n. T' m2 [4 W4 i circle(281,286,6); ! b8 N1 x, A- O! L, }6 e floodfill(281,286,YELLOW); 8 \' n. y. g! U. d2 U- g setfillstyle(8,2); 3 {6 `+ x/ Z( U- F$ v5 s" ? circle(293,286,6);, B7 T% f6 [, I- b* F+ O0 S& X floodfill(293,286,YELLOW); % q. V$ `$ c% d8 O; | setfillstyle(8,3);8 i, X: T- r- j) a" W* d circle(322,286,6);6 v2 C7 s9 {3 I# E" D( t+ }+ }, w floodfill(322,286,YELLOW);& `5 x& }0 r3 r; M$ t) r% {/ L setfillstyle(8,4); " M; ^* e: h8 d3 Z( z% Y$ j circle(333,286,6);- B3 s+ K3 F+ u0 e floodfill(333,286,YELLOW);, f6 a# H- V& Q% s( y getch();. S: W8 X$ n! _6 `9 E. r1 d closegraph();) E1 ^ N& T! w } 0 k! d0 z& @2 _ u, ]9 {# t* k C " E6 k. L; h) F( o" t: N; ~' M: U" T
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    7
    发表于 2003-10-21 18:58:00 | 只看该作者
    你在搞那么多画图干什么?你不是要做进程的创建吗??
    * a5 ~+ E- c- W5 C( k- d难道不是《操作系统》的‘进程’那一章进程创建??
    4 {2 j/ ~6 L6 X. w  m* f+ [( l到底是要个什么效果??糊涂了
    towny 该用户已被删除
    8
     楼主| 发表于 2003-10-21 20:34:00 | 只看该作者
    手误贴错了!# H4 [, |+ C7 u  S) {8 f- t
    不好意思!!
  • 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 | 只看该作者
    做了一半的半成品望斑竹指点!!- O& {+ V( r Y$ u% _# O2 `7 ~ 6 t9 V7 ?1 `3 [ int timecount=0; $ a9 v4 a9 _7 ~char far *indos_ptr=0;! P* E$ G* ^5 S# b char far *crit_err_ptr=0; ( k# w# J h2 X) T0 i; q% Kint num=0,current=0,i; / `( ^' V9 R @/ y, nvoid over();& m$ _% H+ M2 p6 v% g typedef int (far*codeptr)(void);4 V8 U) s5 | _. x3 A int create(char *name ,codeptr code ,int stacklen) ; [& W( ~$ P, X, \7 D{ : e/ i/ K ~8 O. R/ f4 m# `9 Uunsigned int * s;. H6 k! A: Y+ e" T# r num++;% K% W5 V0 X: n/ b# L6 B, E tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); : A3 O0 T2 T) ] tcb[num].state = READY;/ q: {( U* V) k0 X7 ~ strcpy( tcb[num].name ,name);' \1 L* J1 E# z* F1 O3 }2 G5 ^ tcb[num].ss = FP_SEG(tcb[num].stack);7 Y9 F3 v# d" ?8 W: x7 ] tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14);0 a* _0 \% k" R1 J# w8 {4 F *(tcb[num].stack+stacklen-1) = FP_SEG(over);8 O' _/ l4 ~3 e, P* v *(tcb[num].stack+stacklen-2) = FP_OFF(over);" ^* `; {4 @+ y4 p- Q; c- i *(tcb[num].stack+stacklen-3) = 0x200;% T2 a% E$ e$ v: X *(tcb[num].stack+stacklen-4) = FP_SEG(code);2 B- p; s H5 E *(tcb[num].stack+stacklen-5) = FP_OFF(code);0 V* ?( A. f( p# A5 o* u *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack); . F7 y; l) J' G. Y/ ^. q1 @: u* k *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack); 7 \: c9 o) D* C2 J return num; & Q( R/ D! s6 S- ?} ; 7 y- c+ l. {4 r% M* T' |void interrupt (* old_int8)(void); V. r5 S: n& e3 l4 [. _' Ovoid interrupt new_int8(void) q* Z, m1 R1 M. o {/ b" _+ u7 j" @! F3 g (*old_int8)();5 E. j: h2 a& ?7 k3 n. L" }& s timecount++;& |& ?, r* D( [: s$ b" z, I# P6 D) f if(timecount>=TL); , K) G# L2 h- X5 C! j2 N if(!DosBusy())3 }1 o' g& W5 p$ e/ b3 C {' z, G3 I( Q' E4 ` disable(); 4 B2 |; `# } f+ b& h tcb[current].ss=_SS; , n: a' v1 J$ k* P! M# i9 n7 N tcb[current].sp=_SP; ; ^# t* f2 l7 W3 f' u- n5 }) g: I if(tcb[current].state==RUNNING)+ b! O; ~, j$ z/ ]$ }6 h, p tcb[current].state=READY;5 _1 z5 }" m1 `1 B' K4 A2 ]& D T current=3-current;. m k$ w$ B, p! a9 O if(tcb[current].state==READY) i% D- R x: G# n& i8 N { _SS=tcb[current].ss; " q" M! S3 t: T; V" U9 I _SP=tcb[current].sp;6 ?$ C4 U: @7 _1 k1 } tcb[current].state=RUNNING;3 h! Y- v& i7 Q: U: _) ? timecount=0; , y5 J( p6 k# z4 a9 ^ enable();2 g. l) i( Q& h& O8 W8 K. G }" H& [! G K( }# \: f& e } / p3 ]6 p1 q+ M8 r$ I% A3 \}; ! P/ p6 v5 X" `( l, m; avoid tcb_state() ( l4 R& U T% \{+ C+ K0 d8 k+ N( _, H+ y( m int i;6 W t- P) U4 s' J- y4 A7 S/ M: V for(i=1;i<=num;i++) 5 J% c# V* n4 b printf("Thread %s is %d ",tcb.name,tcb.state);/ \) z& v0 d" ?4 O8 g };' T" P; I5 ~$ m6 z2 j( H int all_finished() ) x0 \1 k* t+ r- e{3 z4 z7 I j ^& Z3 o s& q9 P2 F int i;, Z5 n# Z. N6 U( e" J) A for(i=1;i<=num;i++)8 @7 ^/ u; e: M) S3 w2 S$ ?3 g if (tcb.state!=FINISHED) 4 d" v- t3 B+ U5 k. @- z return 0;3 g( E3 C( \( I% w6 G return 1;+ H! v6 Z/ [4 @ ( o( u1 @; z( c# K: z2 D( X' M3 ~) e};3 `% c% ]* N# d1 {2 u' T void interrupt swtch(void)/ ~' m0 l o3 b5 s { / U3 T0 X+ w8 ?# L! h, |; H% eint i; 7 X1 y$ r/ U- y5 Z" y! { disable(); 2 ? a6 t3 R; O+ ~ tcb[current].ss=_SS; % i5 J$ w. M. ~* E tcb[current].sp=_SP; : ?- L2 V' B1 j if(tcb[current].state==RUNNING) : N2 ]! _- a2 v' |& w0 J: ~ tcb[current].state=READY; : x9 g2 |3 f; |! o3 |2 i7 i for( i= current+1 ; i <= num;i++)0 k+ x' ~/ B+ W9 p { if(tcb.state == READY ): [/ ]3 S/ x2 T: ~ goto excute; 8 @8 R/ Q7 Z f' i4 U6 S }5 M- c0 j4 v! i2 a& ?5 V for( i = 1 ; i <= current ; i++) 6 u d2 m8 d! _" x R7 n: G { if(tcb.state == READY)0 f u6 R# u$ B4 n- s3 R goto excute; 9 Y' v" O0 \! t) d* N } & B9 G/ q- k& J9 M. E$ T i = 0 ; 7 _* r. @& [7 H6 t8 q excute: 4 u! i9 s5 ^# L$ b$ i' |# | _SS = tcb.ss; " M3 l# P+ n7 g" }% W _SP = tcb.sp;0 E; e; U. |4 W: a4 K9 q tcb.state = RUNNING; 9 O/ r# D& L* h0 ?7 w current = i;% |1 A( O3 h- m- j enable(); 4 C7 @$ N; Q4 k7 c6 |% _}
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    13
    发表于 2003-10-24 18:02:00 | 只看该作者
    指点什么呢?效率?方法?还是编程格式?
    ' I' R5 E6 A, M; n. v* w给一篇代码给别人叫别人指点?我从来没有过。
    towny 该用户已被删除
    14
     楼主| 发表于 2003-10-24 21:48:00 | 只看该作者
    操!/ |1 D/ C; `" b& `# r3 F  E
    搞什么脾气啊!一个斑竹有什么了不起的啊垃圾!!
    towny 该用户已被删除
    15
     楼主| 发表于 2003-10-24 21:58:00 | 只看该作者
    你要是不懂就让位!
    # \1 W5 o  N* L3 Q. Q. Z别占着茅坑不拉屎!6 f3 I" R2 n* J9 o$ |3 ^3 D- P/ D$ O
  • 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 { N0 e) T6 [) t 3 ], D% e: _) S #include 9 Z( Y. a2 D) Q: S5 V#include # ^% F4 q5 o1 t1 Q#include # z* C3 _) X8 R5 E, z$ D1 e/ l: b #define GET_INDOS 0x34 3 K4 j9 R0 C6 K2 {' _. p9 J! }9 E#define GET_CRIT_ERR 0x5d06 L+ P8 I9 a. ]7 a#define FINISHED 0 % k" _5 v' w7 R#define RUNNING 1 2 e. g$ e4 ?; p7 u3 A- u#define READY 27 Q h9 ^' `6 v4 a. ], J #define BLOCKED 3 2 H: t3 _5 {! a, t. Q9 a& d$ e& t g2 q#define Ntcb 8- L/ R" X. Z( U) o V/ ^* Q #define TL 1+ S6 N5 g+ d4 p e struct tcb{ F! y% T$ ^* s+ k7 S8 C/ { unsigned int * stack;/*堆栈的起始地址*/) G$ J$ o) f- Q/ D- F: n unsigned ss; /*堆栈段址*/ 9 n8 u# G: a! l' n5 D unsigned sp; /*堆栈指针址*/ ; R, t G! {8 r+ a; y char state; /*进程状态*/ % Y8 e" z+ ?; `- | char name[10];/*线程的外部标识符*/& |5 W6 t. w7 O$ x! H }tcb[Ntcb]; /* 系统允许最多的任务数 */; o7 ^/ M( q/ ~3 \ int timecount=0; % b# ~9 h3 \, V" nchar far *indos_ptr=0;; M6 g+ I; h% M char far *crit_err_ptr=0;% q q, H7 N" s int num=0,current=0,i; $ A4 U7 H7 T2 uvoid over(); ; c$ j% [# N0 m, c4 ~ ~typedef int (far*codeptr)(void);2 y- J3 F4 ?, q7 N6 ~ int create(char *name ,codeptr code ,int stacklen)) D! d7 d2 e' u {8 K. N, n+ ^% S+ ~, e3 M+ a unsigned int * s; ! W5 v5 S+ f1 P6 N8 Pnum++; 0 n. b0 C* t) [) v6 htcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); 6 V* w6 k3 P. ^) `& b, h0 Z8 t$ p, \ tcb[num].state = READY;$ t) Q. P1 g- o! S6 o- B! x strcpy( tcb[num].name ,name); % a* n/ Q1 s G5 t9 ] tcb[num].ss = FP_SEG(tcb[num].stack);- X5 [/ L: K% W& u3 ~ tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14); % a! {( ?) J9 T& ~. F; x *(tcb[num].stack+stacklen-1) = FP_SEG(over); ' E: h) j/ O4 } p' r *(tcb[num].stack+stacklen-2) = FP_OFF(over); * ^4 Q; }9 G# F; Q& J *(tcb[num].stack+stacklen-3) = 0x200; ! J4 S/ t7 O3 P, h# [( d *(tcb[num].stack+stacklen-4) = FP_SEG(code); ! o5 I( f8 k5 T8 T4 r6 _- N) O7 f3 k *(tcb[num].stack+stacklen-5) = FP_OFF(code); 9 F; E% n( c2 N% s% m! g *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);) Y' i' u: O7 b& E' c% |/ H *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack); / ^+ q% X/ A4 t# M8 G3 r return num;8 L2 S) W8 X; g5 n# v- i8 `, p/ P } ; ' m: T. D) E( s8 [" w* ` wvoid interrupt (* old_int8)(void); $ T# \8 C5 r( f7 Q void interrupt new_int8(void)0 F$ L, s! s. |- V( _6 I1 V ]2 J, w. y {0 w M, L _/ L: ?: C# k( Q" [ (*old_int8)();8 T( O+ x% x, ] timecount++; ! U8 ]! p! z: O/ r if(timecount>=TL);) G+ W2 X) L$ W. U if(!DosBusy()): J" r9 I% g) A6 y" Q8 Y {# n1 l+ U- u( n% L# U4 D, R disable(); 1 H' ^' x @. j+ z3 Z* e2 J3 ] tcb[current].ss=_SS;2 y+ S) V2 ^% O0 r tcb[current].sp=_SP;% c& ^# k& z/ H/ H if(tcb[current].state==RUNNING)* W( m l8 ]% s. ]3 t tcb[current].state=READY;1 L/ l5 L5 ?/ d" }+ { current=3-current; - d8 x n; m5 a1 Z! T0 u& J; Lif(tcb[current].state==READY) g/ h) N$ A& s& n0 s { _SS=tcb[current].ss;$ B( F1 }# p8 S, z# U _SP=tcb[current].sp; 1 x: Z6 f S) _* R4 S" k tcb[current].state=RUNNING;4 P: p. w W8 P timecount=0; : m* _0 }, w* I+ p A, O# I enable();$ t( a+ G+ Z9 l }; L0 T% y7 R3 U+ X } / d8 c% o8 N: _: n}; " F* `5 `) H# U# R$ H+ f; qvoid tcb_state()$ H8 c! a' w' ^4 a* g { * m1 G1 l e1 d) u! V int i;( i/ y. y8 O V for(i=1;i<=num;i++)) @5 u+ y% b% t printf("Thread %s is %d ",tcb.name,tcb.state);/ O" y; |8 x$ j! H8 x, q" B$ i }; . I# X4 P- Z1 Nint all_finished() " B( K4 `' ^% \6 e" I. Q" x{, [/ {6 A: ^8 C- } int i;' U/ x9 p+ G y Y( v for(i=1;i<=num;i++) : C) g7 F) u" ?5 @% J1 f if (tcb.state!=FINISHED)+ S$ u* b' R1 L8 N; k3 E9 _+ I9 X return 0;5 F+ ?7 o, k: P2 y return 1; 3 Q3 j# S3 Q. l9 ?; j% D 7 ^$ |8 v7 M* C5 Y7 {};+ ?) [- V* W" e3 J9 K void interrupt swtch(void) * o& D6 t y5 l' }( t* r1 e{7 M: _: c- q7 |! N* K int i;: F7 O+ v* e3 Y! u1 X( P$ i8 _ x* E3 F disable(); 7 |, v5 ^1 Q2 K8 i2 b, f; Q tcb[current].ss=_SS; - _/ U6 x. C/ R# S5 X* g tcb[current].sp=_SP;$ a2 E% o# A4 r: ^# y3 [; X if(tcb[current].state==RUNNING) / _! v& L1 K3 A4 d8 i tcb[current].state=READY; : ]( Y5 L7 }$ x; f/ @* D, V for( i= current+1 ; i <= num;i++)" @5 m( {3 y \) }0 e t' z& Q { if(tcb.state == READY ) 7 ~9 q) }) S6 F* G% G goto excute; 0 O. L+ G4 P4 e" {) ?4 T1 V6 ~ } # h Y* P. N, _! f' ~" k6 w" { for( i = 1 ; i <= current ; i++)* D% c, B' Y! B7 H- [ T1 q { if(tcb.state == READY) . \4 t* A/ A( M$ s S" I) }2 f goto excute; $ u9 k4 K V- Y/ S } / J r- u8 T- B7 U: u# y. Z i = 0 ; % m+ e/ a- O9 d6 j& s excute: ) d; i" k/ E) q8 [- M _SS = tcb.ss; & c& b* t$ I x6 v" _ _SP = tcb.sp;. F* q- y5 ]1 f, w$ P( d3 [4 E tcb.state = RUNNING;6 ]8 Q9 Z3 r3 Y- [+ u current = i; ) S# B X* D* D) A% R& B* C enable();) d: J! K) }8 [6 N5 _ } , q8 i* J! G# f4 v, h' _# l4 J/*-------------------------------------------------------------------------*/ 3 c9 @) m$ N1 D- ?2 jvoid over(); h) T/ Z# Z# I3 V. M' t1 T" Y' c( B {6 a$ F# @9 W1 V1 v1 X) u int i=current; $ s D, T: y4 u& v% l /*strcpy(tcb[current].name,'\0');*/1 ?' Z3 [ n$ _1 u( d, D1 ]$ z tcb[current].state=FINISHED; / U, _! s+ w$ V$ e$ I7 a9 I4 A) { swtch(); 2 i& ^2 ]6 Z: @ I free(tcb.stack); ; y2 \2 v# \5 N: Y+ m M}; 6 i5 n$ {& M6 w( r! t" ~$ a/*---------------------------------------------------*/ $ V% F5 Y5 r+ j+ i; jvoid InitInDos(void) : K- Y# y/ \' o/ l- C0 f2 y{6 r5 y1 L) ~5 ^' c0 B8 ^9 t union REGS regs;) F: w: b! o0 b% C' |1 b, L struct SREGS segregs; + ?. y6 {& W/ p, r. M /* get the address to INDOS flag*/; X! x3 N4 I6 M1 ]0 S K2 D: I' r' k regs.h.ah=GET_INDOS; . k- j+ G' m6 ^8 b: {- x; H( ]' C intdosx(®s,®s,&segregs);; C4 A- h. Y, h indos_ptr=MK_FP(segregs.es,regs.x.bx); 9 b% E3 z" |7 m. b2 R /*get the address to CRIT_ERR flag*/ 6 B7 m+ ?& W+ { u if(_osmajor<3) - \2 g3 X& ?$ a" t% W$ T9 y crit_err_ptr=indos_ptr+1;% q' C {* R7 s' m! b' B; d else if (_osmajor==3&&_osminor==0)+ q; w2 Q. K; U& c crit_err_ptr=indos_ptr-1;7 P% _2 t: W0 A1 |1 [! @3 }: t- q else * J) V, W, c1 g4 f { 1 z4 {1 s6 }$ b0 ` regs.x.ax=GET_CRIT_ERR;& Q. n7 L$ W( V# u; @ intdosx(®s,®s,&segregs);7 P& F! ?0 N$ L. g* j/ n! ` crit_err_ptr=MK_FP(segregs.ds,regs.x.si); & d4 H. n. D) j0 X/ O& s3 f7 f1 ^- U }: ~# u2 V8 a1 j Q0 U8 X; Z };1 f' q% a) Z2 W3 T4 a. H! a int DosBusy(void) 8 ]$ o% t4 y, I B( w/ _) f7 b6 y{7 M; P4 n7 W5 J" O0 V5 b$ p if(indos_ptr&&crit_err_ptr)9 r: }8 u9 h+ m( G- [ return(*indos_ptr&&*crit_err_ptr); 6 S4 H; K# y4 x else + a9 J1 N6 [ u& {/ _% D& x: o6 m0 m return( -1);- [$ r* f! R; C) l9 O" w! ? };! U4 d8 q/ N8 W5 }- P void f1(void)6 K; v3 O3 c- E+ v {" ]0 [" R! v) J2 ?; d int i,j,k; ! {5 q) Z0 P$ _ for(i=0;i<40;i++) & {2 r- c6 y8 I% V: M4 d7 w2 F { 8 Z5 I" L U) u" i9 R8 m) ]% P* m putchar('a');9 n* v& {: S' G2 t3 M, Z+ R6 d4 G$ e ! r$ S; G6 G2 v- O0 } for(j=0;j<1000;j++) * J: y/ |6 T' }3 v for(k=0;k<100;k++)' j7 c# M8 o; c7 Q: x7 V' z ; - K, y, D. E; e( e, j) ]- I }; K H* n8 l2 C4 z7 G9 {7 J }; - V) R0 P0 M' Q+ Mvoid f2(void) ( R4 R$ g& B5 w8 h{ , h. x* S* R0 { int i,j,k; `8 F: r( X( W& w% l3 S for(i=0;i<30;i++)+ |4 ^; R6 p+ h { 8 }' Y/ Y* }( g- G2 U putchar('b');6 E1 b; C- s! j+ g, N3 f" Q for(j=0;j<1000;j++) / H% W8 P9 V7 u9 v) g for(k=0;k<50;k++) 0 Q5 ?& v H5 a$ ]8 z2 U8 u( {2 Z l ;0 H# w% y9 L* b- ?# s: Z. Y } . `, `0 Z5 e- h1 _6 X H# w};$ V* Y0 t v4 j /*------------------------------------------*/ 8 R2 P+ K6 c5 w& ^8 }& J" @main()2 ?4 I, B& d+ t$ A; K/ y {' w# w6 ?8 K* I# v" o' T2 v InitInDos();$ ]: Q# N( E! g C; f, w! i& A old_int8=getvect(8);7 F3 a0 i& h# \+ o strcpy(tcb[0].name,"main"); / ~2 k. O- I. X: F9 @ tcb[0].state=RUNNING; " S. c6 _% U: I# |0 z6 U/ \ current=0; 3 Y8 }7 U6 [4 o" Z, z! Y$ }9 s create("f1",(codeptr) f1,1024);+ R/ ]. B( c2 t' U/ ` create("f2",(codeptr) f2,1024);" n% b( n( ]9 T: c! k/ x tcb_state();& ^) p' v4 D& I; A/ H* H3 U$ p setvect(8,new_int8); ! ]% H4 j2 |$ p3 G& [ swtch();. P; ~2 d# U3 c. ^3 `& W while(!all_finished());" y7 r4 N* v+ z/ h: Q strcpy(tcb[0].name,'\0'); . n# h9 g) }: L& H5 S- t8 D% \/ ^ tcb[0].state=FINISHED; 1 P" |' F3 q1 P9 I7 y: | setvect(8,old_int8); 5 R. O- @; }# {: a1 H. }7 u tcb_state(); - n) k* J; G2 u printf("\n Multi_task system terminanted.\n");7 M. u+ i! v3 T+ J( [ };
    towny 该用户已被删除
    20
     楼主| 发表于 2003-10-27 11:58:00 | 只看该作者
    我不想灌水,也根本不想在这样的版块浪费时间!!

    本版积分规则

    关闭

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

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