下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

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

[复制链接]
towny 该用户已被删除
跳转到指定楼层
1
发表于 2003-10-20 12:59:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
create()  创建一个进程
9 A% d3 [  a8 a9 E+ ?要求:1 用c语言编写
6 G/ J3 C/ n* C- E8 _: O; o, z. f! [         2 程序+PCB(ID的内外优先权,申请资源)
7 z" ?$ R: E6 k. j- Q只需做进程中”产生“这一步。# D$ |  e5 A, k: ?9 z; W
以下是做了3分之1的范例:
2 j7 T) T/ J( l" q7 k#include "stdio.h" ( I9 ~8 F% d5 @9 p1 q- ?
#define running 1 /*用running 表示进程处于运行态*/
# a3 g8 J+ x1 ^: ~#define aready 2 /*用aready表示进程处于就绪态*/ ; H- v1 D$ x" G9 c. j  V4 C
#define blocking 3 /*用blocking表示进程处于等待态*/
! o. P$ i" E% C) W) p" X+ ^, L& l#define sometime 5 /*用sometime 表示时间片大小*/ 2 ]! K  B/ c  M# ]  ?
#define n 10 /* 假定系统允许进程个数为10 */ ( J5 a' w0 f6 C0 U& h" [' v1 J3 |
+ X6 a8 K$ ^3 P9 w$ {
struct
' \( i2 L6 r3 @- d# p# t9 ]1 n{ 3 \1 X6 h8 ~6 _  B8 E6 p
int name; /*进程标识符*/ ; h. K! A/ `0 v
int status; /*进程状态*/
, ^. D4 ~0 g: [3 p1 C. gint ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/
" z, J+ \9 G4 q: y6 uint pc; /*进程现场信息,程序计数器内容*/ + q' U1 g4 k1 F2 v
int psw; /*进程现场信息,程序状态字寄存器内容*/ ! W5 L/ N& N2 v+ v. X
int next; /*下一个进程控制块的位置*/
6 v& x6 r& O. |& z# e9 v. L}pcbarea[n]; /*定义模拟进程控制块区域的数组*/
4 g- N! W* r/ L) M/ Y* J
% w: y: P! i' i' g( \+ `% Q8 Tint PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/ ; O; X. }8 S/ ^' T# [  @

3 U" e, S: ~; s, Mint run; /*定义指向正在运行进程的进程控制块的指针*/
( I) R; n; ^* s2 V  c0 P3 gstruct
" E: K# f9 z- ^: }{ 7 ~4 h: N7 [" z; }, \! [- @
int head; 0 O  o, z+ U+ U
int tail;
, J) ?; p* B( s}ready; /*定义指向就绪队列的头指针head和尾指针tail*/ 7 {8 ]( Z0 |; ~1 @
int block; /*定义指向等待队列的指针*/
# n0 [: P3 U' v9 [- r- S4 a4 }int pfree; /*定义指向空闲进程控制块队列的指针*/& R* }; A8 x5 @; I0 N" s

/ E! d& k. m4 v8 D3 z麻烦各位高手了,望帮忙解决一下,急啊!~~!!!!![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 | 只看该作者
    我的脑子都快调得暴了,能写个大至的,让我自己调吗?* S) o* q- ?) _
    麻烦各位高手了!!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    4
    发表于 2003-10-20 22:40:00 | 只看该作者
    你给的头部定义的几个队列指针看的出来你是想写一个 链接方式 的进程队列,由于给得太粗糙和简单,我尝试了一下,反而觉得很不好写,想考虑的一些东西你的结构里没有,而考虑进去发现弄的复杂了就写不完了,所以很难办,结果还是没有写下去,给你我开始的一点筐架吧。0 z" t- [  K0 \5 d/ z
    /* the main site file */
    - p% T/ ^) Z2 j# YCreatePro(&ID){
    ! g8 w8 A, u! |# |: w) z2 q4 I* u  GetFreePcb(&ID);  //申请一个空闲的PCB,并为其命名一个标识ID;; p" Z% |: J( j
      InitResour(&ID) ;//为该进程分配资源(内存空间和工作区);' Z: {. ?# b, i9 \% a/ U
    /*初始化参数*/
    - w* I5 \) M& }4 @4 Q; G   CallName(&ID);   //命名进程的外部名
    & M/ `* K0 @1 C  SetParProStat(&ID);  //记录父进程的ID和CPU的状态、
    8 z) q! A1 N; U3 z, s' c8 G  SetFL();  //优先级数、
    2 ^4 A# ~! S' W: L  SetHeap();  //进程起始地址、) E; k! i. E; w' e; c% `* b( i
      _SetSelfStat();  //设置进程的状态为就绪态2 _) G; A% V+ X  O6 V
      AddStat_Read(); //将该进程加入到就绪队列中。
    % m7 D& ?  h$ ]& `2 X' F: @" _. K.4 H6 }+ J) W: t
    .
    ' h. v8 C" H" n, K.4 w' h- ^( N6 v* _$ a  J" V$ Z4 r0 J
    ./ C9 K: S! `2 [- r
    }2 g, L1 J* ^3 z7 t5 z
    我觉得上面至少要考虑的,但是实在很懒了,对你也许一点用没有,不好意思( y( ^) X4 \0 @# F% c
    towny 该用户已被删除
    5
     楼主| 发表于 2003-10-21 12:04:00 | 只看该作者
    呵呵!!
    . C! o  g% w" j谢谢斑竹的高见!!
    towny 该用户已被删除
    6
     楼主| 发表于 2003-10-21 12:18:00 | 只看该作者
    这是我自己做的一个版本,望斑竹给予指点!!!谢谢* a8 j9 N- B, H) \) r9 A 6 C$ M" L3 [* F4 f2 q #include 5 V! |+ D' R& W3 L5 `, m#include ' x; R. l! k1 @# }# F, `- Z1 h#include ! m) T, x- [: ~: C, y$ F#include- o( D$ ]; y; j1 S: L #define running 1 /*用running 表示进程处于运行态*/ 3 ?1 g( D# D: ]8 {4 k, U. D3 C. I#define aready 2 /*用aready表示进程处于就绪态*/0 X/ O. V' V1 X8 w #define blocking 3 /*用blocking表示进程处于等待态*/! d) k! H2 d1 v, v. n) { #define sometime 5 /*用sometime 表示时间片大小*/ - W6 t" f, ]8 k# D$ D#define n 10 /* 假定系统允许进程个数为10 */ f' |" K8 R. J/ z3 A struct& b4 O3 A$ ?% \6 _7 `; M { ! E2 q4 t! t9 j" J, n$ Q) Q, A& Wint name; /*进程标识符*/+ ^: M$ j* h2 w3 J; ^ int status; /*进程状态*/' G$ U* G1 u+ ?5 `9 K9 S- d int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/; K, z. U" |9 p& r5 a: d* U. } int pc; /*进程现场信息,程序计数器内容*/ 0 |6 j( p" J+ w4 V8 A% _- }int psw; /*进程现场信息,程序状态字寄存器内容*/ % y) w2 f) P4 j7 ^: R9 lint next; /*下一个进程控制块的位置*/ 5 J+ f5 m& |) ^ z5 P. D/ R2 O}pcbarea[n]; /*定义模拟进程控制块区域的数组*/. n$ P+ L; s0 K4 x( O int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/ # M; M& {2 K# H+ e5 Y% u9 Kint run; /*定义指向正在运行进程的进程控制块的指针*/+ g1 n9 M; B$ _3 M8 z4 X. P4 R struct ( h' e1 ?9 b( S( y{- q! W: s$ k2 l& K2 S0 y9 X int head;- Z+ S: e! K6 s j9 G0 p- m int tail;: C, J' k. S. P( M }ready; /*定义指向就绪队列的头指针head和尾指针tail*/1 v% Q/ j7 k1 r! I$ X0 S int block; /*定义指向等待队列的指针*/ / N' l/ Y3 I1 a" eint pfree; /*定义指向空闲进程控制块队列的指针*/ + R) T9 O% E5 J, K# omain()2 ]7 Z& V# m8 F7 r& m# m2 R- x; O { int gdriver=DETECT,gmode;0 r O: c( A- c6 D3 R: v/ _' \' n* K. Z int i,x,y; # R. D+ }( x# B$ O; J for(i=1;i<=n;i++) , E% l. S% I1 g2 [6 s4 y$ ^4 U6 k {ready.head=pcbarea.next;}: S: l; G7 a; ^, X7 O4 s D initgraph(&gdriver,&gmode,""); ' L; D" ]& W7 g3 h, g; n' Y* @ setcolor(YELLOW); 5 \+ l6 G. r" A/ s+ J* Z4 ] for(i=1;i<=4;i++) N+ }5 H" z" v* _4 W) \ { setfillstyle(8,i);; r5 R% f" v7 ]! l4 P* M' q: o circle(284+13*i,190,6); . Q/ A, F* ~; n( ]9 Y& M floodfill(284+13*i,190,YELLOW);* R @5 o/ c( y% \; k1 u; h }* b" x3 s3 J& P- v6 y setlinestyle(0,0,3);: j \, Z4 M* _2 V5 M9 f' k circle(316,190,25); ! C2 c1 H7 v# m# D setcolor(5); ; I" C* N) R0 Z3 }* T settextstyle(3,0,4);5 {& L4 U: j3 f" y" E; l: S outtextxy(35,311,"press any key to create objects!"); , i/ F, k' j5 }7 e; e getch(); + J+ b5 U2 N' g setcolor(YELLOW); * W9 p. I1 ]' r2 l- B P line(300,215,290,235);" q' X( C$ r% ~& Q( G line(323,215,333,235);6 e7 Q; @& H* ^6 [# z% ] delay(50000); & L% L2 h+ z. _" q* ~. M* V setlinestyle(0,0,1); 7 ~, C" b" l1 J7 Q2 @5 ~" S for(x=1;x<=2;x++) - o5 E, s3 f3 q- K" b {setfillstyle(8,x); ; H. w& a5 L. z( [) W! j circle(267+13*x,246,6);, o* S c9 c# N4 d3 V$ o3 p# Q floodfill(267+13*x,246,YELLOW);* t9 k6 o- X' N& t/ z1 k5 i# ^5 b } 3 [: r$ T6 ]4 }) V- ^0 q0 } for(y=3;y<=4;y++)! b8 V8 P! F0 n7 A+ j: ^ {setfillstyle(8,y); ' {$ L1 x$ V3 B N4 O2 n circle(285+13*y,246,6);# X! V; S8 t) k! W! i0 |; S floodfill(285+13*y,246,YELLOW); ) {" M0 z* X4 |" B1 b5 ? }9 N2 A- q3 b9 E setlinestyle(0,0,3);. i- S: d* O b$ U: { circle(287,246,14); / ? e$ F( W# x' A" v X setlinestyle(0,0,3);6 H; } c+ I! P) E. S9 q circle(330,246,14); K) g# j* T) ?& f7 L delay(50000); 1 I: J* G: a- h line(281,260,281,280); ; m0 c' L( |5 s9 S5 m- k line(293,260,293,280);. W/ L+ Q4 l+ D! x5 K% | line(322,260,322,280); ' ^: W6 c+ S% S3 {5 M+ c9 v5 k* h line(333,260,333,280); 8 z O( j, L& y2 j/ [& f6 B7 K delay(50000);3 G0 w% I8 {+ k( Q2 Z v c0 t( g' E5 } setlinestyle(0,0,1);. m$ w; p8 d6 F- O- w% u" }# M setfillstyle(8,1);. B6 Z: n/ \$ k circle(281,286,6); ^0 V" {- f$ N0 ~' r! q; @) u floodfill(281,286,YELLOW);9 a4 v2 C2 P+ g setfillstyle(8,2);% y/ }" B& x3 X2 \0 ]6 q circle(293,286,6); 5 w( {- G" K/ v# s3 s floodfill(293,286,YELLOW); - z* `& M$ T3 u7 }) P% d- i setfillstyle(8,3);4 t: u. |- n: f8 i" J circle(322,286,6);- p0 l6 B8 R* i L6 }) [. N: Y floodfill(322,286,YELLOW);9 K% T7 ~ @ K- ], f; g setfillstyle(8,4);3 {! S+ Q6 q+ f" T. g circle(333,286,6);# T$ V& U& ~" W0 P# [- D" w floodfill(333,286,YELLOW);( P, _ k! T' n getch(); 7 G) K* @9 Y+ ]& Q! }8 f0 }$ T closegraph();, @- w+ M$ C6 l/ f- \+ `( R }: K; m: x$ {/ d& d* {' }& p/ p2 \" L . R3 @8 a: \, J! d9 G$ I1 S 8 R2 l) d5 f& m! [- k! }$ G0 [4 Q
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    7
    发表于 2003-10-21 18:58:00 | 只看该作者
    你在搞那么多画图干什么?你不是要做进程的创建吗??0 o/ {- R, ~# e$ S  a9 C* I' \  n
    难道不是《操作系统》的‘进程’那一章进程创建??
    6 s: i7 G/ y7 q, {( D8 l. N) V到底是要个什么效果??糊涂了
    towny 该用户已被删除
    8
     楼主| 发表于 2003-10-21 20:34:00 | 只看该作者
    手误贴错了!
    / N, ~6 u- ?7 i2 B) }$ l不好意思!!
  • 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 | 只看该作者
    做了一半的半成品望斑竹指点!! 0 I# j& c# f1 }0 T. \# {4 h 8 [6 n0 ~1 o7 A) F: y8 |& T6 ^/ J+ \int timecount=0;- y; v I4 n( f2 U, Q char far *indos_ptr=0; # U: M/ r# @/ A& W' n% k; Dchar far *crit_err_ptr=0;" U6 O; P( P$ k! n int num=0,current=0,i; : E4 x* d' D4 t6 Y! @- Ovoid over(); 3 h3 K. q3 @( Z0 Y4 w2 j4 Ntypedef int (far*codeptr)(void);: ~2 P8 ^6 n* W2 Q* Z, e- I' H$ d int create(char *name ,codeptr code ,int stacklen)6 J2 |7 {: ]/ i: N1 u: J4 v {& ^( \3 V4 g) J' V" C unsigned int * s;; y' l. k8 l+ H* C: y _8 v num++;. N% F& A- ^% q' K tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); 2 b- |8 u8 h% q tcb[num].state = READY; 9 C4 g$ a# ?2 d strcpy( tcb[num].name ,name);, b# K) O- V: H% n" H tcb[num].ss = FP_SEG(tcb[num].stack); 0 M3 k+ A2 R# }# \. t, O tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14);) M+ D5 O* e7 ~8 P *(tcb[num].stack+stacklen-1) = FP_SEG(over);4 l* C; ^5 E/ q- y/ u: P *(tcb[num].stack+stacklen-2) = FP_OFF(over);0 S& o& u- A& R* u! A/ J: \ *(tcb[num].stack+stacklen-3) = 0x200; ' b0 h+ s/ u( q3 s" R *(tcb[num].stack+stacklen-4) = FP_SEG(code);/ T2 K9 T* l4 e o) k; g: s *(tcb[num].stack+stacklen-5) = FP_OFF(code); / S' t/ K0 z4 u: a1 A! Q, L' H *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack); # ]7 F0 q) n* O' [9 ~ *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack);% @9 h6 t1 Q9 t! r return num;8 ]5 x3 b. n& e9 T0 ?9 Z: ]) q } ; + T8 u& R( F$ Vvoid interrupt (* old_int8)(void); 7 _$ T, m* a( H* S. Y5 Cvoid interrupt new_int8(void): v0 E* z- m @0 {$ e" n2 _# W. M { ( w! D. O% u- z- S( D (*old_int8)();- d5 j7 H/ I' j8 D' ]+ O3 H) f% [ timecount++;. L# B& z1 S5 D3 v1 { if(timecount>=TL); 9 Z1 b# ?- D, i" Q5 t- M$ F, ^# X if(!DosBusy()) 4 O, Y+ q. t# l. [% r9 ^1 w" r6 M" A {; M0 {- \: u; k- y7 l disable(); 7 T; ~4 A8 O. R g7 s& h tcb[current].ss=_SS; / y: P8 {% D( s9 o+ F( T tcb[current].sp=_SP;- X4 }1 F1 f" u, b if(tcb[current].state==RUNNING)1 B0 Q0 Y+ w4 }/ f tcb[current].state=READY; z' x( D$ M5 G current=3-current;8 Q i4 g( l ?1 R1 X if(tcb[current].state==READY)0 Y2 |3 m4 ? b7 l. t" m { _SS=tcb[current].ss; v- Q9 @: \! e1 C0 z( @ _SP=tcb[current].sp;) n% d$ {+ _4 S+ U: M9 Z tcb[current].state=RUNNING; ; c( R) n1 {& B/ Z% m timecount=0; 5 ?& c$ |3 ?6 ?: R+ A enable(); / K1 [8 y4 f( J) p+ y3 M! O; E} $ Z; l; _3 S- N}; M H# Z" k! m" S4 J0 g( W };) b! r5 ^ g- x' A void tcb_state()% t( _$ [1 L6 A# Q6 f {. V$ T, l4 b- V6 r* m+ @! w int i;8 B1 d& Y/ O; w. k for(i=1;i<=num;i++) " b; A- C( O* x' R5 ? printf("Thread %s is %d ",tcb.name,tcb.state); 5 ~$ {# k- |, g1 A};& C' b! m( C5 m: ?; m7 a* O- _ int all_finished() 4 y# F) e& ?* {' M1 H6 P6 k T{$ C5 i. ]3 y5 b int i; 0 \( @! G) }/ H for(i=1;i<=num;i++)3 H& p4 b3 y/ C$ j4 N' g( \% P if (tcb.state!=FINISHED) 2 r& D. D# ? x9 m" m7 \; ~ C return 0; ; M( L; W) B6 _2 s return 1; n: x4 n1 G/ s6 F0 j " t: p% {9 R7 E s$ L}; W/ p6 n, T/ j3 nvoid interrupt swtch(void) 2 L, [6 n% m g; m8 B' j{ , j8 H3 A# x4 Q% K0 f; }6 Z" w8 {- hint i; `6 f, S: y+ ~" \" W _# q disable();- b( I2 S u0 O: W tcb[current].ss=_SS; H3 D+ W+ g4 R. ]* W1 v tcb[current].sp=_SP; 0 _ Q4 g9 L* W* m if(tcb[current].state==RUNNING)! N+ N! i; B+ q- L0 t tcb[current].state=READY;9 C7 g: E' i+ W0 p for( i= current+1 ; i <= num;i++) # n2 o) S M! i( P5 V { if(tcb.state == READY ). U% u: k* z( b a goto excute; / v. y% N7 g8 I: C) E. w+ x: h9 R }. E L4 Y1 q( k, I, ~: ` for( i = 1 ; i <= current ; i++)! [1 T; d Z# G" N" p M { if(tcb.state == READY) 7 o% l0 @( E! P5 Z9 h: D goto excute;9 C4 {: g/ F: u9 d" e }. j: F$ g8 m1 s O1 R) z% u i = 0 ; \# K4 z* L* r9 w5 s excute: 5 g$ C. Z/ {7 K0 \( X _SS = tcb.ss;$ Z7 H! m! y/ q4 b7 q7 F: G) i _SP = tcb.sp; 2 A. S5 H, Y. V( S9 \( q. q tcb.state = RUNNING; ) z8 N2 a" L9 U0 ] D+ | current = i; % G. _6 z/ n/ K) Y8 l enable(); 8 F4 w# Y, I* Z1 r- v' U- Z q4 e}
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    13
    发表于 2003-10-24 18:02:00 | 只看该作者
    指点什么呢?效率?方法?还是编程格式?/ s7 i" w" g0 g. s
    给一篇代码给别人叫别人指点?我从来没有过。
    towny 该用户已被删除
    14
     楼主| 发表于 2003-10-24 21:48:00 | 只看该作者
    操!0 z  ~0 B  r. L
    搞什么脾气啊!一个斑竹有什么了不起的啊垃圾!!
    towny 该用户已被删除
    15
     楼主| 发表于 2003-10-24 21:58:00 | 只看该作者
    你要是不懂就让位!4 S4 H9 ?2 Z: v/ k5 S; P
    别占着茅坑不拉屎!' s' \3 t  a- r7 ]# d! _7 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 | 只看该作者
    完成了你们看吧!2 x* |: e% r7 G' g+ n ! K, g% u) p9 v& V% T1 B* [# {; z% ?#include N v2 c6 `5 A% Q' H" F #include 8 O3 s0 F& R: O* m#include 8 \/ U( a- V% T. M% {- I#define GET_INDOS 0x34$ H+ C% z: x4 ^9 T( k) n #define GET_CRIT_ERR 0x5d06 * I q- y# S1 G#define FINISHED 01 L! q: f2 ]: v( a0 R #define RUNNING 19 h$ ]# U- o \7 C c #define READY 2) b1 B& m4 x9 f #define BLOCKED 3 2 K7 G, k% @! j* D0 x' r; Y#define Ntcb 8 - q' T* o% t! t: z6 V( c$ i" x#define TL 1' q/ P/ Y: w- @1 |7 s struct tcb{) B# Q K, |& X unsigned int * stack;/*堆栈的起始地址*/' a: p1 G# {- I a) K unsigned ss; /*堆栈段址*/ : g0 u( a" A. W unsigned sp; /*堆栈指针址*/4 V& U: G' v" r) p. [ char state; /*进程状态*/ : U& M# J" M+ B% i8 f2 S8 T# E char name[10];/*线程的外部标识符*/0 Y" y; @7 ?$ U }tcb[Ntcb]; /* 系统允许最多的任务数 */% J/ Z! H; f. A- p* U! K; T int timecount=0;/ I% p+ @3 a+ | char far *indos_ptr=0; 9 O, B9 `/ ~3 l* ?, q* I) J7 kchar far *crit_err_ptr=0;! f3 E q1 Z/ U9 f3 V int num=0,current=0,i; 7 c! j5 ]; p# c% j" Xvoid over(); - b% N6 k: p! F; m6 T& xtypedef int (far*codeptr)(void);3 y7 e3 B/ b3 ], s! R4 | int create(char *name ,codeptr code ,int stacklen) C% m% d; t) _2 I# m4 [ { 0 B1 K/ X1 i+ l/ P, k. Wunsigned int * s;1 ?2 {* A3 T, P+ n% [ num++; 1 ~+ n& l9 g7 D& I6 H8 t& i& ]3 e' ltcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); ; I. e( d7 j2 P) l! E4 j& h/ y tcb[num].state = READY;# y" G$ [- D2 k. @3 B strcpy( tcb[num].name ,name);+ K! k v) F" p/ s0 N5 v tcb[num].ss = FP_SEG(tcb[num].stack);7 I/ i( A) R5 L! K1 s* v2 c1 e tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14); " k* i4 Y& o1 Y) o0 ]/ N *(tcb[num].stack+stacklen-1) = FP_SEG(over); { Q/ e' e, _; w v *(tcb[num].stack+stacklen-2) = FP_OFF(over); " t: z+ F3 _' C0 o1 q9 w O% | D *(tcb[num].stack+stacklen-3) = 0x200; |7 L; d% R& h: D *(tcb[num].stack+stacklen-4) = FP_SEG(code);1 r6 U( l0 i# i) O" C *(tcb[num].stack+stacklen-5) = FP_OFF(code);% x4 b$ e* I1 n7 _# R *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack); 1 C6 G! d" r8 y *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack);4 ?) o$ j& ^/ c6 h) f) y return num;1 t" U& p8 G8 P" S } ;. x* y! r$ o; i% s void interrupt (* old_int8)(void); 1 c+ m& T) F" C' \. J" v6 A# E" uvoid interrupt new_int8(void) * }5 G/ t$ g6 T$ M% U{& a! }) J w9 w* r& E( R4 B (*old_int8)(); 4 X- `8 r( B: ?2 @$ W timecount++; N( h8 G% P K, b2 g. O' o5 B if(timecount>=TL); 5 T1 [0 _8 |( s" o if(!DosBusy()) 9 z/ Y' f' |- K1 E* [: H1 W+ P { 9 Q8 W/ C5 C" T$ B8 S4 i( u disable(); 6 Q( p$ }# {2 _* v# N4 b% @' i+ Z tcb[current].ss=_SS; , J1 w+ L- {. X% G: |" U: w tcb[current].sp=_SP; % q7 |" v0 V) B2 x* c if(tcb[current].state==RUNNING) , C+ r2 T- H4 ?6 s, l2 a: P) } tcb[current].state=READY;: r: B j" J# R8 n" N8 w; x& Q current=3-current;7 i" N$ j- }6 N& |3 W5 @0 _ if(tcb[current].state==READY) 4 h# ^- o. E' W+ s! J P{ _SS=tcb[current].ss; ) v+ m+ ~7 ?2 K' ]( I _SP=tcb[current].sp;7 y* ` n1 p j* @ tcb[current].state=RUNNING;6 M9 ~+ |$ G3 \# n# E2 E2 F$ F2 b8 ~ timecount=0;# g& ~3 z, {" D* h. V/ Q enable(); 1 Q/ N F% x) [! j} $ k h8 q$ B( a! l2 q}6 U- d m: B3 H3 k5 M+ c* F( W }; + t" h3 |- ~- d, Vvoid tcb_state() 0 Y7 B/ k/ q/ p{ # W1 x8 l- [4 R: u' ]+ f( [# p int i; 2 G# T7 H( _* j% T/ s- }- E! o for(i=1;i<=num;i++)* v: y& {2 C9 s8 n& | printf("Thread %s is %d ",tcb.name,tcb.state);; T+ Q; P8 O$ y+ g }; # \7 x8 Y& B* l) ^7 o4 J0 rint all_finished(), o* H4 ` b8 l- @* @: W { ; g" |: z) |1 s _& o$ t" D2 l int i;8 F; k6 b5 {- Q. C" h% o8 M2 y for(i=1;i<=num;i++) ! Q! B$ F/ t, D9 \% k if (tcb.state!=FINISHED) 0 S l& m! P% \! ^) C* Z return 0; : E% n+ p& x8 \$ s Z6 `: E; M return 1;3 T' t6 f& U" f9 a0 r: [4 J . \5 L7 C4 {0 N$ R$ y+ |) m. }% Q};' N0 I+ q0 r) ]! ~& ?4 y1 O; ~0 _9 N void interrupt swtch(void) ! _" e9 y0 z, a0 K8 n{ # @& @) c U. u7 |; ~+ \0 e7 x' y2 V' Jint i; $ V. x5 g+ m/ B" ]: j- I ^ d disable();8 I2 {) V' K% V2 N% Y# } tcb[current].ss=_SS; * m" y& m+ x1 e* [0 g+ q tcb[current].sp=_SP; R& ^: N: {8 W) M if(tcb[current].state==RUNNING) 9 N0 _' T7 n, a! ^! b7 N8 t! E tcb[current].state=READY;1 M+ O- [: [6 [: m; a for( i= current+1 ; i <= num;i++) ; w0 h; s. L7 i8 U$ u) U { if(tcb.state == READY )5 P) k! p) X1 {8 w2 i7 f* n N goto excute;. X% s7 Q3 ? V; K4 h- i1 M" N. n }( b3 o/ h) O/ Q2 D for( i = 1 ; i <= current ; i++) % P. h {% }' g5 D- I% `+ r# O { if(tcb.state == READY). Z) [2 H% Q0 F, D, z% N% c goto excute; . n. [( A# _* q1 y7 f' W) I$ I% Y } L! v1 r5 w, V& u2 C i = 0 ;( c5 c' D, O( B! m# t8 X2 p excute:' {7 l5 V' n6 L _SS = tcb.ss; / r2 r( a' G2 ~4 X _SP = tcb.sp; ! L; {* D: F9 R& { tcb.state = RUNNING; " _* p! a2 J4 j% A0 b current = i; 1 G* o q6 p5 x enable(); & E, \& d I2 K' Q/ @} ) v! f$ T' w0 G" o: J/*-------------------------------------------------------------------------*/! H1 ^% ~$ D, P void over() $ L0 T- \& u1 n V{ 6 z$ o3 m7 [5 E+ q; ` int i=current;; G) t F# t, R3 F- G; O7 p1 V /*strcpy(tcb[current].name,'\0');*/. Z: S* I9 G( m! O! x' g! H% [4 H) _ tcb[current].state=FINISHED; 9 w. m. t6 N" F3 V+ C$ z+ l swtch();6 n& o2 x9 ?2 c9 S' Y" \ free(tcb.stack); / x( j% T' ~: h& P* u}; 3 Z+ h2 f+ ]$ N" u6 @( k, p( T/*---------------------------------------------------*/& z; l' c1 Q2 h! y2 B* D void InitInDos(void), u# k7 c% _% z1 n6 s7 C { , L0 `7 g* h) A union REGS regs; % p- I* J: Z+ B. T3 y2 F struct SREGS segregs;0 M; q2 l4 J. G L /* get the address to INDOS flag*/. p; a/ `( a- E: Y+ h1 N regs.h.ah=GET_INDOS; : r% o3 B1 H! y' J intdosx(®s,®s,&segregs); ) i- M7 ^' Z$ Z. f& q2 L indos_ptr=MK_FP(segregs.es,regs.x.bx); 6 L# n6 T( D+ O9 K /*get the address to CRIT_ERR flag*/0 y+ Z+ {% k6 Y5 _( R$ Y( f if(_osmajor<3)- R0 P+ ?) ^9 }3 m& T crit_err_ptr=indos_ptr+1; ; i# }2 D; A' R* C/ D3 q$ @ else if (_osmajor==3&&_osminor==0) % |7 A3 K% b6 n; Y9 X x crit_err_ptr=indos_ptr-1;- X' {5 C/ _/ G+ g else( ~2 r& W! A3 J5 ~0 x+ [& x: z7 M3 n { + j! V8 b- u: T. r3 i regs.x.ax=GET_CRIT_ERR; " A7 A" N$ A% Q" V. K intdosx(®s,®s,&segregs);$ R% `3 F3 ?7 A" | crit_err_ptr=MK_FP(segregs.ds,regs.x.si); 2 q7 l7 K% v1 Y/ K& b } K( n- ]: e" R0 V}; 4 t ^) N1 o3 ^1 W2 T, Tint DosBusy(void)8 ~% h+ _& V5 f1 u' a { 1 X* v( E) ^8 n% `4 D. F& K if(indos_ptr&&crit_err_ptr) 7 E D0 o+ n2 H, T2 Q+ s) t. u return(*indos_ptr&&*crit_err_ptr);5 @, y' Y- W, ]( _; s else8 ~* X v* r ?. a7 Z return( -1);: S* M6 v3 H2 l8 j/ Q* v/ o7 S };' d& e7 \" V/ I: h. s1 e void f1(void) " M/ ~0 v8 f5 |. S{" I" e2 A2 H: x int i,j,k; 0 \+ k9 j9 d# E4 _; F& B& T6 s _) B for(i=0;i<40;i++)* z& c( g7 r9 O {& r* a6 g$ x; t1 C _ putchar('a'); & F) {% X$ U" }* W8 O# ~: S, Q: u 0 V' s% l3 |" ^5 z" b% M: A) Y for(j=0;j<1000;j++)- E7 a' g2 _1 G3 G% ` for(k=0;k<100;k++) W4 c. ~+ i9 M' E ;& Y9 c1 {6 H4 \ } % a- {$ x3 b) m5 w+ @};0 z; T1 a. w+ X4 B0 Q void f2(void)+ h+ s, u# F+ |* } {# _( U) g7 B' a7 p, K5 m int i,j,k; - Y) e \: p8 ~4 H for(i=0;i<30;i++) ! U6 I) t1 ~( D0 N; A' t9 r- Y) Z {3 X4 o b# {& y) B; y putchar('b'); ; D; ?7 [/ S* T3 | for(j=0;j<1000;j++)4 ?/ }. b2 q* _7 H, r% V/ K for(k=0;k<50;k++)9 z& [6 {2 j3 ]' g, P ;7 E& ]# {: O4 ^6 K7 J( V& L } * D. ]/ W' c$ u1 V" H* \}; 2 M8 S. ~ l7 u* V/*------------------------------------------*/ ) I& H5 M, |: S: v, M& amain() 6 C6 l: \7 ~9 H7 w% z& `{ . @3 @- y0 B. \! [+ }4 d$ D InitInDos();4 ^2 L. i5 `6 K4 o4 q old_int8=getvect(8); + t4 h3 V/ ?/ k" T. D' [ strcpy(tcb[0].name,"main");% e- l, H4 J2 f- j7 N9 a6 ^ tcb[0].state=RUNNING;3 N$ {: v* z) e9 v0 C* G0 n1 L8 m: F current=0; ! T1 e7 Q0 G! T- } create("f1",(codeptr) f1,1024);, T& _- j& Y9 x0 P, G) m% h create("f2",(codeptr) f2,1024);! b8 Q( h' Z+ c, w: k& | tcb_state();" _, w. {, ~9 I setvect(8,new_int8); 0 `9 G. [2 t! P* g% g swtch();9 V- m0 Q; H) e3 ?. }: X while(!all_finished()); 4 Z8 R. D2 Z' ]8 Z7 K strcpy(tcb[0].name,'\0'); + x+ B' S$ z+ Q! T* } tcb[0].state=FINISHED;& W; ~( t1 D, o setvect(8,old_int8);0 S& U$ D8 j c) u9 `9 ~7 s* l tcb_state(); ! a5 R) L) ]( E( K$ @+ D: A ] printf("\n Multi_task system terminanted.\n"); - K( l9 s- B1 { V: Z3 B};
    towny 该用户已被删除
    20
     楼主| 发表于 2003-10-27 11:58:00 | 只看该作者
    我不想灌水,也根本不想在这样的版块浪费时间!!

    本版积分规则

    关闭

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

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