下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]
towny 该用户已被删除
跳转到指定楼层
1
发表于 2003-10-20 12:59:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
create()  创建一个进程4 v8 B1 [% q& Q
要求:1 用c语言编写
, R  r) |/ Q; @$ H# n" h+ l- m         2 程序+PCB(ID的内外优先权,申请资源)
' E4 }; S' l& ^0 `只需做进程中”产生“这一步。
8 O' B/ T: ?* Y8 h以下是做了3分之1的范例:
5 c, A3 a9 p. k- J$ L9 \, j#include "stdio.h"
$ T5 J0 i* V+ d4 \9 i& ?; Z% z#define running 1 /*用running 表示进程处于运行态*/ - Z, k; O+ p2 a2 C! _% b2 R% o
#define aready 2 /*用aready表示进程处于就绪态*/
* h9 F6 O6 _5 p& c- t#define blocking 3 /*用blocking表示进程处于等待态*/ * O, X8 d$ Y9 L: C, e7 [
#define sometime 5 /*用sometime 表示时间片大小*/
( B# b$ R& x9 _/ A8 [8 T# C/ k#define n 10 /* 假定系统允许进程个数为10 */ & }4 b& X- u) e* X! ^0 @1 T

: x  g3 @0 m6 t4 p6 Tstruct 5 _7 G( `) k; h4 z( c
{
/ z$ Q7 t& ]& y, y( l# ]0 fint name; /*进程标识符*/
  f8 j  e# j$ \6 n# dint status; /*进程状态*/
  p% {7 h' S0 B. d/ ~int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/
' V" S, O' s/ m2 M* a% eint pc; /*进程现场信息,程序计数器内容*/ . j1 J: ]% u+ T& S! n
int psw; /*进程现场信息,程序状态字寄存器内容*/ 2 t  F+ C0 o0 d" F  U
int next; /*下一个进程控制块的位置*/
' o# @9 f" g- I$ L: W}pcbarea[n]; /*定义模拟进程控制块区域的数组*/
8 Q8 T$ c: t' y
0 c) \2 M# u4 ~+ m  S1 H  o* h0 r. x5 yint PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/
/ H3 m/ t0 f$ O$ g( f5 U, V2 ^
4 W/ h: I  J# ^3 |$ c* Eint run; /*定义指向正在运行进程的进程控制块的指针*/
. ?: h) T( H5 R1 estruct
- ^. b/ Y: A  A2 k{
* r! o- d+ e. R6 n7 p$ g9 Q! ]int head;
6 S% W, Z# @) e" a8 d6 b( Sint tail; 3 A2 D$ t. o! e. F$ m5 r
}ready; /*定义指向就绪队列的头指针head和尾指针tail*/ 3 o2 [+ O6 ]+ h
int block; /*定义指向等待队列的指针*/ . B. e+ ]" T8 U5 N
int pfree; /*定义指向空闲进程控制块队列的指针*/
9 k4 Q1 \8 V' n  U0 F7 P- w, j; ~9 C8 H0 S9 C/ e" C
麻烦各位高手了,望帮忙解决一下,急啊!~~!!!!![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 | 只看该作者
    我的脑子都快调得暴了,能写个大至的,让我自己调吗?
    9 u! l( M" q# M& u麻烦各位高手了!!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    4
    发表于 2003-10-20 22:40:00 | 只看该作者
    你给的头部定义的几个队列指针看的出来你是想写一个 链接方式 的进程队列,由于给得太粗糙和简单,我尝试了一下,反而觉得很不好写,想考虑的一些东西你的结构里没有,而考虑进去发现弄的复杂了就写不完了,所以很难办,结果还是没有写下去,给你我开始的一点筐架吧。
    # }/ u9 s  I0 \9 q$ }/* the main site file */
    - g! M* n. ~! k! dCreatePro(&ID){
    ( c* \: J& b1 o! o0 q2 P  GetFreePcb(&ID);  //申请一个空闲的PCB,并为其命名一个标识ID;2 v2 V  g  A, W5 n1 E# s5 \
      InitResour(&ID) ;//为该进程分配资源(内存空间和工作区);
    - C8 r8 {7 a# y; g( u9 U8 d/*初始化参数*/; a* b6 a. G, x- E  I
       CallName(&ID);   //命名进程的外部名3 @/ A" C: K/ j
      SetParProStat(&ID);  //记录父进程的ID和CPU的状态、
    . h( X3 u  l- ^* V0 K# E4 h5 C  SetFL();  //优先级数、
    0 t/ `4 O7 m6 V9 Z. s  SetHeap();  //进程起始地址、% d/ ?: W; i# U0 n/ N" ]
      _SetSelfStat();  //设置进程的状态为就绪态
    5 B2 z+ N- M# H% e) d' H  AddStat_Read(); //将该进程加入到就绪队列中。; A3 a7 j. Y  u, v! ^
    .( ^3 L9 O9 C& Y& p; r
    .
    ' G, E) @0 o5 V. p! X. T1 i- z  J- D.
    3 w  w2 D$ s# \4 p) S' k.) h$ q' t- S) D
    }$ ~' G( p9 B2 ^2 ]: Q
    我觉得上面至少要考虑的,但是实在很懒了,对你也许一点用没有,不好意思
    ' O0 o4 I3 a2 F0 y( W
    towny 该用户已被删除
    5
     楼主| 发表于 2003-10-21 12:04:00 | 只看该作者
    呵呵!!
    ( K! `' T9 S: m; `: o% t7 a  T谢谢斑竹的高见!!
    towny 该用户已被删除
    6
     楼主| 发表于 2003-10-21 12:18:00 | 只看该作者
    这是我自己做的一个版本,望斑竹给予指点!!!谢谢 4 v2 ~1 `- _( `7 C( L 9 w& u$ a' }9 B# K' w#include/ T2 `: E* G+ i& B; H# A1 u5 N #include2 c1 b1 }- O9 w& w+ a! t9 M6 W #include - O6 m, L6 j5 U4 ~ c+ n$ c#include4 s1 g$ v- _' [ d8 _4 _) T #define running 1 /*用running 表示进程处于运行态*/2 {) d) h4 ~; w4 z/ v: I+ _ #define aready 2 /*用aready表示进程处于就绪态*/" m2 C& v2 }# @" k* H) W #define blocking 3 /*用blocking表示进程处于等待态*/" t V7 m5 L. j# B% P #define sometime 5 /*用sometime 表示时间片大小*/ & z4 H" K4 f6 Q0 @9 }9 J! C/ L#define n 10 /* 假定系统允许进程个数为10 *// ~4 h4 p1 k- I struct / j' W0 G7 T$ S1 X{$ t3 x, c; W3 Y4 X( ~+ B1 ~ int name; /*进程标识符*/4 r0 R! a7 z4 x; R int status; /*进程状态*/$ u- `" J z- P- i* {% o! t int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/ 8 v) F' i( T/ o) Cint pc; /*进程现场信息,程序计数器内容*/ : @. Q' j. f+ o- q. P5 oint psw; /*进程现场信息,程序状态字寄存器内容*/ : s. U: ?, `7 P- p" A1 k- eint next; /*下一个进程控制块的位置*/ - f. f/ E7 E, j+ y# y1 q ]3 m}pcbarea[n]; /*定义模拟进程控制块区域的数组*/ - W7 W$ F: |/ u) T' y# ?int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/) p; D4 T9 u% I$ a( _ int run; /*定义指向正在运行进程的进程控制块的指针*/ p% o- f# K/ Y# x+ w. H8 R3 W0 x+ n struct0 }* F: ^) F5 b {7 V8 e0 v0 Z# ?1 r7 v7 h: O int head;9 |4 W6 z% {! d& z int tail;; |0 } b0 Z% z$ C, k9 V }ready; /*定义指向就绪队列的头指针head和尾指针tail*/ 1 r1 `( D$ s* |8 D( y: M- g! iint block; /*定义指向等待队列的指针*/) a% _- Z/ c/ }1 ]' ?0 {$ c int pfree; /*定义指向空闲进程控制块队列的指针*/- N9 G7 ?, y9 {7 ^* z main() % f% @& u, u' D2 e. _4 N{ int gdriver=DETECT,gmode; 2 p) X5 c2 Q3 B1 f int i,x,y;/ b. g( J2 @8 [ for(i=1;i<=n;i++) C# S* ^5 J# g+ v) B. S {ready.head=pcbarea.next;}* M$ X2 y {/ o( d% x% @) e initgraph(&gdriver,&gmode,""); ) V& l+ `& O, W' A setcolor(YELLOW);9 [( S$ Y0 {: N2 i& @) V6 L/ | for(i=1;i<=4;i++)3 \7 i$ A, g! }% T { setfillstyle(8,i);0 g0 F$ J, O4 G8 _$ T- F0 F circle(284+13*i,190,6); $ w5 n" z) o8 G- R8 w) Z3 _6 n floodfill(284+13*i,190,YELLOW); * j- x$ w4 w" A0 L( [ }6 G5 V" x5 E4 {1 w9 I7 w setlinestyle(0,0,3);. K1 c' p$ h: l: M/ Q circle(316,190,25); # C! x! B" W8 V1 {! ~0 r0 v setcolor(5); 6 C6 i# \, W1 R' ^6 H5 M settextstyle(3,0,4);$ ^3 q4 j( ~( O- P5 `. C: B1 q: j) H) V outtextxy(35,311,"press any key to create objects!");* h8 O4 t) M$ y+ \. D6 ] getch(); 9 r( H. t3 {& W+ E0 {8 A M setcolor(YELLOW); ! L" K5 A! T4 I* i4 I# \ line(300,215,290,235); ; B; e! d9 R$ b. L4 ]0 _ line(323,215,333,235);3 U, b; h' P2 Z: U$ W6 B$ p' s delay(50000);: W! k( w8 g4 z! q0 p% \ setlinestyle(0,0,1); . Q# n0 B7 G V q, B for(x=1;x<=2;x++): j! z3 j ^1 }& @# G9 ^1 B n2 R {setfillstyle(8,x); ) |( d% J6 q) ~* B. F8 X circle(267+13*x,246,6); % L! c0 h! h/ n$ D. u5 m floodfill(267+13*x,246,YELLOW); $ I! I3 u. q0 \ }2 V0 n8 S2 z, w. j$ q for(y=3;y<=4;y++)- V. w+ E$ s% V8 K1 e {setfillstyle(8,y); 7 @ x- G) w% t. q circle(285+13*y,246,6);) p3 c8 u7 X1 h: W2 K! p floodfill(285+13*y,246,YELLOW); ! {* }4 T6 f; P9 I( \% U+ o# s3 P }" @( w" }) ~/ R' P) A setlinestyle(0,0,3); 1 C4 U( _6 E) M, T circle(287,246,14); 2 l: R' x' z' b: z- h setlinestyle(0,0,3);& D* \8 {! E! _1 X circle(330,246,14);; J( B% D) X9 I4 m/ H4 q5 a delay(50000);9 ~3 z& x9 ?0 s% x, I6 Q/ C, P line(281,260,281,280);9 i6 k. R. |1 E6 l$ ~ line(293,260,293,280); * _: r7 {& O: s: ~ line(322,260,322,280); 8 `3 G. y2 h2 i line(333,260,333,280); 1 ^% A* S, B" B3 ^ delay(50000); 9 j0 `6 h% h8 r9 L" E; E, r setlinestyle(0,0,1);. B# C) U# x8 P, i setfillstyle(8,1); 1 `" o2 y+ g4 T0 X% Z P/ H9 `8 v circle(281,286,6); 1 `2 v$ [5 W% {% h8 t9 o+ a floodfill(281,286,YELLOW);; P* X$ ]$ ^, q1 h setfillstyle(8,2);: G5 l0 U; f6 R circle(293,286,6);" W4 s" i$ A# L; `# [: E floodfill(293,286,YELLOW);) W9 |6 J" I, c' w7 f setfillstyle(8,3);9 I. n3 _7 m) f circle(322,286,6); 7 j7 b+ O$ @1 u" m& k floodfill(322,286,YELLOW);2 I% p' a3 n1 L setfillstyle(8,4);; C9 [" k5 u) H1 b" j circle(333,286,6); ; \6 x" l- w; e; {/ ^$ N/ M3 K floodfill(333,286,YELLOW); 6 N. R! B0 P! X8 W* o1 j getch();$ F# c' b4 G4 K/ r closegraph(); / X+ f, S! ^( M; c _0 n: q+ J8 l L} , f; c# t0 N( j; l f: K" h Y * O8 r+ q' Y0 ^; I$ I$ u4 l % F) ^: Q% `! W2 k( B" \. [
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    7
    发表于 2003-10-21 18:58:00 | 只看该作者
    你在搞那么多画图干什么?你不是要做进程的创建吗??$ G- p/ E" F; m+ u
    难道不是《操作系统》的‘进程’那一章进程创建??5 f9 f! H5 n0 t0 p6 ?
    到底是要个什么效果??糊涂了
    towny 该用户已被删除
    8
     楼主| 发表于 2003-10-21 20:34:00 | 只看该作者
    手误贴错了!7 r5 ~# Q! ~/ O$ L! b: }2 r' y9 A
    不好意思!!
  • 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 | 只看该作者
    做了一半的半成品望斑竹指点!! % D6 I7 X7 c6 `& L. _4 L: x' m1 v $ {( M G' f& S2 M, Aint timecount=0; ! o0 I& S. X; w$ ]char far *indos_ptr=0; 9 y$ l- o, B" |7 G, v. T* J. I! Jchar far *crit_err_ptr=0; * f3 P1 ^0 c4 E7 K6 z( Jint num=0,current=0,i; ! Z: M" z/ W, n: jvoid over();, H k! W4 Q- F typedef int (far*codeptr)(void);# ~# g2 e- \& f* I. O h2 c6 Q int create(char *name ,codeptr code ,int stacklen)0 p- l; S& @1 Q% p: n- S {9 x3 q t7 t, b, S$ c* G unsigned int * s; * P3 P9 e1 N" m: tnum++; ; J/ {1 p, m. G" o& I( ~" N; e4 _tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); 4 ~/ R* ]& N6 Q$ ?# T6 F+ `# D) K+ O" b tcb[num].state = READY;6 S9 F" V* a* S6 J3 k4 B- ~. k strcpy( tcb[num].name ,name); 2 l$ s! e& f8 t0 A. T$ f9 Q- \ tcb[num].ss = FP_SEG(tcb[num].stack); : r) a; F. W( v$ Y+ t) t tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14); 4 I8 U, Z" `4 i m* C *(tcb[num].stack+stacklen-1) = FP_SEG(over); 7 @0 z0 d, v6 L g& U *(tcb[num].stack+stacklen-2) = FP_OFF(over);, d4 n* P) g- Q3 u; G *(tcb[num].stack+stacklen-3) = 0x200; 2 i4 K6 ]6 A2 f: _3 L) l *(tcb[num].stack+stacklen-4) = FP_SEG(code); : M) V! \3 I* Z. }% K% c5 {- E *(tcb[num].stack+stacklen-5) = FP_OFF(code);0 r: F9 R( |+ p% Y' J& K8 u8 n *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);/ D, q" A% I4 x3 V2 }5 ? *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack);, W; U1 K! W: s: k& ^) } return num;$ |, b: M- l9 C u y! X } ;% H. \- j1 b' n3 W5 u3 j; m void interrupt (* old_int8)(void); ( \" C/ w5 ~8 m, V/ K; hvoid interrupt new_int8(void) : F# ^3 V* L$ Q, o6 p, o1 H{. c* r& T6 @6 Y9 d+ M" o" `/ i3 v (*old_int8)();1 v# H, x3 \* ] P0 ~5 Y* c timecount++; 7 K" c8 @: H! z( O. K/ F if(timecount>=TL); I3 R. r1 j- c5 J d9 C: S3 S5 Q$ j' j. t if(!DosBusy())4 q1 {& Z; \+ X( | { : b/ ~) c" y- \0 o, W disable();) ~- l! D# t; D: V- A tcb[current].ss=_SS;8 G9 W- i; X O& ?9 \0 ]7 k& A tcb[current].sp=_SP; ) _& Z% `2 \. ?% s if(tcb[current].state==RUNNING)+ n+ U! S" V0 R f3 g tcb[current].state=READY;- n% N9 ]4 N4 r6 K. N8 H1 o current=3-current; ^3 V$ s4 s* E1 g1 n! iif(tcb[current].state==READY) $ _9 F7 x3 t9 M& }% J{ _SS=tcb[current].ss; + _3 B( b& ^+ ]5 D" i& h5 G3 G$ D _SP=tcb[current].sp; + O+ V: k3 N- D1 R P% r; T, B tcb[current].state=RUNNING;9 i: K& K2 L' l R, y7 L# S timecount=0; V6 x- s/ h$ o9 m9 |" S, o) R enable();7 u9 K) T' A8 P- G5 y) K3 B } $ A) S9 g' ^" n8 I1 g5 _}' \0 }7 T. X1 e- r/ X% E5 x& q) h }; 8 C" \" @- o# K( j4 |: B1 Bvoid tcb_state() Z, u9 R1 c) y4 y9 C4 C8 K{ % ? B' f0 l# [3 a1 y! ` int i;$ |! S3 z8 n0 z' Y+ w- V for(i=1;i<=num;i++)0 H/ v0 C) T1 u) H* [, ^0 [ printf("Thread %s is %d ",tcb.name,tcb.state); ' v4 f4 q; S% y; ^$ y}; 1 I( I5 Q+ P8 a2 Wint all_finished() ! }$ `8 y H( q. C% J% k{ 5 E. n t+ S e$ \. |9 O6 Q9 y, j1 V* [ int i; ; c4 P2 J" D$ i* L! i/ K* T3 f5 a2 _ for(i=1;i<=num;i++)6 g0 z* x$ t+ g7 @ if (tcb.state!=FINISHED) & O: e0 i: i7 \- L" \ return 0; & s% [2 p1 o4 N6 r( t" m" G return 1; 6 ?, z9 b$ m% N* z. P2 J4 Z / W. C8 M+ I) l& g; {5 K/ s}; . _5 y+ M1 g( v! x: A: Fvoid interrupt swtch(void) - ?3 h8 X! T0 W% {{/ M/ `& i: R& u* I, g& B; p- G int i; 1 i( T' p7 m8 X0 M disable();5 S+ A, t! D8 v% U' `! R8 \# h tcb[current].ss=_SS;( _/ R. Z( t* r( T+ m; p; z tcb[current].sp=_SP;3 R/ T4 q+ \2 @ if(tcb[current].state==RUNNING) & R* y4 F# j( s( P& j: s! [! K: M tcb[current].state=READY;% g; _8 h* r N; k for( i= current+1 ; i <= num;i++)2 {( _0 B, H1 V1 s { if(tcb.state == READY ) 1 m4 @! f' E. G" b% D goto excute; 2 t3 C. l% q4 X! q" M }! s# Z/ ]2 C2 x& E1 P7 K+ h for( i = 1 ; i <= current ; i++)' n2 u/ b ], L9 _ { if(tcb.state == READY)4 g0 ?% Q# a, V+ A* Y goto excute; ! ~* E- A9 }4 Y9 d6 s2 B) p/ B' x4 M } 8 A# E4 P& e3 a [, \! y* N i = 0 ; - Z* @* o) v' r' V excute: $ ^0 g3 ]/ |& ` _SS = tcb.ss; , S1 ^2 c* R9 k$ S3 b0 ~% t) K4 P7 J7 z _SP = tcb.sp;" W7 t9 x! w, J; J tcb.state = RUNNING; 8 B% u- p/ K: o$ f' v. H$ } current = i;3 z5 M) y5 c$ ?4 m' i R$ n* U0 V enable();& \; i' n1 |. W* h9 j& R: T }
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    13
    发表于 2003-10-24 18:02:00 | 只看该作者
    指点什么呢?效率?方法?还是编程格式?# k( s' p8 T% L  k1 e
    给一篇代码给别人叫别人指点?我从来没有过。
    towny 该用户已被删除
    14
     楼主| 发表于 2003-10-24 21:48:00 | 只看该作者
    操!# D9 F1 L) g" |; Y+ C- w
    搞什么脾气啊!一个斑竹有什么了不起的啊垃圾!!
    towny 该用户已被删除
    15
     楼主| 发表于 2003-10-24 21:58:00 | 只看该作者
    你要是不懂就让位!
    2 }0 T1 }' G$ `4 \6 ~' R6 _0 b; ~别占着茅坑不拉屎!7 s0 N( A( F8 [) @) 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 | 只看该作者
    完成了你们看吧!* O: {8 [) A) O s ) E5 D/ c. y2 k* y' t #include 9 a6 |6 m5 v1 G6 O; ~' D5 r; J#include 4 C6 `# ?6 ?1 ~3 a4 [0 @4 I#include ' A) v6 W: _2 W #define GET_INDOS 0x34 1 d0 r# M; P: m/ e, J1 y/ @#define GET_CRIT_ERR 0x5d068 x- n4 n" d- x. ]' g #define FINISHED 0* o+ T& U5 G6 A$ m% l #define RUNNING 1- r& q1 S# v7 L+ m0 J _ #define READY 2 - H# q4 I0 V5 h, |#define BLOCKED 3! r: o' I$ n3 `4 q7 l #define Ntcb 81 I# n. x/ B; j' | #define TL 1 $ D/ o) g+ ~, Gstruct tcb{ ! M+ p4 a4 H8 c. ~1 I unsigned int * stack;/*堆栈的起始地址*/ 7 O; P1 i! {( x9 y unsigned ss; /*堆栈段址*/, D8 n6 {8 }- H2 c: U$ L- ` unsigned sp; /*堆栈指针址*/" l3 q5 r8 N l' H7 A. h t" a6 \ char state; /*进程状态*/6 {$ s, a; d5 q* G char name[10];/*线程的外部标识符*/& c1 K& a5 ^( } }tcb[Ntcb]; /* 系统允许最多的任务数 */0 H0 }4 M- J4 j+ m& ~5 V int timecount=0; 0 V2 r$ u! X& j) C2 Jchar far *indos_ptr=0;$ {8 V$ {6 F: ` char far *crit_err_ptr=0;4 s' b& f$ B3 c8 V8 C7 }* A int num=0,current=0,i;: K% B( E0 T5 I# G- H- ]) \ void over();4 Y- ]5 M! ^$ l: ]* f. m, z typedef int (far*codeptr)(void);9 L. Y$ x) W2 u1 B% f int create(char *name ,codeptr code ,int stacklen)! O' M* U- b- W' L3 }5 Q { 8 H$ n2 Q* h) ?: o6 O* Sunsigned int * s; 1 s9 F+ r4 h/ E2 C2 Lnum++; ) h" J, [0 k2 q+ b; `7 Stcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int));( j2 g, E% X9 L3 p tcb[num].state = READY; 3 A3 X8 ]) U# G2 V( V! i strcpy( tcb[num].name ,name); 5 K# B. @! {3 e/ B8 B tcb[num].ss = FP_SEG(tcb[num].stack);9 ^! O+ J X% {6 @4 d tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14); 6 c+ O/ A# n; @6 E *(tcb[num].stack+stacklen-1) = FP_SEG(over);' X$ x1 L! l' P. z r *(tcb[num].stack+stacklen-2) = FP_OFF(over); 5 b, i3 L8 E. K& D1 C% e *(tcb[num].stack+stacklen-3) = 0x200;9 s- v3 w# M" U0 ] P% r *(tcb[num].stack+stacklen-4) = FP_SEG(code); Y% S7 ]* h6 m2 p8 i *(tcb[num].stack+stacklen-5) = FP_OFF(code); - N, {( `! P( e: E% _9 w8 h5 a *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);' @. ~# {. j4 w7 M9 u *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack);* l8 R+ c" P* B6 x% f9 |( S return num;: L( v7 Q$ m% K! l: b6 a- u, T: f% _9 ? } ;) s% |* \. g+ m1 G) S' j7 W e void interrupt (* old_int8)(void); 6 X& ^, L9 @# o9 S' Rvoid interrupt new_int8(void)4 ~6 c# F' X, i5 h5 Z$ e$ \& ~ {- F- z% b. R0 ` (*old_int8)();. K t! b2 s# }: H% c timecount++;1 i0 `# g: v4 D* i1 l9 X7 t if(timecount>=TL);% v8 F$ C! B, L8 E$ O u if(!DosBusy()) : J% ], e2 b( D1 b { - I5 }2 S$ ~5 \, T- K+ K disable(); 6 @: o3 o* N1 W/ \# X tcb[current].ss=_SS;6 S# Z7 t% p# s$ O tcb[current].sp=_SP;6 y1 v9 S8 R% R. Q1 R5 E) h# [ if(tcb[current].state==RUNNING) + J5 ?' U9 {" @ tcb[current].state=READY;0 [& O, C& S$ q. M! }) } current=3-current; 9 L, t* {; P- V, K, lif(tcb[current].state==READY) 6 R" n3 \1 J) h2 U; Z4 Y{ _SS=tcb[current].ss;, o# B2 b" U1 M8 x& A7 p _SP=tcb[current].sp; . O; B/ x! n$ Q, z% F% ? tcb[current].state=RUNNING;, D* r. Y, }. q2 K% S4 E timecount=0;% Q) r) _8 v9 E: w7 U enable();6 G; e5 n+ ^1 N- p( L } * h) ?& V+ |4 V$ ^! N! `} 4 L+ J$ r& k+ i% W# Y- j- Y1 P8 z};( W# y1 S9 I/ `# C% y3 t void tcb_state()$ J/ w- ]3 L* B1 ? {2 j+ m9 b* G# Z1 {* U, b int i;% F* Y! T& Q( |3 e" ?4 |1 K7 D" j for(i=1;i<=num;i++) 5 N- p& c7 I" E& y! v( p3 ^" f1 n printf("Thread %s is %d ",tcb.name,tcb.state);/ X5 @* H' W+ y; s, B0 |& R }; # I% \. P; p7 tint all_finished()8 i! f7 P& w! \+ [( ~" o/ J {5 y# ^: t. ^$ |' @# Z" | int i; $ |4 t, k2 H0 u6 f+ I& h3 D; [7 v2 { for(i=1;i<=num;i++). ^& P) s4 ~0 U) A% Z if (tcb.state!=FINISHED) 1 E+ {' A2 Y7 |) N5 O return 0;; I4 u. ^, J, C2 _ return 1;4 V4 Y0 P" y0 {, Z {) f& g 3 ]$ ` ^: M/ g* i2 x/ u}; & G* A+ x) W- ^4 }) Nvoid interrupt swtch(void) 1 s: D9 K2 A# M; O2 E2 a: o{ ) h5 y6 u) S# Vint i; , E& h. w1 m4 n- a, i, D disable(); . v$ n; z9 ?5 S tcb[current].ss=_SS;2 e+ p' E$ O- f: ~7 b, X5 q tcb[current].sp=_SP;7 @; F% ?9 E0 b P7 i if(tcb[current].state==RUNNING)/ ?* N) G$ h. d! ` tcb[current].state=READY;/ m6 M% `) b" G( J7 V# T+ p' g for( i= current+1 ; i <= num;i++) 7 D2 E. W: K, d8 x { if(tcb.state == READY ) % ?( S, L$ F- {1 ]$ G! `( G goto excute; ! b" W" l% i; K" \ H/ G1 v! u } 9 e# r/ |8 `: m for( i = 1 ; i <= current ; i++) 9 \1 ?$ H) ?; Z1 _& Y% S Z { if(tcb.state == READY) 5 N" x5 \4 o# q: r* ~+ q& A goto excute;+ e( W$ o# X$ y+ Q0 M4 a } ; G; @! B+ P F/ W i = 0 ; 5 q5 L0 \1 s& S' k2 o# G# U excute: * _4 U' t4 p! h1 d4 g2 p% V _SS = tcb.ss;% @ {0 |" `( i/ z( y6 c" ~; k6 }) | _SP = tcb.sp; 3 G1 R+ z. Z, E. ?! w% U tcb.state = RUNNING; - @! ?! Y9 M6 A/ Q! j9 ]6 z current = i; . C( X0 z9 |- {7 D! Q( }/ X enable(); 1 V1 u! F4 F1 f d3 n}; ~4 r( l& h* m0 |8 r, @ /*-------------------------------------------------------------------------*/ 3 h% F' G% C6 Svoid over(); j5 y }4 w7 y, U2 v7 ^' K# w {% r* b' H& z u$ U# ^2 M/ ~ int i=current;; W& e, y( b, Y% e /*strcpy(tcb[current].name,'\0');*/ " H I9 U5 }. z% { tcb[current].state=FINISHED;* ?; r* A+ c- Z3 N swtch(); 5 |5 a; g9 Q1 T& T$ ^ free(tcb.stack);3 T" Y6 I+ d5 \$ @' m* J z }; 8 t# U6 ~$ a, }" N/*---------------------------------------------------*/ ( t5 m% D4 W1 ]4 ?0 B* E' ^0 qvoid InitInDos(void) " T5 k; L6 {. f% V& ^9 G/ L{ 9 G* O5 e& H L. S0 g' q union REGS regs;0 e) U. k* n! U3 E; h struct SREGS segregs; 2 \- j) @0 h8 g: l. m# \ /* get the address to INDOS flag*/ + z0 k$ X) M* `: _& }3 ^ regs.h.ah=GET_INDOS;; k6 |( c2 B, z( ~0 J7 T ?7 [" n' T intdosx(®s,®s,&segregs);4 A/ c% Z# S* x4 O, v/ {& L indos_ptr=MK_FP(segregs.es,regs.x.bx);# B; M. k s) d; m /*get the address to CRIT_ERR flag*/* K( M5 E( E! V& a4 \7 r if(_osmajor<3)4 |* ~' v0 e2 R crit_err_ptr=indos_ptr+1; - m1 \) a* U+ ^1 n6 q7 f# t8 X else if (_osmajor==3&&_osminor==0)( l, h) v8 w6 e! d crit_err_ptr=indos_ptr-1;5 Y; I+ o7 y( f" a else( z# m4 J. \5 I- F# l* M( [ {1 U# S4 @/ t! H3 X regs.x.ax=GET_CRIT_ERR;/ l% x2 J, @, C- l* C# [8 N intdosx(®s,®s,&segregs);. ?# C2 A# X f crit_err_ptr=MK_FP(segregs.ds,regs.x.si);* I% d' a. c* o7 W) A } ) ^) Q$ y# {/ D$ Y" e C; y7 i0 [};" Y) \( n% F0 L! W# Y int DosBusy(void) ; ]. z( s/ L$ K2 [{ 7 M# {! y2 R" X if(indos_ptr&&crit_err_ptr) 1 S" Y) W1 A; \! }* a j return(*indos_ptr&&*crit_err_ptr); & E( B4 D3 U2 Z else. {- X |5 L3 _# x" _; ^7 _- |0 P: n return( -1); / R! J' ~+ U5 `, M}; * _! {% I- E9 H: P% r/ A. Gvoid f1(void) ; Q( ~( E6 O/ O9 L/ e; E" A{. r6 t( f) f7 E Y5 f6 U( s4 [) P int i,j,k;8 s: y( h3 V5 j! \3 Z7 d for(i=0;i<40;i++) ' [! e5 O5 n# F' E { + N+ h" b- d3 w3 R/ N putchar('a'); 2 |* y& _; A, b2 V c! s- V. f: G- S0 x( `0 z% S7 O% W for(j=0;j<1000;j++)9 q/ J: \- A1 y R9 B+ C$ ^9 J for(k=0;k<100;k++)2 s3 H& c, }" j& W ; 6 M$ A, W) E. ?0 s# } } ( @/ V% u, d& m1 n};0 r" h, ?6 F5 x3 a4 v8 B void f2(void) 6 c2 k# u- _# a{ ( q' P1 j# J# s" }. M9 a8 J/ r int i,j,k;/ ` }/ B% ]* L% k. t for(i=0;i<30;i++)6 f7 v i8 R* W2 O C. o& w1 v {. G5 E6 x3 X; ~( H0 e P putchar('b');/ o% Z- j) n6 r for(j=0;j<1000;j++)- a1 }: ^) G* h9 F* E for(k=0;k<50;k++)3 n1 D7 T/ B7 A5 X ; 0 C. d( [% l. y7 b }* F5 K! M. _9 I2 V" U: B( U }; Q! q8 d4 {' J! n; G" B* J/*------------------------------------------*/ # Y) @2 z f- K- S, k5 ]main() ( M3 d# |' p: J, Y, E6 H7 D! v{* d( o, Z* N$ t% K5 l7 L5 E7 P InitInDos(); 9 n5 H z7 t' u1 G old_int8=getvect(8); ! y6 o2 c3 R* J$ z strcpy(tcb[0].name,"main"); I' u8 e% J+ G9 h$ r+ B* m7 H% k' Q tcb[0].state=RUNNING; , s) l; _; e6 q1 v8 n4 i/ e current=0;1 n9 W& w9 H4 ~, q7 A- | create("f1",(codeptr) f1,1024); ! S: d0 t* u' e0 N. g+ D& Z0 w create("f2",(codeptr) f2,1024);3 z+ I6 O8 L9 h3 H, y% _" T9 r0 q tcb_state(); 2 [, z8 ~) A U! q/ S1 q setvect(8,new_int8);6 w. z m- o* e8 {' N swtch(); " x* e- J$ ?" r: c# L while(!all_finished()); $ S# }+ K1 ]/ J strcpy(tcb[0].name,'\0'); 7 \9 p' j, ]5 d# N tcb[0].state=FINISHED; & O% R+ o- }* ^3 w, z setvect(8,old_int8);3 e5 H$ z7 g. X tcb_state(); 3 d, C7 [( p+ I3 G$ U! g5 E n printf("\n Multi_task system terminanted.\n"); ' T1 M5 Y- H$ D};
    towny 该用户已被删除
    20
     楼主| 发表于 2003-10-27 11:58:00 | 只看该作者
    我不想灌水,也根本不想在这样的版块浪费时间!!

    本版积分规则

    关闭

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

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