下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]
towny 该用户已被删除
跳转到指定楼层
1
发表于 2003-10-20 12:59:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
create()  创建一个进程
5 @# k" W6 c- e: w, t' h! Y, \+ A要求:1 用c语言编写
4 g9 g/ I: E, ]; w1 d& F+ |) \         2 程序+PCB(ID的内外优先权,申请资源)
8 m2 Y. o2 G+ c, v0 P, |$ g只需做进程中”产生“这一步。8 W8 t2 F- ]( y+ M/ i8 ]
以下是做了3分之1的范例:
1 G" R9 v8 T- m. H: o3 e, U9 x#include "stdio.h"
- C; y$ z# y) j: B8 U+ H% a* D#define running 1 /*用running 表示进程处于运行态*/ " t  [0 T: X/ Q/ P: v
#define aready 2 /*用aready表示进程处于就绪态*/
, E( V% m8 d+ j& H#define blocking 3 /*用blocking表示进程处于等待态*/ ' o7 m; H$ U; {/ `) }8 O
#define sometime 5 /*用sometime 表示时间片大小*/ ( U) L/ X0 A- Z3 O
#define n 10 /* 假定系统允许进程个数为10 */ ) Z% }  ~4 O9 R8 o, O' E
# u9 U* h/ P/ Z; A  n4 ?6 j3 d
struct
/ Z, R- q- g' i, \{ + y! c5 x: U4 x8 e, Y; d$ U, p
int name; /*进程标识符*/ % \" G0 w( ~+ O0 v) F4 S1 t( K
int status; /*进程状态*/ , j7 t' v; N/ E. t7 F& V3 c6 X
int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/ / j4 t( P- N/ y. m4 ?
int pc; /*进程现场信息,程序计数器内容*/ 0 ^4 S* I/ k1 L; f0 M6 [, z; p2 Q
int psw; /*进程现场信息,程序状态字寄存器内容*/ 7 u; x( R8 v) ^
int next; /*下一个进程控制块的位置*/
: I% ~* p% b% }: p}pcbarea[n]; /*定义模拟进程控制块区域的数组*/   y' J. u: |1 G7 q! g1 s6 V9 w
, T/ U% Q  P7 U- J1 {
int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/
$ P$ w2 g) u5 E( ~% D7 h% P* N0 {8 s: j
int run; /*定义指向正在运行进程的进程控制块的指针*/
9 \. n# a* E/ M: X" U" mstruct
! P# i! G9 r3 m{ # K9 u' Q; K; t: O$ P
int head; : @2 a3 j! v  m/ Y
int tail;
' Q3 [  _% f: O0 A, _}ready; /*定义指向就绪队列的头指针head和尾指针tail*/
& ]& A0 ^8 D0 B' [* Eint block; /*定义指向等待队列的指针*/ ! k9 M% x& Q' G; R, Q+ s3 G! b
int pfree; /*定义指向空闲进程控制块队列的指针*/+ u. s/ U3 O) D- A9 o% x* J8 S5 r

5 ~. T$ R8 x4 G5 Z7 P: i麻烦各位高手了,望帮忙解决一下,急啊!~~!!!!![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 | 只看该作者
    我的脑子都快调得暴了,能写个大至的,让我自己调吗?
    $ r8 ?  ~3 o4 U% e$ k2 Z麻烦各位高手了!!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    4
    发表于 2003-10-20 22:40:00 | 只看该作者
    你给的头部定义的几个队列指针看的出来你是想写一个 链接方式 的进程队列,由于给得太粗糙和简单,我尝试了一下,反而觉得很不好写,想考虑的一些东西你的结构里没有,而考虑进去发现弄的复杂了就写不完了,所以很难办,结果还是没有写下去,给你我开始的一点筐架吧。
    # l+ o% X, i) z- v  p/* the main site file */
    1 ?% @, m; J- A9 g, [4 f0 iCreatePro(&ID){0 N2 K5 f& K  B& D
      GetFreePcb(&ID);  //申请一个空闲的PCB,并为其命名一个标识ID;# l: }2 h3 H% t: R0 p
      InitResour(&ID) ;//为该进程分配资源(内存空间和工作区);
    - _  W$ N: [; A# ^, C/*初始化参数*/1 M! v& ]9 n6 g+ f$ [
       CallName(&ID);   //命名进程的外部名
    % V# a; C7 }* c& `- y3 w6 d! c  SetParProStat(&ID);  //记录父进程的ID和CPU的状态、, }9 k. @$ `: y+ D' u, V, c
      SetFL();  //优先级数、3 I/ d1 J; o9 \! u  x# R" [
      SetHeap();  //进程起始地址、
    - j+ C: x5 {/ v' \5 A- [  _SetSelfStat();  //设置进程的状态为就绪态) F" C) Q* Z2 p8 Z' g2 C, p
      AddStat_Read(); //将该进程加入到就绪队列中。
    9 u8 H) W- F6 `- x) J5 m  J.
    ! I# n0 M7 h6 C+ s' |.
    $ L: y2 \/ l: ^0 g4 N' h& s5 U.
    ' A% b* {9 W: L+ H.( ]% X" M, j$ [! J* q" f1 x
    }7 {8 ~/ M! L. W
    我觉得上面至少要考虑的,但是实在很懒了,对你也许一点用没有,不好意思
    : W9 q  X' x# C3 a) E: n
    towny 该用户已被删除
    5
     楼主| 发表于 2003-10-21 12:04:00 | 只看该作者
    呵呵!!
    0 h. T" K5 I3 m% q" \% I2 m0 D# \谢谢斑竹的高见!!
    towny 该用户已被删除
    6
     楼主| 发表于 2003-10-21 12:18:00 | 只看该作者
    这是我自己做的一个版本,望斑竹给予指点!!!谢谢# W) t& K& E5 S* U0 N" ] 9 I1 j7 A1 B0 O4 T4 ^#include- ?4 d( [+ F& K6 X #include ' n: K1 F& c8 y#include8 T9 }$ {- Q6 X9 p( _ #include . i% x+ ~6 N0 W# e0 A1 w#define running 1 /*用running 表示进程处于运行态*/" I. x+ R+ P r% z/ G #define aready 2 /*用aready表示进程处于就绪态*/) [5 [5 E8 Z5 J& T A$ w; L5 b5 d #define blocking 3 /*用blocking表示进程处于等待态*/ # M0 ?- |& n( i2 B) s( m#define sometime 5 /*用sometime 表示时间片大小*/: o- u6 h& {1 a/ e #define n 10 /* 假定系统允许进程个数为10 */ 0 A; `/ J4 ^" `( @* |1 N9 bstruct3 R9 d$ Y: n5 `" n5 [6 H {$ ^# Q x8 }! Q/ t3 j7 r int name; /*进程标识符*/ ! R1 X# w/ E2 w2 L# _" t8 nint status; /*进程状态*/) ?% b; v$ E% {# B( P! | int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/ ! ]5 D/ c$ R' h; z. sint pc; /*进程现场信息,程序计数器内容*/! e/ k' m2 q3 \2 u3 y$ G. F' x int psw; /*进程现场信息,程序状态字寄存器内容*/ * z, m, n2 z0 J, U2 C# i3 \4 yint next; /*下一个进程控制块的位置*/ . m: H; B+ ^+ ~/ v8 X5 f1 U8 r3 G6 _}pcbarea[n]; /*定义模拟进程控制块区域的数组*/ # M9 I& L8 H7 U/ W( O& fint PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/ ) h6 f5 F4 t3 Q, z) ?. @% Lint run; /*定义指向正在运行进程的进程控制块的指针*/- w) P/ \9 O# y# t9 H, o" h struct3 k1 E0 w# Q- c7 v { 4 ]$ |% w4 K% w0 R* Dint head; - d2 r5 G5 r& Hint tail;1 z- Z# a1 {3 a5 W. Y }ready; /*定义指向就绪队列的头指针head和尾指针tail*/- G4 j$ s0 D9 |6 h" f" y3 o/ s f int block; /*定义指向等待队列的指针*/& Q& V. [4 a: A/ _ int pfree; /*定义指向空闲进程控制块队列的指针*/' J" ~# [' A8 n: g main() 8 ^! h. K! ]# G{ int gdriver=DETECT,gmode; : w" j) z5 g/ G int i,x,y; + r$ r* P& G8 F3 Q/ H for(i=1;i<=n;i++)& T9 p' ^0 l9 f: f {ready.head=pcbarea.next;}/ C5 r, _& z0 y: e4 E initgraph(&gdriver,&gmode,"");: Z. ?! v* c1 o2 p setcolor(YELLOW);1 s6 q: }6 o- m: ]5 d for(i=1;i<=4;i++) # E5 x0 ?9 W4 `! Z3 i/ u8 x% i* Y { setfillstyle(8,i); ! u B L0 k9 P' |+ {/ `5 C: G circle(284+13*i,190,6);6 Y. P+ P5 u; b" B floodfill(284+13*i,190,YELLOW);, m O& s4 W6 W/ D6 j' f }0 i, K/ U* J& J* c1 K, w) T) c setlinestyle(0,0,3);. }, k: U& @# x9 p% P circle(316,190,25);: [! y% `. |% N1 K) A setcolor(5);$ Q$ d+ e7 W' [* h7 ] settextstyle(3,0,4); / Y( {7 {. t, r! S+ G) K' k outtextxy(35,311,"press any key to create objects!");) H+ L& s( N; u8 m getch(); 3 v7 ^% h Z1 l/ b. f setcolor(YELLOW); ! O0 G9 v9 H' x line(300,215,290,235); 1 @( C5 ], R: F7 Q line(323,215,333,235); 1 c8 l( ~- [9 V. J5 X3 ? delay(50000);; b# q* b! q' C( {! @; j setlinestyle(0,0,1);: a/ B8 r- D% M0 T% S" W# \. o for(x=1;x<=2;x++) 3 @. u& h2 j3 o4 H' {! @! ~ {setfillstyle(8,x);' p# ? |- s8 g! A8 O3 `. p circle(267+13*x,246,6); 0 \ u/ j. N6 A- k5 P: X$ q. J9 i floodfill(267+13*x,246,YELLOW);/ m, e: z3 L. ~; |; r- [: N9 f } ' H% I% S- L5 q- p% U* T3 r for(y=3;y<=4;y++) 7 d0 d U6 t+ [7 i {setfillstyle(8,y);) G8 ^) W4 v5 r F6 b. u circle(285+13*y,246,6); 9 h8 d/ @9 B# `3 D) X floodfill(285+13*y,246,YELLOW); # S( G. o6 W$ D3 w9 q% R } ; o) r* h9 S5 p2 A6 W setlinestyle(0,0,3);& X6 O, J& R* h0 k' @9 _ circle(287,246,14);5 ]0 f4 y5 h0 } ] setlinestyle(0,0,3);4 @9 u( I" I# z9 P) g# y" { circle(330,246,14);2 |9 Z$ G: p& g5 O& d delay(50000);% [: C2 B) O2 l2 m% \3 t, | line(281,260,281,280); + }3 A4 O0 |/ K+ A) i& s' t# k line(293,260,293,280);5 a0 o- Z v2 v2 ^9 H0 _+ P+ F line(322,260,322,280); ! O( s) E8 ?' y$ y% [: o5 r line(333,260,333,280);% d* H" S, ~: \& h2 S, [$ } delay(50000);4 N( }, c4 H* l* g7 d! @/ j. w setlinestyle(0,0,1); 6 P3 {; y, b7 O3 r/ u setfillstyle(8,1); 2 l! v2 N+ l5 o* ~) d circle(281,286,6); " O7 H. n2 Q4 a% ^% i8 j2 y. y; V floodfill(281,286,YELLOW); @2 y ]) [2 X, T e- P G setfillstyle(8,2); & J! M6 U4 o9 F N circle(293,286,6);$ j0 j& D0 ~* D floodfill(293,286,YELLOW); ' J3 C3 D; r* e% C setfillstyle(8,3);/ J7 {4 `$ T" S" V circle(322,286,6); 6 e2 W. ]: z7 c! D7 C floodfill(322,286,YELLOW); # P6 b9 h! t% Z) H, g setfillstyle(8,4); % r3 j# @) f) ^' w& _ circle(333,286,6);8 l1 [* }& \& V, A( { floodfill(333,286,YELLOW); & T; r/ x5 |; q9 h/ G getch(); 6 C- c' I$ b1 [4 h closegraph(); # m: T! w, J8 T2 |0 s% L} 6 K* B: P/ i$ G' v0 f1 r# g; Y/ e7 s5 Q( A/ H6 _ ' H9 W( o4 c- q4 ] 
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    7
    发表于 2003-10-21 18:58:00 | 只看该作者
    你在搞那么多画图干什么?你不是要做进程的创建吗??
      `$ R4 V% E2 e/ ]" {) y难道不是《操作系统》的‘进程’那一章进程创建??! i7 x+ y( f  o4 ^/ z% X5 \
    到底是要个什么效果??糊涂了
    towny 该用户已被删除
    8
     楼主| 发表于 2003-10-21 20:34:00 | 只看该作者
    手误贴错了!
    + B' {6 M# [$ R1 v) k5 K# V不好意思!!
  • 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 | 只看该作者
    做了一半的半成品望斑竹指点!! & g; s* l$ S( w 8 G$ ]6 B$ A! I2 ~7 T; [int timecount=0;' o% w' s) A, L% t char far *indos_ptr=0; * K' N# D8 y/ u) W2 bchar far *crit_err_ptr=0;" E: P* r& o" P: @! ]( Z1 b int num=0,current=0,i; 3 h- t; h% }9 _5 ?/ S2 F7 nvoid over(); ) w6 g2 r3 u; Q5 Q# Z$ Dtypedef int (far*codeptr)(void); 1 J, U- B$ I; eint create(char *name ,codeptr code ,int stacklen)( E# s1 g7 r1 t. S {/ u0 U8 \) w* R6 r1 o, \ unsigned int * s; 8 x% w) _7 d% w' R# onum++;9 \& f0 ?$ B8 a4 j3 l) a tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); 1 p7 C3 }5 `" E. O+ Q) b; q8 P( z: [ tcb[num].state = READY;5 i& _6 ]- U6 i, X strcpy( tcb[num].name ,name);2 W* @, h! w+ B7 a; |" W tcb[num].ss = FP_SEG(tcb[num].stack);) F: B1 ^/ ?! f1 U4 a/ r/ a tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14); ( ?5 t+ b1 Q( m$ R' y1 C( K5 h *(tcb[num].stack+stacklen-1) = FP_SEG(over); 2 O7 n$ |* [. I1 W+ a& P *(tcb[num].stack+stacklen-2) = FP_OFF(over); & q1 ?7 e; U$ J, N: }6 S *(tcb[num].stack+stacklen-3) = 0x200; 3 e! A" f p3 S- Z *(tcb[num].stack+stacklen-4) = FP_SEG(code); / E' `$ [/ b+ m% w; ` *(tcb[num].stack+stacklen-5) = FP_OFF(code); " S/ q- m }: n7 S- }! R *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack); ' [7 y! o7 ~3 C$ x. j *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack);3 `! ~6 D0 ]( k- S return num;# c) ~, ?5 A t* j Z& m' c } ; 3 o. z, p5 \2 kvoid interrupt (* old_int8)(void); % x2 v* [9 k8 B; ^2 M$ |4 ] Z void interrupt new_int8(void) + E* R5 B: k4 v4 ?, Y+ A9 e, V6 R# L{ * Q, J( x+ W- M: D (*old_int8)();' V4 d9 }7 u/ ~8 |5 G$ q' p8 @/ t6 w( u timecount++; 9 j( H# U# K! I3 }/ p3 S; Z if(timecount>=TL);- I. M+ R6 ~. F! v7 D# ?# u if(!DosBusy()) 2 H% H0 X2 M0 u# l0 F {5 V) ~) f0 a# S; _ disable();5 ?9 Z0 G: I ]6 q( y+ D8 m tcb[current].ss=_SS; ( Z* Z {) L6 Q$ J tcb[current].sp=_SP;% K1 Z' `& }4 |2 F% q# R8 S9 p if(tcb[current].state==RUNNING) * i) U/ e) t7 K tcb[current].state=READY; # Z( n2 k: ]% a; }& X! `/ S: u! o current=3-current;5 I1 ^" i0 g K8 B0 V' O/ w# p4 o/ U& U if(tcb[current].state==READY) / }3 p1 S8 @& t8 p" P0 S) ~7 o{ _SS=tcb[current].ss; 4 b% _( Z% [$ w4 a6 M/ D7 ^" w _SP=tcb[current].sp; 4 U& }# A/ }6 }1 K4 F' @ tcb[current].state=RUNNING;+ C# V- D; i2 [8 `! w$ I1 V7 a' O+ ], j timecount=0; T* p- D9 ~1 C enable(); 2 f8 |0 z- ~: c; j/ p} ( T, S/ L/ E+ Q1 R} + H5 z% E3 I8 r r}; ) R5 l E4 u# avoid tcb_state()) o" Y0 x; d% K' O( C' G1 h { 5 ^% x& \, Y5 G: j6 J int i; # _8 [5 n8 S. V5 @ for(i=1;i<=num;i++) % o# b/ }7 ~. z. [, z" E printf("Thread %s is %d ",tcb.name,tcb.state); ( o, g, U: r: ?3 p+ M};- ]9 t& k! `& B* G1 a; ^. U int all_finished()1 p. V; s$ o b4 d* V! v( [7 | { 3 s7 A/ H) \0 w$ o6 i( t( y3 i4 g int i; * t; V1 c' b! \. n1 o0 d0 C. u& B for(i=1;i<=num;i++) , R& N. ?/ x8 c @& t if (tcb.state!=FINISHED)$ w+ l6 n; V% H2 [ return 0; % v% ~( B7 ]& I$ Q. F0 k! N0 E return 1;8 u3 p8 j, ^3 w$ ~0 |; B 9 W5 c9 @* G# B }; : ^5 x& C: f% k) pvoid interrupt swtch(void) 4 |1 v, S3 m9 K% y4 M{, ?& T$ h9 X) J% r/ N int i; 0 B7 b. ?4 n, z- a, n4 G( Z disable();- _# q8 C/ N Y$ I tcb[current].ss=_SS; . r+ T) M1 |" o2 N tcb[current].sp=_SP; 6 b+ h# I" G1 E2 c0 T: j# ? if(tcb[current].state==RUNNING) 2 n* g; M4 Y, F' S- J- ^# O$ m tcb[current].state=READY; # U% Y: V! u& [3 O7 }3 X# ]) E for( i= current+1 ; i <= num;i++)7 p5 x3 A" X# {& l5 D" h P { if(tcb.state == READY )( B, T$ E" I& w6 W0 s/ ~) R3 E: P( y; z+ H goto excute; 9 n! F( P5 A5 G2 T7 N3 p% Z: f* V }+ R/ v" T! c+ m3 k( ] for( i = 1 ; i <= current ; i++)- H% D' @1 ~* r { if(tcb.state == READY) - q6 K& h, Q2 I, X goto excute; 5 s& h3 P/ s$ p3 A0 K5 O( E }% B0 H* A2 V& G( e7 o+ A( u1 j i = 0 ;$ ~- P& A; N, T, D excute: ( ?5 G T7 ~( U, U/ R _SS = tcb.ss; % N9 ]8 V8 o* T) A5 B' X _SP = tcb.sp; 3 ?0 S% f, k9 b0 a9 K E tcb.state = RUNNING;+ \ Y8 Q( v; ] D; v/ H current = i; $ M9 ^. e$ k4 L* j: ~ }7 p7 x6 z enable();* k! V6 H! P7 D }
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    13
    发表于 2003-10-24 18:02:00 | 只看该作者
    指点什么呢?效率?方法?还是编程格式?' k& r% U$ L( ^$ S5 G( t
    给一篇代码给别人叫别人指点?我从来没有过。
    towny 该用户已被删除
    14
     楼主| 发表于 2003-10-24 21:48:00 | 只看该作者
    操!
    5 A( f5 I1 Q$ a* H. W- X搞什么脾气啊!一个斑竹有什么了不起的啊垃圾!!
    towny 该用户已被删除
    15
     楼主| 发表于 2003-10-24 21:58:00 | 只看该作者
    你要是不懂就让位!
    ; v3 S  }2 f/ }& b. m  h  S别占着茅坑不拉屎!" f0 z4 d5 f' n% _* p! B4 i+ |
  • 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 | 只看该作者
    完成了你们看吧!, H. k+ s- U- W# J t3 P 9 A( h, D6 |( t& T#include 6 U7 r8 \+ }, t#include , X w8 {6 d4 }! P, c4 D W+ K #include ( l3 {: D3 O* U8 L/ E% ]4 |- ~9 @#define GET_INDOS 0x34' c+ s0 c6 L, R; u #define GET_CRIT_ERR 0x5d06, L- W# M$ M% \0 L( P #define FINISHED 0 9 I6 v! A9 P- c4 ^1 D1 A#define RUNNING 1) Z! F% E' p7 {/ k9 a# s #define READY 2 " ?, W* i( m! R) S#define BLOCKED 3+ R: J- `) p1 t! {( X; b #define Ntcb 8 $ n, M5 E5 ~7 O$ _. p#define TL 1& Q# F7 B# w( g3 T, ^2 b4 w3 Y struct tcb{* D5 l/ E& `7 R+ }. ^; ~5 ?4 m unsigned int * stack;/*堆栈的起始地址*/' S' u5 |* F: Q/ g B8 x unsigned ss; /*堆栈段址*/, m! x/ @% [5 A& h0 ^5 @" t& o: m$ r unsigned sp; /*堆栈指针址*/8 r+ @7 v/ e+ R% P char state; /*进程状态*/3 s5 n/ w- y5 ~$ Y char name[10];/*线程的外部标识符*/ ) U4 ]* V* W+ [- p: u& `/ s% r }tcb[Ntcb]; /* 系统允许最多的任务数 */ % {' S* Y8 [7 ^, U* Z2 Zint timecount=0;: O( f7 y5 P. Y9 R char far *indos_ptr=0;& h: S5 ~; \* i/ ^1 e# g char far *crit_err_ptr=0;; H5 k0 |6 n0 o6 g( @/ K' l( ~6 I/ P int num=0,current=0,i; % p4 y6 ^% y* P0 p. ?void over(); + v' k4 Q1 _0 v& P$ \, t+ r% ytypedef int (far*codeptr)(void);( V4 K7 P! g5 @$ f6 a' s8 f. m int create(char *name ,codeptr code ,int stacklen)6 n$ ^3 e* D, T2 o& w {8 Z* X( x# |3 M$ I unsigned int * s;) X! Y8 h4 a$ B- L$ s num++;5 X7 j% E/ @' S4 o3 l! z; E tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); # u' f; i: M( u8 u5 I tcb[num].state = READY;$ w% ?2 |2 P& e2 i/ y strcpy( tcb[num].name ,name);# }* @" o: v- P: h' D0 H; b" @ tcb[num].ss = FP_SEG(tcb[num].stack);" }7 ~ V: N0 ^, \5 ~ tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14);* d& z8 u' l# ?. j7 H( u( t" F *(tcb[num].stack+stacklen-1) = FP_SEG(over);$ m j- g6 @" V: C0 M *(tcb[num].stack+stacklen-2) = FP_OFF(over); ! U! y _* U- E$ _6 n8 S *(tcb[num].stack+stacklen-3) = 0x200; & `& I5 B9 g5 x+ T' Q! n *(tcb[num].stack+stacklen-4) = FP_SEG(code); , a& Y! f% s$ v *(tcb[num].stack+stacklen-5) = FP_OFF(code);0 S! s! W# W `7 I* ?0 G *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);+ c! N' }% R8 S U+ V$ S& o *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack);5 v$ i' S+ W1 V+ m8 P0 p' W! U return num;# D. `- f* O+ l. f4 u4 a9 G } ;5 p( I$ C" ]& }9 [& @% }. k5 [ void interrupt (* old_int8)(void); ( h% m5 M$ K, l# V v# z M- s" ^void interrupt new_int8(void): y3 C1 ]0 z2 K3 F7 f { ' l6 p: E2 V- u (*old_int8)(); + f$ K9 N; T b5 _ timecount++; + Y; g) B$ Z' h if(timecount>=TL); " J4 ?8 W9 `. ] if(!DosBusy()) % f X9 x4 ^5 |( f; x {$ w3 J- p6 Z5 h disable(); 1 w; |" \4 v) }" H tcb[current].ss=_SS; " @8 J9 U! Q2 |. ~" u/ ?8 P/ Y tcb[current].sp=_SP;; F! m8 S9 j* v2 y1 m if(tcb[current].state==RUNNING) 8 W: r, B0 [) M4 y( P& s tcb[current].state=READY;) I+ N }( e* D% Z$ v7 g5 }7 q current=3-current; : b9 s. @# h0 \" cif(tcb[current].state==READY)4 V, d6 f, M! N$ [6 o* R# ^ { _SS=tcb[current].ss; * c: A, H) z( x" t2 c1 y _SP=tcb[current].sp; # d2 N7 |% r. Z5 Z7 m tcb[current].state=RUNNING; ! q9 `: z/ f: h timecount=0;: j! V) H6 t* H$ Y0 } enable(); * h1 G! X8 [& \; j, z/ r} + F. O8 F' | q3 |* Z( H} 8 g3 E8 ~. C, @- o! w/ a( f5 h9 s};# h- K- q6 c V# d1 Y9 \+ v void tcb_state()9 |: Z7 E6 T' D l; b3 r/ k2 _* } { 7 I& a" D" \3 _; s7 U$ F int i; & y |% V1 i( \" r2 i. |5 @ for(i=1;i<=num;i++)2 s5 _; D1 U$ L7 F: L% o, T printf("Thread %s is %d ",tcb.name,tcb.state); : d- x4 X* y, }3 ~) T' s}; % t$ z r/ @8 Gint all_finished(), N" ^: v+ a7 f0 Y { * [6 r, T) k! j5 g+ z! j int i;. R2 e/ B! p5 Z: a for(i=1;i<=num;i++) 2 ~9 r' D8 n# ~0 r1 r! S7 j/ a if (tcb.state!=FINISHED) , E* B6 i7 \- ] y3 a4 q& } return 0; & [0 z) Q, z# }! o/ f: S0 E+ a return 1;! _4 P j; Q. z) f1 h( i6 D* q + w* v. _) f+ s' F}; 7 q. @& G- f3 e; Y& Cvoid interrupt swtch(void) 9 a$ i: _3 H; ]$ b- C! i0 |7 E{* B' K6 R J% H/ {+ d int i;8 E# L( x* l6 q$ A) b6 D disable(); , @7 }+ o9 p3 o4 k( w( T tcb[current].ss=_SS; 7 _2 j& p( k+ i# f% L; }1 P tcb[current].sp=_SP;- D7 {) g0 q: H- ?4 T w4 ` if(tcb[current].state==RUNNING)5 X, D! p: W0 a" F# t tcb[current].state=READY; : }2 {7 \' f5 ?, i2 W for( i= current+1 ; i <= num;i++)6 Z x) j4 g+ g { if(tcb.state == READY )8 Z W) b6 D% s) r: V goto excute;2 R. G5 Z; i H- v$ H; H }7 Q6 m7 S; [- ?5 T8 A for( i = 1 ; i <= current ; i++)) P5 [ L( }/ M" V/ @. J7 B. L { if(tcb.state == READY) 7 O& P( }( f1 { goto excute; - Y5 f/ l5 {* b0 u0 R" c$ _ }7 n- B: f2 h6 _+ ^ i = 0 ; 9 w$ N/ i* E j6 p, T: E6 C' ]4 p excute: " I$ B) f3 ^! u; r, a _SS = tcb.ss; 5 L% p4 j- F1 `/ o7 Z! v1 c2 x _SP = tcb.sp;! d2 }' `0 D5 v0 U: l% r tcb.state = RUNNING;# m$ f0 [. ?7 g: {9 @, r current = i; 7 r# c% [$ Q+ f2 C9 O: K0 |0 b enable();& A, Z1 ?$ J1 G$ N4 H9 r } # j3 Y* G6 P4 V; L! \: R) z/*-------------------------------------------------------------------------*/ & F+ B J# C4 C$ a, P( Q1 svoid over() $ s4 ?6 G6 n+ h, w, p{' {3 m& K. O; ~; \* ?1 `0 _1 j int i=current; & h9 M# K' V9 W- E: u& }. |6 w! \# g /*strcpy(tcb[current].name,'\0');*/3 J$ P# c& l6 j( i tcb[current].state=FINISHED; # v8 p- z7 K" U3 P+ J6 O! s1 K swtch(); 2 e' A1 C% G9 C free(tcb.stack);2 ^0 C y: o4 J+ i! L& C };) K$ V0 n( ^* b) V! c. U8 C; f- h /*---------------------------------------------------*/' S' h/ e0 o# |. p void InitInDos(void) 8 F3 x& X- t1 t0 L+ Y$ F/ b: `{8 i, o/ ?( C9 y. P' v union REGS regs; 6 \0 k" ]. q+ H, l9 E4 |9 c, \7 K9 l struct SREGS segregs;! t& ?3 e% u3 ]; ^( v /* get the address to INDOS flag*/ : P. H8 @$ Y# w8 z) t regs.h.ah=GET_INDOS; ~- ^2 H" V3 f( M. q/ Z7 r0 D intdosx(®s,®s,&segregs); & U* ~; |) i$ B/ B4 {: ] indos_ptr=MK_FP(segregs.es,regs.x.bx); 5 _+ a$ V, t# b% ^- K. u1 @ /*get the address to CRIT_ERR flag*/' Y) q" {# W2 J7 |1 m. X: L if(_osmajor<3)' }8 N$ z( i* x& f5 L crit_err_ptr=indos_ptr+1;6 p9 g0 ?! W j% ~# ~0 } else if (_osmajor==3&&_osminor==0)+ b; j" x8 o; @; \8 ]9 } crit_err_ptr=indos_ptr-1; v' T6 s5 a& h. T else + }$ g7 t) e) F* J1 n [" g# L {7 c! h9 ^( i7 j regs.x.ax=GET_CRIT_ERR;, z- V8 m2 v7 _$ T intdosx(®s,®s,&segregs);' g, m+ r) P# p* G& H$ K crit_err_ptr=MK_FP(segregs.ds,regs.x.si);. H H! X$ M! Y7 A% ^# ?) r# j5 ^ }, Z5 N( |* d6 A }; & {6 b: i( s1 B. k7 Rint DosBusy(void) * d5 N% Z" V3 C{ ' c) L4 o5 _" D/ D8 Y6 M0 u( F if(indos_ptr&&crit_err_ptr)5 D; T8 [% J- C return(*indos_ptr&&*crit_err_ptr);, F3 i! W) w) x4 A else8 m% }& u5 @1 p+ z7 ?* ~ return( -1); 3 u4 z B3 R5 |+ X: H. C5 | @}; 4 y& ` x0 d( _, t& O0 Fvoid f1(void)( e$ z5 R& v) w; R { $ o9 m r6 z" ^2 s int i,j,k;! z" T" e# o! b' l* P0 c for(i=0;i<40;i++)1 d5 H/ }/ B% U% K* Y { ) O0 ?0 z; C1 D" p2 Z putchar('a'); . i0 z6 Y: e2 u; X) V 9 {% {/ @2 m4 C! T: L8 Z/ o" [* Z for(j=0;j<1000;j++) t1 \, i0 P" |% H for(k=0;k<100;k++)! Q: r y) x. {1 X. H* I ;& x! e# u# O3 Y$ ^# G: e! I }# ?& a6 H0 u3 Q$ S) Z. f/ r% c }; , X* I5 w6 d4 Q! S0 ]; Q8 f+ P, nvoid f2(void)& `8 z4 u7 C6 d9 s9 z { m! A. H2 R7 v2 `, |# ?/ K int i,j,k; . A/ i5 Y) S& z2 N( }: e for(i=0;i<30;i++) . Y5 c d7 ]7 B. J! T* c {+ H/ q: ^4 X7 o putchar('b'); K" w# D5 x3 Z1 Y for(j=0;j<1000;j++)8 M+ U% d& U, x+ u for(k=0;k<50;k++)4 k+ C [& F8 o2 \ ;) N4 O# G' \+ G, x7 f } - A; w4 a, m6 Q}; , W4 N& l' M3 B( W, _/*------------------------------------------*/% s3 m& M* A" y8 S8 h6 v; D main() - O' U9 E: b0 y{/ Z2 @" O9 I1 U# U+ R" G1 e1 `4 u InitInDos();" Z+ P0 ^* ?/ B; | old_int8=getvect(8); 3 @" R2 ~+ V3 `" g- {+ u1 U3 M strcpy(tcb[0].name,"main"); 4 N" O- U6 E. i* g5 e& v tcb[0].state=RUNNING; * B) Z7 S8 \' } current=0;* ?/ K' w7 q, }5 T& v5 \ create("f1",(codeptr) f1,1024);* f* ]- L2 }7 f2 s# D. A6 @ create("f2",(codeptr) f2,1024); : ~9 J! a0 X7 L, U2 ] tcb_state();8 i# b8 B( d% w setvect(8,new_int8); # ?5 Z0 j$ L( y. q# Z swtch();% K9 R9 I: \. l3 B0 R( l/ N3 F, V while(!all_finished());: N, ~4 E/ V# j- I0 L strcpy(tcb[0].name,'\0'); J" c* ]$ L. k7 n tcb[0].state=FINISHED;( @) D3 w2 E2 w6 \) q setvect(8,old_int8); $ D+ m1 f' b! l tcb_state(); + \( S5 v- I* u# \8 C printf("\n Multi_task system terminanted.\n"); - S$ m, D7 w$ d4 b0 ?8 D1 r};
    towny 该用户已被删除
    20
     楼主| 发表于 2003-10-27 11:58:00 | 只看该作者
    我不想灌水,也根本不想在这样的版块浪费时间!!

    本版积分规则

    关闭

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

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